Home | History | Annotate | Download | only in notifications
      1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_NOTIFICATIONS_DESKTOP_NOTIFICATION_SERVICE_H_
      6 #define CHROME_BROWSER_NOTIFICATIONS_DESKTOP_NOTIFICATION_SERVICE_H_
      7 #pragma once
      8 
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/string16.h"
     16 #include "chrome/browser/content_settings/content_settings_notification_provider.h"
     17 #include "chrome/browser/content_settings/content_settings_provider.h"
     18 #include "chrome/browser/prefs/pref_change_registrar.h"
     19 #include "chrome/browser/profiles/profile_keyed_service.h"
     20 #include "chrome/common/content_settings.h"
     21 #include "content/common/notification_observer.h"
     22 #include "content/common/notification_registrar.h"
     23 #include "googleurl/src/gurl.h"
     24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextDirection.h"
     25 
     26 class Notification;
     27 class NotificationUIManager;
     28 class NotificationsPrefsCache;
     29 class PrefService;
     30 class Profile;
     31 class TabContents;
     32 struct DesktopNotificationHostMsg_Show_Params;
     33 
     34 // The DesktopNotificationService is an object, owned by the Profile,
     35 // which provides the creation of desktop "toasts" to web pages and workers.
     36 class DesktopNotificationService : public NotificationObserver,
     37                                    public ProfileKeyedService {
     38  public:
     39   enum DesktopNotificationSource {
     40     PageNotification,
     41     WorkerNotification
     42   };
     43 
     44   DesktopNotificationService(Profile* profile,
     45                              NotificationUIManager* ui_manager);
     46   virtual ~DesktopNotificationService();
     47 
     48   // Requests permission (using an info-bar) for a given origin.
     49   // |callback_context| contains an opaque value to pass back to the
     50   // requesting process when the info-bar finishes.  A NULL tab can be given if
     51   // none exist (i.e. background tab), in which case the currently selected tab
     52   // will be used.
     53   void RequestPermission(const GURL& origin,
     54                          int process_id,
     55                          int route_id,
     56                          int callback_context,
     57                          TabContents* tab);
     58 
     59   // ShowNotification is called on the UI thread handling IPCs from a child
     60   // process, identified by |process_id| and |route_id|.  |source| indicates
     61   // whether the script is in a worker or page. |params| contains all the
     62   // other parameters supplied by the worker or page.
     63   bool ShowDesktopNotification(
     64       const DesktopNotificationHostMsg_Show_Params& params,
     65       int process_id, int route_id, DesktopNotificationSource source);
     66 
     67   // Cancels a notification.  If it has already been shown, it will be
     68   // removed from the screen.  If it hasn't been shown yet, it won't be
     69   // shown.
     70   bool CancelDesktopNotification(int process_id,
     71                                  int route_id,
     72                                  int notification_id);
     73 
     74   // Methods to setup and modify permission preferences.
     75   void GrantPermission(const GURL& origin);
     76   void DenyPermission(const GURL& origin);
     77 
     78   // NotificationObserver implementation.
     79   virtual void Observe(NotificationType type,
     80                        const NotificationSource& source,
     81                        const NotificationDetails& details);
     82 
     83   NotificationsPrefsCache* prefs_cache() { return prefs_cache_; }
     84 
     85   // Creates a data:xxxx URL which contains the full HTML for a notification
     86   // using supplied icon, title, and text, run through a template which contains
     87   // the standard formatting for notifications.
     88   static string16 CreateDataUrl(const GURL& icon_url,
     89                                 const string16& title,
     90                                 const string16& body,
     91                                 WebKit::WebTextDirection dir);
     92 
     93   // Creates a data:xxxx URL which contains the full HTML for a notification
     94   // using resource template which contains the standard formatting for
     95   // notifications.
     96   static string16 CreateDataUrl(int resource,
     97                                 const std::vector<std::string>& subst);
     98 
     99   // The default content setting determines how to handle origins that haven't
    100   // been allowed or denied yet.
    101   ContentSetting GetDefaultContentSetting();
    102   void SetDefaultContentSetting(ContentSetting setting);
    103   bool IsDefaultContentSettingManaged() const;
    104 
    105   // NOTE: This should only be called on the UI thread.
    106   void ResetToDefaultContentSetting();
    107 
    108   // Returns all origins that explicitly have been allowed.
    109   std::vector<GURL> GetAllowedOrigins();
    110 
    111   // Returns all origins that explicitly have been denied.
    112   std::vector<GURL> GetBlockedOrigins();
    113 
    114   // Removes an origin from the "explicitly allowed" set.
    115   void ResetAllowedOrigin(const GURL& origin);
    116 
    117   // Removes an origin from the "explicitly denied" set.
    118   void ResetBlockedOrigin(const GURL& origin);
    119 
    120   // Clears the sets of explicitly allowed and denied origins.
    121   void ResetAllOrigins();
    122 
    123   static void RegisterUserPrefs(PrefService* user_prefs);
    124 
    125   ContentSetting GetContentSetting(const GURL& origin);
    126 
    127  private:
    128   void InitPrefs();
    129   void StartObserving();
    130   void StopObserving();
    131 
    132   void OnPrefsChanged(const std::string& pref_name);
    133 
    134   // Takes a notification object and shows it in the UI.
    135   void ShowNotification(const Notification& notification);
    136 
    137   // Returns a display name for an origin, to be used in permission infobar
    138   // or on the frame of the notification toast.  Different from the origin
    139   // itself when dealing with extensions.
    140   string16 DisplayNameForOrigin(const GURL& origin);
    141 
    142   // Notifies the observers when permissions settings change.
    143   void NotifySettingsChange();
    144 
    145   // The profile which owns this object.
    146   Profile* profile_;
    147 
    148   // A cache of preferences which is accessible only on the IO thread
    149   // to service synchronous IPCs.
    150   scoped_refptr<NotificationsPrefsCache> prefs_cache_;
    151 
    152   // Non-owned pointer to the notification manager which manages the
    153   // UI for desktop toasts.
    154   NotificationUIManager* ui_manager_;
    155 
    156   scoped_ptr<content_settings::NotificationProvider> provider_;
    157 
    158   PrefChangeRegistrar prefs_registrar_;
    159   NotificationRegistrar notification_registrar_;
    160 
    161   DISALLOW_COPY_AND_ASSIGN(DesktopNotificationService);
    162 };
    163 
    164 #endif  // CHROME_BROWSER_NOTIFICATIONS_DESKTOP_NOTIFICATION_SERVICE_H_
    165