Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4080)

Unified Diff: chrome/browser/geolocation/geolocation_permission_context_unittest.cc

Issue 356543003: Audit the last usage of Geolocation and Notification permissions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Jam nits. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/geolocation/geolocation_permission_context_unittest.cc
diff --git a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
index f011ac355f98f91ab2ed5b8955d512c218fb18c4..b243ce6edda42370a22228032080bb10fc48a818 100644
--- a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
+++ b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
@@ -13,6 +13,8 @@
#include "base/memory/scoped_vector.h"
#include "base/run_loop.h"
#include "base/synchronization/waitable_event.h"
+#include "base/test/simple_test_clock.h"
+#include "base/time/clock.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/content_settings/permission_request_id.h"
@@ -696,3 +698,139 @@ TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) {
// Delete the tab contents.
DeleteContents();
}
+
+TEST_F(GeolocationPermissionContextTests, LastUsageAudited) {
+ GURL requesting_frame("http://www.example.com/geolocation");
+ NavigateAndCommit(requesting_frame);
+
+ base::SimpleTestClock* test_clock = new base::SimpleTestClock;
Bernhard Bauer 2014/07/17 09:11:48 And here.
+ test_clock->SetNow(base::Time::UnixEpoch() +
+ base::TimeDelta::FromSeconds(10));
+
+ HostContentSettingsMap* map = profile()->GetHostContentSettingsMap();
+ map->SetPrefClockForTesting(scoped_ptr<base::Clock>(test_clock));
+
+ // The permission shouldn't have been used yet.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(),
+ requesting_frame.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 0);
+
+ EXPECT_EQ(0U, infobar_service()->infobar_count());
+ RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
+ ASSERT_EQ(1U, infobar_service()->infobar_count());
+ infobars::InfoBar* infobar = infobar_service()->infobar_at(0);
+ ConfirmInfoBarDelegate* infobar_delegate =
+ infobar->delegate()->AsConfirmInfoBarDelegate();
+ ASSERT_TRUE(infobar_delegate);
+ infobar_delegate->Accept();
+ CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW);
+ CheckPermissionMessageSent(0, true);
+
+ // Permission has been used at the starting time.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(),
+ requesting_frame.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 10);
+
+ test_clock->Advance(base::TimeDelta::FromSeconds(3));
+ RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
+
+ // Permission has been used three seconds later.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(),
+ requesting_frame.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 13);
+}
+
+TEST_F(GeolocationPermissionContextTests, LastUsageAuditedMultipleFrames) {
+ base::SimpleTestClock* test_clock = new base::SimpleTestClock;
+ test_clock->SetNow(base::Time::UnixEpoch() +
+ base::TimeDelta::FromSeconds(10));
+
+ HostContentSettingsMap* map = profile()->GetHostContentSettingsMap();
+ map->SetPrefClockForTesting(scoped_ptr<base::Clock>(test_clock));
+
+ GURL requesting_frame_0("http://www.example.com/geolocation");
+ GURL requesting_frame_1("http://www.example-2.com/geolocation");
+
+ // The permission shouldn't have been used yet.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 0);
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 0);
+
+ NavigateAndCommit(requesting_frame_0);
+ EXPECT_EQ(0U, infobar_service()->infobar_count());
+
+ // Request permission for two frames.
+ RequestGeolocationPermission(
+ web_contents(), RequestID(0), requesting_frame_0);
+ RequestGeolocationPermission(
+ web_contents(), RequestID(1), requesting_frame_1);
+
+ // Ensure only one infobar is created.
+ ASSERT_EQ(1U, infobar_service()->infobar_count());
+ infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0);
+ ConfirmInfoBarDelegate* infobar_delegate_0 =
+ infobar_0->delegate()->AsConfirmInfoBarDelegate();
+
+ // Accept the first frame.
+ infobar_delegate_0->Accept();
+ CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
+ CheckPermissionMessageSent(0, true);
+ infobar_service()->RemoveInfoBar(infobar_0);
+
+ // Verify that accepting the first didn't accept because it's embedder
+ // in the other.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 10);
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 0);
+
+ ASSERT_EQ(1U, infobar_service()->infobar_count());
+ infobars::InfoBar* infobar_1 = infobar_service()->infobar_at(0);
+ ConfirmInfoBarDelegate* infobar_delegate_1 =
+ infobar_1->delegate()->AsConfirmInfoBarDelegate();
+
+ test_clock->Advance(base::TimeDelta::FromSeconds(1));
+
+ // Allow the second frame.
+ infobar_delegate_1->Accept();
+ CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW);
+ CheckPermissionMessageSent(1, true);
+ infobar_service()->RemoveInfoBar(infobar_1);
+
+ // Verify that the times are different.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 10);
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 11);
+
+ test_clock->Advance(base::TimeDelta::FromSeconds(2));
+ RequestGeolocationPermission(
+ web_contents(), RequestID(0), requesting_frame_0);
+
+ // Verify that requesting permission in one frame doesn't update other where
+ // it is the embedder.
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 13);
+ EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(),
+ requesting_frame_0.GetOrigin(),
+ CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(),
+ 11);
+}

Powered by Google App Engine
This is Rietveld 408576698