Index: chrome/renderer/resources/extensions/web_view.js |
diff --git a/chrome/renderer/resources/extensions/web_view.js b/chrome/renderer/resources/extensions/web_view.js |
index 2e69ba9a48609e897bf4b6234d3fd48706d84b51..74d93fe013a0ad408b1284874d6809139ab4a3b4 100644 |
--- a/chrome/renderer/resources/extensions/web_view.js |
+++ b/chrome/renderer/resources/extensions/web_view.js |
@@ -66,6 +66,14 @@ var WEB_VIEW_EVENTS = { |
evt: CreateEvent('webview.onContentLoad'), |
fields: [] |
}, |
+ 'dialog': { |
+ cancelable: true, |
+ customHandler: function(webViewInternal, event, webViewEvent) { |
+ webViewInternal.handleDialogEvent(event, webViewEvent); |
+ }, |
+ evt: CreateEvent('webview.onDialog'), |
+ fields: ['defaultPromptText', 'messageText', 'messageType', 'url'] |
+ }, |
'exit': { |
evt: CreateEvent('webview.onExit'), |
fields: ['processId', 'reason'] |
@@ -635,6 +643,84 @@ WebViewInternal.prototype.getPermissionTypes = function() { |
/** |
* @private |
*/ |
+WebViewInternal.prototype.handleDialogEvent = |
+ 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); |
+ window.console.warn(output); |
+ }; |
+ |
+ var self = this; |
+ var browserPluginNode = this.browserPluginNode; |
+ var webviewNode = this.webviewNode; |
+ |
+ var requestId = event.requestId; |
+ var actionTaken = false; |
+ |
+ var validateCall = function() { |
+ var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' + |
+ 'An action has already been taken for this "dialog" event.'; |
+ |
+ if (actionTaken) { |
+ throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN); |
+ } |
+ actionTaken = true; |
+ }; |
+ |
+ var dialog = { |
+ ok: function(user_input) { |
+ validateCall(); |
+ user_input = user_input || ''; |
+ WebView.setPermission(self.instanceId, requestId, 'allow', user_input); |
+ }, |
+ cancel: function() { |
+ validateCall(); |
+ WebView.setPermission(self.instanceId, requestId, 'deny'); |
+ } |
+ }; |
+ 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. |
+ MessagingNatives.BindToGC(dialog, function() { |
+ // Avoid showing a warning message if the decision has already been made. |
+ if (actionTaken) { |
+ return; |
+ } |
+ WebView.setPermission( |
+ self.instanceId, requestId, 'default', '', function(allowed) { |
+ if (allowed) { |
+ return; |
+ } |
+ showWarningMessage(event.messageType); |
+ }); |
+ }); |
+ } else { |
+ actionTaken = true; |
+ // The default action is equivalent to canceling the dialog. |
+ WebView.setPermission( |
+ self.instanceId, requestId, 'default', '', function(allowed) { |
+ if (allowed) { |
+ return; |
+ } |
+ showWarningMessage(event.messageType); |
+ }); |
+ } |
+}; |
+ |
+/** |
+ * @private |
+ */ |
WebViewInternal.prototype.handleLoadAbortEvent = |
function(event, webViewEvent) { |
var showWarningMessage = function(reason) { |