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; |
}; |