diff options
Diffstat (limited to 'chrome')
3 files changed, 19 insertions, 15 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..0d45bc2 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" @@ -1752,10 +1753,18 @@ void RenderViewHost::OnCancelDesktopNotification(int notification_id) { void RenderViewHost::OnRequestNotificationPermission( const GURL& source_origin, int callback_context) { - DesktopNotificationService* service = - process()->profile()->GetDesktopNotificationService(); - service->RequestPermission( - source_origin, process()->id(), routing_id(), callback_context); + 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_ ? delegate_->GetAsTabContents() : NULL); + if (tab) { + DesktopNotificationService* service = + process()->profile()->GetDesktopNotificationService(); + service->RequestPermission( + source_origin, process()->id(), routing_id(), callback_context, tab); + } } void RenderViewHost::OnExtensionRequest(const std::string& name, |