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

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

Issue 457653003: Implement <extensionoptions> deferred attach logic (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove old tests Created 6 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/resources/extensions/extension_options.js
diff --git a/chrome/renderer/resources/extensions/extension_options.js b/chrome/renderer/resources/extensions/extension_options.js
index 8cd4e80484aaaf667dddb32aebd218758769d805..ae07609ac1669e5a0f9d2b62b882ce344709d508 100644
--- a/chrome/renderer/resources/extensions/extension_options.js
+++ b/chrome/renderer/resources/extensions/extension_options.js
@@ -35,29 +35,31 @@ function ExtensionOptionsInternal(extensionoptionsNode) {
// the event is fired from here instead of through
// extension_options_events.js.
this.setupEventProperty('createfailed');
-
new ExtensionOptionsEvents(this, this.viewInstanceId);
this.setupNodeProperties();
- if (this.parseExtensionAttribute())
- this.init();
+ this.parseExtensionAttribute();
+
+ // Once the browser plugin has been created, the guest view will be created
+ // and attached. See handleBrowserPluginAttributeMutation().
+ this.browserPluginNode = this.createBrowserPluginNode();
+ var shadowRoot = this.extensionoptionsNode.createShadowRoot();
+ shadowRoot.appendChild(this.browserPluginNode);
};
-ExtensionOptionsInternal.prototype.attachWindow = function(guestInstanceId) {
- this.guestInstanceId = guestInstanceId;
- var params = {
- 'autosize': this.autosize,
- 'instanceId': this.viewInstanceId,
- 'maxheight': parseInt(this.maxheight || 0),
- 'maxwidth': parseInt(this.maxwidth || 0),
- 'minheight': parseInt(this.minheight || 0),
- 'minwidth': parseInt(this.minwidth || 0)
- };
+ExtensionOptionsInternal.prototype.attachWindow = function() {
return guestViewInternalNatives.AttachGuest(
- parseInt(this.browserPluginNode.getAttribute('internalinstanceid')),
- guestInstanceId,
- params);
+ this.internalInstanceId,
+ this.guestInstanceId,
+ {
+ 'autosize': this.autosize,
+ 'instanceId': this.viewInstanceId,
+ 'maxheight': parseInt(this.maxheight || 0),
+ 'maxwidth': parseInt(this.maxwidth || 0),
+ 'minheight': parseInt(this.minheight || 0),
+ 'minwidth': parseInt(this.minwidth || 0)
+ });
};
ExtensionOptionsInternal.prototype.createBrowserPluginNode = function() {
@@ -81,7 +83,8 @@ ExtensionOptionsInternal.prototype.createGuest = function() {
var createFailedEvent = new Event('createfailed', { bubbles: true });
this.dispatchEvent(createFailedEvent);
} else {
- this.attachWindow(guestInstanceId);
+ this.guestInstanceId = guestInstanceId;
+ this.attachWindow();
}
}.bind(this));
};
@@ -101,11 +104,18 @@ ExtensionOptionsInternal.prototype.handleExtensionOptionsAttributeMutation =
if (oldValue === newValue)
return;
- if (name == 'extension') {
+ if (name == 'extension' && !oldValue && newValue) {
this.extensionId = newValue;
- // Create new guest view if one hasn't been created for this element.
- if (!this.guestInstanceId && this.parseExtensionAttribute())
- this.init();
+ // If the browser plugin is not ready then don't create the guest until
+ // it is ready (in handleBrowserPluginAttributeMutation).
+ if (!this.internalInstanceId)
+ return;
+
+ // If a guest view does not exist then create one.
+ if (!this.guestInstanceId) {
+ this.createGuest();
+ return;
+ }
// TODO(ericzeng): Implement navigation to another guest view if we want
// that functionality.
} else if (AUTO_SIZE_ATTRIBUTES.hasOwnProperty(name) > -1) {
@@ -129,15 +139,15 @@ ExtensionOptionsInternal.prototype.handleExtensionOptionsAttributeMutation =
}
};
-ExtensionOptionsInternal.prototype.init = function() {
- if (this.initCalled)
- return;
+ExtensionOptionsInternal.prototype.handleBrowserPluginAttributeMutation =
+ function(name, oldValue, newValue) {
+ if (name == 'internalinstanceid' && !oldValue && !!newValue) {
+ this.internalInstanceId = parseInt(newValue);
+ this.browserPluginNode.removeAttribute('internalinstanceid');
+ if (this.extensionId)
+ this.createGuest();
- this.initCalled = true;
- this.browserPluginNode = this.createBrowserPluginNode();
- var shadowRoot = this.extensionoptionsNode.createShadowRoot();
- shadowRoot.appendChild(this.browserPluginNode);
- this.createGuest();
+ }
};
ExtensionOptionsInternal.prototype.onSizeChanged =
@@ -292,6 +302,14 @@ function registerBrowserPluginElement() {
this.style.height = '100%';
};
+ proto.attributeChangedCallback = function(name, oldValue, newValue) {
+ var internal = privates(this).internal;
+ if (!internal) {
+ return;
+ }
+ internal.handleBrowserPluginAttributeMutation(name, oldValue, newValue);
+ };
+
proto.attachedCallback = function() {
// Load the plugin immediately.
var unused = this.nonExistentAttribute;
@@ -299,7 +317,7 @@ function registerBrowserPluginElement() {
ExtensionOptionsInternal.BrowserPlugin =
DocumentNatives.RegisterElement('extensionoptionsplugin',
- {extends: 'object', prototype: proto});
+ {extends: 'object', prototype: proto});
delete proto.createdCallback;
delete proto.attachedCallback;
delete proto.detachedCallback;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698