| 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 cc42d7fb4b156bcff285dafd53e8e03a7e999bbb..b459db7c136663deaba18a4427ad5c8edec157db 100644
|
| --- a/chrome/renderer/resources/extensions/extension_options.js
|
| +++ b/chrome/renderer/resources/extensions/extension_options.js
|
| @@ -8,6 +8,16 @@ var ExtensionOptionsEvents =
|
| var GuestViewInternal =
|
| require('binding').Binding.create('guestViewInternal').generate();
|
| var IdGenerator = requireNative('id_generator');
|
| +var utils = require('utils');
|
| +
|
| +// Mapping of the autosize attribute names to default values
|
| +var AUTO_SIZE_ATTRIBUTES = {
|
| + 'autosize': 'on',
|
| + 'maxheight': 600,
|
| + 'maxwidth': 800,
|
| + 'minheight': 32,
|
| + 'minwidth': 80
|
| +};
|
|
|
| function ExtensionOptionsInternal(extensionoptionsNode) {
|
| privates(extensionoptionsNode).internal = this;
|
| @@ -27,7 +37,12 @@ function ExtensionOptionsInternal(extensionoptionsNode) {
|
| ExtensionOptionsInternal.prototype.attachWindow = function(instanceId) {
|
| this.instanceId = instanceId;
|
| 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)
|
| }
|
| return this.browserPluginNode['-internal-attach'](instanceId, params);
|
| };
|
| @@ -42,17 +57,28 @@ ExtensionOptionsInternal.prototype.createGuest = function() {
|
| var params = {
|
| 'extensionId': this.extensionId,
|
| };
|
| - var self = this;
|
| GuestViewInternal.createGuest(
|
| 'extensionoptions',
|
| params,
|
| function(instanceId) {
|
| if (instanceId == 0) {
|
| - self.initCalled = false;
|
| + this.initCalled = false;
|
| } else {
|
| - self.attachWindow(instanceId);
|
| + this.attachWindow(instanceId);
|
| + GuestViewInternal.setAutoSize(this.instanceId, {
|
| + 'enableAutoSize':
|
| + this.extensionoptionsNode.hasAttribute('autosize'),
|
| + 'min': {
|
| + 'width': parseInt(this.minwidth || 0),
|
| + 'height': parseInt(this.minheight || 0)
|
| + },
|
| + 'max': {
|
| + 'width': parseInt(this.maxwidth || 0),
|
| + 'height': parseInt(this.maxheight || 0)
|
| + }
|
| + });
|
| }
|
| - });
|
| + }.bind(this));
|
| };
|
|
|
| ExtensionOptionsInternal.prototype.dispatchEvent =
|
| @@ -62,8 +88,6 @@ ExtensionOptionsInternal.prototype.dispatchEvent =
|
|
|
| ExtensionOptionsInternal.prototype.handleExtensionOptionsAttributeMutation =
|
| function(name, oldValue, newValue) {
|
| - if (name != 'extension')
|
| - return;
|
| // We treat null attribute (attribute removed) and the empty string as
|
| // one case.
|
| oldValue = oldValue || '';
|
| @@ -71,13 +95,33 @@ ExtensionOptionsInternal.prototype.handleExtensionOptionsAttributeMutation =
|
|
|
| if (oldValue === newValue)
|
| return;
|
| - this.extensionId = newValue;
|
|
|
| - // Create new guest view if one hasn't been created for this element.
|
| - if (!this.instanceId && this.parseExtensionAttribute())
|
| - this.init();
|
| - // TODO(ericzeng): Implement navigation to another guest view if we want
|
| - // that functionality.
|
| + if (name == 'extension') {
|
| + this.extensionId = newValue;
|
| + // Create new guest view if one hasn't been created for this element.
|
| + if (!this.instanceId && this.parseExtensionAttribute())
|
| + this.init();
|
| + // TODO(ericzeng): Implement navigation to another guest view if we want
|
| + // that functionality.
|
| + } else if (AUTO_SIZE_ATTRIBUTES.hasOwnProperty(name) > -1) {
|
| + this[name] = newValue;
|
| + this.resetSizeConstraintsIfInvalid();
|
| +
|
| + if (!this.instanceId)
|
| + return;
|
| +
|
| + GuestViewInternal.setAutoSize(this.instanceId, {
|
| + 'enableAutoSize': this.extensionoptionsNode.hasAttribute('autosize'),
|
| + 'min': {
|
| + 'width': parseInt(this.minwidth || 0),
|
| + 'height': parseInt(this.minheight || 0)
|
| + },
|
| + 'max': {
|
| + 'width': parseInt(this.maxwidth || 0),
|
| + 'height': parseInt(this.maxheight || 0)
|
| + }
|
| + });
|
| + }
|
| };
|
|
|
| ExtensionOptionsInternal.prototype.init = function() {
|
| @@ -91,6 +135,11 @@ ExtensionOptionsInternal.prototype.init = function() {
|
| this.createGuest();
|
| };
|
|
|
| +ExtensionOptionsInternal.prototype.onSizeChanged = function(width, height) {
|
| + this.browserPluginNode.style.width = width + 'px';
|
| + this.browserPluginNode.style.height = height + 'px';
|
| +};
|
| +
|
| ExtensionOptionsInternal.prototype.parseExtensionAttribute = function() {
|
| if (this.extensionoptionsNode.hasAttribute('extension')) {
|
| var extensionId = this.extensionoptionsNode.getAttribute('extension');
|
| @@ -127,19 +176,51 @@ ExtensionOptionsInternal.prototype.setupEventProperty = function(eventName) {
|
| };
|
|
|
| ExtensionOptionsInternal.prototype.setupNodeProperties = function() {
|
| - var self = this;
|
| - this.extensionId = this.extensionoptionsNode.getAttribute('extension');
|
| + utils.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) {
|
| + // Get the size constraints from the <extensionoptions> tag, or use the
|
| + // defaults if not specified
|
| + if (this.extensionoptionsNode.hasAttribute(attributeName)) {
|
| + this[attributeName] =
|
| + this.extensionoptionsNode.getAttribute(attributeName);
|
| + } else {
|
| + this[attributeName] = AUTO_SIZE_ATTRIBUTES[attributeName];
|
| + }
|
| +
|
| + Object.defineProperty(this.extensionoptionsNode, attributeName, {
|
| + get: function() {
|
| + return this[attributeName];
|
| + }.bind(this),
|
| + set: function(value) {
|
| + this.extensionoptionsNode.setAttribute(attributeName, value);
|
| + }.bind(this),
|
| + enumerable: true
|
| + });
|
| + }, this);
|
| +
|
| + this.resetSizeConstraintsIfInvalid();
|
| +
|
| Object.defineProperty(this.extensionoptionsNode, 'extension', {
|
| get: function() {
|
| - return self.extensionId;
|
| - },
|
| + return this.extensionId;
|
| + }.bind(this),
|
| set: function(value) {
|
| - self.extensionoptionsNode.setAttribute('extension', value);
|
| - },
|
| + this.extensionoptionsNode.setAttribute('extension', value);
|
| + }.bind(this),
|
| enumerable: true
|
| });
|
| };
|
|
|
| +ExtensionOptionsInternal.prototype.resetSizeConstraintsIfInvalid = function () {
|
| + if (this.minheight > this.maxheight || this.minheight < 0) {
|
| + this.minheight = AUTO_SIZE_ATTRIBUTES.minheight;
|
| + this.maxheight = AUTO_SIZE_ATTRIBUTES.maxheight;
|
| + }
|
| + if (this.minwidth > this.maxwidth || this.minwidth < 0) {
|
| + this.minwidth = AUTO_SIZE_ATTRIBUTES.minwidth;
|
| + this.maxwidth = AUTO_SIZE_ATTRIBUTES.maxwidth;
|
| + }
|
| +}
|
| +
|
| function registerBrowserPluginElement() {
|
| var proto = Object.create(HTMLObjectElement.prototype);
|
|
|
|
|