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