Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4595)

Unified Diff: chrome/renderer/resources/extensions/web_view_experimental.js

Issue 19679002: <webview>: Implement dialog API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed test Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 4a10dd479bb495c9d93faeac0c1af44252081abd..56f8bd32540b3a0368748062925efcbc512480d2 100644
--- a/chrome/renderer/resources/extensions/web_view_experimental.js
+++ b/chrome/renderer/resources/extensions/web_view_experimental.js
@@ -21,6 +21,7 @@ var WebView = require('webView').WebView;
*/
WebView.prototype.maybeSetupExperimentalAPI_ = function() {
this.setupWebRequestEvents_();
+ this.setupDialogEvent_();
};
/**
@@ -58,3 +59,75 @@ 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.';
+
+ var WARNING_MSG_DIALOG_BLOCKED = '<webview>: A dialog was blocked.';
+
+ var DIALOG_EVENT_ATTRIBUTES = [
+ 'defaultPromptText',
+ 'messageText',
+ 'messageType',
+ 'url'
+ ];
+
+ var self = this;
+ var node = this.webviewNode_;
+ var browserPluginNode = this.browserPluginNode_;
+
+ var onTrackedObjectGone = function(requestId, e) {
+ var detail = e.detail ? JSON.parse(e.detail) : {};
+ if (detail.id != requestId)
+ return;
+ browserPluginNode['-internal-setPermission'](requestId, false, '');
+ }
+
+ 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;
+ };
+
+ 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;
+ // Make browser plugin track lifetime of |window|.
+ var onTrackedObjectGoneWithRequestId =
+ $Function.bind(onTrackedObjectGone, self, requestId);
+ browserPluginNode.addEventListener('-internal-trackedobjectgone',
+ onTrackedObjectGoneWithRequestId);
+ browserPluginNode['-internal-trackObjectLifetime'](dialog, requestId);
+
+ var defaultPrevented = !node.dispatchEvent(evt);
+ if (!actionTaken && !defaultPrevented) {
+ actionTaken = true;
+ // The default action is equivalent to canceling the dialog.
+ browserPluginNode['-internal-setPermission'](requestId, false, '');
+ console.warn(WARNING_MSG_DIALOG_BLOCKED);
+ }
+ });
+};

Powered by Google App Engine
This is Rietveld 408576698