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

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

Issue 307543005: Fix the Declarative WebRequest API for <webview> (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move_webcontentsdelegate_impl_to_chrome
Patch Set: Addressed remainder of comments Created 6 years, 7 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 77bc1a433ce395b36a6da4cb29b393cdc6999db8..f0578f7ae76c0d5be08fe63fa17a66c46c24723f 100644
--- a/chrome/renderer/resources/extensions/web_view.js
+++ b/chrome/renderer/resources/extensions/web_view.js
@@ -981,6 +981,28 @@ WebViewInternal.prototype.handlePermissionEvent =
}
};
+var WebRequestMessageEvent = CreateEvent('webview.onMessage');
+
+function DeclarativeWebRequestEvent(opt_eventName,
+ opt_argSchemas,
+ opt_eventOptions,
+ opt_webViewInstanceId) {
+ var subEventName = opt_eventName + '/' + IdGenerator.GetNextId();
+ EventBindings.Event.call(this, subEventName, opt_argSchemas, opt_eventOptions,
+ opt_webViewInstanceId);
+
+ var self = this;
+ // TODO(lazyboy): When do we dispose this listener?
+ WebRequestMessageEvent.addListener(function() {
+ // Re-dispatch to subEvent's listeners.
+ $Function.apply(self.dispatch, self, $Array.slice(arguments));
+ }, {instanceId: opt_webViewInstanceId || 0});
+}
+
+DeclarativeWebRequestEvent.prototype = {
+ __proto__: EventBindings.Event.prototype
+};
+
/**
* @private
*/
@@ -1001,12 +1023,36 @@ WebViewInternal.prototype.setupWebRequestEvents = function() {
};
};
+ var createDeclarativeWebRequestEvent = function(webRequestEvent) {
+ return function() {
+ if (!self[webRequestEvent.name]) {
+ // The onMessage event gets a special event type because we want
+ // the listener to fire only for messages targeted for this particular
+ // <webview>.
+ var EventClass = webRequestEvent.name === 'onMessage' ?
+ DeclarativeWebRequestEvent : EventBindings.Event;
+ self[webRequestEvent.name] =
+ new EventClass(
+ 'webview.' + webRequestEvent.name,
+ webRequestEvent.parameters,
+ webRequestEvent.options,
+ self.viewInstanceId);
+ }
+ return self[webRequestEvent.name];
+ };
+ };
+
for (var i = 0; i < DeclarativeWebRequestSchema.events.length; ++i) {
var eventSchema = DeclarativeWebRequestSchema.events[i];
- var webRequestEvent = createWebRequestEvent(eventSchema);
- this.maybeAttachWebRequestEventToObject(request,
- eventSchema.name,
- webRequestEvent);
+ var webRequestEvent = createDeclarativeWebRequestEvent(eventSchema);
+ Object.defineProperty(
+ request,
lazyboy 2014/05/29 17:50:14 Doesn't this need to go to web_view_experimental?
Fady Samuel 2014/05/29 18:44:45 This will be used by products that will presumably
lazyboy 2014/05/29 19:01:40 Ok.
+ eventSchema.name,
+ {
+ get: webRequestEvent,
+ enumerable: true
+ }
+ );
}
// Populate the WebRequest events from the API definition.
@@ -1020,9 +1066,6 @@ WebViewInternal.prototype.setupWebRequestEvents = function() {
enumerable: true
}
);
- this.maybeAttachWebRequestEventToObject(this.webviewNode,
- WebRequestSchema.events[i].name,
- webRequestEvent);
}
Object.defineProperty(
this.webviewNode,
@@ -1221,12 +1264,6 @@ WebViewInternal.prototype.maybeGetExperimentalEvents = function() {};
* Implemented when the experimental API is available.
* @private
*/
-WebViewInternal.prototype.maybeAttachWebRequestEventToObject = function() {};
-
-/**
- * Implemented when the experimental API is available.
- * @private
- */
WebViewInternal.prototype.maybeGetExperimentalPermissions = function() {
return [];
};

Powered by Google App Engine
This is Rietveld 408576698