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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/test/simple_test_clock.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/clock.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/content_settings/content_settings_usages_state.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h" 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_operation_notification_details.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DomOperationNotificationDetails; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// IFrameLoader --------------------------------------------------------------- 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to block until an iframe is loaded via a javascript call. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: NavigateToURLBlockUntilNavigationsComplete doesn't seem to work for 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple embedded iframes, as notifications seem to be 'batched'. Instead, we 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// load and wait one single frame here by calling a javascript function. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IFrameLoader : public content::NotificationObserver { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IFrameLoader(Browser* browser, int iframe_id, const GURL& url); 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~IFrameLoader(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // content::NotificationObserver: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& iframe_url() const { return iframe_url_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true the navigation has completed. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool navigation_completed_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true the javascript call has completed. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool javascript_completed_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string javascript_response_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL for the iframe we just loaded. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL iframe_url_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IFrameLoader); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IFrameLoader::IFrameLoader(Browser* browser, int iframe_id, const GURL& url) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : navigation_completed_(false), 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) javascript_completed_(false) { 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebContents* web_contents = 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser->tab_strip_model()->GetActiveWebContents(); 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NavigationController* controller = &web_contents->GetController(); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_LOAD_STOP, 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::Source<NavigationController>(controller)); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_DOM_OPERATION_RESPONSE, 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::NotificationService::AllSources()); 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string script(base::StringPrintf( 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "window.domAutomationController.setAutomationId(0);" 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "window.domAutomationController.send(addIFrame(%d, \"%s\"));", 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch iframe_id, url.spec().c_str())); 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) web_contents->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(script)); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RunMessageLoop(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(base::StringPrintf("\"%d\"", iframe_id), javascript_response_); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.RemoveAll(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Now that we loaded the iframe, let's fetch its src. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) script = base::StringPrintf( 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "window.domAutomationController.send(getIFrameSrc(%d))", iframe_id); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string iframe_src; 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(content::ExecuteScriptAndExtractString(web_contents, script, 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &iframe_src)); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iframe_url_ = GURL(iframe_src); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIFrameLoader::~IFrameLoader() { 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void IFrameLoader::Observe(int type, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationSource& source, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) { 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == content::NOTIFICATION_LOAD_STOP) { 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_completed_ = true; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type == content::NOTIFICATION_DOM_OPERATION_RESPONSE) { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<DomOperationNotificationDetails> dom_op_details(details); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) javascript_response_ = dom_op_details->json; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) javascript_completed_ = true; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (javascript_completed_ && navigation_completed_) 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// GeolocationNotificationObserver -------------------------------------------- 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GeolocationNotificationObserver : public content::NotificationObserver { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |wait_for_infobar| is true, AddWatchAndWaitForNotification will block 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // until the infobar has been displayed; otherwise it will block until the 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation is completed. 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit GeolocationNotificationObserver(bool wait_for_infobar); 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~GeolocationNotificationObserver(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // content::NotificationObserver: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void AddWatchAndWaitForNotification( 14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* render_frame_host); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool has_infobar() const { return !!infobar_; } 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar() { return infobar_; } 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool wait_for_infobar_; 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool navigation_started_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool navigation_completed_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string javascript_response_; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GeolocationNotificationObserver); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)GeolocationNotificationObserver::GeolocationNotificationObserver( 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool wait_for_infobar) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : wait_for_infobar_(wait_for_infobar), 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) infobar_(NULL), 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_started_(false), 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_completed_(false) { 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_DOM_OPERATION_RESPONSE, 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::NotificationService::AllSources()); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (wait_for_infobar) { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::NotificationService::AllSources()); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::NotificationService::AllSources()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_LOAD_START, 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::NotificationService::AllSources()); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_LOAD_STOP, 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::NotificationService::AllSources()); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochGeolocationNotificationObserver::~GeolocationNotificationObserver() { 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationNotificationObserver::Observe( 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int type, 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationSource& source, 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED) { 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobar_ = content::Details<infobars::InfoBar::AddedDetails>(details).ptr(); 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_FALSE(infobar_->delegate()->GetIcon().IsEmpty()); 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(infobar_->delegate()->AsConfirmInfoBarDelegate()); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type == content::NOTIFICATION_DOM_OPERATION_RESPONSE) { 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<DomOperationNotificationDetails> dom_op_details(details); 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) javascript_response_ = dom_op_details->json; 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "javascript_response " << javascript_response_; 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if ((type == content::NOTIFICATION_NAV_ENTRY_COMMITTED) || 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (type == content::NOTIFICATION_LOAD_START)) { 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_started_ = true; 1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if ((type == content::NOTIFICATION_LOAD_STOP) && navigation_started_) { 1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch navigation_started_ = false; 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch navigation_completed_ = true; 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // We're either waiting for just the infobar, or for both a javascript 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // prompt and response. 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((wait_for_infobar_ && infobar_) || 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (navigation_completed_ && !javascript_response_.empty())) 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationNotificationObserver::AddWatchAndWaitForNotification( 20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* render_frame_host) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "will add geolocation watch"; 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string script( 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "window.domAutomationController.setAutomationId(0);" 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "window.domAutomationController.send(geoStart());"); 21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_host->ExecuteJavaScript(base::UTF8ToUTF16(script)); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RunMessageLoop(); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.RemoveAll(); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "got geolocation watch" << javascript_response_; 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE("\"0\"", javascript_response_); 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(wait_for_infobar_ ? (infobar_ != NULL) : navigation_completed_); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// GeolocationBrowserTest ----------------------------------------------------- 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a browser test for Geolocation. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It exercises various integration points from javascript <-> browser: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. Infobar is displayed when a geolocation is requested from an unauthorized 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// origin. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. Denying the infobar triggers the correct error callback. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3. Allowing the infobar does not trigger an error, and allow a geoposition to 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be passed to javascript. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4. Permissions persisted in disk are respected. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5. Incognito profiles don't use saved permissions. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GeolocationBrowserTest : public InProcessBrowserTest { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum InitializationOptions { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INITIALIZATION_NONE, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INITIALIZATION_OFFTHERECORD, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INITIALIZATION_NEWTAB, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INITIALIZATION_IFRAMES, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GeolocationBrowserTest(); 2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~GeolocationBrowserTest(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // InProcessBrowserTest: 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE; 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Browser* current_browser() { return current_browser_; } 2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_html_for_tests(const std::string& html_for_tests) { 2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch html_for_tests_ = html_for_tests; 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 25523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* frame_host() const { return render_frame_host_; } 2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& current_url() const { return current_url_; } 2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& iframe_url(size_t i) const { return iframe_urls_[i]; } 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch double fake_latitude() const { return fake_latitude_; } 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch double fake_longitude() const { return fake_longitude_; } 2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Initializes the test server and navigates to the initial url. 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Initialize(InitializationOptions options) WARN_UNUSED_RESULT; 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Loads the specified number of iframes. 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void LoadIFrames(int number_iframes); 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Specifies which frame is to be used for JavaScript calls. 26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void SetFrameHost(const std::string& frame_name); 26923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Start watching for geolocation notifications. If |wait_for_infobar| is 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // true, wait for the infobar to be displayed. Otherwise wait for a javascript 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // response. 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AddGeolocationWatch(bool wait_for_infobar); 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Checks that no errors have been received in javascript, and checks that the 2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // position most recently received in javascript matches |latitude| and 2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |longitude|. 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CheckGeoposition(double latitude, double longitude); 2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // For |requesting_url| if |allowed| is true accept the infobar. Otherwise 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // cancel it. 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetInfoBarResponse(const GURL& requesting_url, bool allowed); 2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Executes |function| in |render_frame_host| and checks that the return value 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // matches |expected|. 28623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void CheckStringValueFromJavascriptForFrame( 28723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& expected, 28823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& function, 28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* render_frame_host); 2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Executes |function| and checks that the return value matches |expected|. 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CheckStringValueFromJavascript(const std::string& expected, 2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& function); 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Sets a new position and sends a notification with the new position. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void NotifyGeoposition(double latitude, double longitude); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBar* infobar_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // path element of a URL referencing the html content for this test. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string html_for_tests_; 30323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // This member defines the frame where the JavaScript calls will run. 30423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* render_frame_host_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current url for the top level page. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL current_url_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If not empty, the GURLs for the iframes loaded by LoadIFrames(). 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> iframe_urls_; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double fake_latitude_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double fake_longitude_; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GeolocationBrowserTest); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)GeolocationBrowserTest::GeolocationBrowserTest() 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : infobar_(NULL), 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser_(NULL), 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch html_for_tests_("/geolocation/simple.html"), 31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_host_(NULL), 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fake_latitude_(1.23), 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fake_longitude_(4.56) { 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochGeolocationBrowserTest::~GeolocationBrowserTest() { 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::SetUpOnMainThread() { 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::OverrideGeolocation(fake_latitude_, fake_longitude_); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::TearDownInProcessBrowserTestFixture() { 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "TearDownInProcessBrowserTestFixture. Test Finished."; 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool GeolocationBrowserTest::Initialize(InitializationOptions options) { 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!embedded_test_server()->Started() && 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !embedded_test_server()->InitializeAndWaitUntilReady()) { 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ADD_FAILURE() << "Test server failed to start."; 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current_url_ = embedded_test_server()->GetURL(html_for_tests_); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "before navigate"; 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (options == INITIALIZATION_OFFTHERECORD) { 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser_ = ui_test_utils::OpenURLOffTheRecord( 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), current_url_); 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser_ = browser(); 3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (options == INITIALIZATION_NEWTAB) 3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch chrome::NewTab(current_browser_); 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURL(current_browser_, current_url_); 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "after navigate"; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(current_browser_); 3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return !!current_browser_; 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::LoadIFrames(int number_iframes) { 3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Limit to 3 iframes. 3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_LT(0, number_iframes); 3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_LE(number_iframes, 3); 3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch iframe_urls_.resize(number_iframes); 3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < number_iframes; ++i) { 3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IFrameLoader loader(current_browser_, i, GURL()); 3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch iframe_urls_[i] = loader.iframe_url(); 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void GeolocationBrowserTest::SetFrameHost(const std::string& frame_name) { 37123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) WebContents* web_contents = 37223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) current_browser_->tab_strip_model()->GetActiveWebContents(); 37323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_host_ = NULL; 37423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 37523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (frame_name.empty()) { 37623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_host_ = web_contents->GetMainFrame(); 37723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } else { 37823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_host_ = content::FrameMatchingPredicate( 37923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) web_contents, base::Bind(&content::FrameMatchesName, frame_name)); 38023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 38123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(render_frame_host_); 38223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 38323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::AddGeolocationWatch(bool wait_for_infobar) { 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GeolocationNotificationObserver notification_observer(wait_for_infobar); 38623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) notification_observer.AddWatchAndWaitForNotification(render_frame_host_); 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (wait_for_infobar) { 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(notification_observer.has_infobar()); 3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch infobar_ = notification_observer.infobar(); 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::CheckGeoposition(double latitude, 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) double longitude) { 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Checks we have no error. 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckStringValueFromJavascript("0", "geoGetLastError()"); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckStringValueFromJavascript(base::DoubleToString(latitude), 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "geoGetLastPositionLatitude()"); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckStringValueFromJavascript(base::DoubleToString(longitude), 4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "geoGetLastPositionLongitude()"); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid GeolocationBrowserTest::SetInfoBarResponse(const GURL& requesting_url, 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool allowed) { 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContents* web_contents = 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_browser_->tab_strip_model()->GetActiveWebContents(); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TabSpecificContentSettings* content_settings = 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents); 409ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const ContentSettingsUsagesState& usages_state = 410ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content_settings->geolocation_usages_state(); 411ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t state_map_size = usages_state.state_map().size(); 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(infobar_); 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "will set infobar response"; 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WindowedNotificationObserver observer( 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::Source<NavigationController>(&web_contents->GetController())); 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (allowed) 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_->delegate()->AsConfirmInfoBarDelegate()->Accept(); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_->delegate()->AsConfirmInfoBarDelegate()->Cancel(); 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.Wait(); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 425a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService* infobar_service = 426a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService::FromWebContents(web_contents); 427a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch infobar_service->RemoveInfoBar(infobar_); 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "infobar response set"; 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) infobar_ = NULL; 430ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_GT(usages_state.state_map().size(), state_map_size); 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GURL requesting_origin(requesting_url.GetOrigin()); 432ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1U, usages_state.state_map().count(requesting_origin)); 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSetting expected_setting = 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_setting, 436ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch usages_state.state_map().find(requesting_origin)->second); 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void GeolocationBrowserTest::CheckStringValueFromJavascriptForFrame( 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& expected, 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& function, 44223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* render_frame_host) { 4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string script(base::StringPrintf( 4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "window.domAutomationController.send(%s)", function.c_str())); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string result; 44623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractString( 44723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_host, script, &result)); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected, result); 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::CheckStringValueFromJavascript( 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& expected, 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& function) { 45423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) CheckStringValueFromJavascriptForFrame( 45523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) expected, function, render_frame_host_); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GeolocationBrowserTest::NotifyGeoposition(double latitude, 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) double longitude) { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fake_latitude_ = latitude; 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fake_longitude_ = longitude; 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::OverrideGeolocation(latitude, longitude); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "MockLocationProvider listeners updated"; 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests ---------------------------------------------------------------------- 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, DisplaysPermissionBar) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 47123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, Geoposition) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 47723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 4797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), true); 4807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ErrorOnPermissionDenied) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 48623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Infobar was displayed, deny access and check for error code. 4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), false); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("1", "geoGetLastError()"); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// See http://crbug.com/308358 4948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, DISABLED_NoInfobarForSecondTab) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 49623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), true); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disables further prompts from this tab. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Checks infobar will not be created in a second tab. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NEWTAB)); 50423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoInfobarForDeniedOrigin) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( 5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentSettingsPattern::FromURLNoWildcard(current_url()), 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentSettingsPattern::FromURLNoWildcard(current_url()), 5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), CONTENT_SETTING_BLOCK); 51523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks we have an error for this denied origin. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("1", "geoGetLastError()"); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks infobar will not be created a second tab. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NEWTAB)); 52123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("1", "geoGetLastError()"); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoInfobarForAllowedOrigin) { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentSettingsPattern::FromURLNoWildcard(current_url()), 5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentSettingsPattern::FromURLNoWildcard(current_url()), 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), CONTENT_SETTING_ALLOW); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks no infobar will be created and there's no error callback. 53323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoInfobarForOffTheRecord) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, check infobar will be created for regular profile 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 54123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 54323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Response will be persisted. 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), true); 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disables further prompts from this tab. 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go incognito, and checks no infobar will be created. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_OFFTHERECORD)); 55023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 5527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoLeakFromOffTheRecord) { 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First, check infobar will be created for incognito profile. 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_OFFTHERECORD)); 55823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddGeolocationWatch(true); 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Response won't be persisted. 5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), true); 5627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disables further prompts from this tab. 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Go to the regular profile, infobar will be created. 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 56723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddGeolocationWatch(true); 5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), false); 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckStringValueFromJavascript("1", "geoGetLastError()"); 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, IFramesWithFreshPosition) { 5747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/iframes_different_origin.html"); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadIFrames(2); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "frames loaded"; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_0"); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 5817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(0), true); 5827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disables further prompts from this iframe. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test second iframe from a different origin with a cached geoposition will 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // create the infobar. 58823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back to the first frame, enable navigation and refresh geoposition. 59223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_0"); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("1", "geoSetMaxNavigateCount(1)"); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double fresh_position_latitude = 3.17; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double fresh_position_longitude = 4.23; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 5997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ¤t_browser()->tab_strip_model()->GetActiveWebContents()-> 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController())); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyGeoposition(fresh_position_latitude, fresh_position_longitude); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckGeoposition(fresh_position_latitude, fresh_position_longitude); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable navigation for this frame. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now go ahead an authorize the second frame. 60923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Infobar was displayed, allow access and check there's no error code. 6117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(1), true); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Checking position..."; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckGeoposition(fresh_position_latitude, fresh_position_longitude); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "...done."; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IFramesWithCachedPosition) { 6197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/iframes_different_origin.html"); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadIFrames(2); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_0"); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 6257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(0), true); 6267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Refresh geoposition, but let's not yet create the watch on the second frame 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that it'll fetch from cache. 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double cached_position_latitude = 5.67; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double cached_position_lognitude = 8.09; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ¤t_browser()->tab_strip_model()->GetActiveWebContents()-> 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController())); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyGeoposition(cached_position_latitude, cached_position_lognitude); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckGeoposition(cached_position_latitude, cached_position_lognitude); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable navigation for this frame. 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Now go ahead and authorize the second frame. 64523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit will use its cache, but we also broadcast a position shortly 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // afterwards. We're only interested in the first navigation for the success 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback from the cached position. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("1", "geoSetMaxNavigateCount(1)"); 6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(1), true); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckGeoposition(cached_position_latitude, cached_position_lognitude); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, CancelPermissionForFrame) { 6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/iframes_different_origin.html"); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadIFrames(2); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "frames loaded"; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_0"); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 6637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(0), true); 6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disables further prompts from this iframe. 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test second iframe from a different origin with a cached geoposition will 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // create the infobar. 67023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service = InfoBarService::FromWebContents( 6747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_browser()->tab_strip_model()->GetActiveWebContents()); 675a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch size_t num_infobars_before_cancel = infobar_service->infobar_count(); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the iframe, and ensure the infobar is gone. 6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IFrameLoader change_iframe_1(current_browser(), 1, current_url()); 678a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch size_t num_infobars_after_cancel = infobar_service->infobar_count(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_infobars_before_cancel, num_infobars_after_cancel + 1); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, InvalidUrlRequest) { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests that an invalid URL (e.g. from a popup window) is rejected 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // correctly. Also acts as a regression test for http://crbug.com/40478 6857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/invalid_request_url.html"); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 68723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 68823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* original_tab = 6907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_browser()->tab_strip_model()->GetActiveWebContents(); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("1", "requestGeolocationFromInvalidUrl()"); 69223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) CheckStringValueFromJavascriptForFrame("1", "isAlive()", 69323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) original_tab->GetMainFrame()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoInfoBarBeforeStart) { 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/42789 6987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/iframes_different_origin.html"); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadIFrames(2); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "frames loaded"; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Access navigator.geolocation, but ensure it won't request permission. 70423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("object", "geoAccessNavigatorGeolocation()"); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_0"); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(0), true); 7107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Permission should be requested after adding a watch. 71423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(iframe_url(1), true); 7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, TwoWatchesInOneFrame) { 7217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/two_watches.html"); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 72323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, set the JavaScript to navigate when it receives |final_position|. 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double final_position_latitude = 3.17; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double final_position_longitude = 4.23; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string script = base::StringPrintf( 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(geoSetFinalPosition(%f, %f))", 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_position_latitude, final_position_longitude); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string js_result; 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractString( 7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_browser()->tab_strip_model()->GetActiveWebContents(), script, 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &js_result)); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(js_result, "ok"); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a position which both geolocation watches will receive. 73723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost(""); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetInfoBarResponse(current_url(), true); 7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second watch will now have cancelled. Ensure an update still makes 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its way through to the first watcher. 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 7477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ¤t_browser()->tab_strip_model()->GetActiveWebContents()-> 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController())); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyGeoposition(final_position_latitude, final_position_longitude); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckGeoposition(final_position_latitude, final_position_longitude); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, TabDestroyed) { 7557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch set_html_for_tests("/geolocation/tab_destroyed.html"); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadIFrames(3); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_0"); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(true); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_1"); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetFrameHost("iframe_2"); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGeolocationWatch(false); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string script = 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(window.close());"; 7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool result = content::ExecuteScript( 7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_browser()->tab_strip_model()->GetActiveWebContents(), script); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, true); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 775116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, LastUsageUpdated) { 776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::SimpleTestClock* clock_ = new base::SimpleTestClock(); 778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_browser() 779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->profile() 780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetHostContentSettingsMap() 781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->SetPrefClockForTesting(scoped_ptr<base::Clock>(clock_)); 782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch clock_->SetNow(base::Time::UnixEpoch() + base::TimeDelta::FromSeconds(10)); 783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Setting the permission should trigger the last usage. 785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( 786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ContentSettingsPattern::FromURLNoWildcard(current_url()), 787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ContentSettingsPattern::FromURLNoWildcard(current_url()), 788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION, 789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTING_ALLOW); 791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Permission has been used at the starting time. 793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(current_browser() 794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->profile() 795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetHostContentSettingsMap() 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetLastUsage(current_url().GetOrigin(), 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_url().GetOrigin(), 798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION) 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .ToDoubleT(), 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10); 801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch clock_->Advance(base::TimeDelta::FromSeconds(3)); 803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Watching should trigger the last usage update. 805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetFrameHost(""); 806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddGeolocationWatch(false); 807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckGeoposition(fake_latitude(), fake_longitude()); 808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Last usage has been updated. 810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(current_browser() 811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->profile() 812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetHostContentSettingsMap() 813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetLastUsage(current_url().GetOrigin(), 814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_url().GetOrigin(), 815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTINGS_TYPE_GEOLOCATION) 816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .ToDoubleT(), 817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13); 818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 819