desktop_notification_service.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_details.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_provider.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_object_proxy.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings_pattern.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/show_desktop_notification_params.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center_util.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/notifier_settings.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/webui/web_ui_util.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNotificationPresenter;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityOrigin;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ContentSetting kDefaultSetting = CONTENT_SETTING_ASK;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToggleListPrefItem(PrefService* prefs, const char* key,
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const std::string& item, bool flag) {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ListPrefUpdate update(prefs, key);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue* const list = update.Get();
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (flag) {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // AppendIfNotPresent will delete |adding_value| when the same value
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // already exists.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::StringValue* const adding_value = new base::StringValue(item);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    list->AppendIfNotPresent(adding_value);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::StringValue removed_value(item);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    list->Remove(removed_value, NULL);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CopySetFromPrefToMemory(PrefService* prefs, const char* key,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::set<std::string>* dst) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dst->clear();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::ListValue* pref_list = prefs->GetList(key);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < pref_list->GetSize(); ++i) {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string element;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!pref_list->GetString(i, &element) && element.empty()) {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LOG(WARNING) << i << "-th element is not a string for "
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   << key;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dst->insert(element);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NotificationPermissionInfoBarDelegate --------------------------------------
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The delegate for the infobar shown when an origin requests notification
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a notification permission delegate and adds it to
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |infobar_service|.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void Create(InfoBarService* infobar_service,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     DesktopNotificationService* notification_service,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const GURL& origin,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const string16& display_name,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int process_id,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int route_id,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int callback_context);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationPermissionInfoBarDelegate(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InfoBarService* infobar_service,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DesktopNotificationService* notification_service,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& display_name,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int process_id,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int route_id,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int callback_context);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NotificationPermissionInfoBarDelegate();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConfirmInfoBarDelegate:
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int GetIconID() const OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Type GetInfoBarType() const OVERRIDE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetMessageText() const OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Accept() OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Cancel() OVERRIDE;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The origin we are asking for permissions on.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The display name for the origin to be displayed.  Will be different from
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin_ for extensions.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 display_name_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The notification service to be used.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DesktopNotificationService* notification_service_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The callback information that tells us how to respond to javascript via
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the correct RenderView.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int process_id_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_context_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the user clicked one of the buttons.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool action_taken_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotificationPermissionInfoBarDelegate);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NotificationPermissionInfoBarDelegate::Create(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService* infobar_service,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DesktopNotificationService* notification_service,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& origin,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16& display_name,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int process_id,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int route_id,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int callback_context) {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new NotificationPermissionInfoBarDelegate(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infobar_service, notification_service, origin, display_name,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          process_id, route_id, callback_context)));
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationPermissionInfoBarDelegate::NotificationPermissionInfoBarDelegate(
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService* infobar_service,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DesktopNotificationService* notification_service,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& display_name,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int callback_context)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ConfirmInfoBarDelegate(infobar_service),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_(origin),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_name_(display_name),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_service_(notification_service),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      process_id_(process_id),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_(route_id),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_context_(callback_context),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      action_taken_(false) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationPermissionInfoBarDelegate::
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~NotificationPermissionInfoBarDelegate() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!action_taken_)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Ignored", 1);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = RenderViewHost::FromID(process_id_, route_id_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host->DesktopNotificationPermissionRequestDone(callback_context_);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int NotificationPermissionInfoBarDelegate::GetIconID() const {
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return IDR_INFOBAR_DESKTOP_NOTIFICATIONS;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InfoBarDelegate::Type
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationPermissionInfoBarDelegate::GetInfoBarType() const {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PAGE_ACTION_TYPE;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NotificationPermissionInfoBarDelegate::GetMessageText() const {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_NOTIFICATION_PERMISSIONS,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    display_name_);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NotificationPermissionInfoBarDelegate::GetButtonLabel(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InfoBarButton button) const {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_NOTIFICATION_PERMISSION_YES : IDS_NOTIFICATION_PERMISSION_NO);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NotificationPermissionInfoBarDelegate::Accept() {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Allowed", 1);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_service_->GrantPermission(origin_);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_taken_ = true;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NotificationPermissionInfoBarDelegate::Cancel() {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Denied", 1);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_service_->DenyPermission(origin_);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_taken_ = true;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopNotificationService -------------------------------------------------
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::RegisterUserPrefs(
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterListPref(prefs::kMessageCenterDisabledExtensionIds,
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterListPref(prefs::kMessageCenterDisabledSystemComponentIds,
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DesktopNotificationService::CreateDataUrl(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& icon_url, const string16& title, const string16& body,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebTextDirection dir) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> subst;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_url.is_valid()) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = IDR_NOTIFICATION_ICON_HTML;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(icon_url.spec());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(title)));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(body)));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // icon float position
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(dir == WebKit::WebTextDirectionRightToLeft ?
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "right" : "left");
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (title.empty() || body.empty()) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = IDR_NOTIFICATION_1LINE_HTML;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 line = title.empty() ? body : title;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Strings are div names in the template file.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 line_name = title.empty() ? ASCIIToUTF16("description")
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       : ASCIIToUTF16("title");
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(line_name)));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(line)));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = IDR_NOTIFICATION_2LINE_HTML;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(title)));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(body)));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // body text direction
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(dir == WebKit::WebTextDirectionRightToLeft ?
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "rtl" : "ltr");
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateDataUrl(resource, subst);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DesktopNotificationService::CreateDataUrl(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource, const std::vector<std::string>& subst) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::StringPiece template_html(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          resource));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_html.empty()) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "unable to load template. ID: " << resource;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return string16();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data = ReplaceStringPlaceholders(template_html, subst, NULL);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UTF8ToUTF16("data:text/html;charset=utf-8," +
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      net::EscapeQueryParamValue(data, false));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DesktopNotificationService::AddNotification(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin_url,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& title,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& message,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& icon_url,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& replace_id,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationDelegate* delegate,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (message_center::IsRichNotificationEnabled()) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For message center create a non-HTML notification with |icon_url|.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Notification notification(origin_url, icon_url, title, message,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              WebKit::WebTextDirectionDefault,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              string16(), replace_id, delegate);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_browser_process->notification_ui_manager()->Add(notification, profile);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return notification.notification_id();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate a data URL embedding the icon URL, title, and message.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL content_url(CreateDataUrl(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icon_url, title, message, WebKit::WebTextDirectionDefault));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Notification notification(
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(), content_url, string16(), replace_id, delegate);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->notification_ui_manager()->Add(notification, profile);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return notification.notification_id();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DesktopNotificationService::AddIconNotification(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin_url,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& title,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& message,
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Image& icon,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& replace_id,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationDelegate* delegate,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (message_center::IsRichNotificationEnabled()) {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For message center create a non-HTML notification with |icon|.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Notification notification(origin_url, icon, title, message,
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              WebKit::WebTextDirectionDefault,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              string16(), replace_id, delegate);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_browser_process->notification_ui_manager()->Add(notification, profile);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return notification.notification_id();
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL icon_url;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon.IsEmpty())
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_url = GURL(webui::GetBitmapDataUrl(*icon.ToSkBitmap()));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddNotification(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_url, title, message, icon_url, replace_id, delegate, profile);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::RemoveNotification(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& notification_id) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_browser_process->notification_ui_manager()->CancelById(notification_id);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopNotificationService::DesktopNotificationService(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationUIManager* ui_manager)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_manager_(ui_manager) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnDisabledExtensionIdsChanged();
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnDisabledSystemComponentIdsChanged();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  disabled_extension_id_pref_.Init(
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kMessageCenterDisabledExtensionIds,
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile_->GetPrefs(),
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &DesktopNotificationService::OnDisabledExtensionIdsChanged,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Unretained(this)));
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disabled_system_component_id_pref_.Init(
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMessageCenterDisabledSystemComponentIds,
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_->GetPrefs(),
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &DesktopNotificationService::OnDisabledSystemComponentIdsChanged,
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::Unretained(this)));
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 content::Source<Profile>(profile_));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopNotificationService::~DesktopNotificationService() {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::GrantPermission(const GURL& origin) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern primary_pattern =
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(origin);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetContentSetting(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_pattern,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_ALLOW);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::DenyPermission(const GURL& origin) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern primary_pattern =
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(origin);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetContentSetting(
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_pattern,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_BLOCK);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting DesktopNotificationService::GetDefaultContentSetting(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* provider_id) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, provider_id);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::SetDefaultContentSetting(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetDefaultContentSetting(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, setting);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ResetToDefaultContentSetting() {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetDefaultContentSetting(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, CONTENT_SETTING_DEFAULT);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::GetNotificationsSettings(
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsForOneType* settings) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->GetSettingsForOneType(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ClearSetting(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& pattern) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetContentSetting(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_DEFAULT);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ResetAllOrigins() {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->ClearSettingsForOneType(
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting DesktopNotificationService::GetContentSetting(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetHostContentSettingsMap()->GetContentSetting(
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::RequestPermission(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin, int process_id, int route_id, int callback_context,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* contents) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |origin| hasn't been seen before and the default content setting for
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifications is "ask", show an infobar.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cache can only answer queries on the IO thread once it's initialized,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so don't ask the cache.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = GetContentSetting(origin);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ASK) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Show an info bar requesting permission.
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService* infobar_service =
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        InfoBarService::FromWebContents(contents);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |infobar_service| may be NULL, e.g., if this request originated in a
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // browser action popup, extension background page, or any HTML that runs
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // outside of a tab.
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (infobar_service) {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NotificationPermissionInfoBarDelegate::Create(
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infobar_service,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DesktopNotificationServiceFactory::GetForProfile(
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Profile::FromBrowserContext(contents->GetBrowserContext())),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          origin,
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          DisplayNameForOriginInProcessId(origin, process_id),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          process_id,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          route_id,
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          callback_context);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify renderer immediately.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = RenderViewHost::FromID(process_id, route_id);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host->DesktopNotificationPermissionRequestDone(callback_context);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ShowNotification(
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Notification& notification) {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUIManager()->Add(notification, profile_);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopNotificationService::CancelDesktopNotification(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id, int route_id, int notification_id) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NotificationObjectProxy> proxy(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NotificationObjectProxy(process_id, route_id, notification_id,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  false));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetUIManager()->CancelById(proxy->id());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_WIN
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopNotificationService::ShowDesktopNotification(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ShowDesktopNotificationHostMsgParams& params,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id, int route_id, DesktopNotificationSource source) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& origin = params.origin;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationObjectProxy* proxy =
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NotificationObjectProxy(process_id, route_id,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  params.notification_id,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source == WorkerNotification);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  string16 display_source = DisplayNameForOriginInProcessId(origin, process_id);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params.is_html) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowNotification(Notification(origin, params.contents_url, display_source,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        params.replace_id, proxy));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Notification notification(origin, params.icon_url, params.title,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        params.body, params.direction, display_source, params.replace_id,
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        proxy);
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The webkit notification doesn't timeout.
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    notification.set_never_timeout(true);
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ShowNotification(notification);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 DesktopNotificationService::DisplayNameForOriginInProcessId(
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& origin, int process_id) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the source is an extension, lookup the display name.
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Message center prefers to use extension name if the notification
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is allowed by an extension.
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (NotificationUIManager::DelegatesToMessageCenter() ||
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      origin.SchemeIs(extensions::kExtensionScheme)) {
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionInfoMap* extension_info_map =
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extensions::ExtensionSystem::Get(profile_)->info_map();
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (extension_info_map) {
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExtensionSet extensions;
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin(
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          origin, process_id, extensions::APIPermission::kNotification,
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &extensions);
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (ExtensionSet::const_iterator iter = extensions.begin();
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           iter != extensions.end(); ++iter) {
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (IsExtensionEnabled((*iter)->id()))
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          return UTF8ToUTF16((*iter)->name());
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UTF8ToUTF16(origin.host());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::NotifySettingsChange() {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_DESKTOP_NOTIFICATION_SETTINGS_CHANGED,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<DesktopNotificationService>(this),
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationUIManager* DesktopNotificationService::GetUIManager() {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We defer setting ui_manager_ to the global singleton until we need it
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in order to avoid UI dependent construction during startup.
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ui_manager_)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_manager_ = g_browser_process->notification_ui_manager();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui_manager_;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DesktopNotificationService::IsExtensionEnabled(const std::string& id) {
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return disabled_extension_ids_.find(id) == disabled_extension_ids_.end();
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::SetExtensionEnabled(
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& id, bool enabled) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not touch |disabled_extension_ids_|. It will be updated at
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDisabledExtensionIdsChanged() which will be called when the pref changes.
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ToggleListPrefItem(
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_->GetPrefs(),
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMessageCenterDisabledExtensionIds,
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      id,
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !enabled);
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::OnDisabledExtensionIdsChanged() {
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CopySetFromPrefToMemory(profile_->GetPrefs(),
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          prefs::kMessageCenterDisabledExtensionIds,
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &disabled_extension_ids_);
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DesktopNotificationService::IsSystemComponentEnabled(
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_center::Notifier::SystemComponentNotifierType type) {
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return disabled_system_component_ids_.find(message_center::ToString(type)) ==
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         disabled_system_component_ids_.end();
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DesktopNotificationService::SetSystemComponentEnabled(
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_center::Notifier::SystemComponentNotifierType type, bool enabled) {
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Do not touch |disabled_extension_ids_|. It will be updated at
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OnDisabledExtensionIdsChanged() which will be called when the pref changes.
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ToggleListPrefItem(
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_->GetPrefs(),
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMessageCenterDisabledSystemComponentIds,
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      message_center::ToString(type),
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !enabled);
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DesktopNotificationService::OnDisabledSystemComponentIdsChanged() {
599b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  disabled_system_component_ids_.clear();
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CopySetFromPrefToMemory(profile_->GetPrefs(),
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          prefs::kMessageCenterDisabledSystemComponentIds,
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &disabled_system_component_ids_);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter::Permission
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DesktopNotificationService::HasPermission(const GURL& origin) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* host_content_settings_map =
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->GetHostContentSettingsMap();
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = host_content_settings_map->GetContentSetting(
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ALLOW)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebNotificationPresenter::PermissionAllowed;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_BLOCK)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebNotificationPresenter::PermissionDenied;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ASK)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebNotificationPresenter::PermissionNotAllowed;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Invalid notifications settings value: " << setting;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebKit::WebNotificationPresenter::PermissionNotAllowed;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void DesktopNotificationService::Observe(
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int type,
62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const content::NotificationSource& source,
62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const content::NotificationDetails& details) {
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNINSTALLED, type);
63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  extensions::Extension* extension =
63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::Details<extensions::Extension>(details).ptr();
63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (IsExtensionEnabled(extension->id()))
63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetExtensionEnabled(extension->id(), true);
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
639