Chromium Code Reviews| Index: chrome/renderer/resources/extensions/web_view_experimental.js |
| diff --git a/chrome/renderer/resources/extensions/web_view_experimental.js b/chrome/renderer/resources/extensions/web_view_experimental.js |
| index cfb11ed872dd1d6ec03e47fe7a2e30c0aed83158..f3ca1aed544628a89ad6ecc256cd5b94996d8d9c 100644 |
| --- a/chrome/renderer/resources/extensions/web_view_experimental.js |
| +++ b/chrome/renderer/resources/extensions/web_view_experimental.js |
| @@ -15,13 +15,24 @@ var WebRequestEvent = require('webRequestInternal').WebRequestEvent; |
| var webRequestSchema = |
| requireNative('schema_registry').GetSchema('webRequest'); |
| var WebView = require('webView').WebView; |
| +var createEvent = require('webView').CreateEvent; |
|
lazyboy
2013/08/08 19:58:01
nit: can sort these.
Fady Samuel
2013/08/08 20:13:45
Done.
|
| + |
| +var WEB_VIEW_EXPERIMENTAL_EXT_EVENTS = { |
| + 'dialog': { |
| + cancelable: true, |
| + customHandler: function(webview, event, webviewEvent) { |
| + webview.maybeSetupExtDialogEvent_(event, webviewEvent); |
| + }, |
| + evt: createEvent('webview.onDialog'), |
| + fields: ['defaultPromptText', 'messageText', 'messageType', 'url'] |
| + } |
| +}; |
| /** |
| * @private |
| */ |
| WebView.prototype.maybeSetupExperimentalAPI_ = function() { |
| this.setupWebRequestEvents_(); |
| - this.setupDialogEvent_(); |
| }; |
| /** |
| @@ -41,7 +52,7 @@ WebView.prototype.setupWebRequestEvents_ = function() { |
| self.viewInstanceId_); |
| } |
| return self[webRequestEvent.name + '_']; |
| - } |
| + }; |
| }; |
| // Populate the WebRequest events from the API definition. |
| @@ -81,7 +92,7 @@ WebView.prototype.setupWebRequestEvents_ = function() { |
| /** |
| * @private |
| */ |
| -WebView.prototype.setupDialogEvent_ = function() { |
| +WebView.prototype.maybeSetupExtDialogEvent_ = function(event, webviewEvent) { |
| var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' + |
| 'An action has already been taken for this "dialog" event.'; |
| @@ -94,77 +105,74 @@ WebView.prototype.setupDialogEvent_ = function() { |
| console.log(output); |
| }; |
| - var DIALOG_EVENT_ATTRIBUTES = [ |
| - 'defaultPromptText', |
| - 'messageText', |
| - 'messageType', |
| - 'url' |
| - ]; |
| - |
| var self = this; |
| - var node = this.webviewNode_; |
| var browserPluginNode = this.browserPluginNode_; |
| + var webviewNode = this.webviewNode_; |
| + |
| + var requestId = event.requestId; |
| + var actionTaken = false; |
| var onTrackedObjectGone = function(requestId, dialogType, e) { |
| var detail = e.detail ? JSON.parse(e.detail) : {}; |
| - if (detail.id != requestId) |
| + if (detail.id != requestId) { |
| return; |
| - // If the request was pending then show a warning indiciating that a new |
| - // window was blocked. |
| - if (browserPluginNode['-internal-setPermission'](requestId, false, '')) { |
| - showWarningMessage(dialogType); |
| } |
| - } |
| - browserPluginNode.addEventListener('-internal-dialog', function(e) { |
| - var evt = new Event('dialog', { bubbles: true, cancelable: true }); |
| - var detail = e.detail ? JSON.parse(e.detail) : {}; |
| - |
| - $Array.forEach(DIALOG_EVENT_ATTRIBUTES, function(attribName) { |
| - evt[attribName] = detail[attribName]; |
| - }); |
| - var requestId = detail.requestId; |
| - var actionTaken = false; |
| - |
| - var validateCall = function() { |
| - if (actionTaken) { |
| - throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN); |
| - } |
| - actionTaken = true; |
| - }; |
| + // Avoid showing a warning message if the decision has already been made. |
| + if (actionTaken) { |
| + return; |
| + } |
| - var dialog = { |
| - ok: function(user_input) { |
| - validateCall(); |
| - browserPluginNode['-internal-setPermission']( |
| - requestId, true, user_input); |
| - }, |
| - cancel: function() { |
| - validateCall(); |
| - browserPluginNode['-internal-setPermission'](requestId, false, ''); |
| - } |
| - }; |
| - evt.dialog = dialog; |
| + chrome.webview.setPermission(self.instanceId_, requestId, false, ''); |
| + showWarningMessage(dialogType); |
| + } |
| - var defaultPrevented = !node.dispatchEvent(evt); |
| + var validateCall = function() { |
| if (actionTaken) { |
| - return; |
| + throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN); |
| } |
| + actionTaken = true; |
| + }; |
| - if (defaultPrevented) { |
| - // Tell the JavaScript garbage collector to track lifetime of |dialog| and |
| - // call back when the dialog object has been collected. |
| - var onTrackedObjectGoneWithRequestId = |
| - $Function.bind( |
| - onTrackedObjectGone, self, requestId, detail.messageType); |
| - browserPluginNode.addEventListener('-internal-trackedobjectgone', |
| - onTrackedObjectGoneWithRequestId); |
| - browserPluginNode['-internal-trackObjectLifetime'](dialog, requestId); |
| - } else { |
| - actionTaken = true; |
| - // The default action is equivalent to canceling the dialog. |
| - browserPluginNode['-internal-setPermission'](requestId, false, ''); |
| - showWarningMessage(detail.messageType); |
| + var dialog = { |
| + ok: function(user_input) { |
| + validateCall(); |
| + user_input = user_input || ''; |
| + chrome.webview.setPermission( |
| + self.instanceId_, requestId, true, user_input); |
| + }, |
| + cancel: function() { |
| + validateCall(); |
| + chrome.webview.setPermission(self.instanceId_, requestId, false, ''); |
| } |
| - }); |
| + }; |
| + webviewEvent.dialog = dialog; |
| + |
| + var defaultPrevented = !webviewNode.dispatchEvent(webviewEvent); |
| + if (actionTaken) { |
| + return; |
| + } |
| + |
| + if (defaultPrevented) { |
| + // Tell the JavaScript garbage collector to track lifetime of |dialog| and |
| + // call back when the dialog object has been collected. |
| + var onTrackedObjectGoneWithRequestId = |
| + $Function.bind( |
| + onTrackedObjectGone, self, requestId, event.messageType); |
| + browserPluginNode.addEventListener('-internal-trackedobjectgone', |
| + onTrackedObjectGoneWithRequestId); |
| + browserPluginNode['-internal-trackObjectLifetime'](dialog, requestId); |
| + } else { |
| + actionTaken = true; |
| + // The default action is equivalent to canceling the dialog. |
| + chrome.webview.setPermission(self.instanceId_, requestId, false, ''); |
| + showWarningMessage(event.messageType); |
| + } |
| +}; |
| + |
| +/** |
| + * @private |
| + */ |
| +WebView.prototype.maybeGetWebviewExperimentalExtEvents_ = function() { |
| + return WEB_VIEW_EXPERIMENTAL_EXT_EVENTS; |
| }; |