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

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

Issue 21297005: <webview>: Refactor Permission API to chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cleanup_permissions
Patch Set: Merge with ToT Created 7 years, 4 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 c2bb066d6f1b657c0414fd62991597e2f6e75b49..8498f92903d67998bc080bbcb010f51b55c52f24 100644
--- a/chrome/renderer/resources/extensions/web_view_experimental.js
+++ b/chrome/renderer/resources/extensions/web_view_experimental.js
@@ -11,17 +11,28 @@
// permission API would only be available for channels CHANNEL_DEV and
// CHANNEL_CANARY.
+var createEvent = require('webView').CreateEvent;
var WebRequestEvent = require('webRequestInternal').WebRequestEvent;
var webRequestSchema =
requireNative('schema_registry').GetSchema('webRequest');
var WebView = require('webView').WebView;
+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_();
};
/**
@@ -78,90 +89,87 @@ 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.';
-
+WebView.prototype.maybeSetupExtDialogEvent_ = 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);
- console.log(output);
+ console.warn(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) : {};
+ // Avoid showing a warning message if the decision has already been made.
+ if (actionTaken) {
+ return;
+ }
- $Array.forEach(DIALOG_EVENT_ATTRIBUTES, function(attribName) {
- evt[attribName] = detail[attribName];
- });
- var requestId = detail.requestId;
- var actionTaken = false;
+ chrome.webview.setPermission(self.instanceId_, requestId, false, '');
+ showWarningMessage(dialogType);
+ }
- var validateCall = function() {
- if (actionTaken) {
- throw new Error(ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN);
- }
- actionTaken = true;
- };
+ var validateCall = function() {
+ var ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN = '<webview>: ' +
+ 'An action has already been taken for this "dialog" event.';
- 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;
-
- var defaultPrevented = !node.dispatchEvent(evt);
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;
};
« no previous file with comments | « chrome/renderer/resources/extensions/web_view.js ('k') | content/browser/browser_plugin/browser_plugin_guest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698