| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/notification/notification_api.h" | 5 #include "chrome/browser/extensions/api/notification/notification_api.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/browser_process.h" | 10 #include "chrome/browser/browser_process.h" |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 }; | 109 }; |
| 110 | 110 |
| 111 } // namespace | 111 } // namespace |
| 112 | 112 |
| 113 NotificationApiFunction::NotificationApiFunction() { | 113 NotificationApiFunction::NotificationApiFunction() { |
| 114 } | 114 } |
| 115 | 115 |
| 116 NotificationApiFunction::~NotificationApiFunction() { | 116 NotificationApiFunction::~NotificationApiFunction() { |
| 117 } | 117 } |
| 118 | 118 |
| 119 ui::notifications::NotificationType | 119 message_center::NotificationType |
| 120 NotificationApiFunction::MapApiTemplateTypeToType( | 120 NotificationApiFunction::MapApiTemplateTypeToType( |
| 121 api::experimental_notification::TemplateType type) { | 121 api::experimental_notification::TemplateType type) { |
| 122 switch (type) { | 122 switch (type) { |
| 123 case api::experimental_notification::TEMPLATE_TYPE_NONE: | 123 case api::experimental_notification::TEMPLATE_TYPE_NONE: |
| 124 case api::experimental_notification::TEMPLATE_TYPE_SIMPLE: | 124 case api::experimental_notification::TEMPLATE_TYPE_SIMPLE: |
| 125 return ui::notifications::NOTIFICATION_TYPE_SIMPLE; | 125 return message_center::NOTIFICATION_TYPE_SIMPLE; |
| 126 case api::experimental_notification::TEMPLATE_TYPE_BASIC: | 126 case api::experimental_notification::TEMPLATE_TYPE_BASIC: |
| 127 return ui::notifications::NOTIFICATION_TYPE_BASE_FORMAT; | 127 return message_center::NOTIFICATION_TYPE_BASE_FORMAT; |
| 128 case api::experimental_notification::TEMPLATE_TYPE_IMAGE: | 128 case api::experimental_notification::TEMPLATE_TYPE_IMAGE: |
| 129 return ui::notifications::NOTIFICATION_TYPE_IMAGE; | 129 return message_center::NOTIFICATION_TYPE_IMAGE; |
| 130 case api::experimental_notification::TEMPLATE_TYPE_LIST: | 130 case api::experimental_notification::TEMPLATE_TYPE_LIST: |
| 131 return ui::notifications::NOTIFICATION_TYPE_MULTIPLE; | 131 return message_center::NOTIFICATION_TYPE_MULTIPLE; |
| 132 default: | 132 default: |
| 133 // Gracefully handle newer application code that is running on an older | 133 // Gracefully handle newer application code that is running on an older |
| 134 // runtime that doesn't recognize the requested template. | 134 // runtime that doesn't recognize the requested template. |
| 135 return ui::notifications::NOTIFICATION_TYPE_BASE_FORMAT; | 135 return message_center::NOTIFICATION_TYPE_BASE_FORMAT; |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 | 138 |
| 139 // If older notification runtime is used, MessageCenter is not built. |
| 140 // Use simpler bridge then, ignoring all options. |
| 141 #if !defined (ENABLE_MESSAGE_CENTER) |
| 139 void NotificationApiFunction::CreateNotification( | 142 void NotificationApiFunction::CreateNotification( |
| 140 const std::string& id, | 143 const std::string& id, |
| 141 api::experimental_notification::NotificationOptions* options) { | 144 api::experimental_notification::NotificationOptions* options) { |
| 142 ui::notifications::NotificationType type = MapApiTemplateTypeToType( | 145 message_center::NotificationType type = |
| 143 options->template_type); | 146 MapApiTemplateTypeToType(options->template_type); |
| 144 GURL icon_url(UTF8ToUTF16(options->icon_url)); | 147 GURL icon_url(UTF8ToUTF16(options->icon_url)); |
| 145 string16 title(UTF8ToUTF16(options->title)); | 148 string16 title(UTF8ToUTF16(options->title)); |
| 146 string16 message(UTF8ToUTF16(options->message)); | 149 string16 message(UTF8ToUTF16(options->message)); |
| 150 |
| 151 // Ignore options if running on the old notification runtime. |
| 152 scoped_ptr<DictionaryValue> optional_fields(new DictionaryValue()); |
| 153 |
| 154 NotificationApiDelegate* api_delegate(new NotificationApiDelegate( |
| 155 this, |
| 156 profile(), |
| 157 extension_->id(), |
| 158 id)); // ownership is passed to Notification |
| 159 Notification notification(type, extension_->url(), icon_url, title, message, |
| 160 WebKit::WebTextDirectionDefault, |
| 161 string16(), UTF8ToUTF16(api_delegate->id()), |
| 162 optional_fields.get(), api_delegate); |
| 163 |
| 164 g_browser_process->notification_ui_manager()->Add(notification, profile()); |
| 165 } |
| 166 #else // defined(ENABLE_MESSAGE_CENTER) |
| 167 void NotificationApiFunction::CreateNotification( |
| 168 const std::string& id, |
| 169 api::experimental_notification::NotificationOptions* options) { |
| 170 message_center::NotificationType type = |
| 171 MapApiTemplateTypeToType(options->template_type); |
| 172 GURL icon_url(UTF8ToUTF16(options->icon_url)); |
| 173 string16 title(UTF8ToUTF16(options->title)); |
| 174 string16 message(UTF8ToUTF16(options->message)); |
| 147 | 175 |
| 148 scoped_ptr<DictionaryValue> optional_fields(new DictionaryValue()); | 176 scoped_ptr<DictionaryValue> optional_fields(new DictionaryValue()); |
| 149 | 177 |
| 150 // For all notification types. | 178 // For all notification types. |
| 151 if (options->priority.get()) | 179 if (options->priority.get()) |
| 152 optional_fields->SetInteger(ui::notifications::kPriorityKey, | 180 optional_fields->SetInteger(message_center::kPriorityKey, |
| 153 *options->priority); | 181 *options->priority); |
| 154 if (options->event_time.get()) | 182 if (options->event_time.get()) |
| 155 optional_fields->SetString(ui::notifications::kTimestampKey, | 183 optional_fields->SetString(message_center::kTimestampKey, |
| 156 *options->event_time); | 184 *options->event_time); |
| 157 if (options->buttons.get()) { | 185 if (options->buttons.get()) { |
| 158 if (options->buttons->size() > 0) { | 186 if (options->buttons->size() > 0) { |
| 159 linked_ptr<api::experimental_notification::NotificationButton> button = | 187 linked_ptr<api::experimental_notification::NotificationButton> button = |
| 160 (*options->buttons)[0]; | 188 (*options->buttons)[0]; |
| 161 optional_fields->SetString(ui::notifications::kButtonOneTitleKey, | 189 optional_fields->SetString(message_center::kButtonOneTitleKey, |
| 162 UTF8ToUTF16(button->title)); | 190 UTF8ToUTF16(button->title)); |
| 163 if (button->icon_url.get()) | 191 if (button->icon_url.get()) |
| 164 optional_fields->SetString(ui::notifications::kButtonOneIconUrlKey, | 192 optional_fields->SetString(message_center::kButtonOneIconUrlKey, |
| 165 UTF8ToUTF16(*button->icon_url)); | 193 UTF8ToUTF16(*button->icon_url)); |
| 166 } | 194 } |
| 167 if (options->buttons->size() > 1) { | 195 if (options->buttons->size() > 1) { |
| 168 linked_ptr<api::experimental_notification::NotificationButton> button = | 196 linked_ptr<api::experimental_notification::NotificationButton> button = |
| 169 (*options->buttons)[1]; | 197 (*options->buttons)[1]; |
| 170 optional_fields->SetString(ui::notifications::kButtonTwoTitleKey, | 198 optional_fields->SetString(message_center::kButtonTwoTitleKey, |
| 171 UTF8ToUTF16(button->title)); | 199 UTF8ToUTF16(button->title)); |
| 172 if (button->icon_url.get()) | 200 if (button->icon_url.get()) |
| 173 optional_fields->SetString(ui::notifications::kButtonTwoIconUrlKey, | 201 optional_fields->SetString(message_center::kButtonTwoIconUrlKey, |
| 174 UTF8ToUTF16(*button->icon_url)); | 202 UTF8ToUTF16(*button->icon_url)); |
| 175 } | 203 } |
| 176 } | 204 } |
| 177 if (options->expanded_message.get()) | 205 if (options->expanded_message.get()) |
| 178 optional_fields->SetString(ui::notifications::kExpandedMessageKey, | 206 optional_fields->SetString(message_center::kExpandedMessageKey, |
| 179 UTF8ToUTF16(*options->expanded_message)); | 207 UTF8ToUTF16(*options->expanded_message)); |
| 180 | 208 |
| 181 // For image notifications (type == 'image'). | 209 // For image notifications (type == 'image'). |
| 182 // TODO(dharcourt): Fail if (type == 'image' && !options->image_url.get()) | 210 // TODO(dharcourt): Fail if (type == 'image' && !options->image_url.get()) |
| 183 // TODO(dharcourt): Fail if (type != 'image' && options->image_url.get()) | 211 // TODO(dharcourt): Fail if (type != 'image' && options->image_url.get()) |
| 184 if (options->image_url.get()) | 212 if (options->image_url.get()) |
| 185 optional_fields->SetString(ui::notifications::kImageUrlKey, | 213 optional_fields->SetString(message_center::kImageUrlKey, |
| 186 UTF8ToUTF16(*options->image_url)); | 214 UTF8ToUTF16(*options->image_url)); |
| 187 | 215 |
| 188 // For list notifications (type == 'multiple'). | 216 // For list notifications (type == 'multiple'). |
| 189 // TODO(dharcourt): Fail if (type == 'multiple' && !options->items.get()) | 217 // TODO(dharcourt): Fail if (type == 'multiple' && !options->items.get()) |
| 190 // TODO(dharcourt): Fail if (type != 'multiple' && options->items.get()) | 218 // TODO(dharcourt): Fail if (type != 'multiple' && options->items.get()) |
| 191 if (options->items.get()) { | 219 if (options->items.get()) { |
| 192 base::ListValue* items = new base::ListValue(); | 220 base::ListValue* items = new base::ListValue(); |
| 193 std::vector< | 221 std::vector< |
| 194 linked_ptr< | 222 linked_ptr< |
| 195 api::experimental_notification::NotificationItem> >::iterator i; | 223 api::experimental_notification::NotificationItem> >::iterator i; |
| 196 for (i = options->items->begin(); i != options->items->end(); ++i) { | 224 for (i = options->items->begin(); i != options->items->end(); ++i) { |
| 197 base::DictionaryValue* item = new base::DictionaryValue(); | 225 base::DictionaryValue* item = new base::DictionaryValue(); |
| 198 item->SetString(ui::notifications::kItemTitleKey, | 226 item->SetString(message_center::kItemTitleKey, |
| 199 UTF8ToUTF16(i->get()->title)); | 227 UTF8ToUTF16(i->get()->title)); |
| 200 item->SetString(ui::notifications::kItemMessageKey, | 228 item->SetString(message_center::kItemMessageKey, |
| 201 UTF8ToUTF16(i->get()->message)); | 229 UTF8ToUTF16(i->get()->message)); |
| 202 items->Append(item); | 230 items->Append(item); |
| 203 } | 231 } |
| 204 optional_fields->Set(ui::notifications::kItemsKey, items); | 232 optional_fields->Set(message_center::kItemsKey, items); |
| 205 } | 233 } |
| 206 | 234 |
| 207 NotificationApiDelegate* api_delegate(new NotificationApiDelegate( | 235 NotificationApiDelegate* api_delegate(new NotificationApiDelegate( |
| 208 this, | 236 this, |
| 209 profile(), | 237 profile(), |
| 210 extension_->id(), | 238 extension_->id(), |
| 211 id)); // ownership is passed to Notification | 239 id)); // ownership is passed to Notification |
| 212 Notification notification(type, extension_->url(), icon_url, title, message, | 240 Notification notification(type, extension_->url(), icon_url, title, message, |
| 213 WebKit::WebTextDirectionDefault, | 241 WebKit::WebTextDirectionDefault, |
| 214 string16(), UTF8ToUTF16(api_delegate->id()), | 242 string16(), UTF8ToUTF16(api_delegate->id()), |
| 215 optional_fields.get(), api_delegate); | 243 optional_fields.get(), api_delegate); |
| 216 | 244 |
| 217 g_browser_process->notification_ui_manager()->Add(notification, profile()); | 245 g_browser_process->notification_ui_manager()->Add(notification, profile()); |
| 218 } | 246 } |
| 247 #endif // !defined(ENABLE_MESSAGE_CENTER) |
| 219 | 248 |
| 220 bool NotificationApiFunction::IsNotificationApiEnabled() { | 249 bool NotificationApiFunction::IsNotificationApiEnabled() { |
| 221 DesktopNotificationService* service = | 250 DesktopNotificationService* service = |
| 222 DesktopNotificationServiceFactory::GetForProfile(profile()); | 251 DesktopNotificationServiceFactory::GetForProfile(profile()); |
| 223 return service->IsExtensionEnabled(extension_->id()); | 252 return service->IsExtensionEnabled(extension_->id()); |
| 224 } | 253 } |
| 225 | 254 |
| 226 bool NotificationApiFunction::RunImpl() { | 255 bool NotificationApiFunction::RunImpl() { |
| 227 if (!IsNotificationApiEnabled()) { | 256 if (!IsNotificationApiEnabled()) { |
| 228 SendResponse(false); | 257 SendResponse(false); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 CancelById(NotificationApiDelegate::CreateScopedIdentifier( | 334 CancelById(NotificationApiDelegate::CreateScopedIdentifier( |
| 306 extension_->id(), params_->notification_id)); | 335 extension_->id(), params_->notification_id)); |
| 307 | 336 |
| 308 SetResult(Value::CreateBooleanValue(cancel_result)); | 337 SetResult(Value::CreateBooleanValue(cancel_result)); |
| 309 SendResponse(true); | 338 SendResponse(true); |
| 310 | 339 |
| 311 return true; | 340 return true; |
| 312 } | 341 } |
| 313 | 342 |
| 314 } // namespace extensions | 343 } // namespace extensions |
| OLD | NEW |