| Index: chrome/browser/permissions/permission_context_base_unittest.cc | 
| diff --git a/chrome/browser/permissions/permission_context_base_unittest.cc b/chrome/browser/permissions/permission_context_base_unittest.cc | 
| index 3b130f4bb2e49ac06199a5e766806136b1f5ef9b..25cd98b23f15eb2fb9777640f04d08cfe4d2ca70 100644 | 
| --- a/chrome/browser/permissions/permission_context_base_unittest.cc | 
| +++ b/chrome/browser/permissions/permission_context_base_unittest.cc | 
| @@ -128,23 +128,23 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| void RespondToPermission(TestPermissionContext* context, | 
| const PermissionRequestID& id, | 
| const GURL& url, | 
| +                           bool persist, | 
| ContentSetting response) { | 
| DCHECK(response == CONTENT_SETTING_ALLOW || | 
| response == CONTENT_SETTING_BLOCK || | 
| response == CONTENT_SETTING_ASK); | 
| #if defined(OS_ANDROID) | 
| -    bool update_content_setting = response != CONTENT_SETTING_ASK; | 
| PermissionAction decision = DISMISSED; | 
| if (response == CONTENT_SETTING_ALLOW) | 
| decision = GRANTED; | 
| else if (response == CONTENT_SETTING_BLOCK) | 
| decision = DENIED; | 
| context->GetInfoBarController()->OnPermissionSet( | 
| -        id, url, url, false /* user_gesture */, update_content_setting, | 
| -        decision); | 
| +        id, url, url, false /* user_gesture */, persist, decision); | 
| #else | 
| PermissionRequestManager* manager = | 
| PermissionRequestManager::FromWebContents(web_contents()); | 
| +    manager->TogglePersist(persist); | 
| switch (response) { | 
| case CONTENT_SETTING_ALLOW: | 
| manager->Accept(); | 
| @@ -161,11 +161,13 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| #endif | 
| } | 
|  | 
| -  void TestAskAndGrant_TestContent() { | 
| -    TestPermissionContext permission_context( | 
| -        profile(), content::PermissionType::NOTIFICATIONS, | 
| -        CONTENT_SETTINGS_TYPE_NOTIFICATIONS); | 
| -    GURL url("http://www.google.com"); | 
| +  void TestAskAndDecide_TestContent(content::PermissionType permission, | 
| +                                    ContentSettingsType content_settings_type, | 
| +                                    ContentSetting decision, | 
| +                                    bool persist) { | 
| +    TestPermissionContext permission_context(profile(), permission, | 
| +                                             content_settings_type); | 
| +    GURL url("https://www.google.com"); | 
| NavigateAndCommit(url); | 
| base::HistogramTester histograms; | 
|  | 
| @@ -179,48 +181,37 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| base::Bind(&TestPermissionContext::TrackPermissionDecision, | 
| base::Unretained(&permission_context))); | 
|  | 
| -    RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ALLOW); | 
| +    RespondToPermission(&permission_context, id, url, persist, decision); | 
| EXPECT_EQ(1u, permission_context.decisions().size()); | 
| -    EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]); | 
| +    EXPECT_EQ(decision, permission_context.decisions()[0]); | 
| EXPECT_TRUE(permission_context.tab_context_updated()); | 
| -    EXPECT_EQ(CONTENT_SETTING_ALLOW, | 
| -              permission_context.GetContentSettingFromMap(url, url)); | 
| - | 
| -    histograms.ExpectUniqueSample( | 
| -        "Permissions.Prompt.Accepted.PriorDismissCount.Notifications", 0, 1); | 
| -    histograms.ExpectUniqueSample( | 
| -        "Permissions.Prompt.Accepted.PriorIgnoreCount.Notifications", 0, 1); | 
| -  } | 
|  | 
| -  void TestAskAndDismiss_TestContent() { | 
| -    TestPermissionContext permission_context( | 
| -        profile(), content::PermissionType::MIDI_SYSEX, | 
| -        CONTENT_SETTINGS_TYPE_MIDI_SYSEX); | 
| -    GURL url("http://www.google.es"); | 
| -    NavigateAndCommit(url); | 
| -    base::HistogramTester histograms; | 
| - | 
| -    const PermissionRequestID id( | 
| -        web_contents()->GetRenderProcessHost()->GetID(), | 
| -        web_contents()->GetMainFrame()->GetRoutingID(), | 
| -        -1); | 
| -    permission_context.RequestPermission( | 
| -        web_contents(), | 
| -        id, url, true /* user_gesture */, | 
| -        base::Bind(&TestPermissionContext::TrackPermissionDecision, | 
| -                   base::Unretained(&permission_context))); | 
| - | 
| -    RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ASK); | 
| -    EXPECT_EQ(1u, permission_context.decisions().size()); | 
| -    EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]); | 
| -    EXPECT_TRUE(permission_context.tab_context_updated()); | 
| -    EXPECT_EQ(CONTENT_SETTING_ASK, | 
| -              permission_context.GetContentSettingFromMap(url, url)); | 
| +    std::string decision_string = ""; | 
| +    if (decision == CONTENT_SETTING_ALLOW) | 
| +      decision_string = "Accepted"; | 
| +    else if (decision == CONTENT_SETTING_BLOCK) | 
| +      decision_string = "Denied"; | 
| +    else if (decision == CONTENT_SETTING_ASK) | 
| +      decision_string = "Dismissed"; | 
| + | 
| +    if (decision_string.size()) { | 
| +      histograms.ExpectUniqueSample( | 
| +          "Permissions.Prompt." + decision_string + ".PriorDismissCount." + | 
| +              PermissionUtil::GetPermissionString(permission), | 
| +          0, 1); | 
| +      histograms.ExpectUniqueSample( | 
| +          "Permissions.Prompt." + decision_string + ".PriorIgnoreCount." + | 
| +              PermissionUtil::GetPermissionString(permission), | 
| +          0, 1); | 
| +    } | 
|  | 
| -    histograms.ExpectUniqueSample( | 
| -        "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", 0, 1); | 
| -    histograms.ExpectUniqueSample( | 
| -        "Permissions.Prompt.Dismissed.PriorIgnoreCount.MidiSysEx", 0, 1); | 
| +    if (persist) { | 
| +      EXPECT_EQ(decision, | 
| +                permission_context.GetContentSettingFromMap(url, url)); | 
| +    } else { | 
| +      EXPECT_EQ(CONTENT_SETTING_ASK, | 
| +                permission_context.GetContentSettingFromMap(url, url)); | 
| +    } | 
| } | 
|  | 
| void DismissMultipleTimesAndExpectBlock( | 
| @@ -246,7 +237,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| base::Bind(&TestPermissionContext::TrackPermissionDecision, | 
| base::Unretained(&permission_context))); | 
|  | 
| -      RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ASK); | 
| +      RespondToPermission(&permission_context, id, url, false, /* persist */ | 
| +                          CONTENT_SETTING_ASK); | 
| histograms.ExpectTotalCount( | 
| "Permissions.Prompt.Dismissed.PriorDismissCount." + | 
| PermissionUtil::GetPermissionString(permission_type), | 
| @@ -289,7 +281,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| base::Bind(&TestPermissionContext::TrackPermissionDecision, | 
| base::Unretained(&permission_context))); | 
|  | 
| -      RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ASK); | 
| +      RespondToPermission(&permission_context, id, url, false, /* persist */ | 
| +                          CONTENT_SETTING_ASK); | 
| histograms.ExpectTotalCount( | 
| "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", | 
| i + 1); | 
| @@ -379,7 +372,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| base::Bind(&TestPermissionContext::TrackPermissionDecision, | 
| base::Unretained(&permission_context))); | 
|  | 
| -      RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ASK); | 
| +      RespondToPermission(&permission_context, id, url, false, /* persist */ | 
| +                          CONTENT_SETTING_ASK); | 
| EXPECT_EQ(1u, permission_context.decisions().size()); | 
| EXPECT_EQ(expected, permission_context.decisions()[0]); | 
| EXPECT_TRUE(permission_context.tab_context_updated()); | 
| @@ -446,7 +440,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
| base::Bind(&TestPermissionContext::TrackPermissionDecision, | 
| base::Unretained(&permission_context))); | 
|  | 
| -    RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ALLOW); | 
| +    RespondToPermission(&permission_context, id, url, true, /* persist */ | 
| +                        CONTENT_SETTING_ALLOW); | 
| EXPECT_EQ(1u, permission_context.decisions().size()); | 
| EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]); | 
| EXPECT_TRUE(permission_context.tab_context_updated()); | 
| @@ -509,7 +504,9 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
|  | 
| EXPECT_EQ(0u, permission_context.decisions().size()); | 
|  | 
| -    RespondToPermission(&permission_context, id0, url, response); | 
| +    bool persist = (response == CONTENT_SETTING_ALLOW || | 
| +                    response == CONTENT_SETTING_BLOCK); | 
| +    RespondToPermission(&permission_context, id0, url, persist, response); | 
|  | 
| EXPECT_EQ(2u, permission_context.decisions().size()); | 
| EXPECT_EQ(response, permission_context.decisions()[0]); | 
| @@ -535,14 +532,41 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 
|  | 
| // Simulates clicking Accept. The permission should be granted and | 
| // saved for future use. | 
| -TEST_F(PermissionContextBaseTests, TestAskAndGrant) { | 
| -  TestAskAndGrant_TestContent(); | 
| +TEST_F(PermissionContextBaseTests, TestAskAndGrantPersist) { | 
| +  TestAskAndDecide_TestContent(content::PermissionType::NOTIFICATIONS, | 
| +                               CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | 
| +                               CONTENT_SETTING_ALLOW, true); | 
| +} | 
| + | 
| +// Simulates clicking Accept. The permission should be granted, but not | 
| +// persisted. | 
| +TEST_F(PermissionContextBaseTests, TestAskAndGrantNoPersist) { | 
| +  TestAskAndDecide_TestContent(content::PermissionType::NOTIFICATIONS, | 
| +                               CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | 
| +                               CONTENT_SETTING_ALLOW, false); | 
| +} | 
| + | 
| +// Simulates clicking Block. The permission should be denied and | 
| +// saved for future use. | 
| +TEST_F(PermissionContextBaseTests, TestAskAndBlockPersist) { | 
| +  TestAskAndDecide_TestContent(content::PermissionType::GEOLOCATION, | 
| +                               CONTENT_SETTINGS_TYPE_GEOLOCATION, | 
| +                               CONTENT_SETTING_BLOCK, true); | 
| +} | 
| + | 
| +// Simulates clicking Block. The permission should be denied, but not persisted. | 
| +TEST_F(PermissionContextBaseTests, TestAskAndBlockNoPersist) { | 
| +  TestAskAndDecide_TestContent(content::PermissionType::GEOLOCATION, | 
| +                               CONTENT_SETTINGS_TYPE_GEOLOCATION, | 
| +                               CONTENT_SETTING_BLOCK, false); | 
| } | 
|  | 
| // Simulates clicking Dismiss (X) in the infobar/bubble. | 
| // The permission should be denied but not saved for future use. | 
| TEST_F(PermissionContextBaseTests, TestAskAndDismiss) { | 
| -  TestAskAndDismiss_TestContent(); | 
| +  TestAskAndDecide_TestContent(content::PermissionType::MIDI_SYSEX, | 
| +                               CONTENT_SETTINGS_TYPE_MIDI_SYSEX, | 
| +                               CONTENT_SETTING_ASK, false); | 
| } | 
|  | 
| // Simulates clicking Dismiss (X) in the infobar/bubble with the block on too | 
|  |