172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h" 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/dom_operation_notification_details.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/geolocation/geolocation_content_settings_map.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/geolocation/geolocation_settings_state.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/arbitrator_dependency_factories_for_test.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/location_arbitrator.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/mock_location_provider.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/geoposition.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h" 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Used to block until an iframe is loaded via a javascript call. 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Note: NavigateToURLBlockUntilNavigationsComplete doesn't seem to work for 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// multiple embedded iframes, as notifications seem to be 'batched'. Instead, we 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// load and wait one single frame here by calling a javascript function. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass IFrameLoader : public NotificationObserver { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IFrameLoader(Browser* browser, int iframe_id, const GURL& url) 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : navigation_completed_(false), 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch javascript_completed_(false) { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationController* controller = 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &browser->GetSelectedTabContents()->controller(); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::LOAD_STOP, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<NavigationController>(controller)); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::DOM_OPERATION_RESPONSE, 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string script = StringPrintf( 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.setAutomationId(0);" 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.send(addIFrame(%d, \"%s\"));", 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_id, 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url.spec().c_str()); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser->GetSelectedTabContents()->render_view_host()-> 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(script)); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(StringPrintf("\"%d\"", iframe_id), javascript_response_); 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.RemoveAll(); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now that we loaded the iframe, let's fetch its src. 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch script = StringPrintf( 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.send(getIFrameSrc(%d))", iframe_id); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string iframe_src; 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser->GetSelectedTabContents()->render_view_host(), 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"", UTF8ToWide(script), &iframe_src)); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_url_ = GURL(iframe_src); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL iframe_url() const { return iframe_url_; } 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Observe(NotificationType type, 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details) { 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (type == NotificationType::LOAD_STOP) { 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch navigation_completed_ = true; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (type == NotificationType::DOM_OPERATION_RESPONSE) { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<DomOperationNotificationDetails> dom_op_details(details); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch javascript_response_ = dom_op_details->json(); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch javascript_completed_ = true; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (javascript_completed_ && navigation_completed_) 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopForUI::current()->Quit(); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar registrar_; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If true the navigation has completed. 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool navigation_completed_; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If true the javascript call has completed. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool javascript_completed_; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string javascript_response_; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The URL for the iframe we just loaded. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL iframe_url_; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(IFrameLoader); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GeolocationNotificationObserver : public NotificationObserver { 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If |wait_for_infobar| is true, AddWatchAndWaitForNotification will block 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // until the infobar has been displayed; otherwise it will block until the 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // navigation is completed. 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit GeolocationNotificationObserver(bool wait_for_infobar) 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : wait_for_infobar_(wait_for_infobar), 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_(NULL), 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick navigation_started_(false), 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick navigation_completed_(false) { 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::DOM_OPERATION_RESPONSE, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (wait_for_infobar) { 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_ADDED, 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NotificationService::AllSources()); 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registrar_.Add(this, NotificationType::LOAD_START, 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NotificationService::AllSources()); 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registrar_.Add(this, NotificationType::LOAD_STOP, 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddWatchAndWaitForNotification(RenderViewHost* render_view_host, 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::wstring& iframe_xpath) { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "will add geolocation watch"; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string script = 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.setAutomationId(0);" 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.send(geoStart());"; 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_host->ExecuteJavascriptInWebFrame(WideToUTF16Hack(iframe_xpath), 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UTF8ToUTF16(script)); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.RemoveAll(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "got geolocation watch" << javascript_response_; 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE("\"0\"", javascript_response_); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (wait_for_infobar_) { 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(infobar_); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(navigation_completed_); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NotificationObserver 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Observe(NotificationType type, 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details) { 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (type.value == NotificationType::TAB_CONTENTS_INFOBAR_ADDED) { 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_ = Details<InfoBarDelegate>(details).ptr(); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_->GetIcon()); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_->AsConfirmInfoBarDelegate()); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (type == NotificationType::DOM_OPERATION_RESPONSE) { 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<DomOperationNotificationDetails> dom_op_details(details); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch javascript_response_ = dom_op_details->json(); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "javascript_response " << javascript_response_; 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else if (type == NotificationType::NAV_ENTRY_COMMITTED || 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick type == NotificationType::LOAD_START) { 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick navigation_started_ = true; 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else if (type == NotificationType::LOAD_STOP) { 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (navigation_started_) { 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick navigation_started_ = false; 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick navigation_completed_ = true; 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We're either waiting for just the inforbar, or for both a javascript 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // prompt and response. 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (wait_for_infobar_ && infobar_) 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopForUI::current()->Quit(); 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else if (navigation_completed_ && !javascript_response_.empty()) 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopForUI::current()->Quit(); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar registrar_; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool wait_for_infobar_; 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoBarDelegate* infobar_; 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool navigation_started_; 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool navigation_completed_; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string javascript_response_; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid NotifyGeoposition(const Geoposition& geoposition) { 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(MockLocationProvider::instance_); 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MockLocationProvider::instance_->HandlePositionChanged(geoposition); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "MockLocationProvider listeners updated"; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is a browser test for Geolocation. 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It exercises various integration points from javascript <-> browser: 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1. Infobar is displayed when a geolocation is requested from an unauthorized 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// origin. 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 2. Denying the infobar triggers the correct error callback. 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 3. Allowing the infobar does not trigger an error, and allow a geoposition to 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// be passed to javascript. 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 4. Permissions persisted in disk are respected. 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 5. Incognito profiles don't use saved permissions. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GeolocationBrowserTest : public InProcessBrowserTest { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationBrowserTest() 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : infobar_(NULL), 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_(NULL), 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick html_for_tests_("files/geolocation/simple.html"), 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen started_test_server_(false), 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen dependency_factory_( 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new GeolocationArbitratorDependencyFactoryWithLocationProvider( 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &NewAutoSuccessMockNetworkLocationProvider)) { 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EnableDOMAutomation(); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // InProcessBrowserTest 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void SetUpInProcessBrowserTestFixture() { 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationArbitrator::SetDependencyFactoryForTest( 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen dependency_factory_.get()); 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // InProcessBrowserTest 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void TearDownInProcessBrowserTestFixture() { 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(WARNING) << "TearDownInProcessBrowserTestFixture. Test Finished."; 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationArbitrator::SetDependencyFactoryForTest(NULL); 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum InitializationOptions { 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INITIALIZATION_NONE, 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INITIALIZATION_OFFTHERECORD, 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INITIALIZATION_NEWTAB, 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INITIALIZATION_IFRAMES, 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool Initialize(InitializationOptions options) WARN_UNUSED_RESULT { 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!started_test_server_) 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick started_test_server_ = test_server()->Start(); 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(started_test_server_); 2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!started_test_server_) 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick current_url_ = test_server()->GetURL(html_for_tests_); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "before navigate"; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (options == INITIALIZATION_OFFTHERECORD) { 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::OpenURLOffTheRecord(browser()->profile(), current_url_); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_ = BrowserList::FindBrowserWithType( 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->profile()->GetOffTheRecordProfile(), Browser::TYPE_NORMAL, 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (options == INITIALIZATION_NEWTAB) { 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_ = browser(); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_->NewTab(); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(current_browser_, current_url_); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (options == INITIALIZATION_IFRAMES) { 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_ = browser(); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(current_browser_, current_url_); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_ = browser(); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(current_browser_, current_url_); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "after navigate"; 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(current_browser_); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!current_browser_) 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void LoadIFrames(int number_iframes) { 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Limit to 3 iframes. 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(0 < number_iframes && number_iframes <= 3); 26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen iframe_urls_.resize(number_iframes); 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (int i = 0; i < number_iframes; ++i) { 27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IFrameLoader loader(current_browser_, i, GURL()); 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen iframe_urls_[i] = loader.iframe_url(); 27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddGeolocationWatch(bool wait_for_infobar) { 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationNotificationObserver notification_observer(wait_for_infobar); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch notification_observer.AddWatchAndWaitForNotification( 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_->GetSelectedTabContents()->render_view_host(), 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (wait_for_infobar) { 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(notification_observer.infobar_); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_ = notification_observer.infobar_; 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Geoposition GeopositionFromLatLong(double latitude, double longitude) { 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Geoposition geoposition; 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geoposition.latitude = latitude; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geoposition.longitude = longitude; 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geoposition.accuracy = 0; 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geoposition.error_code = Geoposition::ERROR_CODE_NONE; 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Webkit compares the timestamp to wall clock time, so we need 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it to be contemporary. 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geoposition.timestamp = base::Time::Now(); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(geoposition.IsValidFix()); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return geoposition; 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckGeoposition(const Geoposition& geoposition) { 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Checks we have no error. 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascript("0", "geoGetLastError()"); 3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CheckStringValueFromJavascript(base::DoubleToString(geoposition.latitude), 3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "geoGetLastPositionLatitude()"); 3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CheckStringValueFromJavascript(base::DoubleToString(geoposition.longitude), 3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "geoGetLastPositionLongitude()"); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetInfobarResponse(const GURL& requesting_url, bool allowed) { 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents = current_browser_->GetSelectedTabContents(); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabSpecificContentSettings* content_settings = 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents->GetTabSpecificContentSettings(); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GeolocationSettingsState& settings_state = 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch content_settings->geolocation_settings_state(); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t state_map_size = settings_state.state_map().size(); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(infobar_); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "will set infobar response"; 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (allowed) 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_->AsConfirmInfoBarDelegate()->Accept(); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_->AsConfirmInfoBarDelegate()->Cancel(); 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WaitForNavigation(); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents->RemoveInfoBar(infobar_); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "infobar response set"; 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobar_ = NULL; 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_GT(settings_state.state_map().size(), state_map_size); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_origin = requesting_url.GetOrigin(); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, settings_state.state_map().count(requesting_origin)); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ContentSetting expected_setting = 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(expected_setting, 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings_state.state_map().find(requesting_origin)->second); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void WaitForNavigation() { 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(WARNING) << "will block for navigation"; 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NavigationController* controller = 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ¤t_browser_->GetSelectedTabContents()->controller(); 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ui_test_utils::WaitForNavigation(controller); 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(WARNING) << "navigated"; 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckStringValueFromJavascriptForTab( 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& expected, const std::string& function, 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string script = StringPrintf( 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.send(%s)", function.c_str()); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string result; 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents->render_view_host(), 350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick iframe_xpath_, UTF8ToWide(script), &result)); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(expected, result); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckStringValueFromJavascript( 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& expected, const std::string& function) { 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascriptForTab( 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected, function, current_browser_->GetSelectedTabContents()); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoBarDelegate* infobar_; 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* current_browser_; 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // path element of a URL referencing the html content for this test. 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string html_for_tests_; 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This member defines the iframe (or top-level page, if empty) where the 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // javascript calls will run. 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring iframe_xpath_; 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The current url for the top level page. 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL current_url_; 36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If not empty, the GURLs for the iframes loaded by LoadIFrames(). 37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<GURL> iframe_urls_; 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(phajdan.jr): Remove after we can ask TestServer whether it is started. 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool started_test_server_; 37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<GeolocationArbitratorDependencyFactory> dependency_factory_; 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, DisplaysPermissionBar) { 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, Geoposition) { 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetInfobarResponse(current_url_, true); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Crashy, http://crbug.com/70585. 39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, 39272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DISABLED_ErrorOnPermissionDenied) { 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Infobar was displayed, deny access and check for error code. 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetInfobarResponse(current_url_, false); 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascript("1", "geoGetLastError()"); 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// http://crbug.com/44589. Hangs on Mac, crashes on Windows 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX) || defined(OS_WINDOWS) 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_NoInfobarForSecondTab DISABLED_NoInfobarForSecondTab 4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_NoInfobarForSecondTab NoInfobarForSecondTab 4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, MAYBE_NoInfobarForSecondTab) { 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetInfobarResponse(current_url_, true); 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Disables further prompts from this tab. 411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Checks infobar will not be created a second tab. 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NEWTAB)); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(false); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// http://crbug.com/44589. Hangs on Mac, crashes on Windows 4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX) || defined(OS_WINDOWS) 4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_NoInfobarForDeniedOrigin DISABLED_NoInfobarForDeniedOrigin 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_NoInfobarForDeniedOrigin NoInfobarForDeniedOrigin 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, MAYBE_NoInfobarForDeniedOrigin) { 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_->profile()->GetGeolocationContentSettingsMap()-> 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetContentSetting(current_url_, current_url_, CONTENT_SETTING_BLOCK); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(false); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Checks we have an error for this denied origin. 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascript("1", "geoGetLastError()"); 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Checks infobar will not be created a second tab. 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NEWTAB)); 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(false); 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascript("1", "geoGetLastError()"); 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoInfobarForAllowedOrigin) { 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_->profile()->GetGeolocationContentSettingsMap()-> 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetContentSetting(current_url_, current_url_, CONTENT_SETTING_ALLOW); 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Checks no infobar will be created and there's no error callback. 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(false); 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, NoInfobarForOffTheRecord) { 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First, check infobar will be created for regular profile 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Response will be persisted 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetInfobarResponse(current_url_, true); 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Disables further prompts from this tab. 455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Go incognito, and checks no infobar will be created. 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_OFFTHERECORD)); 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(false); 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, IFramesWithFreshPosition) { 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_for_tests_ = "files/geolocation/iframes_different_origin.html"; 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadIFrames(2); 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "frames loaded"; 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_0']"; 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[0], true); 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Disables further prompts from this iframe. 473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test second iframe from a different origin with a cached geoposition will 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // create the infobar. 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_1']"; 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Back to the first frame, enable navigation and refresh geoposition. 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_0']"; 482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("1", "geoSetMaxNavigateCount(1)"); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MockLocationProvider must have been created. 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(MockLocationProvider::instance_); 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Geoposition fresh_position = GeopositionFromLatLong(3.17, 4.23); 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NotifyGeoposition(fresh_position); 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WaitForNavigation(); 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(fresh_position); 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Disable navigation for this frame. 491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now go ahead an authorize the second frame. 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_1']"; 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Infobar was displayed, allow access and check there's no error code. 49672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[1], true); 497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(WARNING) << "Checking position..."; 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(fresh_position); 499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(WARNING) << "...done."; 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, IFramesWithCachedPosition) { 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_for_tests_ = "files/geolocation/iframes_different_origin.html"; 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadIFrames(2); 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_0']"; 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[0], true); 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Refresh geoposition, but let's not yet create the watch on the second frame 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // so that it'll fetch from cache. 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MockLocationProvider must have been created. 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(MockLocationProvider::instance_); 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Geoposition cached_position = GeopositionFromLatLong(5.67, 8.09); 517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NotifyGeoposition(cached_position); 518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WaitForNavigation(); 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(cached_position); 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Disable navigation for this frame. 522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now go ahead an authorize the second frame. 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_1']"; 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WebKit will use its cache, but we also broadcast a position shortly 528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // afterwards. We're only interested in the first navigation for the success 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // callback from the cached position. 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("1", "geoSetMaxNavigateCount(1)"); 53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[1], true); 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(cached_position); 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// See http://crbug.com/56033 5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, 537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISABLED_CancelPermissionForFrame) { 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_for_tests_ = "files/geolocation/iframes_different_origin.html"; 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadIFrames(2); 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "frames loaded"; 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_0']"; 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[0], true); 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Disables further prompts from this iframe. 548731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test second iframe from a different origin with a cached geoposition will 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // create the infobar. 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_1']"; 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t num_infobars_before_cancel = 55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen current_browser_->GetSelectedTabContents()->infobar_count(); 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Change the iframe, and ensure the infobar is gone. 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IFrameLoader change_iframe_1(current_browser_, 1, current_url_); 55972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t num_infobars_after_cancel = 56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen current_browser_->GetSelectedTabContents()->infobar_count(); 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(num_infobars_before_cancel, num_infobars_after_cancel + 1); 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Disabled, http://crbug.com/66959. 56521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, DISABLED_InvalidUrlRequest) { 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tests that an invalid URL (e.g. from a popup window) is rejected 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // correctly. Also acts as a regression test for http://crbug.com/40478 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_for_tests_ = "files/geolocation/invalid_request_url.html"; 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* original_tab = current_browser_->GetSelectedTabContents(); 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascript("1", "requestGeolocationFromInvalidUrl()"); 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascriptForTab("1", "isAlive()", original_tab); 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Crashy, http://crbug.com/66400. 57621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, DISABLED_NoInfoBarBeforeStart) { 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See http://crbug.com/42789 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_for_tests_ = "files/geolocation/iframes_different_origin.html"; 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadIFrames(2); 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "frames loaded"; 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Access navigator.geolocation, but ensure it won't request permission. 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_1']"; 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckStringValueFromJavascript("object", "geoAccessNavigatorGeolocation()"); 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_0']"; 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 58972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[0], true); 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CheckStringValueFromJavascript("0", "geoSetMaxNavigateCount(0)"); 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Permission should be requested after adding a watch. 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iframe_xpath_ = L"//iframe[@id='iframe_1']"; 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 59672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetInfobarResponse(iframe_urls_[1], true); 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, TwoWatchesInOneFrame) { 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_for_tests_ = "files/geolocation/two_watches.html"; 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(Initialize(INITIALIZATION_NONE)); 603731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // First, set the JavaScript to navigate when it receives |final_position|. 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Geoposition final_position = GeopositionFromLatLong(3.17, 4.23); 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string script = StringPrintf( 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "window.domAutomationController.send(geoSetFinalPosition(%f, %f))", 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch final_position.latitude, final_position.longitude); 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string js_result; 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_browser_->GetSelectedTabContents()->render_view_host(), 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"", UTF8ToWide(script), &js_result)); 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(js_result, "ok"); 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Send a position which both geolocation watches will receive. 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddGeolocationWatch(true); 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetInfobarResponse(current_url_, true); 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(MockLocationProvider::instance_->position_); 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The second watch will now have cancelled. Ensure an update still makes 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // its way through to the first watcher. 621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NotifyGeoposition(final_position); 622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WaitForNavigation(); 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckGeoposition(final_position); 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 62572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 62672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Hangs flakily, http://crbug.com/70588. 62772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(GeolocationBrowserTest, DISABLED_TabDestroyed) { 62872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen html_for_tests_ = "files/geolocation/tab_destroyed.html"; 62972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(Initialize(INITIALIZATION_IFRAMES)); 63072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadIFrames(3); 63172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 63272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen iframe_xpath_ = L"//iframe[@id='iframe_0']"; 63372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddGeolocationWatch(true); 63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 63572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen iframe_xpath_ = L"//iframe[@id='iframe_1']"; 63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddGeolocationWatch(false); 63772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 63872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen iframe_xpath_ = L"//iframe[@id='iframe_2']"; 63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddGeolocationWatch(false); 64072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 64172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string script = 64272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "window.domAutomationController.setAutomationId(0);" 64372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "window.domAutomationController.send(window.close());"; 64472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = 64572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui_test_utils::ExecuteJavaScript( 64672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen current_browser_->GetSelectedTabContents()->render_view_host(), 64772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen L"", UTF8ToWide(script)); 64872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(result, true); 64972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 65072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 65172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 652