diff options
author | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-27 01:33:04 +0000 |
---|---|---|
committer | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-27 01:33:04 +0000 |
commit | 75d0c462ff9a10e430e23f90936a97e8efa7e77c (patch) | |
tree | 78f1ed918044a70c3d03eb5166fdf60c76fb50a4 /chrome | |
parent | 4f32c150be688665f09abd5b0af4090cfacfb7ed (diff) | |
download | chromium_src-75d0c462ff9a10e430e23f90936a97e8efa7e77c.zip chromium_src-75d0c462ff9a10e430e23f90936a97e8efa7e77c.tar.gz chromium_src-75d0c462ff9a10e430e23f90936a97e8efa7e77c.tar.bz2 |
The desktop notification service infobar would not display in ChromeFrame rendered pages as the code assumed the existing of a BrowserList
and associated objects like Browser etc. In ChromeFrame the tab contents is owned by the ExternalTabContainer. Fix is to pass the current tab
contents from the RenderViewHost to the DesktopNotificationService::RequestPermission function and use that if we don't have a browser list.
Fixes bug http://code.google.com/p/chromium/issues/detail?id=44913
Bug=44913
Review URL: http://codereview.chromium.org/2294002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48348 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
3 files changed, 16 insertions, 12 deletions
diff --git a/chrome/browser/notifications/desktop_notification_service.cc b/chrome/browser/notifications/desktop_notification_service.cc index 53cc37b..f0eb62d 100644 --- a/chrome/browser/notifications/desktop_notification_service.cc +++ b/chrome/browser/notifications/desktop_notification_service.cc @@ -8,7 +8,6 @@ #include "app/resource_bundle.h" #include "base/thread.h" #include "base/utf_string_conversions.h" -#include "chrome/browser/browser_list.h" #include "chrome/browser/child_process_host.h" #include "chrome/browser/chrome_thread.h" #include "chrome/browser/extensions/extensions_service.h" @@ -376,18 +375,12 @@ void DesktopNotificationService::PersistPermissionChange( } void DesktopNotificationService::RequestPermission( - const GURL& origin, int process_id, int route_id, int callback_context) { + const GURL& origin, int process_id, int route_id, int callback_context, + TabContents* tab) { DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); - // Show an info bar requesting permission. - Browser* browser = BrowserList::GetLastActive(); - if (!browser) { - // Reached during ui tests. - return; - } - TabContents* tab = browser->GetSelectedTabContents(); if (!tab) return; - + // Show an info bar requesting permission. std::wstring display_name = DisplayNameForOrigin(origin); tab->AddInfoBar(new NotificationPermissionInfoBarDelegate( diff --git a/chrome/browser/notifications/desktop_notification_service.h b/chrome/browser/notifications/desktop_notification_service.h index c3a41f9..4a651f8 100644 --- a/chrome/browser/notifications/desktop_notification_service.h +++ b/chrome/browser/notifications/desktop_notification_service.h @@ -19,6 +19,7 @@ class NotificationsPrefsCache; class PrefService; class Profile; class Task; +class TabContents; // The DesktopNotificationService is an object, owned by the Profile, // which provides the creation of desktop "toasts" to web pages and workers. @@ -39,7 +40,8 @@ class DesktopNotificationService : public NotificationObserver { void RequestPermission(const GURL& origin, int process_id, int route_id, - int callback_context); + int callback_context, + TabContents* tab); // Takes a notification object and shows it in the UI. void ShowNotification(const Notification& notification); diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 7d5a58a..0981527 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -15,6 +15,7 @@ #include "base/string_util.h" #include "base/time.h" #include "base/waitable_event.h" +#include "chrome/browser/browser_list.h" #include "chrome/browser/child_process_security_policy.h" #include "chrome/browser/cross_site_request_manager.h" #include "chrome/browser/debugger/devtools_manager.h" @@ -1754,8 +1755,16 @@ void RenderViewHost::OnRequestNotificationPermission( const GURL& source_origin, int callback_context) { DesktopNotificationService* service = process()->profile()->GetDesktopNotificationService(); + + Browser* browser = BrowserList::GetLastActive(); + // We may not have a BrowserList if the chrome browser process is launched as + // a ChromeFrame process in which case we attempt to use the TabContents + // provided by the RenderViewHostDelegate. + TabContents* tab = browser ? browser->GetSelectedTabContents() : + delegate_->GetAsTabContents(); + service->RequestPermission( - source_origin, process()->id(), routing_id(), callback_context); + source_origin, process()->id(), routing_id(), callback_context, tab); } void RenderViewHost::OnExtensionRequest(const std::string& name, |