15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/geolocation/geolocation_permission_context.h" 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/id_map.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/test/simple_test_clock.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/clock.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/geolocation/geolocation_permission_context_factory.h" 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/infobars/infobar_service.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/permission_request_id.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h" 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h" 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/mock_google_location_settings_helper.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/view_type_utils.h" 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::MockRenderProcessHost; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// ClosedInfoBarTracker ------------------------------------------------------- 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We need to track which infobars were closed. 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass ClosedInfoBarTracker : public content::NotificationObserver { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClosedInfoBarTracker(); 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual ~ClosedInfoBarTracker(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t size() const { return removed_infobars_.size(); } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool Contains(infobars::InfoBar* infobar) const; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(GeolocationPermissionContextTests, TabDestroyed); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::set<infobars::InfoBar*> removed_infobars_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochClosedInfoBarTracker::ClosedInfoBarTracker() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochClosedInfoBarTracker::~ClosedInfoBarTracker() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ClosedInfoBarTracker::Observe( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type == chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED); 89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch removed_infobars_.insert( 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::Details<infobars::InfoBar::RemovedDetails>(details)->first); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool ClosedInfoBarTracker::Contains(infobars::InfoBar* infobar) const { 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return removed_infobars_.count(infobar) != 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ClosedInfoBarTracker::Clear() { 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch removed_infobars_.clear(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GeolocationPermissionContextTests ------------------------------------------ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GeolocationPermissionContextTests 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ChromeRenderViewHostTestHarness { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ChromeRenderViewHostTestHarness: 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetUp() OVERRIDE; 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PermissionRequestID RequestID(int bridge_id); 112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PermissionRequestID RequestIDForTab(int tab, int bridge_id); 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService* infobar_service() { 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return InfoBarService::FromWebContents(web_contents()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService* infobar_service_for_tab(int tab) { 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return InfoBarService::FromWebContents(extra_tabs_[tab]); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void RequestGeolocationPermission(content::WebContents* web_contents, 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const PermissionRequestID& id, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& requesting_frame); 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void RequestGeolocationPermission(content::WebContents* web_contents, 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const PermissionRequestID& id, 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const GURL& requesting_frame, 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Closure* cancel_callback); 127a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch void PermissionResponse(const PermissionRequestID& id, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckPermissionMessageSent(int bridge_id, bool allowed); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckPermissionMessageSentInternal(MockRenderProcessHost* process, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bridge_id, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddNewTab(const GURL& url); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckTabContentsState(const GURL& requesting_frame, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting expected_content_setting); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_; 139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClosedInfoBarTracker closed_infobar_tracker_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<content::WebContents> extra_tabs_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A map between renderer child id and a pair represending the bridge id and 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whether the requested permission was allowed. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::hash_map<int, std::pair<int, bool> > responses_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPermissionRequestID GeolocationPermissionContextTests::RequestID( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bridge_id) { 149a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PermissionRequestID( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderProcessHost()->GetID(), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderViewHost()->GetRoutingID(), 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bridge_id, 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156a3f7b4e666c476898878fa745f637129375cd889Ben MurdochPermissionRequestID GeolocationPermissionContextTests::RequestIDForTab( 157a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch int tab, 158a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch int bridge_id) { 159a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PermissionRequestID( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_tabs_[tab]->GetRenderProcessHost()->GetID(), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_tabs_[tab]->GetRenderViewHost()->GetRoutingID(), 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bridge_id, 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::RequestGeolocationPermission( 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::WebContents* web_contents, 168a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const PermissionRequestID& id, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& requesting_frame) { 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RequestGeolocationPermission(web_contents, id, requesting_frame, NULL); 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GeolocationPermissionContextTests::RequestGeolocationPermission( 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WebContents* web_contents, 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const PermissionRequestID& id, 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const GURL& requesting_frame, 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Closure* cancel_callback) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_permission_context_->RequestGeolocationPermission( 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents, id.bridge_id(), requesting_frame, false, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GeolocationPermissionContextTests::PermissionResponse, 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), id), 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cancel_callback); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::PermissionResponse( 187a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const PermissionRequestID& id, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) responses_[id.render_process_id()] = std::make_pair(id.bridge_id(), allowed); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::CheckPermissionMessageSent( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bridge_id, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSentInternal(process(), bridge_id, allowed); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::CheckPermissionMessageSentForTab( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bridge_id, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSentInternal(static_cast<MockRenderProcessHost*>( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_tabs_[tab]->GetRenderProcessHost()), 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bridge_id, allowed); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::CheckPermissionMessageSentInternal( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRenderProcessHost* process, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bridge_id, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(responses_.count(process->GetID()), 1U); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bridge_id, responses_[process->GetID()].first); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(allowed, responses_[process->GetID()].second); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) responses_.erase(process->GetID()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::AddNewTab(const GURL& url) { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* new_tab = content::WebContents::Create( 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents::CreateParams(profile())); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_tab->GetController().LoadURL( 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url, content::Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHostTester::For(new_tab->GetRenderViewHost())-> 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendNavigate(extra_tabs_.size() + 1, url); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up required helpers, and make this be as "tabby" as the code requires. 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::SetViewType(new_tab, extensions::VIEW_TYPE_TAB_CONTENTS); 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::CreateForWebContents(new_tab); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_tabs_.push_back(new_tab); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::CheckTabContentsState( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& requesting_frame, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting expected_content_setting) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* content_settings = 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents()); 239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const ContentSettingsUsagesState::StateMap& state_map = 240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content_settings->geolocation_usages_state().state_map(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, state_map.count(requesting_frame.GetOrigin())); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, state_map.count(requesting_frame)); 243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ContentSettingsUsagesState::StateMap::const_iterator settings = 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_map.find(requesting_frame.GetOrigin()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(settings == state_map.end()) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "geolocation state not found " << requesting_frame; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_content_setting, settings->second); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::SetUp() { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::SetUp(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up required helpers, and make this be as "tabby" as the code requires. 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::SetViewType(web_contents(), extensions::VIEW_TYPE_TAB_CONTENTS); 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::CreateForWebContents(web_contents()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings::CreateForWebContents(web_contents()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGoogleLocationSettingsHelper::SetLocationStatus(true, true); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_permission_context_ = 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GeolocationPermissionContextFactory::GetForProfile(profile()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GeolocationPermissionContextTests::TearDown() { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_tabs_.clear(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::TearDown(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests ---------------------------------------------------------------------- 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, SinglePermission) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame("http://www.example.com/geolocation"); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame); 276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar = infobar_service()->infobar_at(0); 280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate = 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar->delegate()->AsConfirmInfoBarDelegate(); 282ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate); 283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate->Cancel(); 284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar); 285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, GeolocationEnabledDisabled) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame("http://www.example.com/geolocation"); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGoogleLocationSettingsHelper::SetLocationStatus(true, true); 294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1U, infobar_service()->infobar_count()); 297e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ConfirmInfoBarDelegate* infobar_delegate_0 = 298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate(); 299ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_0); 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text_0 = infobar_delegate_0->GetButtonLabel( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfirmInfoBarDelegate::BUTTON_OK); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Reload(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGoogleLocationSettingsHelper::SetLocationStatus(true, false); 305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, MasterEnabledGoogleAppsEnabled) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame("http://www.example.com/geolocation"); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGoogleLocationSettingsHelper::SetLocationStatus(true, true); 314a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1U, infobar_service()->infobar_count()); 317e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ConfirmInfoBarDelegate* infobar_delegate = 318a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate(); 319ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate); 320ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate->Accept(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(0, true); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, MasterEnabledGoogleAppsDisabled) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame("http://www.example.com/geolocation"); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGoogleLocationSettingsHelper::SetLocationStatus(true, false); 329a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0U, infobar_service()->infobar_count()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, QueuedPermission) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_0("http://www.example.com/geolocation"); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_1("http://www.example-2.com/geolocation"); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ASK, 3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_0, requesting_frame_0, 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ASK, 3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_1, requesting_frame_0, 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame_0); 348a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request permission for two frames. 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents(), RequestID(0), requesting_frame_0); 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents(), RequestID(1), requesting_frame_1); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure only one infobar is created. 355a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0); 357ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_0 = 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_0->delegate()->AsConfirmInfoBarDelegate(); 359ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_0); 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text_0 = infobar_delegate_0->GetMessageText(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accept the first frame. 363ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_0->Accept(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(0, true); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar_0); 368ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0)); 370ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch closed_infobar_tracker_.Clear(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we should have a new infobar for the second frame. 372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_1 = infobar_service()->infobar_at(0); 375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_1 = 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_1->delegate()->AsConfirmInfoBarDelegate(); 377ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_1); 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text_1 = infobar_delegate_1->GetMessageText(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(text_0, text_1); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel (block) this frame. 382ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_1->Cancel(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(1, false); 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar_1); 386ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1)); 388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the persisted permissions are ok. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ALLOW, 391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch requesting_frame_0, requesting_frame_0, 393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_BLOCK, 396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 397ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch requesting_frame_1, requesting_frame_0, 398ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(GeolocationPermissionContextTests, HashIsIgnored) { 402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GURL url_a("http://www.example.com/geolocation#a"); 403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GURL url_b("http://www.example.com/geolocation#b"); 404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Navigate to the first url and check permission is requested. 406d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateAndCommit(url_a); 407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), url_a); 409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar = infobar_service()->infobar_at(0); 411d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ConfirmInfoBarDelegate* infobar_delegate = 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar->delegate()->AsConfirmInfoBarDelegate(); 413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(infobar_delegate); 414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Change the hash, we'll still be on the same page. 416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateAndCommit(url_b); 417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 418d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Accept. 419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) infobar_delegate->Accept(); 420d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CheckTabContentsState(url_a, CONTENT_SETTING_ALLOW); 421d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CheckTabContentsState(url_b, CONTENT_SETTING_ALLOW); 422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CheckPermissionMessageSent(0, true); 423d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Cleanup. 425a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar); 426d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(1U, closed_infobar_tracker_.size()); 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar)); 428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GeolocationPermissionContextTests, PermissionForFileScheme) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL requesting_frame("file://example/geolocation.html"); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateAndCommit(requesting_frame); 433a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 435a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1U, infobar_service()->infobar_count()); 4360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar = infobar_service()->infobar_at(0); 437ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate = 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar->delegate()->AsConfirmInfoBarDelegate(); 439ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate); 440bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Accept the frame. 441ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate->Accept(); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckPermissionMessageSent(0, true); 444a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the setting is not stored. 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ASK, 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile()->GetHostContentSettingsMap()->GetContentSetting( 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) requesting_frame, 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) requesting_frame, 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_GEOLOCATION, 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string())); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, CancelGeolocationPermissionRequest) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_0("http://www.example.com/geolocation"); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_1("http://www.example-2.com/geolocation"); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ASK, 4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_0, requesting_frame_0, 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ASK, 4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_1, requesting_frame_0, 4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame_0); 469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request permission for two frames. 471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Closure cancel_callback; 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_contents(), RequestID(0), requesting_frame_0, &cancel_callback); 474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents(), RequestID(1), requesting_frame_1); 476a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0); 479ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_0 = 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_0->delegate()->AsConfirmInfoBarDelegate(); 481ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_0); 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text_0 = infobar_delegate_0->GetMessageText(); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate the frame going away, ensure the infobar for this frame 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is removed and the next pending infobar is created. 486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cancel_callback.Run(); 487ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0)); 489ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch closed_infobar_tracker_.Clear(); 490a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_1 = infobar_service()->infobar_at(0); 493ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_1 = 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_1->delegate()->AsConfirmInfoBarDelegate(); 495ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_1); 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text_1 = infobar_delegate_1->GetMessageText(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(text_0, text_1); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow this frame. 500ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_1->Accept(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(1, true); 503a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar_1); 504ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1)); 506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the persisted permissions are ok. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ASK, 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_0, requesting_frame_0, 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CONTENT_SETTING_ALLOW, 5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_1, requesting_frame_0, 5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, InvalidURL) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL invalid_embedder("about:blank"); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(invalid_embedder); 523a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 525a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(0, false); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_a("http://www.example.com/geolocation"); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_b("http://www.example-2.com/geolocation"); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(url_a); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddNewTab(url_b); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddNewTab(url_a); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 536a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), url_a); 538a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 0), url_b); 541a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1U, infobar_service_for_tab(0)->infobar_count()); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(extra_tabs_[1], RequestIDForTab(1, 0), url_a); 544a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service_for_tab(1)->infobar_count()); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* removed_infobar = 5470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobar_service_for_tab(1)->infobar_at(0); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accept the first tab. 5500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0); 551ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_0 = 552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_0->delegate()->AsConfirmInfoBarDelegate(); 553ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_0); 554ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_0->Accept(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(0, true); 556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->RemoveInfoBar(infobar_0); 557ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(2U, closed_infobar_tracker_.size()); 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0)); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the infobar for the tab with the same origin should have gone. 560a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service_for_tab(1)->infobar_count()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSentForTab(1, 0, true); 562ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(closed_infobar_tracker_.Contains(removed_infobar)); 563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch closed_infobar_tracker_.Clear(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But the other tab should still have the info bar... 566a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count()); 5670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_1 = infobar_service_for_tab(0)->infobar_at(0); 568ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_1 = 569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_1->delegate()->AsConfirmInfoBarDelegate(); 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(infobar_delegate_1); 571ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_1->Cancel(); 572a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service_for_tab(0)->RemoveInfoBar(infobar_1); 573ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1)); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_a("http://www.example.com/geolocation"); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_b("http://www.example-2.com/geolocation"); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(url_a); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddNewTab(url_a); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 583a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(web_contents(), RequestID(0), url_a); 585a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 0), url_a); 588a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1U, infobar_service_for_tab(0)->infobar_count()); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission(extra_tabs_[0], RequestIDForTab(0, 1), url_b); 591a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* removed_infobar = infobar_service()->infobar_at(0); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accept the second tab. 5960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_0 = infobar_service_for_tab(0)->infobar_at(0); 597ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_0 = 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_0->delegate()->AsConfirmInfoBarDelegate(); 599ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_0); 600ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_0->Accept(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSentForTab(0, 0, true); 602a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service_for_tab(0)->RemoveInfoBar(infobar_0); 603ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(2U, closed_infobar_tracker_.size()); 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_0)); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the infobar for the tab with the same origin should have gone. 606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSent(0, true); 608ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(closed_infobar_tracker_.Contains(removed_infobar)); 609ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch closed_infobar_tracker_.Clear(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And we should have the queued infobar displayed now. 612a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service_for_tab(0)->infobar_count()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accept the second infobar. 6150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_1 = infobar_service_for_tab(0)->infobar_at(0); 616ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_1 = 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_1->delegate()->AsConfirmInfoBarDelegate(); 618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate_1); 619ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar_delegate_1->Accept(); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckPermissionMessageSentForTab(0, 1, true); 621a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service_for_tab(0)->RemoveInfoBar(infobar_1); 622ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, closed_infobar_tracker_.size()); 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(closed_infobar_tracker_.Contains(infobar_1)); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6260529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GeolocationPermissionContextTests, TabDestroyed) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_0("http://www.example.com/geolocation"); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_1("http://www.example-2.com/geolocation"); 6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(CONTENT_SETTING_ASK, 6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_0, requesting_frame_0, 6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(CONTENT_SETTING_ASK, 6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile()->GetHostContentSettingsMap()->GetContentSetting( 6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requesting_frame_1, requesting_frame_0, 6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame_0); 640a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request permission for two frames. 642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents(), RequestID(0), requesting_frame_0); 644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents(), RequestID(1), requesting_frame_1); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure only one infobar is created. 647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 6480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar = infobar_service()->infobar_at(0); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the tab contents. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteContents(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // During contents destruction, the infobar will have been closed, and the 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pending request should have been cleared without an infobar being created. 655ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(1U, closed_infobar_tracker_.size()); 656ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(closed_infobar_tracker_.Contains(infobar)); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_0("http://www.example.com/geolocation"); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_frame_1("http://www.example-2.com/geolocation"); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame_0); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateAndCommit(requesting_frame_1); 664a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go back: navigate to a pending entry before requesting geolocation 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GoBack(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request permission for the committed frame (not the pending one). 669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestGeolocationPermission( 670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents(), RequestID(0), requesting_frame_1); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the infobar is created. 672a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 6730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBarDelegate* infobar_delegate = 674a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service()->infobar_at(0)->delegate(); 675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(infobar_delegate); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the infobar wouldn't expire for a navigation to the committed entry. 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::LoadCommittedDetails details; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.entry = web_contents()->GetController().GetLastCommittedEntry(); 679c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(infobar_delegate->ShouldExpire( 680c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InfoBarService::NavigationDetailsFromLoadCommittedDetails(details))); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the infobar will expire when we commit the pending navigation. 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) details.entry = web_contents()->GetController().GetActiveEntry(); 683c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(infobar_delegate->ShouldExpire( 684c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InfoBarService::NavigationDetailsFromLoadCommittedDetails(details))); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the tab contents. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteContents(); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 690116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GeolocationPermissionContextTests, LastUsageAudited) { 691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL requesting_frame("http://www.example.com/geolocation"); 692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NavigateAndCommit(requesting_frame); 693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::SimpleTestClock* test_clock = new base::SimpleTestClock; 695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_clock->SetNow(base::Time::UnixEpoch() + 696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromSeconds(10)); 697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HostContentSettingsMap* map = profile()->GetHostContentSettingsMap(); 699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch map->SetPrefClockForTesting(scoped_ptr<base::Clock>(test_clock)); 700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The permission shouldn't have been used yet. 702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(), 703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame.GetOrigin(), 704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0); 706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobars::InfoBar* infobar = infobar_service()->infobar_at(0); 711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate = 712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar->delegate()->AsConfirmInfoBarDelegate(); 713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(infobar_delegate); 714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_delegate->Accept(); 715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckTabContentsState(requesting_frame, CONTENT_SETTING_ALLOW); 716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckPermissionMessageSent(0, true); 717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Permission has been used at the starting time. 719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(), 720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame.GetOrigin(), 721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10); 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_clock->Advance(base::TimeDelta::FromSeconds(3)); 725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RequestGeolocationPermission(web_contents(), RequestID(0), requesting_frame); 726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Permission has been used three seconds later. 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame.GetOrigin(), 729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame.GetOrigin(), 730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13); 732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 734116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GeolocationPermissionContextTests, LastUsageAuditedMultipleFrames) { 735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::SimpleTestClock* test_clock = new base::SimpleTestClock; 736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_clock->SetNow(base::Time::UnixEpoch() + 737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromSeconds(10)); 738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HostContentSettingsMap* map = profile()->GetHostContentSettingsMap(); 740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch map->SetPrefClockForTesting(scoped_ptr<base::Clock>(test_clock)); 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL requesting_frame_0("http://www.example.com/geolocation"); 743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL requesting_frame_1("http://www.example-2.com/geolocation"); 744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The permission shouldn't have been used yet. 746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(), 747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0); 750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(), 751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0); 754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 755116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NavigateAndCommit(requesting_frame_0); 756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0U, infobar_service()->infobar_count()); 757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Request permission for two frames. 759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RequestGeolocationPermission( 760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents(), RequestID(0), requesting_frame_0); 761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RequestGeolocationPermission( 762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents(), RequestID(1), requesting_frame_1); 763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Ensure only one infobar is created. 765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobars::InfoBar* infobar_0 = infobar_service()->infobar_at(0); 767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_0 = 768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_0->delegate()->AsConfirmInfoBarDelegate(); 769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Accept the first frame. 771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_delegate_0->Accept(); 772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW); 773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckPermissionMessageSent(0, true); 774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_service()->RemoveInfoBar(infobar_0); 775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Verify that accepting the first didn't accept because it's embedder 777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // in the other. 778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(), 779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10); 782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(), 783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0); 786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(1U, infobar_service()->infobar_count()); 788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobars::InfoBar* infobar_1 = infobar_service()->infobar_at(0); 789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConfirmInfoBarDelegate* infobar_delegate_1 = 790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_1->delegate()->AsConfirmInfoBarDelegate(); 791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_clock->Advance(base::TimeDelta::FromSeconds(1)); 793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Allow the second frame. 795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_delegate_1->Accept(); 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW); 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckPermissionMessageSent(1, true); 798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch infobar_service()->RemoveInfoBar(infobar_1); 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Verify that the times are different. 801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(), 802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10); 805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(), 806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11); 809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_clock->Advance(base::TimeDelta::FromSeconds(2)); 811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RequestGeolocationPermission( 812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents(), RequestID(0), requesting_frame_0); 813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Verify that requesting permission in one frame doesn't update other where 815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // it is the embedder. 816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_0.GetOrigin(), 817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13); 820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(map->GetLastUsage(requesting_frame_1.GetOrigin(), 821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch requesting_frame_0.GetOrigin(), 822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION).ToDoubleT(), 823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11); 824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 825