| 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 9ae3a305414dee56dd96abfacef9508e28c93f37..d9cdac3aea654df7fc0cde70c468dbf66bee82cd 100644
|
| --- a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
|
| +++ b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
|
| @@ -21,6 +21,9 @@
|
| #include "chrome/browser/content_settings/tab_specific_content_settings.h"
|
| #include "chrome/browser/geolocation/geolocation_permission_context_factory.h"
|
| #include "chrome/browser/infobars/infobar_service.h"
|
| +#include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
|
| +#include "chrome/browser/ui/website_settings/permission_bubble_request.h"
|
| +#include "chrome/browser/ui/website_settings/permission_bubble_view.h"
|
| #include "chrome/test/base/chrome_render_view_host_test_harness.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| #include "components/infobars/core/confirm_infobar_delegate.h"
|
| @@ -32,6 +35,7 @@
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/test/mock_render_process_host.h"
|
| #include "content/public/test/test_renderer_host.h"
|
| +#include "content/public/test/test_utils.h"
|
| #include "content/public/test/web_contents_tester.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -47,6 +51,37 @@
|
|
|
| using content::MockRenderProcessHost;
|
|
|
| +class MockPermissionBubbleView : public PermissionBubbleView {
|
| + public:
|
| + MockPermissionBubbleView() : shown_(false) {}
|
| + virtual ~MockPermissionBubbleView() {}
|
| +
|
| + virtual void SetDelegate(Delegate* delegate) OVERRIDE {
|
| + }
|
| +
|
| + virtual void Show(
|
| + const std::vector<PermissionBubbleRequest*>& requests,
|
| + const std::vector<bool>& accept_state,
|
| + bool customization_mode) OVERRIDE {
|
| +LOG(INFO) << "Showing view... " << requests[0]->GetMessageText();
|
| + shown_ = true;
|
| + }
|
| +
|
| + virtual bool CanAcceptRequestUpdate() OVERRIDE {
|
| + return true;
|
| + }
|
| +
|
| + virtual void Hide() OVERRIDE {
|
| + shown_ = false;
|
| + }
|
| +
|
| + virtual bool IsVisible() OVERRIDE {
|
| + return shown_;
|
| + }
|
| +
|
| + private:
|
| + bool shown_;
|
| +};
|
|
|
| // ClosedInfoBarTracker -------------------------------------------------------
|
|
|
| @@ -118,10 +153,12 @@ class GeolocationPermissionContextTests
|
|
|
| void RequestGeolocationPermission(content::WebContents* web_contents,
|
| const PermissionRequestID& id,
|
| - const GURL& requesting_frame);
|
| + const GURL& requesting_frame,
|
| + bool user_gesture);
|
| void RequestGeolocationPermission(content::WebContents* web_contents,
|
| const PermissionRequestID& id,
|
| const GURL& requesting_frame,
|
| + bool user_gesture,
|
| base::Closure* cancel_callback);
|
| void PermissionResponse(const PermissionRequestID& id,
|
| bool allowed);
|
| @@ -133,9 +170,15 @@ class GeolocationPermissionContextTests
|
| void AddNewTab(const GURL& url);
|
| void CheckTabContentsState(const GURL& requesting_frame,
|
| ContentSetting expected_content_setting);
|
| + base::string16 GetFirstRequestText(PermissionBubbleManager* mgr);
|
| + int GetBubblesQueueSize(PermissionBubbleManager* mgr);
|
| + void AcceptBubble(PermissionBubbleManager* mgr);
|
| + void DenyBubble(PermissionBubbleManager* mgr);
|
| + void BubbleManagerDocumentLoadCompleted();
|
|
|
| scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_;
|
| ClosedInfoBarTracker closed_infobar_tracker_;
|
| + MockPermissionBubbleView bubble_view_;
|
| ScopedVector<content::WebContents> extra_tabs_;
|
|
|
| // A map between renderer child id and a pair represending the bridge id and
|
| @@ -165,17 +208,20 @@ PermissionRequestID GeolocationPermissionContextTests::RequestIDForTab(
|
| void GeolocationPermissionContextTests::RequestGeolocationPermission(
|
| content::WebContents* web_contents,
|
| const PermissionRequestID& id,
|
| - const GURL& requesting_frame) {
|
| - RequestGeolocationPermission(web_contents, id, requesting_frame, NULL);
|
| + const GURL& requesting_frame,
|
| + bool user_gesture) {
|
| + RequestGeolocationPermission(web_contents, id, requesting_frame,
|
| + user_gesture, NULL);
|
| }
|
|
|
| void GeolocationPermissionContextTests::RequestGeolocationPermission(
|
| content::WebContents* web_contents,
|
| const PermissionRequestID& id,
|
| const GURL& requesting_frame,
|
| + bool user_gesture,
|
| base::Closure* cancel_callback) {
|
| geolocation_permission_context_->RequestGeolocationPermission(
|
| - web_contents, id.bridge_id(), requesting_frame, false,
|
| + web_contents, id.bridge_id(), requesting_frame, user_gesture,
|
| base::Bind(&GeolocationPermissionContextTests::PermissionResponse,
|
| base::Unretained(this), id),
|
| cancel_callback);
|
| @@ -238,13 +284,16 @@ void GeolocationPermissionContextTests::CheckTabContentsState(
|
| TabSpecificContentSettings::FromWebContents(web_contents());
|
| const ContentSettingsUsagesState::StateMap& state_map =
|
| content_settings->geolocation_usages_state().state_map();
|
| - EXPECT_EQ(1U, state_map.count(requesting_frame.GetOrigin()));
|
| - EXPECT_EQ(0U, state_map.count(requesting_frame));
|
| + EXPECT_EQ(1U, state_map.count(requesting_frame.GetOrigin()))
|
| + << " for " << requesting_frame.spec();
|
| + EXPECT_EQ(0U, state_map.count(requesting_frame))
|
| + << " for " << requesting_frame.spec();
|
| ContentSettingsUsagesState::StateMap::const_iterator settings =
|
| state_map.find(requesting_frame.GetOrigin());
|
| ASSERT_FALSE(settings == state_map.end())
|
| << "geolocation state not found " << requesting_frame;
|
| - EXPECT_EQ(expected_content_setting, settings->second);
|
| + EXPECT_EQ(expected_content_setting, settings->second)
|
| + << " for " << requesting_frame.spec();
|
| }
|
|
|
| void GeolocationPermissionContextTests::SetUp() {
|
| @@ -261,6 +310,10 @@ void GeolocationPermissionContextTests::SetUp() {
|
| #endif
|
| geolocation_permission_context_ =
|
| GeolocationPermissionContextFactory::GetForProfile(profile());
|
| +
|
| + PermissionBubbleManager::CreateForWebContents(web_contents());
|
| + PermissionBubbleManager::FromWebContents(web_contents())->SetView(
|
| + &bubble_view_);
|
| }
|
|
|
| void GeolocationPermissionContextTests::TearDown() {
|
| @@ -268,13 +321,42 @@ void GeolocationPermissionContextTests::TearDown() {
|
| ChromeRenderViewHostTestHarness::TearDown();
|
| }
|
|
|
| +base::string16 GeolocationPermissionContextTests::GetFirstRequestText(
|
| + PermissionBubbleManager* mgr) {
|
| + return mgr->requests_.front()->GetMessageText();
|
| +}
|
| +
|
| +int GeolocationPermissionContextTests::GetBubblesQueueSize(
|
| + PermissionBubbleManager* mgr) {
|
| + return static_cast<int>(mgr->requests_.size());
|
| +}
|
| +
|
| +void GeolocationPermissionContextTests::AcceptBubble(
|
| + PermissionBubbleManager* mgr) {
|
| + mgr->Accept();
|
| +}
|
| +
|
| +void GeolocationPermissionContextTests::DenyBubble(
|
| + PermissionBubbleManager* mgr) {
|
| + mgr->Deny();
|
| +}
|
| +
|
| +void GeolocationPermissionContextTests::BubbleManagerDocumentLoadCompleted() {
|
| + PermissionBubbleManager::FromWebContents(web_contents())->
|
| + DocumentOnLoadCompletedInMainFrame();
|
| +}
|
| +
|
| // Tests ----------------------------------------------------------------------
|
|
|
| -TEST_F(GeolocationPermissionContextTests, SinglePermission) {
|
| +TEST_F(GeolocationPermissionContextTests, SinglePermissionInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL requesting_frame("http://www.example.com/geolocation");
|
| NavigateAndCommit(requesting_frame);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
| infobars::InfoBar* infobar = infobar_service()->infobar_at(0);
|
| ConfirmInfoBarDelegate* infobar_delegate =
|
| @@ -286,13 +368,29 @@ TEST_F(GeolocationPermissionContextTests, SinglePermission) {
|
| EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar));
|
| }
|
|
|
| +TEST_F(GeolocationPermissionContextTests, SinglePermissionBubble) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + GURL requesting_frame("http://www.example.com/geolocation");
|
| + NavigateAndCommit(requesting_frame);
|
| + BubbleManagerDocumentLoadCompleted();
|
| + EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| +}
|
| +
|
| #if defined(OS_ANDROID)
|
| TEST_F(GeolocationPermissionContextTests, GeolocationEnabledDisabled) {
|
| GURL requesting_frame("http://www.example.com/geolocation");
|
| NavigateAndCommit(requesting_frame);
|
| MockGoogleLocationSettingsHelper::SetLocationStatus(true, true);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| EXPECT_EQ(1U, infobar_service()->infobar_count());
|
| ConfirmInfoBarDelegate* infobar_delegate_0 =
|
| infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
|
| @@ -303,7 +401,8 @@ TEST_F(GeolocationPermissionContextTests, GeolocationEnabledDisabled) {
|
| Reload();
|
| MockGoogleLocationSettingsHelper::SetLocationStatus(true, false);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| }
|
|
|
| @@ -312,7 +411,8 @@ TEST_F(GeolocationPermissionContextTests, MasterEnabledGoogleAppsEnabled) {
|
| NavigateAndCommit(requesting_frame);
|
| MockGoogleLocationSettingsHelper::SetLocationStatus(true, true);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| EXPECT_EQ(1U, infobar_service()->infobar_count());
|
| ConfirmInfoBarDelegate* infobar_delegate =
|
| infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
|
| @@ -327,12 +427,16 @@ TEST_F(GeolocationPermissionContextTests, MasterEnabledGoogleAppsDisabled) {
|
| NavigateAndCommit(requesting_frame);
|
| MockGoogleLocationSettingsHelper::SetLocationStatus(true, false);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| }
|
| #endif
|
|
|
| -TEST_F(GeolocationPermissionContextTests, QueuedPermission) {
|
| +TEST_F(GeolocationPermissionContextTests, QueuedPermissionInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL requesting_frame_0("http://www.example.com/geolocation");
|
| GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| EXPECT_EQ(CONTENT_SETTING_ASK,
|
| @@ -348,9 +452,9 @@ TEST_F(GeolocationPermissionContextTests, QueuedPermission) {
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| // Request permission for two frames.
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(0), requesting_frame_0);
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(1), requesting_frame_1);
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| // Ensure only one infobar is created.
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
| infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0);
|
| @@ -398,14 +502,76 @@ TEST_F(GeolocationPermissionContextTests, QueuedPermission) {
|
| CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, HashIsIgnored) {
|
| +TEST_F(GeolocationPermissionContextTests, QueuedPermissionBubble) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + GURL requesting_frame_0("http://www.example.com/geolocation");
|
| + GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_0, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_1, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + NavigateAndCommit(requesting_frame_0);
|
| + BubbleManagerDocumentLoadCompleted();
|
| +
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + ASSERT_EQ(0, GetBubblesQueueSize(mgr));
|
| +
|
| + // Request permission for two frames.
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| + // Only main frame permission shown.
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| + base::string16 text_0 = GetFirstRequestText(mgr);
|
| +
|
| + // Accept the first frame.
|
| + AcceptBubble(mgr);
|
| + CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
|
| + CheckPermissionMessageSent(0, true);
|
| +
|
| + // Now we should have a new bubble for the second frame.
|
| + EXPECT_EQ(1, GetBubblesQueueSize(mgr));
|
| +
|
| + base::string16 text_1 = GetFirstRequestText(mgr);
|
| + EXPECT_NE(text_0, text_1);
|
| +
|
| + // Cancel (block) this frame.
|
| + DenyBubble(mgr);
|
| + CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK);
|
| + CheckPermissionMessageSent(1, false);
|
| +
|
| + // Ensure the persisted permissions are ok.
|
| + EXPECT_EQ(CONTENT_SETTING_ALLOW,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_0, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + EXPECT_EQ(CONTENT_SETTING_BLOCK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_1, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +}
|
| +
|
| +TEST_F(GeolocationPermissionContextTests, UrlFragmentIsIgnoredInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL url_a("http://www.example.com/geolocation#a");
|
| GURL url_b("http://www.example.com/geolocation#b");
|
|
|
| // Navigate to the first url and check permission is requested.
|
| NavigateAndCommit(url_a);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), url_a);
|
| + RequestGeolocationPermission(web_contents(), RequestID(0), url_a, true);
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
| infobars::InfoBar* infobar = infobar_service()->infobar_at(0);
|
| ConfirmInfoBarDelegate* infobar_delegate =
|
| @@ -427,11 +593,45 @@ TEST_F(GeolocationPermissionContextTests, HashIsIgnored) {
|
| EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar));
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, PermissionForFileScheme) {
|
| +TEST_F(GeolocationPermissionContextTests, UrlFragmentIsIgnoredBubble) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + GURL url_a("http://www.example.com/geolocation#a");
|
| + GURL url_b("http://www.example.com/geolocation#b");
|
| +
|
| + // Navigate to the first url and check permission is requested.
|
| + NavigateAndCommit(url_a);
|
| + BubbleManagerDocumentLoadCompleted();
|
| +
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + ASSERT_EQ(0, GetBubblesQueueSize(mgr));
|
| +
|
| + RequestGeolocationPermission(web_contents(), RequestID(0), url_a, true);
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| +
|
| + // Change the hash, we'll still be on the same page.
|
| + NavigateAndCommit(url_b);
|
| + BubbleManagerDocumentLoadCompleted();
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| +
|
| + // Accept.
|
| + AcceptBubble(mgr);
|
| + CheckTabContentsState(url_a, CONTENT_SETTING_ALLOW);
|
| + CheckTabContentsState(url_b, CONTENT_SETTING_ALLOW);
|
| + CheckPermissionMessageSent(0, true);
|
| +}
|
| +
|
| +TEST_F(GeolocationPermissionContextTests, PermissionForFileSchemeInfobars) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL requesting_frame("file://example/geolocation.html");
|
| NavigateAndCommit(requesting_frame);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| EXPECT_EQ(1U, infobar_service()->infobar_count());
|
| infobars::InfoBar* infobar = infobar_service()->infobar_at(0);
|
| ConfirmInfoBarDelegate* infobar_delegate =
|
| @@ -452,7 +652,40 @@ TEST_F(GeolocationPermissionContextTests, PermissionForFileScheme) {
|
| std::string()));
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, CancelGeolocationPermissionRequest) {
|
| +TEST_F(GeolocationPermissionContextTests, PermissionForFileSchemeBubbles) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + GURL requesting_frame("file://example/geolocation.html");
|
| + NavigateAndCommit(requesting_frame);
|
| + BubbleManagerDocumentLoadCompleted();
|
| +
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + ASSERT_EQ(0, GetBubblesQueueSize(mgr));
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| +
|
| + // Accept the frame.
|
| + AcceptBubble(mgr);
|
| + CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW);
|
| + CheckPermissionMessageSent(0, true);
|
| +
|
| + // Make sure the setting is not stored.
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame,
|
| + requesting_frame,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION,
|
| + std::string()));
|
| +}
|
| +
|
| +TEST_F(GeolocationPermissionContextTests,
|
| + CancelGeolocationPermissionRequestInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL requesting_frame_0("http://www.example.com/geolocation");
|
| GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| EXPECT_EQ(CONTENT_SETTING_ASK,
|
| @@ -470,9 +703,9 @@ TEST_F(GeolocationPermissionContextTests, CancelGeolocationPermissionRequest) {
|
| // Request permission for two frames.
|
| base::Closure cancel_callback;
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(0), requesting_frame_0, &cancel_callback);
|
| + web_contents(), RequestID(0), requesting_frame_0, true, &cancel_callback);
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(1), requesting_frame_1);
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
|
|
| infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0);
|
| @@ -516,17 +749,80 @@ TEST_F(GeolocationPermissionContextTests, CancelGeolocationPermissionRequest) {
|
| CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| }
|
|
|
| +TEST_F(GeolocationPermissionContextTests,
|
| + CancelGeolocationPermissionRequestBubbles) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + GURL requesting_frame_0("http://www.example.com/geolocation");
|
| + GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_0, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_1, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + NavigateAndCommit(requesting_frame_0);
|
| + BubbleManagerDocumentLoadCompleted();
|
| + EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| + // Request permission for two frames.
|
| + base::Closure cancel_callback;
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame_0, true, &cancel_callback);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| +
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + ASSERT_TRUE(mgr != NULL);
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| + base::string16 text_0 = GetFirstRequestText(mgr);
|
| + ASSERT_NE(base::string16(), text_0);
|
| +
|
| + // Cancel the request. This will still leave the bubble showing, since
|
| + // the request is showing in the view. It will just be dummied.
|
| + cancel_callback.Run();
|
| + AcceptBubble(mgr); // Dummy accept
|
| + base::string16 text_1 = GetFirstRequestText(mgr);
|
| + EXPECT_NE(text_0, text_1);
|
| +
|
| + // Allow this frame.
|
| + AcceptBubble(mgr);
|
| + CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW);
|
| + CheckPermissionMessageSent(1, true);
|
| + EXPECT_EQ(0, GetBubblesQueueSize(mgr));
|
| +
|
| + // Ensure the persisted permissions are ok.
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_0, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + EXPECT_EQ(CONTENT_SETTING_ALLOW,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_1, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +}
|
| +
|
| TEST_F(GeolocationPermissionContextTests, InvalidURL) {
|
| GURL invalid_embedder("about:blank");
|
| GURL requesting_frame;
|
| NavigateAndCommit(invalid_embedder);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| CheckPermissionMessageSent(0, false);
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) {
|
| +TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabsInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL url_a("http://www.example.com/geolocation");
|
| GURL url_b("http://www.example-2.com/geolocation");
|
| NavigateAndCommit(url_a);
|
| @@ -534,13 +830,15 @@ TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) {
|
| AddNewTab(url_a);
|
|
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), url_a);
|
| + RequestGeolocationPermission(web_contents(), RequestID(0), url_a, true);
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
|
|
| - RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 0), url_b);
|
| + RequestGeolocationPermission(
|
| + extra_tabs_[0], RequestIDForTab(0, 0), url_b, true);
|
| EXPECT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
|
|
|
| - RequestGeolocationPermission(extra_tabs_[1], RequestIDForTab(1, 0), url_a);
|
| + RequestGeolocationPermission(
|
| + extra_tabs_[1], RequestIDForTab(1, 0), url_a, true);
|
| ASSERT_EQ(1U, infobar_service_for_tab(1)->infobar_count());
|
|
|
| infobars::InfoBar* removed_infobar =
|
| @@ -574,20 +872,25 @@ TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) {
|
| EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1));
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) {
|
| +TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabsInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL url_a("http://www.example.com/geolocation");
|
| GURL url_b("http://www.example-2.com/geolocation");
|
| NavigateAndCommit(url_a);
|
| AddNewTab(url_a);
|
|
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), url_a);
|
| + RequestGeolocationPermission(web_contents(), RequestID(0), url_a, true);
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
|
|
| - RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 0), url_a);
|
| + RequestGeolocationPermission(
|
| + extra_tabs_[0], RequestIDForTab(0, 0), url_a, true);
|
| EXPECT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
|
|
|
| - RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 1), url_b);
|
| + RequestGeolocationPermission(
|
| + extra_tabs_[0], RequestIDForTab(0, 1), url_b, true);
|
| ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
|
|
|
| infobars::InfoBar* removed_infobar = infobar_service()->infobar_at(0);
|
| @@ -623,7 +926,10 @@ TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) {
|
| EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1));
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, TabDestroyed) {
|
| +TEST_F(GeolocationPermissionContextTests, TabDestroyedInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL requesting_frame_0("http://www.example.com/geolocation");
|
| GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| EXPECT_EQ(CONTENT_SETTING_ASK,
|
| @@ -640,9 +946,9 @@ TEST_F(GeolocationPermissionContextTests, TabDestroyed) {
|
| EXPECT_EQ(0U, infobar_service()->infobar_count());
|
| // Request permission for two frames.
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(0), requesting_frame_0);
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(1), requesting_frame_1);
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| // Ensure only one infobar is created.
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
| infobars::InfoBar* infobar = infobar_service()->infobar_at(0);
|
| @@ -656,7 +962,48 @@ TEST_F(GeolocationPermissionContextTests, TabDestroyed) {
|
| ASSERT_TRUE(closed_infobar_tracker_.Contains(infobar));
|
| }
|
|
|
| +TEST_F(GeolocationPermissionContextTests, TabDestroyedBubbles) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + GURL requesting_frame_0("http://www.example.com/geolocation");
|
| + GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_0, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + EXPECT_EQ(CONTENT_SETTING_ASK,
|
| + profile()->GetHostContentSettingsMap()->GetContentSetting(
|
| + requesting_frame_1, requesting_frame_0,
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
|
| +
|
| + NavigateAndCommit(requesting_frame_0);
|
| + BubbleManagerDocumentLoadCompleted();
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + ASSERT_TRUE(mgr != NULL);
|
| + ASSERT_EQ(0, GetBubblesQueueSize(mgr));
|
| +
|
| + // Request permission for two frames.
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| + // Ensure only one bubble request is shown.
|
| + ASSERT_EQ(1, GetBubblesQueueSize(mgr));
|
| +
|
| + // Delete the tab contents.
|
| + DeleteContents();
|
| +
|
| + // During contents destruction, the bubble will have been closed, and the
|
| + // pending request should have been cleared without a bubble being shown.
|
| +}
|
| +
|
| TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| GURL requesting_frame_0("http://www.example.com/geolocation");
|
| GURL requesting_frame_1("http://www.example-2.com/geolocation");
|
| NavigateAndCommit(requesting_frame_0);
|
| @@ -667,7 +1014,7 @@ TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) {
|
| web_contents()->GetController().GoBack();
|
| // Request permission for the committed frame (not the pending one).
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(0), requesting_frame_1);
|
| + web_contents(), RequestID(0), requesting_frame_1, true);
|
| // Ensure the infobar is created.
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
| infobars::InfoBarDelegate* infobar_delegate =
|
| @@ -705,13 +1052,22 @@ TEST_F(GeolocationPermissionContextTests, LastUsageAudited) {
|
| 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();
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
| +
|
| + if (!PermissionBubbleManager::Enabled()) {
|
| + 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();
|
| + } else {
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + AcceptBubble(mgr);
|
| + }
|
| +
|
| CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW);
|
| CheckPermissionMessageSent(0, true);
|
|
|
| @@ -722,7 +1078,8 @@ TEST_F(GeolocationPermissionContextTests, LastUsageAudited) {
|
| 10);
|
|
|
| test_clock->Advance(base::TimeDelta::FromSeconds(3));
|
| - RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame, true);
|
|
|
| // Permission has been used three seconds later.
|
| EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(),
|
| @@ -731,7 +1088,11 @@ TEST_F(GeolocationPermissionContextTests, LastUsageAudited) {
|
| 13);
|
| }
|
|
|
| -TEST_F(GeolocationPermissionContextTests, LastUsageAuditedMultipleFrames) {
|
| +TEST_F(GeolocationPermissionContextTests,
|
| + LastUsageAuditedMultipleFramesInfobar) {
|
| + if (PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| base::SimpleTestClock* test_clock = new base::SimpleTestClock;
|
| test_clock->SetNow(base::Time::UnixEpoch() +
|
| base::TimeDelta::FromSeconds(10));
|
| @@ -757,9 +1118,9 @@ TEST_F(GeolocationPermissionContextTests, LastUsageAuditedMultipleFrames) {
|
|
|
| // Request permission for two frames.
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(0), requesting_frame_0);
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(1), requesting_frame_1);
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
|
|
| // Ensure only one infobar is created.
|
| ASSERT_EQ(1U, infobar_service()->infobar_count());
|
| @@ -769,6 +1130,7 @@ TEST_F(GeolocationPermissionContextTests, LastUsageAuditedMultipleFrames) {
|
|
|
| // Accept the first frame.
|
| infobar_delegate_0->Accept();
|
| +
|
| CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
|
| CheckPermissionMessageSent(0, true);
|
| infobar_service()->RemoveInfoBar(infobar_0);
|
| @@ -809,7 +1171,96 @@ TEST_F(GeolocationPermissionContextTests, LastUsageAuditedMultipleFrames) {
|
|
|
| test_clock->Advance(base::TimeDelta::FromSeconds(2));
|
| RequestGeolocationPermission(
|
| - web_contents(), RequestID(0), requesting_frame_0);
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| +
|
| + // 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);
|
| +}
|
| +
|
| +TEST_F(GeolocationPermissionContextTests,
|
| + LastUsageAuditedMultipleFramesBubble) {
|
| + if (!PermissionBubbleManager::Enabled())
|
| + return;
|
| +
|
| + 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);
|
| + BubbleManagerDocumentLoadCompleted();
|
| + PermissionBubbleManager* mgr =
|
| + PermissionBubbleManager::FromWebContents(web_contents());
|
| + EXPECT_EQ(0, GetBubblesQueueSize(mgr));
|
| +
|
| + // Request permission for two frames.
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(0), requesting_frame_0, true);
|
| + RequestGeolocationPermission(
|
| + web_contents(), RequestID(1), requesting_frame_1, true);
|
| + EXPECT_EQ(1, GetBubblesQueueSize(mgr)); // 1 in request queue, 1 in pending
|
| + content::RunAllPendingInMessageLoop();
|
| +
|
| + // Accept the first frame.
|
| + AcceptBubble(mgr);
|
| +
|
| +LOG(INFO) << "Checking state after accepting requesting_frame_0";
|
| + CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
|
| + CheckPermissionMessageSent(0, true);
|
| +
|
| + // 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);
|
| +
|
| + test_clock->Advance(base::TimeDelta::FromSeconds(1));
|
| + AcceptBubble(mgr);
|
| +LOG(INFO) << "Checking state after accepting second bubble.";
|
| + CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW);
|
| + CheckPermissionMessageSent(1, true);
|
| +
|
| + // 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, true);
|
|
|
| // Verify that requesting permission in one frame doesn't update other where
|
| // it is the embedder.
|
|
|