1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/notifications/notification.h"
6
7#include "base/strings/string_util.h"
8#include "chrome/browser/notifications/desktop_notification_service.h"
9#include "ui/base/webui/web_ui_util.h"
10#include "ui/message_center/message_center_util.h"
11
12Notification::Notification(const GURL& origin_url,
13                           const GURL& content_url,
14                           const base::string16& display_source,
15                           const base::string16& replace_id,
16                           NotificationDelegate* delegate)
17    : message_center::Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
18                                   delegate->id(),
19                                   base::string16(),
20                                   base::string16(),
21                                   gfx::Image(),
22                                   display_source,
23                                   message_center::NotifierId(origin_url),
24                                   message_center::RichNotificationData(),
25                                   delegate),
26      origin_url_(origin_url),
27      is_html_(true),
28      content_url_(content_url),
29      replace_id_(replace_id),
30      delegate_(delegate) {}
31
32Notification::Notification(const GURL& origin_url,
33                           const GURL& icon_url,
34                           const base::string16& title,
35                           const base::string16& body,
36                           blink::WebTextDirection dir,
37                           const base::string16& display_source,
38                           const base::string16& replace_id,
39                           NotificationDelegate* delegate)
40    : message_center::Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
41                                   delegate->id(),
42                                   title,
43                                   body,
44                                   gfx::Image(),
45                                   display_source,
46                                   message_center::NotifierId(origin_url),
47                                   message_center::RichNotificationData(),
48                                   delegate),
49      origin_url_(origin_url),
50      icon_url_(icon_url),
51      is_html_(false),
52      replace_id_(replace_id),
53      delegate_(delegate) {
54  // "Upconvert" the string parameters to a data: URL.
55  content_url_ = GURL(DesktopNotificationService::CreateDataUrl(
56      icon_url, title, body, dir));
57}
58
59Notification::Notification(
60    message_center::NotificationType type,
61    const GURL& origin_url,
62    const base::string16& title,
63    const base::string16& body,
64    const gfx::Image& icon,
65    blink::WebTextDirection dir,
66    const message_center::NotifierId& notifier_id,
67    const base::string16& display_source,
68    const base::string16& replace_id,
69    const message_center::RichNotificationData& rich_notification_data,
70    NotificationDelegate* delegate)
71    : message_center::Notification(type,
72                                   delegate->id(),
73                                   title,
74                                   body,
75                                   icon,
76                                   display_source,
77                                   notifier_id,
78                                   rich_notification_data,
79                                   delegate),
80      origin_url_(origin_url),
81      is_html_(false),
82      replace_id_(replace_id),
83      delegate_(delegate) {
84  // It's important to leave |icon_url_| empty with rich notifications enabled,
85  // to prevent "Downloading" the data url and overwriting the existing |icon|.
86  if (!message_center::IsRichNotificationEnabled()) {
87    // "Upconvert" the string parameters to a data: URL.  Some balloon views
88    // require content URL to render anything, so this serves as a backup.
89    if (!icon.IsEmpty())
90      icon_url_ = GURL(webui::GetBitmapDataUrl(*icon.ToSkBitmap()));
91    content_url_ = GURL(
92        DesktopNotificationService::CreateDataUrl(icon_url_, title, body, dir));
93  }
94}
95
96Notification::Notification(const GURL& origin_url,
97                           const gfx::Image& icon,
98                           const base::string16& title,
99                           const base::string16& body,
100                           blink::WebTextDirection dir,
101                           const base::string16& display_source,
102                           const base::string16& replace_id,
103                           NotificationDelegate* delegate)
104    : message_center::Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
105                                   delegate->id(),
106                                   title,
107                                   body,
108                                   icon,
109                                   display_source,
110                                   message_center::NotifierId(origin_url),
111                                   message_center::RichNotificationData(),
112                                   delegate),
113      origin_url_(origin_url),
114      is_html_(false),
115      replace_id_(replace_id),
116      delegate_(delegate) {}
117
118Notification::Notification(const Notification& notification)
119    : message_center::Notification(notification),
120      origin_url_(notification.origin_url()),
121      icon_url_(notification.icon_url()),
122      is_html_(notification.is_html()),
123      content_url_(notification.content_url()),
124      button_one_icon_url_(notification.button_one_icon_url()),
125      button_two_icon_url_(notification.button_two_icon_url()),
126      image_url_(notification.image_url()),
127      replace_id_(notification.replace_id()),
128      delegate_(notification.delegate()) {}
129
130Notification::~Notification() {}
131
132Notification& Notification::operator=(const Notification& notification) {
133  message_center::Notification::operator=(notification);
134  origin_url_ = notification.origin_url();
135  icon_url_ = notification.icon_url();
136  is_html_ = notification.is_html();
137  content_url_ = notification.content_url();
138  button_one_icon_url_ = notification.button_one_icon_url();
139  button_two_icon_url_ = notification.button_two_icon_url();
140  image_url_ = notification.image_url();
141  replace_id_ = notification.replace_id();
142  delegate_ = notification.delegate();
143  return *this;
144}
145