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

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

Issue 183693015: <webview>: Move Dialog API to stable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed C++ check Created 6 years, 9 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.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) {

Powered by Google App Engine
This is Rietveld 408576698