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
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/geolocation/geolocation_content_settings_map.h"
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/testing_profile.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/arbitrator_dependency_factories_for_test.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/geolocation_permission_context.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/location_arbitrator.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/location_provider.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/mock_location_provider.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/mock_render_process_host.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/test_render_view_host.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/test_tab_contents.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/geolocation_messages.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TestTabContentsWithPendingInfoBar ------------------------------------------
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TestTabContents short-circuits TAB_CONTENTS_INFOBAR_REMOVED to call
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// InfoBarClosed() directly. We need to observe it and call InfoBarClosed()
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// later.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestTabContentsWithPendingInfoBar : public TestTabContents {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestTabContentsWithPendingInfoBar(Profile* profile, SiteInstance* instance);
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~TestTabContentsWithPendingInfoBar();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TestTabContents:
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InfoBarDelegate* removed_infobar_delegate_;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTestTabContentsWithPendingInfoBar::TestTabContentsWithPendingInfoBar(
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile,
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SiteInstance* instance)
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : TestTabContents(profile, instance),
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      removed_infobar_delegate_(NULL) {
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTestTabContentsWithPendingInfoBar::~TestTabContentsWithPendingInfoBar() {
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TestTabContentsWithPendingInfoBar::Observe(
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NotificationType type,
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NotificationSource& source,
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NotificationDetails& details) {
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (type.value == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED)
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    removed_infobar_delegate_ = Details<InfoBarDelegate>(details).ptr();
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TestTabContents::Observe(type, source, details);
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationPermissionContextTests ------------------------------------------
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This class sets up GeolocationArbitrator.
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GeolocationPermissionContextTests : public RenderViewHostTestHarness {
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GeolocationPermissionContextTests();
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected:
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~GeolocationPermissionContextTests();
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int process_id() { return contents()->render_view_host()->process()->id(); }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int process_id_for_tab(int tab) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return extra_tabs_[tab]->render_view_host()->process()->id();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int render_id() { return contents()->render_view_host()->routing_id(); }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_id_for_tab(int tab) {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return extra_tabs_[tab]->render_view_host()->routing_id();
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int bridge_id() const { return 42; }  // Not relevant at this level.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CheckPermissionMessageSent(int bridge_id, bool allowed);
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckPermissionMessageSentInternal(MockRenderProcessHost* process,
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          int bridge_id,
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                          bool allowed);
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void AddNewTab(const GURL& url);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckTabContentsState(const GURL& requesting_frame,
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             ContentSetting expected_content_setting);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestTabContentsWithPendingInfoBar* tab_contents_with_pending_infobar_;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedVector<TestTabContentsWithPendingInfoBar> extra_tabs_;
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // RenderViewHostTestHarness:
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetUp();
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void TearDown();
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserThread ui_thread_;
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<GeolocationArbitratorDependencyFactory> dependency_factory_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationPermissionContextTests::GeolocationPermissionContextTests()
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : RenderViewHostTestHarness(),
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab_contents_with_pending_infobar_(NULL),
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ui_thread_(BrowserThread::UI, MessageLoop::current()),
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      dependency_factory_(
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          new GeolocationArbitratorDependencyFactoryWithLocationProvider(
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              &NewAutoSuccessMockNetworkLocationProvider)) {
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationPermissionContextTests::~GeolocationPermissionContextTests() {
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckPermissionMessageSent(
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool allowed) {
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CheckPermissionMessageSentInternal(process(), bridge_id, allowed);
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckPermissionMessageSentForTab(
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int tab,
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool allowed) {
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CheckPermissionMessageSentInternal(static_cast<MockRenderProcessHost*>(
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      extra_tabs_[tab]->render_view_host()->process()), bridge_id, allowed);
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckPermissionMessageSentInternal(
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    MockRenderProcessHost* process,
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool allowed) {
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MessageLoop::current()->Run();
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const IPC::Message* message = process->sink().GetFirstMessageMatching(
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      GeolocationMsg_PermissionSet::ID);
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(message);
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GeolocationMsg_PermissionSet::Param param;
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GeolocationMsg_PermissionSet::Read(message, &param);
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(bridge_id, param.a);
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(allowed, param.b);
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  process->sink().ClearMessages();
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::AddNewTab(const GURL& url) {
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestTabContentsWithPendingInfoBar* new_tab =
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new TestTabContentsWithPendingInfoBar(profile(), NULL);
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new_tab->controller().LoadURL(url, GURL(), PageTransition::TYPED);
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static_cast<TestRenderViewHost*>(new_tab->render_manager()->current_host())->
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      SendNavigate(extra_tabs_.size() + 1, url);
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  extra_tabs_.push_back(new_tab);
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::CheckTabContentsState(
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& requesting_frame,
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ContentSetting expected_content_setting) {
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabSpecificContentSettings* content_settings =
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      contents()->GetTabSpecificContentSettings();
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const GeolocationSettingsState::StateMap& state_map =
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      content_settings->geolocation_settings_state().state_map();
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, state_map.count(requesting_frame.GetOrigin()));
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, state_map.count(requesting_frame));
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GeolocationSettingsState::StateMap::const_iterator settings =
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      state_map.find(requesting_frame.GetOrigin());
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_FALSE(settings == state_map.end())
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      << "geolocation state not found " << requesting_frame;
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(expected_content_setting, settings->second);
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::SetUp() {
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RenderViewHostTestHarness::SetUp();
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GeolocationArbitrator::SetDependencyFactoryForTest(
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      dependency_factory_.get());
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SiteInstance* site_instance = contents()->GetSiteInstance();
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_contents_with_pending_infobar_ =
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new TestTabContentsWithPendingInfoBar(profile_.get(), site_instance);
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetContents(tab_contents_with_pending_infobar_);
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  geolocation_permission_context_ =
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new GeolocationPermissionContext(profile());
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationPermissionContextTests::TearDown() {
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GeolocationArbitrator::SetDependencyFactoryForTest(NULL);
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RenderViewHostTestHarness::TearDown();
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests ----------------------------------------------------------------------
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, SinglePermission) {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame("http://www.example.com/geolocation");
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommit(requesting_frame);
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), requesting_frame);
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, QueuedPermission) {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame_0("http://www.example.com/geolocation");
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame_1("http://www.example-2.com/geolocation");
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ASK,
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_0, requesting_frame_0));
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ASK,
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_1, requesting_frame_0));
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommit(requesting_frame_0);
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request permission for two frames.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), requesting_frame_0);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id() + 1, requesting_frame_1);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure only one infobar is created.
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_0 =
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_0);
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 text_0 = infobar_0->GetMessageText();
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accept the first frame.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->Accept();
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSent(bridge_id(), true);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents()->RemoveInfoBar(infobar_0);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_0,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            tab_contents_with_pending_infobar_->removed_infobar_delegate_);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->InfoBarClosed();
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now we should have a new infobar for the second frame.
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_1 =
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_1);
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 text_1 = infobar_1->GetMessageText();
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(text_0, text_1);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancel (block) this frame.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_1->Cancel();
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK);
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSent(bridge_id() + 1, false);
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents()->RemoveInfoBar(infobar_1);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_1,
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            tab_contents_with_pending_infobar_->removed_infobar_delegate_);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_1->InfoBarClosed();
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure the persisted permissions are ok.
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ALLOW,
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_0, requesting_frame_0));
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_BLOCK,
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_1, requesting_frame_0));
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, CancelGeolocationPermissionRequest) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame_0("http://www.example.com/geolocation");
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame_1("http://www.example-2.com/geolocation");
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ASK,
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_0, requesting_frame_0));
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ASK,
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_1, requesting_frame_0));
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommit(requesting_frame_0);
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request permission for two frames.
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), requesting_frame_0);
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id() + 1, requesting_frame_1);
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_0 =
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_0);
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 text_0 = infobar_0->GetMessageText();
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate the frame going away, ensure the infobar for this frame
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is removed and the next pending infobar is created.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->CancelGeolocationPermissionRequest(
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), requesting_frame_0);
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_0,
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            tab_contents_with_pending_infobar_->removed_infobar_delegate_);
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->InfoBarClosed();
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_1 =
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_1);
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 text_1 = infobar_1->GetMessageText();
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(text_0, text_1);
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Allow this frame.
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_1->Accept();
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW);
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSent(bridge_id() + 1, true);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents()->RemoveInfoBar(infobar_1);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_1,
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            tab_contents_with_pending_infobar_->removed_infobar_delegate_);
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_1->InfoBarClosed();
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure the persisted permissions are ok.
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ASK,
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_0, requesting_frame_0));
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(CONTENT_SETTING_ALLOW,
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame_1, requesting_frame_0));
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, InvalidURL) {
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL invalid_embedder;
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame("about:blank");
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommit(invalid_embedder);
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), requesting_frame);
32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSent(bridge_id(), false);
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) {
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_a("http://www.example.com/geolocation");
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_b("http://www.example-2.com/geolocation");
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommit(url_a);
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddNewTab(url_b);
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddNewTab(url_a);
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), url_a);
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_b);
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, extra_tabs_[0]->infobar_count());
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id_for_tab(1), render_id_for_tab(1), bridge_id(), url_a);
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, extra_tabs_[1]->infobar_count());
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* removed_infobar =
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extra_tabs_[1]->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accept the first tab.
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_0 =
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_0);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->Accept();
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSent(bridge_id(), true);
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents()->RemoveInfoBar(infobar_0);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_0,
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            tab_contents_with_pending_infobar_->removed_infobar_delegate_);
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->InfoBarClosed();
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now the infobar for the tab with the same origin should have gone.
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, extra_tabs_[1]->infobar_count());
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSentForTab(1, bridge_id(), true);
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Destroy the infobar that has just been removed.
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  removed_infobar->InfoBarClosed();
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // But the other tab should still have the info bar...
37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, extra_tabs_[0]->infobar_count());
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extra_tabs_.reset();
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) {
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_a("http://www.example.com/geolocation");
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_b("http://www.example-2.com/geolocation");
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommit(url_a);
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddNewTab(url_a);
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id(), render_id(), bridge_id(), url_a);
38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_a);
38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, extra_tabs_[0]->infobar_count());
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_permission_context_->RequestGeolocationPermission(
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      process_id_for_tab(0), render_id_for_tab(0), bridge_id() + 1, url_b);
39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, extra_tabs_[0]->infobar_count());
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* removed_infobar =
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accept the second tab.
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_0 =
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extra_tabs_[0]->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_0);
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->Accept();
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSentForTab(0, bridge_id(), true);
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extra_tabs_[0]->RemoveInfoBar(infobar_0);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_0,
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            extra_tabs_[0]->removed_infobar_delegate_);
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_0->InfoBarClosed();
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now the infobar for the tab with the same origin should have gone.
40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSent(bridge_id(), true);
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Destroy the infobar that has just been removed.
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  removed_infobar->InfoBarClosed();
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And we should have the queued infobar displayed now.
41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, extra_tabs_[0]->infobar_count());
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accept the second infobar.
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfirmInfoBarDelegate* infobar_1 =
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      extra_tabs_[0]->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(infobar_1);
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_1->Accept();
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckPermissionMessageSentForTab(0, bridge_id() + 1, true);
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extra_tabs_[0]->RemoveInfoBar(infobar_1);
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(infobar_1,
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            extra_tabs_[0]->removed_infobar_delegate_);
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  infobar_1->InfoBarClosed();
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extra_tabs_.reset();
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(GeolocationPermissionContextTests, TabDestroyed) {
43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL requesting_frame_0("http://www.example.com/geolocation");
43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL requesting_frame_1("http://www.example-2.com/geolocation");
43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      CONTENT_SETTING_ASK,
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          requesting_frame_0, requesting_frame_0));
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      CONTENT_SETTING_ASK,
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      profile()->GetGeolocationContentSettingsMap()->GetContentSetting(
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          requesting_frame_1, requesting_frame_0));
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NavigateAndCommit(requesting_frame_0);
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0U, contents()->infobar_count());
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Request permission for two frames.
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  geolocation_permission_context_->RequestGeolocationPermission(
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      process_id(), render_id(), bridge_id(), requesting_frame_0);
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  geolocation_permission_context_->RequestGeolocationPermission(
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      process_id(), render_id(), bridge_id() + 1, requesting_frame_1);
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Ensure only one infobar is created.
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1U, contents()->infobar_count());
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ConfirmInfoBarDelegate* infobar_0 =
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      contents()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(infobar_0);
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 text_0 = infobar_0->GetMessageText();
45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Delete the tab contents.
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DeleteContents();
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
460