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 d1e1fa057115b3b04b43baf02c05ab8bb75e7b8c..936193e0fc18156b968aff8a1f7248948ca2f5c2 100644 |
--- a/chrome/renderer/resources/extensions/web_view_experimental.js |
+++ b/chrome/renderer/resources/extensions/web_view_experimental.js |
@@ -21,7 +21,6 @@ var WebView = require('webView').WebView; |
*/ |
WebView.prototype.maybeSetupExperimentalAPI_ = function() { |
this.setupWebRequestEvents_(); |
- this.setupDialogEvent_(); |
}; |
/** |
@@ -55,7 +54,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.'; |
@@ -68,77 +67,67 @@ 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); |
+ } |
}; |