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

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

Issue 330143002: Simplify geolocation permission request in the Content API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 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/chrome_geolocation_permission_context_unittest.cc
diff --git a/chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc b/chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc
deleted file mode 100644
index 57d805034673633385c45716dd8c7f4909169fb5..0000000000000000000000000000000000000000
--- a/chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc
+++ /dev/null
@@ -1,697 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h"
-
-#include <set>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/containers/hash_tables.h"
-#include "base/memory/scoped_vector.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.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"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/geolocation/chrome_geolocation_permission_context_factory.h"
-#include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/infobars/infobar_service.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"
-#include "components/infobars/core/infobar.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/navigation_details.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/notification_service.h"
-#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/web_contents_tester.h"
-#include "extensions/browser/view_type_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/prefs/pref_service.h"
-#include "chrome/browser/android/mock_google_location_settings_helper.h"
-#include "chrome/common/pref_names.h"
-#endif
-
-using content::MockRenderProcessHost;
-
-
-// ClosedInfoBarTracker -------------------------------------------------------
-
-// We need to track which infobars were closed.
-class ClosedInfoBarTracker : public content::NotificationObserver {
- public:
- ClosedInfoBarTracker();
- virtual ~ClosedInfoBarTracker();
-
- // content::NotificationObserver:
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE;
-
- size_t size() const { return removed_infobars_.size(); }
-
- bool Contains(infobars::InfoBar* infobar) const;
- void Clear();
-
- private:
- FRIEND_TEST_ALL_PREFIXES(GeolocationPermissionContextTests, TabDestroyed);
- content::NotificationRegistrar registrar_;
- std::set<infobars::InfoBar*> removed_infobars_;
-};
-
-ClosedInfoBarTracker::ClosedInfoBarTracker() {
- registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
- content::NotificationService::AllSources());
-}
-
-ClosedInfoBarTracker::~ClosedInfoBarTracker() {
-}
-
-void ClosedInfoBarTracker::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK(type == chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED);
- removed_infobars_.insert(
- content::Details<infobars::InfoBar::RemovedDetails>(details)->first);
-}
-
-bool ClosedInfoBarTracker::Contains(infobars::InfoBar* infobar) const {
- return removed_infobars_.count(infobar) != 0;
-}
-
-void ClosedInfoBarTracker::Clear() {
- removed_infobars_.clear();
-}
-
-
-// GeolocationPermissionContextTests ------------------------------------------
-
-class GeolocationPermissionContextTests
- : public ChromeRenderViewHostTestHarness {
- protected:
- // ChromeRenderViewHostTestHarness:
- virtual void SetUp() OVERRIDE;
- virtual void TearDown() OVERRIDE;
-
- PermissionRequestID RequestID(int bridge_id);
- PermissionRequestID RequestIDForTab(int tab, int bridge_id);
- InfoBarService* infobar_service() {
- return InfoBarService::FromWebContents(web_contents());
- }
- InfoBarService* infobar_service_for_tab(int tab) {
- return InfoBarService::FromWebContents(extra_tabs_[tab]);
- }
-
- void RequestGeolocationPermission(content::WebContents* web_contents,
- const PermissionRequestID& id,
- const GURL& requesting_frame);
- void CancelGeolocationPermissionRequest(content::WebContents* web_contents,
- const PermissionRequestID& id,
- const GURL& requesting_frame);
- void PermissionResponse(const PermissionRequestID& id,
- bool allowed);
- void CheckPermissionMessageSent(int bridge_id, bool allowed);
- void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed);
- void CheckPermissionMessageSentInternal(MockRenderProcessHost* process,
- int bridge_id,
- bool allowed);
- void AddNewTab(const GURL& url);
- void CheckTabContentsState(const GURL& requesting_frame,
- ContentSetting expected_content_setting);
-
- scoped_refptr<ChromeGeolocationPermissionContext>
- geolocation_permission_context_;
- ClosedInfoBarTracker closed_infobar_tracker_;
- ScopedVector<content::WebContents> extra_tabs_;
-
- // A map between renderer child id and a pair represending the bridge id and
- // whether the requested permission was allowed.
- base::hash_map<int, std::pair<int, bool> > responses_;
-};
-
-PermissionRequestID GeolocationPermissionContextTests::RequestID(
- int bridge_id) {
- return PermissionRequestID(
- web_contents()->GetRenderProcessHost()->GetID(),
- web_contents()->GetRenderViewHost()->GetRoutingID(),
- bridge_id,
- GURL());
-}
-
-PermissionRequestID GeolocationPermissionContextTests::RequestIDForTab(
- int tab,
- int bridge_id) {
- return PermissionRequestID(
- extra_tabs_[tab]->GetRenderProcessHost()->GetID(),
- extra_tabs_[tab]->GetRenderViewHost()->GetRoutingID(),
- bridge_id,
- GURL());
-}
-
-void GeolocationPermissionContextTests::RequestGeolocationPermission(
- content::WebContents* web_contents,
- const PermissionRequestID& id,
- const GURL& requesting_frame) {
- geolocation_permission_context_->RequestGeolocationPermission(
- web_contents, id.bridge_id(), requesting_frame, false,
- base::Bind(&GeolocationPermissionContextTests::PermissionResponse,
- base::Unretained(this), id));
- content::BrowserThread::GetBlockingPool()->FlushForTesting();
- base::RunLoop().RunUntilIdle();
-}
-
-void GeolocationPermissionContextTests::CancelGeolocationPermissionRequest(
- content::WebContents* web_contents,
- const PermissionRequestID& id,
- const GURL& requesting_frame) {
- geolocation_permission_context_->CancelGeolocationPermissionRequest(
- web_contents, id.bridge_id(), requesting_frame);
-}
-
-void GeolocationPermissionContextTests::PermissionResponse(
- const PermissionRequestID& id,
- bool allowed) {
- responses_[id.render_process_id()] = std::make_pair(id.bridge_id(), allowed);
-}
-
-void GeolocationPermissionContextTests::CheckPermissionMessageSent(
- int bridge_id,
- bool allowed) {
- CheckPermissionMessageSentInternal(process(), bridge_id, allowed);
-}
-
-void GeolocationPermissionContextTests::CheckPermissionMessageSentForTab(
- int tab,
- int bridge_id,
- bool allowed) {
- CheckPermissionMessageSentInternal(static_cast<MockRenderProcessHost*>(
- extra_tabs_[tab]->GetRenderProcessHost()),
- bridge_id, allowed);
-}
-
-void GeolocationPermissionContextTests::CheckPermissionMessageSentInternal(
- MockRenderProcessHost* process,
- int bridge_id,
- bool allowed) {
- ASSERT_EQ(responses_.count(process->GetID()), 1U);
- EXPECT_EQ(bridge_id, responses_[process->GetID()].first);
- EXPECT_EQ(allowed, responses_[process->GetID()].second);
- responses_.erase(process->GetID());
-}
-
-void GeolocationPermissionContextTests::AddNewTab(const GURL& url) {
- content::WebContents* new_tab = content::WebContents::Create(
- content::WebContents::CreateParams(profile()));
- new_tab->GetController().LoadURL(
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
- content::RenderViewHostTester::For(new_tab->GetRenderViewHost())->
- SendNavigate(extra_tabs_.size() + 1, url);
-
- // Set up required helpers, and make this be as "tabby" as the code requires.
- extensions::SetViewType(new_tab, extensions::VIEW_TYPE_TAB_CONTENTS);
- InfoBarService::CreateForWebContents(new_tab);
-
- extra_tabs_.push_back(new_tab);
-}
-
-void GeolocationPermissionContextTests::CheckTabContentsState(
- const GURL& requesting_frame,
- ContentSetting expected_content_setting) {
- TabSpecificContentSettings* content_settings =
- 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));
- 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);
-}
-
-void GeolocationPermissionContextTests::SetUp() {
- ChromeRenderViewHostTestHarness::SetUp();
-
- // Set up required helpers, and make this be as "tabby" as the code requires.
- extensions::SetViewType(web_contents(), extensions::VIEW_TYPE_TAB_CONTENTS);
- InfoBarService::CreateForWebContents(web_contents());
- TabSpecificContentSettings::CreateForWebContents(web_contents());
-#if defined(OS_ANDROID)
- MockGoogleLocationSettingsHelper::SetLocationStatus(true, true);
-#endif
- geolocation_permission_context_ =
- ChromeGeolocationPermissionContextFactory::GetForProfile(profile());
-}
-
-void GeolocationPermissionContextTests::TearDown() {
- extra_tabs_.clear();
- ChromeRenderViewHostTestHarness::TearDown();
-}
-
-// Tests ----------------------------------------------------------------------
-
-TEST_F(GeolocationPermissionContextTests, SinglePermission) {
- 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);
- 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->Cancel();
- infobar_service()->RemoveInfoBar(infobar);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar));
-}
-
-#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);
- EXPECT_EQ(1U, infobar_service()->infobar_count());
- ConfirmInfoBarDelegate* infobar_delegate_0 =
- infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_0);
- base::string16 text_0 = infobar_delegate_0->GetButtonLabel(
- ConfirmInfoBarDelegate::BUTTON_OK);
-
- Reload();
- MockGoogleLocationSettingsHelper::SetLocationStatus(true, false);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
- EXPECT_EQ(1U, infobar_service()->infobar_count());
- ConfirmInfoBarDelegate* infobar_delegate_1 =
- infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_1);
- base::string16 text_1 = infobar_delegate_1->GetButtonLabel(
- ConfirmInfoBarDelegate::BUTTON_OK);
- EXPECT_NE(text_0, text_1);
-
- Reload();
- MockGoogleLocationSettingsHelper::SetLocationStatus(false, false);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
-}
-
-TEST_F(GeolocationPermissionContextTests, MasterEnabledGoogleAppsEnabled) {
- 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);
- EXPECT_EQ(1U, infobar_service()->infobar_count());
- ConfirmInfoBarDelegate* infobar_delegate =
- infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate);
- infobar_delegate->Accept();
- CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW);
- CheckPermissionMessageSent(0, true);
-}
-
-TEST_F(GeolocationPermissionContextTests, MasterEnabledGoogleAppsDisabled) {
- GURL requesting_frame("http://www.example.com/geolocation");
- NavigateAndCommit(requesting_frame);
- MockGoogleLocationSettingsHelper::SetLocationStatus(true, false);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
- EXPECT_EQ(1U, infobar_service()->infobar_count());
- ConfirmInfoBarDelegate* infobar_delegate =
- infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate);
- infobar_delegate->Accept();
- EXPECT_TRUE(
- MockGoogleLocationSettingsHelper::WasGoogleLocationSettingsCalled());
-}
-#endif
-
-TEST_F(GeolocationPermissionContextTests, QueuedPermission) {
- 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);
- 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();
- ASSERT_TRUE(infobar_delegate_0);
- base::string16 text_0 = infobar_delegate_0->GetMessageText();
-
- // Accept the first frame.
- infobar_delegate_0->Accept();
- CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
- CheckPermissionMessageSent(0, true);
-
- infobar_service()->RemoveInfoBar(infobar_0);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0));
- closed_infobar_tracker_.Clear();
- // Now we should have a new infobar for the second frame.
- ASSERT_EQ(1U, infobar_service()->infobar_count());
-
- infobars::InfoBar* infobar_1 = infobar_service()->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_1 =
- infobar_1->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_1);
- base::string16 text_1 = infobar_delegate_1->GetMessageText();
- EXPECT_NE(text_0, text_1);
-
- // Cancel (block) this frame.
- infobar_delegate_1->Cancel();
- CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK);
- CheckPermissionMessageSent(1, false);
- infobar_service()->RemoveInfoBar(infobar_1);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1));
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- // 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, HashIsIgnored) {
- 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);
- 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);
-
- // Change the hash, we'll still be on the same page.
- NavigateAndCommit(url_b);
-
- // Accept.
- infobar_delegate->Accept();
- CheckTabContentsState(url_a, CONTENT_SETTING_ALLOW);
- CheckTabContentsState(url_b, CONTENT_SETTING_ALLOW);
- CheckPermissionMessageSent(0, true);
-
- // Cleanup.
- infobar_service()->RemoveInfoBar(infobar);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar));
-}
-
-TEST_F(GeolocationPermissionContextTests, PermissionForFileScheme) {
- GURL requesting_frame("file://example/geolocation.html");
- NavigateAndCommit(requesting_frame);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame);
- EXPECT_EQ(1U, infobar_service()->infobar_count());
- infobars::InfoBar* infobar = infobar_service()->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate =
- infobar->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate);
- // Accept the frame.
- infobar_delegate->Accept();
- CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW);
- CheckPermissionMessageSent(0, true);
- infobar_service()->RemoveInfoBar(infobar);
-
- // 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, CancelGeolocationPermissionRequest) {
- 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);
- 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);
- ASSERT_EQ(1U, infobar_service()->infobar_count());
-
- infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_0 =
- infobar_0->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_0);
- base::string16 text_0 = infobar_delegate_0->GetMessageText();
-
- // Simulate the frame going away, ensure the infobar for this frame
- // is removed and the next pending infobar is created.
- CancelGeolocationPermissionRequest(
- web_contents(), RequestID(0), requesting_frame_0);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0));
- closed_infobar_tracker_.Clear();
- ASSERT_EQ(1U, infobar_service()->infobar_count());
-
- infobars::InfoBar* infobar_1 = infobar_service()->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_1 =
- infobar_1->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_1);
- base::string16 text_1 = infobar_delegate_1->GetMessageText();
- EXPECT_NE(text_0, text_1);
-
- // Allow this frame.
- infobar_delegate_1->Accept();
- CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW);
- CheckPermissionMessageSent(1, true);
- infobar_service()->RemoveInfoBar(infobar_1);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1));
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- // 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);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- CheckPermissionMessageSent(0, false);
-}
-
-TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) {
- GURL url_a("http://www.example.com/geolocation");
- GURL url_b("http://www.example-2.com/geolocation");
- NavigateAndCommit(url_a);
- AddNewTab(url_b);
- AddNewTab(url_a);
-
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- RequestGeolocationPermission(web_contents(), RequestID(0), url_a);
- ASSERT_EQ(1U, infobar_service()->infobar_count());
-
- RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 0), url_b);
- EXPECT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
-
- RequestGeolocationPermission(extra_tabs_[1], RequestIDForTab(1, 0), url_a);
- ASSERT_EQ(1U, infobar_service_for_tab(1)->infobar_count());
-
- infobars::InfoBar* removed_infobar =
- infobar_service_for_tab(1)->infobar_at(0);
-
- // Accept the first tab.
- infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_0 =
- infobar_0->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_0);
- infobar_delegate_0->Accept();
- CheckPermissionMessageSent(0, true);
- infobar_service()->RemoveInfoBar(infobar_0);
- EXPECT_EQ(2U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0));
- // Now the infobar for the tab with the same origin should have gone.
- EXPECT_EQ(0U, infobar_service_for_tab(1)->infobar_count());
- CheckPermissionMessageSentForTab(1, 0, true);
- EXPECT_TRUE(closed_infobar_tracker_.Contains(removed_infobar));
- closed_infobar_tracker_.Clear();
-
- // But the other tab should still have the info bar...
- ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
- infobars::InfoBar* infobar_1 = infobar_service_for_tab(0)->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_1 =
- infobar_1->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_1);
- infobar_delegate_1->Cancel();
- infobar_service_for_tab(0)->RemoveInfoBar(infobar_1);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1));
-}
-
-TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) {
- 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);
- ASSERT_EQ(1U, infobar_service()->infobar_count());
-
- RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 0), url_a);
- EXPECT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
-
- RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 1), url_b);
- ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
-
- infobars::InfoBar* removed_infobar = infobar_service()->infobar_at(0);
-
- // Accept the second tab.
- infobars::InfoBar* infobar_0 = infobar_service_for_tab(0)->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_0 =
- infobar_0->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_0);
- infobar_delegate_0->Accept();
- CheckPermissionMessageSentForTab(0, 0, true);
- infobar_service_for_tab(0)->RemoveInfoBar(infobar_0);
- EXPECT_EQ(2U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0));
- // Now the infobar for the tab with the same origin should have gone.
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- CheckPermissionMessageSent(0, true);
- EXPECT_TRUE(closed_infobar_tracker_.Contains(removed_infobar));
- closed_infobar_tracker_.Clear();
-
- // And we should have the queued infobar displayed now.
- ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count());
-
- // Accept the second infobar.
- infobars::InfoBar* infobar_1 = infobar_service_for_tab(0)->infobar_at(0);
- ConfirmInfoBarDelegate* infobar_delegate_1 =
- infobar_1->delegate()->AsConfirmInfoBarDelegate();
- ASSERT_TRUE(infobar_delegate_1);
- infobar_delegate_1->Accept();
- CheckPermissionMessageSentForTab(0, 1, true);
- infobar_service_for_tab(0)->RemoveInfoBar(infobar_1);
- EXPECT_EQ(1U, closed_infobar_tracker_.size());
- EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1));
-}
-
-TEST_F(GeolocationPermissionContextTests, TabDestroyed) {
- 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);
- 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 = infobar_service()->infobar_at(0);
-
- // Delete the tab contents.
- DeleteContents();
-
- // During contents destruction, the infobar will have been closed, and the
- // pending request should have been cleared without an infobar being created.
- ASSERT_EQ(1U, closed_infobar_tracker_.size());
- ASSERT_TRUE(closed_infobar_tracker_.Contains(infobar));
-}
-
-TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) {
- GURL requesting_frame_0("http://www.example.com/geolocation");
- GURL requesting_frame_1("http://www.example-2.com/geolocation");
- NavigateAndCommit(requesting_frame_0);
- NavigateAndCommit(requesting_frame_1);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- // Go back: navigate to a pending entry before requesting geolocation
- // permission.
- web_contents()->GetController().GoBack();
- // Request permission for the committed frame (not the pending one).
- RequestGeolocationPermission(
- web_contents(), RequestID(0), requesting_frame_1);
- // Ensure the infobar is created.
- ASSERT_EQ(1U, infobar_service()->infobar_count());
- infobars::InfoBarDelegate* infobar_delegate =
- infobar_service()->infobar_at(0)->delegate();
- ASSERT_TRUE(infobar_delegate);
- // Ensure the infobar wouldn't expire for a navigation to the committed entry.
- content::LoadCommittedDetails details;
- details.entry = web_contents()->GetController().GetLastCommittedEntry();
- EXPECT_FALSE(infobar_delegate->ShouldExpire(
- InfoBarService::NavigationDetailsFromLoadCommittedDetails(details)));
- // Ensure the infobar will expire when we commit the pending navigation.
- details.entry = web_contents()->GetController().GetActiveEntry();
- EXPECT_TRUE(infobar_delegate->ShouldExpire(
- InfoBarService::NavigationDetailsFromLoadCommittedDetails(details)));
-
- // Delete the tab contents.
- DeleteContents();
-}

Powered by Google App Engine
This is Rietveld 408576698