| 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 19d713500b7fcf263c4ae564eba6653f0e0c7343..fb996b54d7a7ec3913f9acf0f7a5431f81191dd6 100644
 | 
| --- a/chrome/browser/permissions/permission_context_base_unittest.cc
 | 
| +++ b/chrome/browser/permissions/permission_context_base_unittest.cc
 | 
| @@ -7,8 +7,11 @@
 | 
|  #include "base/bind.h"
 | 
|  #include "base/command_line.h"
 | 
|  #include "base/macros.h"
 | 
| +#include "base/message_loop/message_loop.h"
 | 
|  #include "base/metrics/field_trial.h"
 | 
|  #include "base/test/mock_entropy_provider.h"
 | 
| +#include "base/test/test_mock_time_task_runner.h"
 | 
| +#include "base/time/time.h"
 | 
|  #include "build/build_config.h"
 | 
|  #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 | 
|  #include "chrome/browser/infobars/infobar_service.h"
 | 
| @@ -88,6 +91,12 @@ class TestPermissionContext : public PermissionContextBase {
 | 
|      variations::testing::ClearAllVariationParams();
 | 
|    }
 | 
|  
 | 
| +  ContentSetting GetContentSettingFromMap(GURL url_a, GURL url_b) {
 | 
| +    return HostContentSettingsMapFactory::GetForProfile(profile())
 | 
| +        ->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(),
 | 
| +                            content_settings_type(), std::string());
 | 
| +  }
 | 
| +
 | 
|   protected:
 | 
|    void UpdateTabContext(const PermissionRequestID& id,
 | 
|                          const GURL& requesting_origin,
 | 
| @@ -149,14 +158,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
 | 
|      EXPECT_TRUE(permission_context.permission_set());
 | 
|      EXPECT_TRUE(permission_context.permission_granted());
 | 
|      EXPECT_TRUE(permission_context.tab_context_updated());
 | 
| -
 | 
| -    ContentSetting setting =
 | 
| -        HostContentSettingsMapFactory::GetForProfile(profile())
 | 
| -            ->GetContentSetting(url.GetOrigin(),
 | 
| -                                url.GetOrigin(),
 | 
| -                                CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
 | 
| -                                std::string());
 | 
| -    EXPECT_EQ(CONTENT_SETTING_ALLOW, setting);
 | 
| +    EXPECT_EQ(CONTENT_SETTING_ALLOW,
 | 
| +              permission_context.GetContentSettingFromMap(url, url));
 | 
|    }
 | 
|  
 | 
|    void TestAskAndDismiss_TestContent() {
 | 
| @@ -180,14 +183,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
 | 
|      EXPECT_TRUE(permission_context.permission_set());
 | 
|      EXPECT_FALSE(permission_context.permission_granted());
 | 
|      EXPECT_TRUE(permission_context.tab_context_updated());
 | 
| -
 | 
| -    ContentSetting setting =
 | 
| -        HostContentSettingsMapFactory::GetForProfile(profile())
 | 
| -            ->GetContentSetting(url.GetOrigin(),
 | 
| -                                url.GetOrigin(),
 | 
| -                                CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
 | 
| -                                std::string());
 | 
| -    EXPECT_EQ(CONTENT_SETTING_ASK, setting);
 | 
| +    EXPECT_EQ(CONTENT_SETTING_ASK,
 | 
| +              permission_context.GetContentSettingFromMap(url, url));
 | 
|    }
 | 
|  
 | 
|    void TestRequestPermissionInvalidUrl(
 | 
| @@ -212,12 +209,8 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
 | 
|      EXPECT_TRUE(permission_context.permission_set());
 | 
|      EXPECT_FALSE(permission_context.permission_granted());
 | 
|      EXPECT_TRUE(permission_context.tab_context_updated());
 | 
| -
 | 
| -    ContentSetting setting =
 | 
| -        HostContentSettingsMapFactory::GetForProfile(profile())
 | 
| -            ->GetContentSetting(url.GetOrigin(), url.GetOrigin(),
 | 
| -                                content_settings_type, std::string());
 | 
| -    EXPECT_EQ(CONTENT_SETTING_ASK, setting);
 | 
| +    EXPECT_EQ(CONTENT_SETTING_ASK,
 | 
| +              permission_context.GetContentSettingFromMap(url, url));
 | 
|    }
 | 
|  
 | 
