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

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

Issue 183693015: <webview>: Move Dialog API to stable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed C++ check Created 6 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 // This module implements experimental API for <webview>. 5 // This module implements experimental API for <webview>.
6 // See web_view.js for details. 6 // See web_view.js for details.
7 // 7 //
8 // <webview> Experimental API is only available on canary and dev channels of 8 // <webview> Experimental API is only available on canary and dev channels of
9 // Chrome. 9 // Chrome.
10 10
(...skipping 15 matching lines...) Expand all
26 // accessible to <webview> developers. 26 // accessible to <webview> developers.
27 // |customHandler| allows a handler function to be called each time an extension 27 // |customHandler| allows a handler function to be called each time an extension
28 // event is caught by its event listener. The DOM event should be dispatched 28 // event is caught by its event listener. The DOM event should be dispatched
29 // within this handler function. With no handler function, the DOM event 29 // within this handler function. With no handler function, the DOM event
30 // will be dispatched by default each time the extension event is caught. 30 // will be dispatched by default each time the extension event is caught.
31 // |cancelable| (default: false) specifies whether the event's default 31 // |cancelable| (default: false) specifies whether the event's default
32 // behavior can be canceled. If the default action associated with the event 32 // behavior can be canceled. If the default action associated with the event
33 // is prevented, then its dispatch function will return false in its event 33 // is prevented, then its dispatch function will return false in its event
34 // handler. The event must have a custom handler for this to be meaningful. 34 // handler. The event must have a custom handler for this to be meaningful.
35 var WEB_VIEW_EXPERIMENTAL_EVENTS = { 35 var WEB_VIEW_EXPERIMENTAL_EVENTS = {
36 'dialog': {
37 cancelable: true,
38 customHandler: function(webViewInternal, event, webViewEvent) {
39 webViewInternal.handleDialogEvent(event, webViewEvent);
40 },
41 evt: CreateEvent('webview.onDialog'),
42 fields: ['defaultPromptText', 'messageText', 'messageType', 'url']
43 },
44 'findupdate': { 36 'findupdate': {
45 evt: CreateEvent('webview.onFindReply'), 37 evt: CreateEvent('webview.onFindReply'),
46 fields: [ 38 fields: [
47 'searchText', 39 'searchText',
48 'numberOfMatches', 40 'numberOfMatches',
49 'activeMatchOrdinal', 41 'activeMatchOrdinal',
50 'selectionRect', 42 'selectionRect',
51 'canceled', 43 'canceled',
52 'finalUpdate' 44 'finalUpdate'
53 ] 45 ]
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 /** 137 /**
146 * @private 138 * @private
147 */ 139 */
148 WebViewInternal.prototype.setZoom = function(zoomFactor) { 140 WebViewInternal.prototype.setZoom = function(zoomFactor) {
149 if (!this.instanceId) { 141 if (!this.instanceId) {
150 return; 142 return;
151 } 143 }
152 WebView.setZoom(this.instanceId, zoomFactor); 144 WebView.setZoom(this.instanceId, zoomFactor);
153 }; 145 };
154 146
155 /**
156 * @private
157 */
158 WebViewInternal.prototype.handleDialogEvent =
159 function(event, webViewEvent) {
160 var showWarningMessage = function(dialogType) {
161 var VOWELS = ['a', 'e', 'i', 'o', 'u'];
162 var WARNING_MSG_DIALOG_BLOCKED = '<webview>: %1 %2 dialog was blocked.';
163 var article = (VOWELS.indexOf(dialogType.charAt(0)) >= 0) ? 'An' : 'A';
164 var output = WARNING_MSG_DIALOG_BLOCKED.replace('%1', article);
165 output = output.replace('%2', dialogType);
166 window.console.warn(output);
167 };
168
169 var self = this;
170 var browserPluginNode = this.browserPluginNode;
171 var webviewNode = this.webviewNode;
172
173 var requestId = event.requestId;
174 var actionTaken = false;
175
176 var validateCall = function() {
177 var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' +
178 'An action has already been taken for this "dialog" event.';
179
180 if (actionTaken) {
181 throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN);
182 }
183 actionTaken = true;
184 };
185
186 var dialog = {
187 ok: function(user_input) {
188 validateCall();
189 user_input = user_input || '';
190 WebView.setPermission(self.instanceId, requestId, 'allow', user_input);
191 },
192 cancel: function() {
193 validateCall();
194 WebView.setPermission(self.instanceId, requestId, 'deny');
195 }
196 };
197 webViewEvent.dialog = dialog;
198
199 var defaultPrevented = !webviewNode.dispatchEvent(webViewEvent);
200 if (actionTaken) {
201 return;
202 }
203
204 if (defaultPrevented) {
205 // Tell the JavaScript garbage collector to track lifetime of |dialog| and
206 // call back when the dialog object has been collected.
207 MessagingNatives.BindToGC(dialog, function() {
208 // Avoid showing a warning message if the decision has already been made.
209 if (actionTaken) {
210 return;
211 }
212 WebView.setPermission(
213 self.instanceId, requestId, 'default', '', function(allowed) {
214 if (allowed) {
215 return;
216 }
217 showWarningMessage(event.messageType);
218 });
219 });
220 } else {
221 actionTaken = true;
222 // The default action is equivalent to canceling the dialog.
223 WebView.setPermission(
224 self.instanceId, requestId, 'default', '', function(allowed) {
225 if (allowed) {
226 return;
227 }
228 showWarningMessage(event.messageType);
229 });
230 }
231 };
232
233 WebViewInternal.prototype.maybeGetExperimentalEvents = function() { 147 WebViewInternal.prototype.maybeGetExperimentalEvents = function() {
234 return WEB_VIEW_EXPERIMENTAL_EVENTS; 148 return WEB_VIEW_EXPERIMENTAL_EVENTS;
235 }; 149 };
236 150
237 /** @private */ 151 /** @private */
238 WebViewInternal.prototype.maybeGetExperimentalPermissions = function() { 152 WebViewInternal.prototype.maybeGetExperimentalPermissions = function() {
239 return []; 153 return [];
240 }; 154 };
241 155
242 /** @private */ 156 /** @private */
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 269
356 // Expose <webview>.contextMenus object. 270 // Expose <webview>.contextMenus object.
357 Object.defineProperty( 271 Object.defineProperty(
358 this.webviewNode, 272 this.webviewNode,
359 'contextMenus', 273 'contextMenus',
360 { 274 {
361 get: createContextMenus(), 275 get: createContextMenus(),
362 enumerable: true 276 enumerable: true
363 }); 277 });
364 }; 278 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698