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        &current_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