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