| 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 ce75619c6b63abf57864381fd4774050d1137b22..7267212b79e275f32430d08b9e9aab659da22b05 100644
|
| --- a/chrome/renderer/resources/extensions/web_view.js
|
| +++ b/chrome/renderer/resources/extensions/web_view.js
|
| @@ -165,6 +165,7 @@ WebViewInternal.maybeRegisterExperimentalAPIs = function(proto) {}
|
| function WebViewInternal(webviewNode) {
|
| privates(webviewNode).internal = this;
|
| this.webviewNode = webviewNode;
|
| + this.attached = false;
|
| this.browserPluginNode = this.createBrowserPluginNode();
|
| var shadowRoot = this.webviewNode.createShadowRoot();
|
| shadowRoot.appendChild(this.browserPluginNode);
|
| @@ -569,20 +570,7 @@ WebViewInternal.prototype.setupWebviewNodeEvents = function() {
|
| this.viewInstanceId = IdGenerator.GetNextId();
|
| var onInstanceIdAllocated = function(e) {
|
| var detail = e.detail ? JSON.parse(e.detail) : {};
|
| - self.instanceId = detail.windowId;
|
| - var params = {
|
| - 'api': 'webview',
|
| - 'instanceId': self.viewInstanceId
|
| - };
|
| - if (self.userAgentOverride) {
|
| - params['userAgentOverride'] = self.userAgentOverride;
|
| - }
|
| - self.browserPluginNode['-internal-attach'](params);
|
| -
|
| - var events = self.getEvents();
|
| - for (var eventName in events) {
|
| - self.setupEvent(eventName, events[eventName]);
|
| - }
|
| + self.attachWindowAndSetUpEvents(detail.windowId);
|
| };
|
| this.browserPluginNode.addEventListener('-internal-instanceid-allocated',
|
| onInstanceIdAllocated);
|
| @@ -801,7 +789,7 @@ WebViewInternal.prototype.handleNewWindowEvent =
|
| var windowObj = {
|
| attach: function(webview) {
|
| validateCall();
|
| - if (!webview)
|
| + if (!webview || !webview.tagName || webview.tagName != 'WEBVIEW')
|
| throw new Error(ERROR_MSG_WEBVIEW_EXPECTED);
|
| // Attach happens asynchronously to give the tagWatcher an opportunity
|
| // to pick up the new webview before attach operates on it, if it hasn't
|
| @@ -809,9 +797,10 @@ WebViewInternal.prototype.handleNewWindowEvent =
|
| // Note: Any subsequent errors cannot be exceptions because they happen
|
| // asynchronously.
|
| setTimeout(function() {
|
| + var webViewInternal = privates(webview).internal;
|
| var attached =
|
| - browserPluginNode['-internal-attachWindowTo'](webview,
|
| - event.windowId);
|
| + webViewInternal.attachWindowAndSetUpEvents(event.windowId);
|
| +
|
| if (!attached) {
|
| window.console.error(ERROR_MSG_NEWWINDOW_UNABLE_TO_ATTACH);
|
| }
|
| @@ -1022,6 +1011,25 @@ WebViewInternal.prototype.setUserAgentOverride = function(userAgentOverride) {
|
| WebView.overrideUserAgent(this.instanceId, userAgentOverride);
|
| };
|
|
|
| +/** @private */
|
| +WebViewInternal.prototype.attachWindowAndSetUpEvents = function(instanceId) {
|
| + this.instanceId = instanceId;
|
| + var params = {
|
| + 'api': 'webview',
|
| + 'instanceId': this.viewInstanceId
|
| + };
|
| + if (this.userAgentOverride) {
|
| + params['userAgentOverride'] = this.userAgentOverride;
|
| + }
|
| + this.browserPluginNode['-internal-attach'](this.instanceId, params);
|
| +
|
| + var events = this.getEvents();
|
| + for (var eventName in events) {
|
| + this.setupEvent(eventName, events[eventName]);
|
| + }
|
| + return true;
|
| +};
|
| +
|
| // Registers browser plugin <object> custom element.
|
| function registerBrowserPluginElement() {
|
| var proto = Object.create(HTMLObjectElement.prototype);
|
|
|