desktop_notification_service.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.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"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/notifier_settings.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/webui/web_ui_util.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNotificationPresenter;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityOrigin;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ContentSetting kDefaultSetting = CONTENT_SETTING_ASK;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsesTextNotifications() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      g_browser_process->notification_ui_manager()->DelegatesToMessageCenter();
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToggleListPrefItem(PrefService* prefs, const char* key,
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const std::string& item, bool flag) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ListPrefUpdate update(prefs, key);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue* const list = update.Get();
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (flag) {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // AppendIfNotPresent will delete |adding_value| when the same value
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // already exists.
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::StringValue* const adding_value = new base::StringValue(item);
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    list->AppendIfNotPresent(adding_value);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::StringValue removed_value(item);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    list->Remove(removed_value, NULL);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CopySetFromPrefToMemory(PrefService* prefs, const char* key,
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             std::set<std::string>* dst) {
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dst->clear();
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::ListValue* pref_list = prefs->GetList(key);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < pref_list->GetSize(); ++i) {
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string element;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!pref_list->GetString(i, &element) && element.empty()) {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LOG(WARNING) << i << "-th element is not a string for "
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   << key;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dst->insert(element);
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NotificationPermissionInfoBarDelegate --------------------------------------
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The delegate for the infobar shown when an origin requests notification
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a notification permission delegate and adds it to
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |infobar_service|.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void Create(InfoBarService* infobar_service,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     DesktopNotificationService* notification_service,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const GURL& origin,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const string16& display_name,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int process_id,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int route_id,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int callback_context);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationPermissionInfoBarDelegate(
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InfoBarService* infobar_service,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DesktopNotificationService* notification_service,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& display_name,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int process_id,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int route_id,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int callback_context);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NotificationPermissionInfoBarDelegate();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConfirmInfoBarDelegate:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Image* GetIcon() const OVERRIDE;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Type GetInfoBarType() const OVERRIDE;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetMessageText() const OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Accept() OVERRIDE;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Cancel() OVERRIDE;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The origin we are asking for permissions on.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The display name for the origin to be displayed.  Will be different from
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin_ for extensions.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 display_name_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The notification service to be used.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DesktopNotificationService* notification_service_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The callback information that tells us how to respond to javascript via
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the correct RenderView.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int process_id_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_context_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the user clicked one of the buttons.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool action_taken_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotificationPermissionInfoBarDelegate);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NotificationPermissionInfoBarDelegate::Create(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService* infobar_service,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DesktopNotificationService* notification_service,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& origin,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16& display_name,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int process_id,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int route_id,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int callback_context) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new NotificationPermissionInfoBarDelegate(
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infobar_service, notification_service, origin, display_name,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          process_id, route_id, callback_context)));
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationPermissionInfoBarDelegate::NotificationPermissionInfoBarDelegate(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService* infobar_service,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DesktopNotificationService* notification_service,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& display_name,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int callback_context)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ConfirmInfoBarDelegate(infobar_service),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_(origin),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_name_(display_name),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_service_(notification_service),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      process_id_(process_id),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_(route_id),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_context_(callback_context),
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      action_taken_(false) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationPermissionInfoBarDelegate::
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~NotificationPermissionInfoBarDelegate() {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!action_taken_)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Ignored", 1);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = RenderViewHost::FromID(process_id_, route_id_);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host->DesktopNotificationPermissionRequestDone(callback_context_);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image* NotificationPermissionInfoBarDelegate::GetIcon() const {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &ResourceBundle::GetSharedInstance().GetNativeImageNamed(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_INFOBAR_DESKTOP_NOTIFICATIONS);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InfoBarDelegate::Type
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationPermissionInfoBarDelegate::GetInfoBarType() const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PAGE_ACTION_TYPE;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NotificationPermissionInfoBarDelegate::GetMessageText() const {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_NOTIFICATION_PERMISSIONS,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    display_name_);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NotificationPermissionInfoBarDelegate::GetButtonLabel(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InfoBarButton button) const {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_NOTIFICATION_PERMISSION_YES : IDS_NOTIFICATION_PERMISSION_NO);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NotificationPermissionInfoBarDelegate::Accept() {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Allowed", 1);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_service_->GrantPermission(origin_);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_taken_ = true;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NotificationPermissionInfoBarDelegate::Cancel() {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Denied", 1);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_service_->DenyPermission(origin_);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_taken_ = true;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopNotificationService -------------------------------------------------
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::RegisterUserPrefs(
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) || defined(ENABLE_MESSAGE_CENTER)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterListPref(prefs::kMessageCenterDisabledExtensionIds,
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterListPref(prefs::kMessageCenterDisabledSystemComponentIds,
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DesktopNotificationService::CreateDataUrl(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& icon_url, const string16& title, const string16& body,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebTextDirection dir) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> subst;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_url.is_valid()) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = IDR_NOTIFICATION_ICON_HTML;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(icon_url.spec());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(title)));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(body)));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // icon float position
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(dir == WebKit::WebTextDirectionRightToLeft ?
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "right" : "left");
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (title.empty() || body.empty()) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = IDR_NOTIFICATION_1LINE_HTML;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 line = title.empty() ? body : title;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Strings are div names in the template file.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 line_name = title.empty() ? ASCIIToUTF16("description")
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       : ASCIIToUTF16("title");
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(line_name)));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(line)));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = IDR_NOTIFICATION_2LINE_HTML;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(title)));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subst.push_back(net::EscapeForHTML(UTF16ToUTF8(body)));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // body text direction
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(dir == WebKit::WebTextDirectionRightToLeft ?
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "rtl" : "ltr");
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateDataUrl(resource, subst);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DesktopNotificationService::CreateDataUrl(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int resource, const std::vector<std::string>& subst) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::StringPiece template_html(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          resource));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_html.empty()) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "unable to load template. ID: " << resource;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return string16();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data = ReplaceStringPlaceholders(template_html, subst, NULL);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UTF8ToUTF16("data:text/html;charset=utf-8," +
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      net::EscapeQueryParamValue(data, false));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DesktopNotificationService::AddNotification(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin_url,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& title,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& message,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& icon_url,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& replace_id,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationDelegate* delegate,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (UsesTextNotifications()) {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For message center create a non-HTML notification with |icon_url|.
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Notification notification(origin_url, icon_url, title, message,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              WebKit::WebTextDirectionDefault,
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              string16(), replace_id, delegate);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_browser_process->notification_ui_manager()->Add(notification, profile);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return notification.notification_id();
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate a data URL embedding the icon URL, title, and message.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL content_url(CreateDataUrl(
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icon_url, title, message, WebKit::WebTextDirectionDefault));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Notification notification(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(), content_url, string16(), replace_id, delegate);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->notification_ui_manager()->Add(notification, profile);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return notification.notification_id();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DesktopNotificationService::AddIconNotification(
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin_url,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& title,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& message,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Image& icon,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& replace_id,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationDelegate* delegate,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (UsesTextNotifications()) {
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For message center create a non-HTML notification with |icon|.
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Notification notification(origin_url, icon, title, message,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              WebKit::WebTextDirectionDefault,
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              string16(), replace_id, delegate);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_browser_process->notification_ui_manager()->Add(notification, profile);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return notification.notification_id();
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL icon_url;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!icon.IsEmpty())
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_url = GURL(webui::GetBitmapDataUrl(*icon.ToSkBitmap()));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddNotification(
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_url, title, message, icon_url, replace_id, delegate, profile);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::RemoveNotification(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& notification_id) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_browser_process->notification_ui_manager()->CancelById(notification_id);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopNotificationService::DesktopNotificationService(
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationUIManager* ui_manager)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_manager_(ui_manager) {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MESSAGE_CENTER)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnDisabledExtensionIdsChanged();
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnDisabledSystemComponentIdsChanged();
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  disabled_extension_id_pref_.Init(
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kMessageCenterDisabledExtensionIds,
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile_->GetPrefs(),
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &DesktopNotificationService::OnDisabledExtensionIdsChanged,
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Unretained(this)));
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disabled_system_component_id_pref_.Init(
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMessageCenterDisabledSystemComponentIds,
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_->GetPrefs(),
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &DesktopNotificationService::OnDisabledSystemComponentIdsChanged,
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::Unretained(this)));
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopNotificationService::~DesktopNotificationService() {
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MESSAGE_CENTER)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  disabled_extension_id_pref_.Destroy();
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::GrantPermission(const GURL& origin) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern primary_pattern =
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(origin);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetContentSetting(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_pattern,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_ALLOW);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::DenyPermission(const GURL& origin) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern primary_pattern =
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(origin);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetContentSetting(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_pattern,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_BLOCK);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting DesktopNotificationService::GetDefaultContentSetting(
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* provider_id) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, provider_id);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::SetDefaultContentSetting(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetDefaultContentSetting(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, setting);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ResetToDefaultContentSetting() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetDefaultContentSetting(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, CONTENT_SETTING_DEFAULT);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::GetNotificationsSettings(
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsForOneType* settings) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->GetSettingsForOneType(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ClearSetting(
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& pattern) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->SetContentSetting(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_DEFAULT);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ResetAllOrigins() {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap()->ClearSettingsForOneType(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting DesktopNotificationService::GetContentSetting(
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetHostContentSettingsMap()->GetContentSetting(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::RequestPermission(
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin, int process_id, int route_id, int callback_context,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* contents) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |origin| hasn't been seen before and the default content setting for
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifications is "ask", show an infobar.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cache can only answer queries on the IO thread once it's initialized,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so don't ask the cache.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = GetContentSetting(origin);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ASK) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Show an info bar requesting permission.
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService* infobar_service =
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        InfoBarService::FromWebContents(contents);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |infobar_service| may be NULL, e.g., if this request originated in a
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // browser action popup, extension background page, or any HTML that runs
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // outside of a tab.
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (infobar_service) {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NotificationPermissionInfoBarDelegate::Create(
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infobar_service,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DesktopNotificationServiceFactory::GetForProfile(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Profile::FromBrowserContext(contents->GetBrowserContext())),
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          origin,
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          DisplayNameForOriginInProcessId(origin, process_id),
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          process_id,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          route_id,
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          callback_context);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify renderer immediately.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* host = RenderViewHost::FromID(process_id, route_id);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host->DesktopNotificationPermissionRequestDone(callback_context);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ShowNotification(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Notification& notification) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUIManager()->Add(notification, profile_);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopNotificationService::CancelDesktopNotification(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id, int route_id, int notification_id) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NotificationObjectProxy> proxy(
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NotificationObjectProxy(process_id, route_id, notification_id,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  false));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetUIManager()->CancelById(proxy->id());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_WIN
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopNotificationService::ShowDesktopNotification(
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ShowDesktopNotificationHostMsgParams& params,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id, int route_id, DesktopNotificationSource source) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& origin = params.origin;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationObjectProxy* proxy =
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new NotificationObjectProxy(process_id, route_id,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  params.notification_id,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source == WorkerNotification);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  string16 display_source = DisplayNameForOriginInProcessId(origin, process_id);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params.is_html) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowNotification(Notification(origin, params.contents_url, display_source,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        params.replace_id, proxy));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Notification notification(origin, params.icon_url, params.title,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        params.body, params.direction, display_source, params.replace_id,
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        proxy);
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The webkit notification doesn't timeout.
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notification.DisableTimeout();
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ShowNotification(notification);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 DesktopNotificationService::DisplayNameForOriginInProcessId(
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& origin, int process_id) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the source is an extension, lookup the display name.
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Message center prefers to use extension name if the notification
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is allowed by an extension.
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (NotificationUIManager::DelegatesToMessageCenter() ||
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      origin.SchemeIs(extensions::kExtensionScheme)) {
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionInfoMap* extension_info_map =
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extensions::ExtensionSystem::Get(profile_)->info_map();
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (extension_info_map) {
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExtensionSet extensions;
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin(
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          origin, process_id, extensions::APIPermission::kNotification,
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &extensions);
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (ExtensionSet::const_iterator iter = extensions.begin();
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           iter != extensions.end(); ++iter) {
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (IsExtensionEnabled((*iter)->id()))
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          return UTF8ToUTF16((*iter)->name());
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UTF8ToUTF16(origin.host());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::NotifySettingsChange() {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_DESKTOP_NOTIFICATION_SETTINGS_CHANGED,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<DesktopNotificationService>(this),
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationUIManager* DesktopNotificationService::GetUIManager() {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We defer setting ui_manager_ to the global singleton until we need it
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in order to avoid UI dependent construction during startup.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ui_manager_)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_manager_ = g_browser_process->notification_ui_manager();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui_manager_;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DesktopNotificationService::IsExtensionEnabled(const std::string& id) {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return disabled_extension_ids_.find(id) == disabled_extension_ids_.end();
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::SetExtensionEnabled(
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& id, bool enabled) {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not touch |disabled_extension_ids_|. It will be updated at
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDisabledExtensionIdsChanged() which will be called when the pref changes.
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ToggleListPrefItem(
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_->GetPrefs(),
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMessageCenterDisabledExtensionIds,
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      id,
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !enabled);
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::OnDisabledExtensionIdsChanged() {
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CopySetFromPrefToMemory(profile_->GetPrefs(),
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          prefs::kMessageCenterDisabledExtensionIds,
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &disabled_extension_ids_);
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_MESSAGE_CENTER)
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DesktopNotificationService::IsSystemComponentEnabled(
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_center::Notifier::SystemComponentNotifierType type) {
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return disabled_system_component_ids_.find(message_center::ToString(type)) ==
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         disabled_system_component_ids_.end();
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DesktopNotificationService::SetSystemComponentEnabled(
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_center::Notifier::SystemComponentNotifierType type, bool enabled) {
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Do not touch |disabled_extension_ids_|. It will be updated at
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OnDisabledExtensionIdsChanged() which will be called when the pref changes.
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ToggleListPrefItem(
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_->GetPrefs(),
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMessageCenterDisabledSystemComponentIds,
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      message_center::ToString(type),
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !enabled);
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DesktopNotificationService::OnDisabledSystemComponentIdsChanged() {
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  disabled_extension_ids_.clear();
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CopySetFromPrefToMemory(profile_->GetPrefs(),
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          prefs::kMessageCenterDisabledSystemComponentIds,
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &disabled_system_component_ids_);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter::Permission
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DesktopNotificationService::HasPermission(const GURL& origin) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* host_content_settings_map =
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->GetHostContentSettingsMap();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = host_content_settings_map->GetContentSetting(
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin,
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NO_RESOURCE_IDENTIFIER);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ALLOW)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebNotificationPresenter::PermissionAllowed;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_BLOCK)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebNotificationPresenter::PermissionDenied;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ASK)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebNotificationPresenter::PermissionNotAllowed;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Invalid notifications settings value: " << setting;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebKit::WebNotificationPresenter::PermissionNotAllowed;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
641