// 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. #include "chrome/browser/desktop_notification_handler.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/desktop_notification_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" #include "content/browser/renderer_host/render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/common/desktop_notification_messages.h" DesktopNotificationHandler::DesktopNotificationHandler( RenderViewHost* render_view_host) : RenderViewHostObserver(render_view_host) { } DesktopNotificationHandler::~DesktopNotificationHandler() { } bool DesktopNotificationHandler::OnMessageReceived( const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(DesktopNotificationHandler, message) IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Show, OnShow) IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Cancel, OnCancel) IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_RequestPermission, OnRequestPermission) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } void DesktopNotificationHandler::OnShow( const DesktopNotificationHostMsg_Show_Params& params) { // Disallow HTML notifications from unwanted schemes. javascript: // in particular allows unwanted cross-domain access. GURL url = params.contents_url; if (params.is_html && !url.SchemeIs(chrome::kHttpScheme) && !url.SchemeIs(chrome::kHttpsScheme) && !url.SchemeIs(chrome::kExtensionScheme) && !url.SchemeIs(chrome::kDataScheme)) { return; } RenderProcessHost* process = render_view_host()->process(); DesktopNotificationService* service = DesktopNotificationServiceFactory::GetForProfile(process->profile()); service->ShowDesktopNotification( params, process->id(), routing_id(), DesktopNotificationService::PageNotification); } void DesktopNotificationHandler::OnCancel(int notification_id) { RenderProcessHost* process = render_view_host()->process(); DesktopNotificationService* service = DesktopNotificationServiceFactory::GetForProfile(process->profile()); service->CancelDesktopNotification( process->id(), routing_id(), notification_id); } void DesktopNotificationHandler::OnRequestPermission( const GURL& source_origin, int callback_context) { if (render_view_host()->delegate()->RequestDesktopNotificationPermission( source_origin, callback_context)) { return; } RenderProcessHost* process = render_view_host()->process(); DesktopNotificationService* service = DesktopNotificationServiceFactory::GetForProfile(process->profile()); service->RequestPermission( source_origin, process->id(), routing_id(), callback_context, NULL); }