172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h" 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/geolocation/geolocation_content_settings_map.h" 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/testing_profile.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/arbitrator_dependency_factories_for_test.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/geolocation_permission_context.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/location_arbitrator.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/location_provider.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/mock_location_provider.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/mock_render_process_host.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/test_render_view_host.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/test_tab_contents.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/geolocation_messages.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TestTabContentsWithPendingInfoBar ------------------------------------------ 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TestTabContents short-circuits TAB_CONTENTS_INFOBAR_REMOVED to call 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// InfoBarClosed() directly. We need to observe it and call InfoBarClosed() 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// later. 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestTabContentsWithPendingInfoBar : public TestTabContents { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestTabContentsWithPendingInfoBar(Profile* profile, SiteInstance* instance); 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual ~TestTabContentsWithPendingInfoBar(); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TestTabContents: 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void Observe(NotificationType type, 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationSource& source, 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationDetails& details); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoBarDelegate* removed_infobar_delegate_; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTestTabContentsWithPendingInfoBar::TestTabContentsWithPendingInfoBar( 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Profile* profile, 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SiteInstance* instance) 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : TestTabContents(profile, instance), 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen removed_infobar_delegate_(NULL) { 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTestTabContentsWithPendingInfoBar::~TestTabContentsWithPendingInfoBar() { 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TestTabContentsWithPendingInfoBar::Observe( 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationType type, 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationSource& source, 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationDetails& details) { 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (type.value == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED) 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen removed_infobar_delegate_ = Details<InfoBarDelegate>(details).ptr(); 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen else 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestTabContents::Observe(type, source, details); 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationPermissionContextTests ------------------------------------------ 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This class sets up GeolocationArbitrator. 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GeolocationPermissionContextTests : public RenderViewHostTestHarness { 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationPermissionContextTests(); 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected: 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual ~GeolocationPermissionContextTests(); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int process_id() { return contents()->render_view_host()->process()->id(); } 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int process_id_for_tab(int tab) { 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return extra_tabs_[tab]->render_view_host()->process()->id(); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_id() { return contents()->render_view_host()->routing_id(); } 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_id_for_tab(int tab) { 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return extra_tabs_[tab]->render_view_host()->routing_id(); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id() const { return 42; } // Not relevant at this level. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void CheckPermissionMessageSent(int bridge_id, bool allowed); 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckPermissionMessageSentInternal(MockRenderProcessHost* process, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bridge_id, 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed); 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void AddNewTab(const GURL& url); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckTabContentsState(const GURL& requesting_frame, 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ContentSetting expected_content_setting); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestTabContentsWithPendingInfoBar* tab_contents_with_pending_infobar_; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedVector<TestTabContentsWithPendingInfoBar> extra_tabs_; 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private: 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // RenderViewHostTestHarness: 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void SetUp(); 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void TearDown(); 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread ui_thread_; 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<GeolocationArbitratorDependencyFactory> dependency_factory_; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationPermissionContextTests::GeolocationPermissionContextTests() 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : RenderViewHostTestHarness(), 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_with_pending_infobar_(NULL), 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui_thread_(BrowserThread::UI, MessageLoop::current()), 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen dependency_factory_( 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new GeolocationArbitratorDependencyFactoryWithLocationProvider( 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &NewAutoSuccessMockNetworkLocationProvider)) { 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationPermissionContextTests::~GeolocationPermissionContextTests() { 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckPermissionMessageSent( 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed) { 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CheckPermissionMessageSentInternal(process(), bridge_id, allowed); 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckPermissionMessageSentForTab( 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int tab, 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed) { 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CheckPermissionMessageSentInternal(static_cast<MockRenderProcessHost*>( 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_tabs_[tab]->render_view_host()->process()), bridge_id, allowed); 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckPermissionMessageSentInternal( 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockRenderProcessHost* process, 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed) { 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MessageLoop::current()->Run(); 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const IPC::Message* message = process->sink().GetFirstMessageMatching( 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GeolocationMsg_PermissionSet::ID); 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(message); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GeolocationMsg_PermissionSet::Param param; 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GeolocationMsg_PermissionSet::Read(message, ¶m); 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(bridge_id, param.a); 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(allowed, param.b); 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen process->sink().ClearMessages(); 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::AddNewTab(const GURL& url) { 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestTabContentsWithPendingInfoBar* new_tab = 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new TestTabContentsWithPendingInfoBar(profile(), NULL); 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new_tab->controller().LoadURL(url, GURL(), PageTransition::TYPED); 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<TestRenderViewHost*>(new_tab->render_manager()->current_host())-> 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendNavigate(extra_tabs_.size() + 1, url); 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_tabs_.push_back(new_tab); 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckTabContentsState( 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame, 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ContentSetting expected_content_setting) { 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabSpecificContentSettings* content_settings = 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen contents()->GetTabSpecificContentSettings(); 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GeolocationSettingsState::StateMap& state_map = 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen content_settings->geolocation_settings_state().state_map(); 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, state_map.count(requesting_frame.GetOrigin())); 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, state_map.count(requesting_frame)); 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationSettingsState::StateMap::const_iterator settings = 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen state_map.find(requesting_frame.GetOrigin()); 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(settings == state_map.end()) 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << "geolocation state not found " << requesting_frame; 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(expected_content_setting, settings->second); 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::SetUp() { 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderViewHostTestHarness::SetUp(); 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationArbitrator::SetDependencyFactoryForTest( 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen dependency_factory_.get()); 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SiteInstance* site_instance = contents()->GetSiteInstance(); 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_with_pending_infobar_ = 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new TestTabContentsWithPendingInfoBar(profile_.get(), site_instance); 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetContents(tab_contents_with_pending_infobar_); 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen geolocation_permission_context_ = 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new GeolocationPermissionContext(profile()); 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::TearDown() { 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationArbitrator::SetDependencyFactoryForTest(NULL); 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderViewHostTestHarness::TearDown(); 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests ---------------------------------------------------------------------- 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, SinglePermission) { 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame("http://www.example.com/geolocation"); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigateAndCommit(requesting_frame); 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), requesting_frame); 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, QueuedPermission) { 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame_0("http://www.example.com/geolocation"); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame_1("http://www.example-2.com/geolocation"); 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ASK, 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_0, requesting_frame_0)); 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ASK, 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_1, requesting_frame_0)); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigateAndCommit(requesting_frame_0); 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request permission for two frames. 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), requesting_frame_0); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id() + 1, requesting_frame_1); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure only one infobar is created. 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_0 = 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_0); 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 text_0 = infobar_0->GetMessageText(); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Accept the first frame. 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->Accept(); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSent(bridge_id(), true); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->RemoveInfoBar(infobar_0); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_0, 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_with_pending_infobar_->removed_infobar_delegate_); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->InfoBarClosed(); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now we should have a new infobar for the second frame. 23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_1 = 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_1); 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 text_1 = infobar_1->GetMessageText(); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(text_0, text_1); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Cancel (block) this frame. 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_1->Cancel(); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSent(bridge_id() + 1, false); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->RemoveInfoBar(infobar_1); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_1, 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_with_pending_infobar_->removed_infobar_delegate_); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_1->InfoBarClosed(); 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure the persisted permissions are ok. 25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ALLOW, 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_0, requesting_frame_0)); 25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_BLOCK, 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_1, requesting_frame_0)); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, CancelGeolocationPermissionRequest) { 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame_0("http://www.example.com/geolocation"); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame_1("http://www.example-2.com/geolocation"); 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ASK, 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_0, requesting_frame_0)); 27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ASK, 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_1, requesting_frame_0)); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigateAndCommit(requesting_frame_0); 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request permission for two frames. 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), requesting_frame_0); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id() + 1, requesting_frame_1); 28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_0 = 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_0); 2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 text_0 = infobar_0->GetMessageText(); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the frame going away, ensure the infobar for this frame 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is removed and the next pending infobar is created. 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->CancelGeolocationPermissionRequest( 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), requesting_frame_0); 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_0, 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_with_pending_infobar_->removed_infobar_delegate_); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->InfoBarClosed(); 29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_1 = 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_1); 3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 text_1 = infobar_1->GetMessageText(); 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(text_0, text_1); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allow this frame. 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_1->Accept(); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSent(bridge_id() + 1, true); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->RemoveInfoBar(infobar_1); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_1, 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_with_pending_infobar_->removed_infobar_delegate_); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_1->InfoBarClosed(); 31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure the persisted permissions are ok. 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ASK, 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_0, requesting_frame_0)); 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(CONTENT_SETTING_ALLOW, 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame_1, requesting_frame_0)); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, InvalidURL) { 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL invalid_embedder; 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame("about:blank"); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigateAndCommit(invalid_embedder); 32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), requesting_frame); 32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSent(bridge_id(), false); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) { 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_a("http://www.example.com/geolocation"); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_b("http://www.example-2.com/geolocation"); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigateAndCommit(url_a); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddNewTab(url_b); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddNewTab(url_a); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), url_a); 34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_b); 34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, extra_tabs_[0]->infobar_count()); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id_for_tab(1), render_id_for_tab(1), bridge_id(), url_a); 35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, extra_tabs_[1]->infobar_count()); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* removed_infobar = 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[1]->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Accept the first tab. 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_0 = 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_0); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->Accept(); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSent(bridge_id(), true); 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->RemoveInfoBar(infobar_0); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_0, 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_with_pending_infobar_->removed_infobar_delegate_); 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->InfoBarClosed(); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now the infobar for the tab with the same origin should have gone. 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, extra_tabs_[1]->infobar_count()); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSentForTab(1, bridge_id(), true); 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Destroy the infobar that has just been removed. 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch removed_infobar->InfoBarClosed(); 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // But the other tab should still have the info bar... 37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, extra_tabs_[0]->infobar_count()); 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_.reset(); 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) { 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_a("http://www.example.com/geolocation"); 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_b("http://www.example-2.com/geolocation"); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigateAndCommit(url_a); 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddNewTab(url_a); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id(), render_id(), bridge_id(), url_a); 38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_a); 38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, extra_tabs_[0]->infobar_count()); 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->RequestGeolocationPermission( 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_id_for_tab(0), render_id_for_tab(0), bridge_id() + 1, url_b); 39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, extra_tabs_[0]->infobar_count()); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* removed_infobar = 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Accept the second tab. 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_0 = 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[0]->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_0); 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->Accept(); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSentForTab(0, bridge_id(), true); 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[0]->RemoveInfoBar(infobar_0); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_0, 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[0]->removed_infobar_delegate_); 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_0->InfoBarClosed(); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now the infobar for the tab with the same origin should have gone. 40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSent(bridge_id(), true); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Destroy the infobar that has just been removed. 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch removed_infobar->InfoBarClosed(); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // And we should have the queued infobar displayed now. 41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, extra_tabs_[0]->infobar_count()); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Accept the second infobar. 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConfirmInfoBarDelegate* infobar_1 = 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[0]->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_1); 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_1->Accept(); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckPermissionMessageSentForTab(0, bridge_id() + 1, true); 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[0]->RemoveInfoBar(infobar_1); 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(infobar_1, 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_[0]->removed_infobar_delegate_); 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_1->InfoBarClosed(); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_tabs_.reset(); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(GeolocationPermissionContextTests, TabDestroyed) { 43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL requesting_frame_0("http://www.example.com/geolocation"); 43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL requesting_frame_1("http://www.example-2.com/geolocation"); 43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ( 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CONTENT_SETTING_ASK, 43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame_0, requesting_frame_0)); 43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ( 43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CONTENT_SETTING_ASK, 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile()->GetGeolocationContentSettingsMap()->GetContentSetting( 44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame_1, requesting_frame_0)); 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NavigateAndCommit(requesting_frame_0); 44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0U, contents()->infobar_count()); 44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Request permission for two frames. 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen geolocation_permission_context_->RequestGeolocationPermission( 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen process_id(), render_id(), bridge_id(), requesting_frame_0); 44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen geolocation_permission_context_->RequestGeolocationPermission( 44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen process_id(), render_id(), bridge_id() + 1, requesting_frame_1); 45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Ensure only one infobar is created. 45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1U, contents()->infobar_count()); 45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ConfirmInfoBarDelegate* infobar_0 = 45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(infobar_0); 45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 text_0 = infobar_0->GetMessageText(); 45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Delete the tab contents. 45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DeleteContents(); 45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 460