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 c2bb066d6f1b657c0414fd62991597e2f6e75b49..8498f92903d67998bc080bbcb010f51b55c52f24 100644 |
--- a/chrome/renderer/resources/extensions/web_view_experimental.js |
+++ b/chrome/renderer/resources/extensions/web_view_experimental.js |
@@ -11,17 +11,28 @@ |
// permission API would only be available for channels CHANNEL_DEV and |
// CHANNEL_CANARY. |
+var createEvent = require('webView').CreateEvent; |
var WebRequestEvent = require('webRequestInternal').WebRequestEvent; |
var webRequestSchema = |
requireNative('schema_registry').GetSchema('webRequest'); |
var WebView = require('webView').WebView; |
+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_(); |
}; |
/** |
@@ -78,90 +89,87 @@ WebView.prototype.setupWebRequestEvents_ = function() { |
/** |
* @private |
*/ |
-WebView.prototype.setupDialogEvent_ = function() { |
- var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' + |
- 'An action has already been taken for this "dialog" event.'; |
- |
+WebView.prototype.maybeSetupExtDialogEvent_ = function(event, webviewEvent) { |
var showWarningMessage = function(dialogType) { |
var VOWELS = ['a', 'e', 'i', 'o', 'u']; |
var WARNING_MSG_DIALOG_BLOCKED = '<webview>: %1 %2 dialog was blocked.'; |
var article = (VOWELS.indexOf(dialogType.charAt(0)) >= 0) ? 'An' : 'A'; |
var output = WARNING_MSG_DIALOG_BLOCKED.replace('%1', article); |
output = output.replace('%2', dialogType); |
- console.log(output); |
+ console.warn(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) : {}; |
+ // Avoid showing a warning message if the decision has already been made. |
+ if (actionTaken) { |
+ return; |
+ } |
- $Array.forEach(DIALOG_EVENT_ATTRIBUTES, function(attribName) { |
- evt[attribName] = detail[attribName]; |
- }); |
- var requestId = detail.requestId; |
- var actionTaken = false; |
+ chrome.webview.setPermission(self.instanceId_, requestId, false, ''); |
+ showWarningMessage(dialogType); |
+ } |
- var validateCall = function() { |
- if (actionTaken) { |
- throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN); |
- } |
- actionTaken = true; |
- }; |
+ var validateCall = function() { |
+ var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' + |
+ 'An action has already been taken for this "dialog" event.'; |
- 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; |
- |
- var defaultPrevented = !node.dispatchEvent(evt); |
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; |
}; |