| Index: chrome/browser/geolocation/geolocation_permission_context.cc
|
| ===================================================================
|
| --- chrome/browser/geolocation/geolocation_permission_context.cc (revision 72158)
|
| +++ chrome/browser/geolocation/geolocation_permission_context.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -34,17 +34,8 @@
|
| #include "net/base/net_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
|
|
| -namespace {
|
| +// GeolocationInfoBarQueueController ------------------------------------------
|
|
|
| -const char kGeolocationLearnMoreUrl[] =
|
| -#if defined(OS_CHROMEOS)
|
| - "http://www.google.com/support/chromeos/bin/answer.py?answer=142065";
|
| -#else
|
| - "http://www.google.com/support/chrome/bin/answer.py?answer=142065";
|
| -#endif
|
| -
|
| -} // namespace
|
| -
|
| // This class controls the geolocation infobar queue per profile, and it's an
|
| // internal class to GeolocationPermissionContext.
|
| // An alternate approach would be to have this queue per tab, and use
|
| @@ -62,25 +53,32 @@
|
|
|
| // The InfoBar will be displayed immediately if the tab is not already
|
| // displaying one, otherwise it'll be queued.
|
| - void CreateInfoBarRequest(
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| - const GURL& requesting_frame, const GURL& emebedder);
|
| + void CreateInfoBarRequest(int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| + const GURL& requesting_frame,
|
| + const GURL& emebedder);
|
|
|
| // Cancels a specific infobar request.
|
| - void CancelInfoBarRequest(
|
| - int render_process_id, int render_view_id, int bridge_id);
|
| + void CancelInfoBarRequest(int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id);
|
|
|
| // Called by the InfoBarDelegate to notify it's closed. It'll display a new
|
| // InfoBar if there's any request pending for this tab.
|
| - void OnInfoBarClosed(
|
| - int render_process_id, int render_view_id, int bridge_id);
|
| + void OnInfoBarClosed(int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id);
|
|
|
| // Called by the InfoBarDelegate to notify permission has been set.
|
| // It'll notify and dismiss any other pending InfoBar request for the same
|
| // |requesting_frame| and embedder.
|
| - void OnPermissionSet(
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| - const GURL& requesting_frame, const GURL& embedder, bool allowed);
|
| + void OnPermissionSet(int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| + const GURL& requesting_frame,
|
| + const GURL& embedder,
|
| + bool allowed);
|
|
|
| // NotificationObserver
|
| virtual void Observe(NotificationType type,
|
| @@ -108,75 +106,42 @@
|
|
|
| namespace {
|
|
|
| -// This is the delegate used to display the confirmation info bar.
|
| +const char kGeolocationLearnMoreUrl[] =
|
| +#if defined(OS_CHROMEOS)
|
| + "http://www.google.com/support/chromeos/bin/answer.py?answer=142065";
|
| +#else
|
| + "http://www.google.com/support/chrome/bin/answer.py?answer=142065";
|
| +#endif
|
| +
|
| +
|
| +// GeolocationConfirmInfoBarDelegate ------------------------------------------
|
| +
|
| class GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate {
|
| public:
|
| GeolocationConfirmInfoBarDelegate(
|
| - TabContents* tab_contents, GeolocationInfoBarQueueController* controller,
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| + TabContents* tab_contents,
|
| + GeolocationInfoBarQueueController* controller,
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| const GURL& requesting_frame_url,
|
| - const std::string& display_languages)
|
| - : ConfirmInfoBarDelegate(tab_contents),
|
| - tab_contents_(tab_contents),
|
| - controller_(controller),
|
| - render_process_id_(render_process_id),
|
| - render_view_id_(render_view_id),
|
| - bridge_id_(bridge_id),
|
| - requesting_frame_url_(requesting_frame_url),
|
| - display_languages_(display_languages) {
|
| - }
|
| + const std::string& display_languages);
|
|
|
| - // ConfirmInfoBarDelegate
|
| - virtual void InfoBarClosed() {
|
| - controller_->OnInfoBarClosed(render_process_id_, render_view_id_,
|
| - bridge_id_);
|
| - delete this;
|
| - }
|
| - virtual Type GetInfoBarType() { return PAGE_ACTION_TYPE; }
|
| - virtual bool Accept() { return OnPermissionSet(true); }
|
| - virtual bool Cancel() { return OnPermissionSet(false); }
|
| - virtual int GetButtons() const { return BUTTON_OK | BUTTON_CANCEL; }
|
| - virtual string16 GetButtonLabel(InfoBarButton button) const {
|
| - switch (button) {
|
| - case BUTTON_OK:
|
| - return l10n_util::GetStringUTF16(IDS_GEOLOCATION_ALLOW_BUTTON);
|
| - case BUTTON_CANCEL:
|
| - return l10n_util::GetStringUTF16(IDS_GEOLOCATION_DENY_BUTTON);
|
| - default:
|
| - // All buttons are labeled above.
|
| - NOTREACHED() << "Bad button id " << button;
|
| - return string16();
|
| - }
|
| - }
|
| - virtual string16 GetMessageText() const {
|
| - return l10n_util::GetStringFUTF16(
|
| - IDS_GEOLOCATION_INFOBAR_QUESTION,
|
| - net::FormatUrl(requesting_frame_url_.GetOrigin(), display_languages_));
|
| - }
|
| - virtual SkBitmap* GetIcon() const {
|
| - return ResourceBundle::GetSharedInstance().GetBitmapNamed(
|
| - IDR_GEOLOCATION_INFOBAR_ICON);
|
| - }
|
| - virtual string16 GetLinkText() {
|
| - return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
|
| - }
|
| - virtual bool LinkClicked(WindowOpenDisposition disposition) {
|
| - GURL learn_more_url =
|
| - google_util::AppendGoogleLocaleParam(GURL(kGeolocationLearnMoreUrl));
|
| - // Ignore the click disposition and always open in a new top level tab.
|
| - tab_contents_->OpenURL(
|
| - learn_more_url, GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
|
| - return false; // Do not dismiss the info bar.
|
| - }
|
| -
|
| private:
|
| - bool OnPermissionSet(bool confirm) {
|
| - controller_->OnPermissionSet(
|
| - render_process_id_, render_view_id_, bridge_id_, requesting_frame_url_,
|
| - tab_contents_->GetURL(), confirm);
|
| - return true;
|
| - }
|
| + virtual ~GeolocationConfirmInfoBarDelegate();
|
|
|
| + // ConfirmInfoBarDelegate:
|
| + virtual void InfoBarClosed();
|
| + virtual SkBitmap* GetIcon() const;
|
| + virtual Type GetInfoBarType() const;
|
| + virtual string16 GetMessageText() const;
|
| + virtual int GetButtons() const;
|
| + virtual string16 GetButtonLabel(InfoBarButton button) const;
|
| + virtual bool Accept();
|
| + virtual bool Cancel();
|
| + virtual string16 GetLinkText();
|
| + virtual bool LinkClicked(WindowOpenDisposition disposition);
|
| +
|
| TabContents* tab_contents_;
|
| GeolocationInfoBarQueueController* controller_;
|
| int render_process_id_;
|
| @@ -188,8 +153,88 @@
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(GeolocationConfirmInfoBarDelegate);
|
| };
|
|
|
| +GeolocationConfirmInfoBarDelegate::GeolocationConfirmInfoBarDelegate(
|
| + TabContents* tab_contents,
|
| + GeolocationInfoBarQueueController* controller,
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| + const GURL& requesting_frame_url,
|
| + const std::string& display_languages)
|
| + : ConfirmInfoBarDelegate(tab_contents),
|
| + tab_contents_(tab_contents),
|
| + controller_(controller),
|
| + render_process_id_(render_process_id),
|
| + render_view_id_(render_view_id),
|
| + bridge_id_(bridge_id),
|
| + requesting_frame_url_(requesting_frame_url),
|
| + display_languages_(display_languages) {
|
| +}
|
| +
|
| +GeolocationConfirmInfoBarDelegate::~GeolocationConfirmInfoBarDelegate() {
|
| +}
|
| +
|
| +void GeolocationConfirmInfoBarDelegate::InfoBarClosed() {
|
| + controller_->OnInfoBarClosed(render_process_id_, render_view_id_,
|
| + bridge_id_);
|
| + delete this;
|
| +}
|
| +
|
| +SkBitmap* GeolocationConfirmInfoBarDelegate::GetIcon() const {
|
| + return ResourceBundle::GetSharedInstance().GetBitmapNamed(
|
| + IDR_GEOLOCATION_INFOBAR_ICON);
|
| +}
|
| +
|
| +InfoBarDelegate::Type
|
| + GeolocationConfirmInfoBarDelegate::GetInfoBarType() const {
|
| + return PAGE_ACTION_TYPE;
|
| +}
|
| +
|
| +string16 GeolocationConfirmInfoBarDelegate::GetMessageText() const {
|
| + return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION,
|
| + net::FormatUrl(requesting_frame_url_.GetOrigin(), display_languages_));
|
| +}
|
| +
|
| +int GeolocationConfirmInfoBarDelegate::GetButtons() const {
|
| + return BUTTON_OK | BUTTON_CANCEL;
|
| +}
|
| +
|
| +string16 GeolocationConfirmInfoBarDelegate::GetButtonLabel(
|
| + InfoBarButton button) const {
|
| + return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
|
| + IDS_GEOLOCATION_ALLOW_BUTTON : IDS_GEOLOCATION_DENY_BUTTON);
|
| +}
|
| +
|
| +bool GeolocationConfirmInfoBarDelegate::Accept() {
|
| + controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_,
|
| + requesting_frame_url_, tab_contents_->GetURL(), true);
|
| + return true;
|
| +}
|
| +
|
| +bool GeolocationConfirmInfoBarDelegate::Cancel() {
|
| + controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_,
|
| + requesting_frame_url_, tab_contents_->GetURL(), false);
|
| + return true;
|
| +}
|
| +
|
| +string16 GeolocationConfirmInfoBarDelegate::GetLinkText() {
|
| + return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
|
| +}
|
| +
|
| +bool GeolocationConfirmInfoBarDelegate::LinkClicked(
|
| + WindowOpenDisposition disposition) {
|
| + // Ignore the click disposition and always open in a new top level tab.
|
| + tab_contents_->OpenURL(
|
| + google_util::AppendGoogleLocaleParam(GURL(kGeolocationLearnMoreUrl)),
|
| + GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
|
| + return false; // Do not dismiss the info bar.
|
| +}
|
| +
|
| } // namespace
|
|
|
| +
|
| +// GeolocationInfoBarQueueController ------------------------------------------
|
| +
|
| struct GeolocationInfoBarQueueController::PendingInfoBarRequest {
|
| int render_process_id;
|
| int render_view_id;
|
| @@ -228,8 +273,11 @@
|
| }
|
|
|
| void GeolocationInfoBarQueueController::CreateInfoBarRequest(
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| - const GURL& requesting_frame, const GURL& embedder) {
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| + const GURL& requesting_frame,
|
| + const GURL& embedder) {
|
| // This makes sure that no duplicates are added to
|
| // |pending_infobar_requests_| as an artificial permission request may
|
| // already exist in the queue as per
|
| @@ -238,14 +286,13 @@
|
| // TODO(joth): Once we have CLIENT_BASED_GEOLOCATION and
|
| // WTF_USE_PREEMPT_GEOLOCATION_PERMISSION set in WebKit we should be able to
|
| // just use a DCHECK to check if a duplicate is attempting to be added.
|
| - PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
|
| - while (i != pending_infobar_requests_.end()) {
|
| + for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
|
| + i != pending_infobar_requests_.end(); ++i) {
|
| if (i->Equals(render_process_id, render_view_id, bridge_id)) {
|
| // The request already exists.
|
| DCHECK(i->IsForPair(requesting_frame, embedder));
|
| return;
|
| }
|
| - ++i;
|
| }
|
| PendingInfoBarRequest pending_infobar_request;
|
| pending_infobar_request.render_process_id = render_process_id;
|
| @@ -259,18 +306,21 @@
|
| }
|
|
|
| void GeolocationInfoBarQueueController::CancelInfoBarRequest(
|
| - int render_process_id, int render_view_id, int bridge_id) {
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id) {
|
| for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
|
| i != pending_infobar_requests_.end(); ++i) {
|
| if (i->Equals(render_process_id, render_view_id, bridge_id)) {
|
| CancelInfoBarRequestInternal(i);
|
| - break;
|
| + return;
|
| }
|
| }
|
| }
|
|
|
| -void GeolocationInfoBarQueueController::OnInfoBarClosed(
|
| - int render_process_id, int render_view_id, int bridge_id) {
|
| +void GeolocationInfoBarQueueController::OnInfoBarClosed(int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
|
| i != pending_infobar_requests_.end(); ++i) {
|
| @@ -283,8 +333,12 @@
|
| }
|
|
|
| void GeolocationInfoBarQueueController::OnPermissionSet(
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| - const GURL& requesting_frame, const GURL& embedder, bool allowed) {
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| + const GURL& requesting_frame,
|
| + const GURL& embedder,
|
| + bool allowed) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| // Persist the permission.
|
| ContentSetting content_setting =
|
| @@ -306,11 +360,11 @@
|
| // Cancel it first, and then notify the permission.
|
| // Note: if the pending request had an infobar, TabContents will
|
| // eventually close it and we will pump the queue via OnInfoBarClosed().
|
| - PendingInfoBarRequest other_request = *i;
|
| + PendingInfoBarRequest copied_request = *i;
|
| i = CancelInfoBarRequestInternal(i);
|
| geolocation_permission_context_->NotifyPermissionSet(
|
| - other_request.render_process_id, other_request.render_view_id,
|
| - other_request.bridge_id, other_request.requesting_frame, allowed);
|
| + copied_request.render_process_id, copied_request.render_view_id,
|
| + copied_request.bridge_id, copied_request.requesting_frame, allowed);
|
| } else {
|
| ++i;
|
| }
|
| @@ -335,8 +389,8 @@
|
| }
|
| }
|
|
|
| -void GeolocationInfoBarQueueController::ShowQueuedInfoBar(
|
| - int render_process_id, int render_view_id) {
|
| +void GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id,
|
| + int render_view_id) {
|
| TabContents* tab_contents =
|
| tab_util::GetTabContentsByID(render_process_id, render_view_id);
|
| for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
|
| @@ -352,17 +406,14 @@
|
| // Check if already displayed.
|
| if (i->infobar_delegate)
|
| break;
|
| - if (!registrar_.IsRegistered(
|
| - this, NotificationType::TAB_CONTENTS_DESTROYED,
|
| + if (!registrar_.IsRegistered(this, NotificationType::TAB_CONTENTS_DESTROYED,
|
| Source<TabContents>(tab_contents))) {
|
| - registrar_.Add(
|
| - this, NotificationType::TAB_CONTENTS_DESTROYED,
|
| + registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED,
|
| Source<TabContents>(tab_contents));
|
| }
|
| - i->infobar_delegate = new GeolocationConfirmInfoBarDelegate(
|
| - tab_contents, this,
|
| - render_process_id, render_view_id,
|
| - i->bridge_id, i->requesting_frame,
|
| + i->infobar_delegate = new GeolocationConfirmInfoBarDelegate(tab_contents,
|
| + this, render_process_id, render_view_id, i->bridge_id,
|
| + i->requesting_frame,
|
| profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
|
| tab_contents->AddInfoBar(i->infobar_delegate);
|
| break;
|
| @@ -388,9 +439,8 @@
|
| GeolocationPermissionContext::GeolocationPermissionContext(
|
| Profile* profile)
|
| : profile_(profile),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - geolocation_infobar_queue_controller_(
|
| - new GeolocationInfoBarQueueController(this, profile))) {
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(geolocation_infobar_queue_controller_(
|
| + new GeolocationInfoBarQueueController(this, profile))) {
|
| }
|
|
|
| GeolocationPermissionContext::~GeolocationPermissionContext() {
|
| @@ -400,11 +450,9 @@
|
| int render_process_id, int render_view_id, int bridge_id,
|
| const GURL& requesting_frame) {
|
| if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &GeolocationPermissionContext::RequestGeolocationPermission,
|
| - render_process_id, render_view_id, bridge_id, requesting_frame));
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
|
| + this, &GeolocationPermissionContext::RequestGeolocationPermission,
|
| + render_process_id, render_view_id, bridge_id, requesting_frame));
|
| return;
|
| }
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -430,8 +478,8 @@
|
| if (!tab_contents) {
|
| // The tab may have gone away, or the request may not be from a tab at all.
|
| LOG(WARNING) << "Attempt to use geolocation tabless renderer: "
|
| - << render_process_id << "," << render_view_id << "," << bridge_id
|
| - << " (can't prompt user without a visible tab)";
|
| + << render_process_id << "," << render_view_id << ","
|
| + << bridge_id << " (can't prompt user without a visible tab)";
|
| NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
|
| requesting_frame, false);
|
| return;
|
| @@ -440,8 +488,8 @@
|
| GURL embedder = tab_contents->GetURL();
|
| if (!requesting_frame.is_valid() || !embedder.is_valid()) {
|
| LOG(WARNING) << "Attempt to use geolocation from an invalid URL: "
|
| - << requesting_frame << "," << embedder
|
| - << " (geolocation is not supported in popups)";
|
| + << requesting_frame << "," << embedder
|
| + << " (geolocation is not supported in popups)";
|
| NotifyPermissionSet(render_process_id, render_view_id, bridge_id,
|
| requesting_frame, false);
|
| return;
|
| @@ -464,14 +512,19 @@
|
| }
|
|
|
| void GeolocationPermissionContext::CancelGeolocationPermissionRequest(
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| const GURL& requesting_frame) {
|
| CancelPendingInfoBarRequest(render_process_id, render_view_id, bridge_id);
|
| }
|
|
|
| void GeolocationPermissionContext::NotifyPermissionSet(
|
| - int render_process_id, int render_view_id, int bridge_id,
|
| - const GURL& requesting_frame, bool allowed) {
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id,
|
| + const GURL& requesting_frame,
|
| + bool allowed) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| TabContents* tab_contents =
|
| @@ -485,17 +538,13 @@
|
| allowed);
|
| }
|
|
|
| - CallRenderViewHost(
|
| - render_process_id, render_view_id,
|
| - &RenderViewHost::Send,
|
| + CallRenderViewHost(render_process_id, render_view_id, &RenderViewHost::Send,
|
| new ViewMsg_Geolocation_PermissionSet(render_view_id, bridge_id,
|
| - allowed));
|
| + allowed));
|
| if (allowed) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &GeolocationPermissionContext::NotifyArbitratorPermissionGranted,
|
| - requesting_frame));
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod(
|
| + this, &GeolocationPermissionContext::NotifyArbitratorPermissionGranted,
|
| + requesting_frame));
|
| }
|
| }
|
|
|
| @@ -506,16 +555,16 @@
|
| }
|
|
|
| void GeolocationPermissionContext::CancelPendingInfoBarRequest(
|
| - int render_process_id, int render_view_id, int bridge_id) {
|
| + int render_process_id,
|
| + int render_view_id,
|
| + int bridge_id) {
|
| if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &GeolocationPermissionContext::CancelPendingInfoBarRequest,
|
| - render_process_id, render_view_id, bridge_id));
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
|
| + this, &GeolocationPermissionContext::CancelPendingInfoBarRequest,
|
| + render_process_id, render_view_id, bridge_id));
|
| return;
|
| }
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - geolocation_infobar_queue_controller_->CancelInfoBarRequest(
|
| - render_process_id, render_view_id, bridge_id);
|
| + geolocation_infobar_queue_controller_->CancelInfoBarRequest(render_process_id,
|
| + render_view_id, bridge_id);
|
| }
|
|
|