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 0b2ad3784837bb62ff0e36f6212b8bcac0368306..3dd7b53817aa3ac8aa9477a70070bce6a68c3d5e 100644 |
--- a/chrome/renderer/resources/extensions/web_view.js |
+++ b/chrome/renderer/resources/extensions/web_view.js |
@@ -27,13 +27,10 @@ var WEB_VIEW_API_METHODS = [ |
var WEB_VIEW_EVENTS = { |
'close': [], |
'consolemessage': ['level', 'message', 'line', 'sourceId'], |
- 'contentload' : [], |
'exit' : ['processId', 'reason'], |
'loadabort' : ['url', 'isTopLevel', 'reason'], |
- 'loadcommit' : ['url', 'isTopLevel'], |
'loadredirect' : ['oldUrl', 'newUrl', 'isTopLevel'], |
'loadstart' : ['url', 'isTopLevel'], |
- 'loadstop' : [], |
'responsive' : ['processId'], |
'sizechanged': ['oldHeight', 'oldWidth', 'newHeight', 'newWidth'], |
'unresponsive' : ['processId'] |
@@ -44,9 +41,31 @@ var createEvent = function(name) { |
return new eventBindings.Event(name, undefined, eventOpts); |
}; |
+var contentLoadEvent = createEvent('webview.onContentLoad'); |
var loadCommitEvent = createEvent('webview.onLoadCommit'); |
var loadStopEvent = createEvent('webview.onLoadStop'); |
+var WEB_VIEW_EXT_EVENTS = { |
+ 'contentload': { |
+ evt: contentLoadEvent, |
+ fields: [] |
+ }, |
+ 'loadcommit': { |
+ customHandler: function(WebView, event) { |
+ WebView.currentEntryIndex_ = event.currentEntryIndex; |
+ WebView.entryCount_ = event.entryCount; |
+ }, |
+ evt: loadCommitEvent, |
+ fields: ['url', 'isTopLevel'] |
+ } |
+ , |
+ 'loadstop': { |
+ evt: loadStopEvent, |
+ fields: [] |
+ } |
+}; |
+ |
+ |
// The <webview> tags we wish to watch for (watchForTag) does not belong to the |
// current scope's "document" reference. We need to wait until the document |
// begins loading, since only then will the "document" reference |
@@ -306,30 +325,13 @@ WebView.prototype.handleBrowserPluginAttributeMutation_ = function(mutation) { |
WebView.prototype.setupWebviewNodeEvents_ = function() { |
var self = this; |
var webviewNode = this.webviewNode_; |
- // TODO(fsamuel): Generalize this further as we add more events. |
- var onAttached = function(e) { |
+ this.browserPluginNode_.addEventListener('-internal-attached', function(e) { |
var detail = e.detail ? JSON.parse(e.detail) : {}; |
- loadCommitEvent.addListener(function(event) { |
- var webviewEvent = new Event('loadcommit', {bubbles: true}); |
- var attribs = WEB_VIEW_EVENTS['loadcommit']; |
- $Array.forEach(attribs, function(attribName) { |
- webviewEvent[attribName] = event[attribName]; |
- }); |
- self.currentEntryIndex_ = event.currentEntryIndex; |
- self.entryCount_ = event.entryCount; |
- webviewNode.dispatchEvent(webviewEvent); |
- }, {instanceId: detail.windowId}); |
- |
- loadStopEvent.addListener(function(event) { |
- var webviewEvent = new Event('loadstop', {bubbles: true}); |
- var attribs = WEB_VIEW_EVENTS['loadstop']; |
- $Array.forEach(attribs, function(attribName) { |
- webviewEvent[attribName] = event[attribName]; |
- }); |
- webviewNode.dispatchEvent(webviewEvent); |
- }, {instanceId: detail.windowId}); |
- }; |
- this.browserPluginNode_.addEventListener('-internal-attached', onAttached); |
+ self.instanceId_ = detail.windowId; |
+ for (var eventName in WEB_VIEW_EXT_EVENTS) { |
+ self.setupExtEvent_(eventName, WEB_VIEW_EXT_EVENTS[eventName]); |
+ } |
+ }); |
for (var eventName in WEB_VIEW_EVENTS) { |
this.setupEvent_(eventName, WEB_VIEW_EVENTS[eventName]); |
@@ -341,11 +343,29 @@ WebView.prototype.setupWebviewNodeEvents_ = function() { |
/** |
* @private |
*/ |
-WebView.prototype.setupEvent_ = function(eventname, attribs) { |
+WebView.prototype.setupExtEvent_ = function(eventName, eventInfo) { |
+ var self = this; |
+ var webviewNode = this.webviewNode_; |
+ eventInfo.evt.addListener(function(event) { |
+ var webviewEvent = new Event(eventName, {bubbles: true}); |
+ $Array.forEach(eventInfo.fields, function(field) { |
+ webviewEvent[field] = event[field]; |
+ }); |
+ if (eventInfo.customHandler) { |
+ eventInfo.customHandler(self, event); |
+ } |
+ webviewNode.dispatchEvent(webviewEvent); |
+ }, {instanceId: self.instanceId_}); |
+}; |
+ |
+/** |
+ * @private |
+ */ |
+WebView.prototype.setupEvent_ = function(eventName, attribs) { |
var webviewNode = this.webviewNode_; |
- var internalname = '-internal-' + eventname; |
+ var internalname = '-internal-' + eventName; |
this.browserPluginNode_.addEventListener(internalname, function(e) { |
- var evt = new Event(eventname, { bubbles: true }); |
+ var evt = new Event(eventName, { bubbles: true }); |
var detail = e.detail ? JSON.parse(e.detail) : {}; |
$Array.forEach(attribs, function(attribName) { |
evt[attribName] = detail[attribName]; |