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
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/geolocation_permission_context.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <functional>
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/geolocation/geolocation_content_settings_map.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/google/google_util.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_util.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/geolocation_provider.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/geolocation_messages.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h"
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h"
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController ------------------------------------------
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class controls the geolocation infobar queue per profile, and it's an
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// internal class to GeolocationPermissionContext.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An alternate approach would be to have this queue per tab, and use
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notifications to broadcast when permission is set / listen to notification to
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// cancel pending requests. This may be specially useful if there are other
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// things listening for such notifications.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For the time being this class is self-contained and it doesn't seem pulling
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the notification infrastructure would simplify.
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GeolocationInfoBarQueueController : NotificationObserver {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationInfoBarQueueController(
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GeolocationPermissionContext* geolocation_permission_context,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Profile* profile);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~GeolocationInfoBarQueueController();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The InfoBar will be displayed immediately if the tab is not already
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // displaying one, otherwise it'll be queued.
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CreateInfoBarRequest(int render_process_id,
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            int render_view_id,
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            int bridge_id,
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const GURL& requesting_frame,
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const GURL& emebedder);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancels a specific infobar request.
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CancelInfoBarRequest(int render_process_id,
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            int render_view_id,
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            int bridge_id);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by the InfoBarDelegate to notify it's closed. It'll display a new
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // InfoBar if there's any request pending for this tab.
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnInfoBarClosed(int render_process_id,
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       int render_view_id,
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       int bridge_id);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by the InfoBarDelegate to notify permission has been set.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It'll notify and dismiss any other pending InfoBar request for the same
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |requesting_frame| and embedder.
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnPermissionSet(int render_process_id,
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       int render_view_id,
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       int bridge_id,
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const GURL& requesting_frame,
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const GURL& embedder,
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       bool allowed);
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NotificationObserver
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct PendingInfoBarRequest;
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  class RequestEquals;
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<PendingInfoBarRequest> PendingInfoBarRequests;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shows the first pending infobar for this tab.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ShowQueuedInfoBar(int render_process_id, int render_view_id);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancels an InfoBar request and returns the next iterator position.
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PendingInfoBarRequests::iterator CancelInfoBarRequestInternal(
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      PendingInfoBarRequests::iterator i);
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar registrar_;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationPermissionContext* const geolocation_permission_context_;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* const profile_;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PendingInfoBarRequests pending_infobar_requests_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationConfirmInfoBarDelegate ------------------------------------------
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationConfirmInfoBarDelegate(
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      TabContents* tab_contents,
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GeolocationInfoBarQueueController* controller,
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      int render_process_id,
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      int render_view_id,
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      int bridge_id,
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL& requesting_frame_url,
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const std::string& display_languages);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~GeolocationConfirmInfoBarDelegate();
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ConfirmInfoBarDelegate:
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void InfoBarClosed();
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual SkBitmap* GetIcon() const;
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual Type GetInfoBarType() const;
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetMessageText() const;
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetButtonLabel(InfoBarButton button) const;
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool Accept();
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool Cancel();
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetLinkText();
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool LinkClicked(WindowOpenDisposition disposition);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents_;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationInfoBarQueueController* controller_;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_process_id_;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_view_id_;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int bridge_id_;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame_url_;
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string display_languages_;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_IMPLICIT_CONSTRUCTORS(GeolocationConfirmInfoBarDelegate);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationConfirmInfoBarDelegate::GeolocationConfirmInfoBarDelegate(
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TabContents* tab_contents,
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    GeolocationInfoBarQueueController* controller,
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& requesting_frame_url,
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& display_languages)
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : ConfirmInfoBarDelegate(tab_contents),
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab_contents_(tab_contents),
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      controller_(controller),
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      render_process_id_(render_process_id),
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      render_view_id_(render_view_id),
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      bridge_id_(bridge_id),
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      requesting_frame_url_(requesting_frame_url),
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      display_languages_(display_languages) {
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationConfirmInfoBarDelegate::~GeolocationConfirmInfoBarDelegate() {
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationConfirmInfoBarDelegate::InfoBarClosed() {
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller_->OnInfoBarClosed(render_process_id_, render_view_id_,
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               bridge_id_);
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete this;
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSkBitmap* GeolocationConfirmInfoBarDelegate::GetIcon() const {
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return ResourceBundle::GetSharedInstance().GetBitmapNamed(
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IDR_GEOLOCATION_INFOBAR_ICON);
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenInfoBarDelegate::Type
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    GeolocationConfirmInfoBarDelegate::GetInfoBarType() const {
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return PAGE_ACTION_TYPE;
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 GeolocationConfirmInfoBarDelegate::GetMessageText() const {
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION,
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      net::FormatUrl(requesting_frame_url_.GetOrigin(), display_languages_));
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 GeolocationConfirmInfoBarDelegate::GetButtonLabel(
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarButton button) const {
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IDS_GEOLOCATION_ALLOW_BUTTON : IDS_GEOLOCATION_DENY_BUTTON);
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationConfirmInfoBarDelegate::Accept() {
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_,
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      requesting_frame_url_, tab_contents_->GetURL(), true);
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationConfirmInfoBarDelegate::Cancel() {
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_,
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      requesting_frame_url_, tab_contents_->GetURL(), false);
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 GeolocationConfirmInfoBarDelegate::GetLinkText() {
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationConfirmInfoBarDelegate::LinkClicked(
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    WindowOpenDisposition disposition) {
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char kGeolocationLearnMoreUrl[] =
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS)
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "https://www.google.com/support/chromeos/bin/answer.py?answer=142065";
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "https://www.google.com/support/chrome/bin/answer.py?answer=142065";
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Ignore the click disposition and always open in a new top level tab.
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_contents_->OpenURL(
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      google_util::AppendGoogleLocaleParam(GURL(kGeolocationLearnMoreUrl)),
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return false;  // Do not dismiss the info bar.
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController::PendingInfoBarRequest -------------------
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct GeolocationInfoBarQueueController::PendingInfoBarRequest {
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PendingInfoBarRequest(int render_process_id,
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        int render_view_id,
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        int bridge_id,
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const GURL& requesting_frame,
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const GURL& embedder);
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool IsForTab(int p_render_process_id, int p_render_view_id) const;
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool IsForPair(const GURL& p_requesting_frame,
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 const GURL& p_embedder) const;
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool Equals(int p_render_process_id,
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              int p_render_view_id,
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              int p_bridge_id) const;
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_process_id;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_view_id;
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int bridge_id;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL requesting_frame;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL embedder;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InfoBarDelegate* infobar_delegate;
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationInfoBarQueueController::PendingInfoBarRequest::PendingInfoBarRequest(
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const GURL& requesting_frame,
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const GURL& embedder)
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : render_process_id(render_process_id),
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      render_view_id(render_view_id),
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      bridge_id(bridge_id),
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      requesting_frame(requesting_frame),
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      embedder(embedder),
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      infobar_delegate(NULL) {
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForTab(
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int p_render_process_id,
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int p_render_view_id) const {
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return (render_process_id == p_render_process_id) &&
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      (render_view_id == p_render_view_id);
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForPair(
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& p_requesting_frame,
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& p_embedder) const {
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return (requesting_frame == p_requesting_frame) && (embedder == p_embedder);
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::PendingInfoBarRequest::Equals(
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int p_render_process_id,
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int p_render_view_id,
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int p_bridge_id) const {
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return IsForTab(p_render_process_id, p_render_view_id) &&
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     (bridge_id == p_bridge_id);
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController::RequestEquals ---------------------------
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Useful predicate for checking PendingInfoBarRequest equality.
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GeolocationInfoBarQueueController::RequestEquals
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : public std::unary_function<PendingInfoBarRequest, bool> {
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RequestEquals(int render_process_id, int render_view_id, int bridge_id);
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool operator()(const PendingInfoBarRequest& request) const;
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int render_process_id_;
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int render_view_id_;
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int bridge_id_;
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationInfoBarQueueController::RequestEquals::RequestEquals(
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id)
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : render_process_id_(render_process_id),
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      render_view_id_(render_view_id),
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      bridge_id_(bridge_id) {
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::RequestEquals::operator()(
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const PendingInfoBarRequest& request) const {
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return request.Equals(render_process_id_, render_view_id_, bridge_id_);
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController ------------------------------------------
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationInfoBarQueueController::GeolocationInfoBarQueueController(
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GeolocationPermissionContext* geolocation_permission_context,
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile)
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : geolocation_permission_context_(geolocation_permission_context),
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(profile) {
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationInfoBarQueueController::~GeolocationInfoBarQueueController() {
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationInfoBarQueueController::CreateInfoBarRequest(
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& requesting_frame,
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& embedder) {
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We shouldn't get duplicate requests.
34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(std::find_if(pending_infobar_requests_.begin(),
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      pending_infobar_requests_.end(),
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      RequestEquals(render_process_id, render_view_id, bridge_id)) ==
34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      pending_infobar_requests_.end());
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pending_infobar_requests_.push_back(PendingInfoBarRequest(render_process_id,
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      render_view_id, bridge_id, requesting_frame, embedder));
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowQueuedInfoBar(render_process_id, render_view_id);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationInfoBarQueueController::CancelInfoBarRequest(
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id) {
35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PendingInfoBarRequests::iterator i = std::find_if(
36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      pending_infobar_requests_.begin(), pending_infobar_requests_.end(),
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      RequestEquals(render_process_id, render_view_id, bridge_id));
36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(pkasting): Can this conditional become a DCHECK()?
36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (i != pending_infobar_requests_.end())
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    CancelInfoBarRequestInternal(i);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationInfoBarQueueController::OnInfoBarClosed(int render_process_id,
37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                        int render_view_id,
37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                        int bridge_id) {
372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PendingInfoBarRequests::iterator i = std::find_if(
37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      pending_infobar_requests_.begin(), pending_infobar_requests_.end(),
37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      RequestEquals(render_process_id, render_view_id, bridge_id));
37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (i != pending_infobar_requests_.end())
37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    pending_infobar_requests_.erase(i);
37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowQueuedInfoBar(render_process_id, render_view_id);
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationInfoBarQueueController::OnPermissionSet(
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
38672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
38772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& requesting_frame,
38872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& embedder,
38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool allowed) {
390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSetting content_setting =
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK;
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_->GetGeolocationContentSettingsMap()->SetContentSetting(
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      requesting_frame.GetOrigin(), embedder.GetOrigin(), content_setting);
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       i != pending_infobar_requests_.end(); ) {
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (i->IsForPair(requesting_frame, embedder)) {
40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Cancel this request first, then notify listeners.  TODO(pkasting): Why
40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // is this order important?
40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // NOTE: If the pending request had an infobar, TabContents will close it
40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // either synchronously or asynchronously, which will then pump the queue
40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // via OnInfoBarClosed().
40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      PendingInfoBarRequest copied_request = *i;
40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Don't let CancelInfoBarRequestInternal() call RemoveInfoBar() on the
40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // delegate that's currently calling us.  That delegate is in either
40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Accept() or Cancel(), so its owning InfoBar will call RemoveInfoBar()
40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // later on in this callstack anyway; and if we do it here, and it causes
41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // the delegate to be deleted, our GURL& args will point to garbage and we
41172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // may also cause other problems during stack unwinding.
41272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (i->Equals(render_process_id, render_view_id, bridge_id))
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        i->infobar_delegate = NULL;
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      i = CancelInfoBarRequestInternal(i);
41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      geolocation_permission_context_->NotifyPermissionSet(
41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          copied_request.render_process_id, copied_request.render_view_id,
41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          copied_request.bridge_id, copied_request.requesting_frame, allowed);
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ++i;
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationInfoBarQueueController::Observe(
42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NotificationType type, const NotificationSource& source,
42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NotificationDetails& details) {
42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED,
42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    source);
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContents* tab_contents = Source<TabContents>(source).ptr();
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick       i != pending_infobar_requests_.end();) {
43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (i->infobar_delegate == NULL &&
43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        tab_contents == tab_util::GetTabContentsByID(i->render_process_id,
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                     i->render_view_id)) {
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      i = pending_infobar_requests_.erase(i);
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else {
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ++i;
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id,
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                          int render_view_id) {
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContents* tab_contents =
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab_util::GetTabContentsByID(render_process_id, render_view_id);
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       i != pending_infobar_requests_.end(); ) {
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (i->IsForTab(render_process_id, render_view_id)) {
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (!tab_contents) {
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        i = pending_infobar_requests_.erase(i);
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        continue;
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (!i->infobar_delegate) {
45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (!registrar_.IsRegistered(this,
45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     NotificationType::TAB_CONTENTS_DESTROYED,
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     Source<TabContents>(tab_contents))) {
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED,
46072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                         Source<TabContents>(tab_contents));
46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        }
46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        i->infobar_delegate = new GeolocationConfirmInfoBarDelegate(
46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            tab_contents, this, render_process_id, render_view_id, i->bridge_id,
46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            i->requesting_frame,
46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        tab_contents->AddInfoBar(i->infobar_delegate);
46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ++i;
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationInfoBarQueueController::PendingInfoBarRequests::iterator
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GeolocationInfoBarQueueController::CancelInfoBarRequestInternal(
47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    PendingInfoBarRequests::iterator i) {
47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InfoBarDelegate* delegate = i->infobar_delegate;
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!delegate)
47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return pending_infobar_requests_.erase(i);
48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents =
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_util::GetTabContentsByID(i->render_process_id, i->render_view_id);
48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!tab_contents)
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return pending_infobar_requests_.erase(i);
48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TabContents will destroy the InfoBar, which will remove from our vector
48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // asynchronously.
48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_contents->RemoveInfoBar(i->infobar_delegate);
48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return ++i;
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationPermissionContext -----------------------------------------------
49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationPermissionContext::GeolocationPermissionContext(
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile)
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : profile_(profile),
49872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ALLOW_THIS_IN_INITIALIZER_LIST(geolocation_infobar_queue_controller_(
49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         new GeolocationInfoBarQueueController(this, profile))) {
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationPermissionContext::~GeolocationPermissionContext() {
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::RequestGeolocationPermission(
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int render_process_id, int render_view_id, int bridge_id,
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& requesting_frame) {
508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this, &GeolocationPermissionContext::RequestGeolocationPermission,
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        render_process_id, render_view_id, bridge_id, requesting_frame));
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* extensions = profile_->GetExtensionService();
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (extensions) {
518513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* ext = extensions->GetExtensionByURL(requesting_frame);
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!ext)
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ext = extensions->GetExtensionByWebExtent(requesting_frame);
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (ext && ext->HasApiPermission(Extension::kGeolocationPermission)) {
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ExtensionProcessManager* epm = profile_->GetExtensionProcessManager();
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      RenderProcessHost* process = epm->GetExtensionProcess(requesting_frame);
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (process && process->id() == render_process_id) {
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            requesting_frame, true);
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return;
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents =
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_util::GetTabContentsByID(render_process_id, render_view_id);
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!tab_contents) {
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The tab may have gone away, or the request may not be from a tab at all.
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(WARNING) << "Attempt to use geolocation tabless renderer: "
53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << render_process_id << "," << render_view_id << ","
53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << bridge_id << " (can't prompt user without a visible tab)";
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        requesting_frame, false);
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL embedder = tab_contents->GetURL();
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!requesting_frame.is_valid() || !embedder.is_valid()) {
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(WARNING) << "Attempt to use geolocation from an invalid URL: "
54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << requesting_frame << "," << embedder
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << " (geolocation is not supported in popups)";
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        requesting_frame, false);
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSetting content_setting =
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_->GetGeolocationContentSettingsMap()->GetContentSetting(
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          requesting_frame, embedder);
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (content_setting == CONTENT_SETTING_BLOCK) {
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        requesting_frame, false);
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (content_setting == CONTENT_SETTING_ALLOW) {
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        requesting_frame, true);
56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {  // setting == ask. Prompt the user.
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    geolocation_infobar_queue_controller_->CreateInfoBarRequest(
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        render_process_id, render_view_id, bridge_id, requesting_frame,
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        embedder);
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::CancelGeolocationPermissionRequest(
57172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
57272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
57372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& requesting_frame) {
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelPendingInfoBarRequest(render_process_id, render_view_id, bridge_id);
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::NotifyPermissionSet(
57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id,
58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& requesting_frame,
58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool allowed) {
584731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents =
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_util::GetTabContentsByID(render_process_id, render_view_id);
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TabContents may have gone away (or not exists for extension).
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (tab_contents) {
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabSpecificContentSettings* content_settings =
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        tab_contents->GetTabSpecificContentSettings();
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    content_settings->OnGeolocationPermissionSet(requesting_frame.GetOrigin(),
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 allowed);
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  RenderViewHost* r = RenderViewHost::FromID(render_process_id, render_view_id);
598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (r) {
599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    r->Send(new GeolocationMsg_PermissionSet(
600dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        render_view_id, bridge_id, allowed));
601dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
602dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (allowed) {
60472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod(
60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this, &GeolocationPermissionContext::NotifyArbitratorPermissionGranted,
60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        requesting_frame));
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::NotifyArbitratorPermissionGranted(
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& requesting_frame) {
612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GeolocationProvider::GetInstance()->OnPermissionGranted(requesting_frame);
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::CancelPendingInfoBarRequest(
61772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_process_id,
61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int render_view_id,
61972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int bridge_id) {
620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
62172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
62272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this, &GeolocationPermissionContext::CancelPendingInfoBarRequest,
62372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        render_process_id, render_view_id, bridge_id));
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     return;
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
62772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  geolocation_infobar_queue_controller_->CancelInfoBarRequest(render_process_id,
62872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      render_view_id, bridge_id);
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
630