|    void TestGrantAndRevoke_TestContent(content::PermissionType permission_type,
 | 
| @@ -242,19 +235,13 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
 | 
|      EXPECT_TRUE(permission_context.permission_set());
 | 
|      EXPECT_TRUE(permission_context.permission_granted());
 | 
|      EXPECT_TRUE(permission_context.tab_context_updated());
 | 
| -
 | 
| -    ContentSetting setting =
 | 
| -        HostContentSettingsMapFactory::GetForProfile(profile())
 | 
| -            ->GetContentSetting(url.GetOrigin(), url.GetOrigin(),
 | 
| -                                content_settings_type, std::string());
 | 
| -    EXPECT_EQ(CONTENT_SETTING_ALLOW, setting);
 | 
| +    EXPECT_EQ(CONTENT_SETTING_ALLOW,
 | 
| +              permission_context.GetContentSettingFromMap(url, url));
 | 
|  
 | 
|      // Try to reset permission.
 | 
|      permission_context.ResetPermission(url.GetOrigin(), url.GetOrigin());
 | 
|      ContentSetting setting_after_reset =
 | 
| -        HostContentSettingsMapFactory::GetForProfile(profile())
 | 
| -            ->GetContentSetting(url.GetOrigin(), url.GetOrigin(),
 | 
| -                                content_settings_type, std::string());
 | 
| +        permission_context.GetContentSettingFromMap(url, url);
 | 
|      ContentSetting default_setting =
 | 
|          HostContentSettingsMapFactory::GetForProfile(profile())
 | 
|              ->GetDefaultContentSetting(content_settings_type, nullptr);
 | 
| @@ -366,6 +353,81 @@ TEST_F(PermissionContextBaseTests, TestGrantAndRevokeWithBubbles) {
 | 
|  }
 | 
|  #endif
 | 
|  
 | 
| +// Tests content_settings::ContentSettingsInfo::DENY_IN_INCOGNITO_AFTER_DELAY.
 | 
| +#if defined(ENABLE_NOTIFICATIONS)
 | 
| +TEST_F(PermissionContextBaseTests, TestDenyInIncognitoAfterDelay) {
 | 
| +  TestPermissionContext permission_context(
 | 
| +      profile()->GetOffTheRecordProfile(),
 | 
| +      content::PermissionType::NOTIFICATIONS,
 | 
| +      CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
 | 
| +  GURL url("http://www.google.com");
 | 
| +  content::WebContentsTester::For(web_contents())->NavigateAndCommit(url);
 | 
| +
 | 
| +  const PermissionRequestID id(web_contents()->GetRenderProcessHost()->GetID(),
 | 
| +                               web_contents()->GetMainFrame()->GetRoutingID(),
 | 
| +                               -1);
 | 
| +
 | 
| +  scoped_refptr<base::SingleThreadTaskRunner> old_task_runner(
 | 
| +      base::MessageLoop::current()->task_runner());
 | 
| +  scoped_refptr<base::TestMockTimeTaskRunner> task_runner(
 | 
| +      new base::TestMockTimeTaskRunner(base::Time::Now(),
 | 
| +                                       base::TimeTicks::Now()));
 | 
| +  base::MessageLoop::current()->SetTaskRunner(task_runner);
 | 
| +
 | 
| +  permission_context.RequestPermission(
 | 
| +      web_contents(), id, url, true /* user_gesture */,
 | 
| +      base::Bind(&TestPermissionContext::TrackPermissionDecision,
 | 
| +                 base::Unretained(&permission_context)));
 | 
| +
 | 
| +  // Should be blocked after 1-2 seconds, but the timer is reset whenever the
 | 
| +  // tab is not visible, so these 500ms never add up to >= 1 second.
 | 
| +  for (int n = 0; n < 10; n++) {
 | 
| +    web_contents()->WasShown();
 | 
| +    task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(500));
 | 
| +    web_contents()->WasHidden();
 | 
| +  }
 | 
| +
 | 
| +  EXPECT_FALSE(permission_context.permission_set());
 | 
| +  EXPECT_FALSE(permission_context.tab_context_updated());
 | 
| +  EXPECT_EQ(CONTENT_SETTING_ASK,
 | 
| +            permission_context.GetContentSettingFromMap(url, url));
 | 
| +
 | 
| +  // Time elapsed whilst hidden is not counted.
 | 
| +  // n.b. This line also clears out any old scheduled timer tasks. This is
 | 
| +  // important, because otherwise Timer::Reset (triggered by
 | 
| +  // VisibilityTimerTabHelper::WasShown) may choose to re-use an existing
 | 
| +  // scheduled task, and when it fires Timer::RunScheduledTask will call
 | 
| +  // TimeTicks::Now() (which unlike task_runner->NowTicks(), we can't fake),
 | 
| +  // and miscalculate the remaining delay at which to fire the timer.
 | 
| +  task_runner->FastForwardBy(base::TimeDelta::FromDays(1));
 | 
| +
 | 
| +  EXPECT_FALSE(permission_context.permission_set());
 | 
| +  EXPECT_FALSE(permission_context.tab_context_updated());
 | 
| +  EXPECT_EQ(CONTENT_SETTING_ASK,
 | 
| +            permission_context.GetContentSettingFromMap(url, url));
 | 
| +
 | 
| +  // Should be blocked after 1-2 seconds. So 500ms is not enough.
 | 
| +  web_contents()->WasShown();
 | 
| +  task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(500));
 | 
| +
 | 
| +  EXPECT_FALSE(permission_context.permission_set());
 | 
| +  EXPECT_FALSE(permission_context.tab_context_updated());
 | 
| +  EXPECT_EQ(CONTENT_SETTING_ASK,
 | 
| +            permission_context.GetContentSettingFromMap(url, url));
 | 
| +
 | 
| +  // But 5*500ms > 2 seconds, so it should now be blocked.
 | 
| +  for (int n = 0; n < 4; n++)
 | 
| +    task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(500));
 | 
| +
 | 
| +  EXPECT_TRUE(permission_context.permission_set());
 | 
| +  EXPECT_TRUE(permission_context.tab_context_updated());
 | 
| +  EXPECT_EQ(CONTENT_SETTING_BLOCK,
 | 
| +            permission_context.GetContentSettingFromMap(url, url));
 | 
| +
 | 
| +  base::MessageLoop::current()->SetTaskRunner(old_task_runner);
 | 
| +}
 | 
| +#endif
 | 
| +
 | 
|  // Tests the global kill switch by enabling/disabling the Field Trials.
 | 
|  TEST_F(PermissionContextBaseTests, TestGlobalKillSwitch) {
 | 
|    TestGlobalPermissionsKillSwitch(content::PermissionType::GEOLOCATION,
 | 
| 
 |