Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(532)

Side by Side Diff: chrome/renderer/resources/extensions/notification_custom_bindings.js

Issue 12313115: Take notification API out of experimental. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Missed one pathname. Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 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 // Custom bindings for the notification API.
6
7 var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
8 var sendRequest = require('sendRequest').sendRequest;
9 var imageUtil = require('imageUtil');
10 var lastError = require('lastError');
11
12 function url_getter(context, key) {
13 var f = function() {
14 return this[key];
15 };
16 return f.bind(context);
17 }
18
19 function url_setter(context, key) {
20 var f = function(val) {
21 this[key] = val;
22 };
23 return f.bind(context);
24 }
25
26 function replaceNotificationOptionURLs(notification_details, callback) {
27 // A URL Spec is an object with the following keys:
28 // path: The resource to be downloaded.
29 // callback: A function to be called when the URL is complete. It
30 // should accept an ImageData object and set the appropriate
31 // field in the output of create.
32
33 // TODO(dewittj): Try to remove hard-coding.
34 // |iconUrl| is required.
35 var url_specs = [{
36 path: notification_details.iconUrl,
37 width: 80,
38 height: 80,
39 callback: url_setter(notification_details, 'iconUrl')
40 }];
41
42 // |secondIconUrl| is optional.
43 if (notification_details.secondIconUrl) {
44 url_specs.push({
45 path: notification_details.secondIconUrl,
46 width: 80,
47 height: 80,
48 callback: url_setter(notification_details, 'secondIconUrl')
49 });
50 }
51
52 // |imageUrl| is optional.
53 if (notification_details.imageUrl) {
54 url_specs.push({
55 path: notification_details.imageUrl,
56 width: 300,
57 height: 300,
58 callback: url_setter(notification_details, 'imageUrl')
59 });
60 }
61
62 // Each button has an optional icon.
63 var button_list = notification_details.buttons;
64 if (button_list && typeof button_list.length === 'number') {
65 var num_buttons = button_list.length;
66 for (var i = 0; i < num_buttons; i++) {
67 if (button_list[i].iconUrl) {
68 url_specs.push({
69 path: button_list[i].iconUrl,
70 width: 16,
71 height: 16,
72 callback: url_setter(button_list[i], 'iconUrl')
73 });
74 }
75 }
76 }
77
78 var errors = 0;
79
80 imageUtil.loadAllImages(url_specs, {
81 onerror: function(index) {
82 errors++;
83 },
84 oncomplete: function(imageData) {
85 if (errors > 0) {
86 callback(false);
87 return;
88 }
89 for (var index = 0; index < url_specs.length; index++) {
90 var url_spec = url_specs[index];
91 url_spec.callback(imageData[index]);
92 }
93 callback(true);
94 }
95 });
96 }
97
98 function genHandle(failure_function) {
99 return function(id, input_notification_details, callback) {
100 // TODO(dewittj): Remove this hack. This is used as a way to deep
101 // copy a complex JSON object.
102 var notification_details = JSON.parse(
103 JSON.stringify(input_notification_details));
104 var that = this;
105 replaceNotificationOptionURLs(notification_details, function(success) {
106 if (success) {
107 sendRequest(that.name,
108 [id, notification_details, callback],
109 that.definition.parameters);
110 return;
111 }
112 lastError.set('Unable to download all specified images.');
113 failure_function(callback, id);
114 });
115 };
116 }
117
118 var handleCreate = genHandle(function(callback, id) { callback(id); });
119 var handleUpdate = genHandle(function(callback, id) { callback(false); });
120
121 var experimentalNotificationCustomHook = function(bindingsAPI, extensionId) {
122 var apiFunctions = bindingsAPI.apiFunctions;
123 apiFunctions.setHandleRequest('create', handleCreate);
124 apiFunctions.setHandleRequest('update', handleCreate);
125 };
126
127 chromeHidden.registerCustomHook('experimental.notification',
128 experimentalNotificationCustomHook);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698