Home | History | Annotate | Download | only in renderer
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/renderer/notification_provider.h"
      6 
      7 #include "base/strings/string_util.h"
      8 #include "content/common/desktop_notification_messages.h"
      9 #include "content/common/frame_messages.h"
     10 #include "content/renderer/render_frame_impl.h"
     11 #include "third_party/WebKit/public/platform/WebURL.h"
     12 #include "third_party/WebKit/public/web/WebDocument.h"
     13 #include "third_party/WebKit/public/web/WebLocalFrame.h"
     14 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
     15 
     16 using blink::WebDocument;
     17 using blink::WebNotification;
     18 using blink::WebNotificationPresenter;
     19 using blink::WebSecurityOrigin;
     20 using blink::WebString;
     21 using blink::WebURL;
     22 using blink::WebUserGestureIndicator;
     23 
     24 namespace content {
     25 
     26 NotificationProvider::NotificationProvider(RenderFrame* render_frame)
     27     : RenderFrameObserver(render_frame) {
     28 }
     29 
     30 NotificationProvider::~NotificationProvider() {
     31 }
     32 
     33 bool NotificationProvider::show(const WebNotification& notification) {
     34   WebDocument document = render_frame()->GetWebFrame()->document();
     35   int notification_id = manager_.RegisterNotification(notification);
     36 
     37   ShowDesktopNotificationHostMsgParams params;
     38   params.origin = GURL(document.securityOrigin().toString());
     39   params.icon_url = notification.iconURL();
     40   params.title = notification.title();
     41   params.body = notification.body();
     42   params.direction = notification.direction();
     43   params.replace_id = notification.replaceId();
     44   return Send(new DesktopNotificationHostMsg_Show(
     45       routing_id(), notification_id, params));
     46 }
     47 
     48 void NotificationProvider::cancel(const WebNotification& notification) {
     49   int id;
     50   bool id_found = manager_.GetId(notification, id);
     51   // Won't be found if the notification has already been closed by the user.
     52   if (id_found)
     53     Send(new DesktopNotificationHostMsg_Cancel(routing_id(), id));
     54 }
     55 
     56 void NotificationProvider::objectDestroyed(
     57     const WebNotification& notification) {
     58   int id;
     59   bool id_found = manager_.GetId(notification, id);
     60   // Won't be found if the notification has already been closed by the user.
     61   if (id_found)
     62     manager_.UnregisterNotification(id);
     63 }
     64 
     65 WebNotificationPresenter::Permission NotificationProvider::checkPermission(
     66     const WebSecurityOrigin& origin) {
     67   int permission = WebNotificationPresenter::PermissionNotAllowed;
     68   Send(new DesktopNotificationHostMsg_CheckPermission(
     69           routing_id(),
     70           GURL(origin.toString()),
     71           &permission));
     72   return static_cast<WebNotificationPresenter::Permission>(permission);
     73 }
     74 
     75 bool NotificationProvider::OnMessageReceived(const IPC::Message& message) {
     76   bool handled = true;
     77   IPC_BEGIN_MESSAGE_MAP(NotificationProvider, message)
     78     IPC_MESSAGE_HANDLER(DesktopNotificationMsg_PostDisplay, OnDisplay);
     79     IPC_MESSAGE_HANDLER(DesktopNotificationMsg_PostError, OnError);
     80     IPC_MESSAGE_HANDLER(DesktopNotificationMsg_PostClose, OnClose);
     81     IPC_MESSAGE_HANDLER(DesktopNotificationMsg_PostClick, OnClick);
     82     IPC_MESSAGE_UNHANDLED(handled = false)
     83   IPC_END_MESSAGE_MAP()
     84 
     85   if (message.type() == FrameMsg_Navigate::ID)
     86     OnNavigate();  // Don't want to swallow the message.
     87 
     88   return handled;
     89 }
     90 
     91 void NotificationProvider::OnDisplay(int id) {
     92   WebNotification notification;
     93   bool found = manager_.GetNotification(id, &notification);
     94   // |found| may be false if the WebNotification went out of scope in
     95   // the page before it was actually displayed to the user.
     96   if (found)
     97     notification.dispatchDisplayEvent();
     98 }
     99 
    100 void NotificationProvider::OnError(int id) {
    101   WebNotification notification;
    102   bool found = manager_.GetNotification(id, &notification);
    103   // |found| may be false if the WebNotification went out of scope in
    104   // the page before the error occurred.
    105   if (found)
    106     notification.dispatchErrorEvent(WebString());
    107 }
    108 
    109 void NotificationProvider::OnClose(int id, bool by_user) {
    110   WebNotification notification;
    111   bool found = manager_.GetNotification(id, &notification);
    112   // |found| may be false if the WebNotification went out of scope in
    113   // the page before the associated toast was closed by the user.
    114   if (found) {
    115     notification.dispatchCloseEvent(by_user);
    116     manager_.UnregisterNotification(id);
    117   }
    118 }
    119 
    120 void NotificationProvider::OnClick(int id) {
    121   WebNotification notification;
    122   bool found = manager_.GetNotification(id, &notification);
    123   // |found| may be false if the WebNotification went out of scope in
    124   // the page before the associated toast was clicked on.
    125   if (found)
    126     notification.dispatchClickEvent();
    127 }
    128 
    129 void NotificationProvider::OnNavigate() {
    130   manager_.Clear();
    131 }
    132 
    133 }  // namespace content
    134