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

Side by Side Diff: chrome/renderer/resources/extensions/extension_options.js

Issue 431503002: Implement autosizing for <extensionoptions> (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix style, modify how default attributes are displayed, make sizechanged a DOM event 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var DocumentNatives = requireNative('document_natives'); 5 var DocumentNatives = requireNative('document_natives');
6 var ExtensionOptionsEvents = 6 var ExtensionOptionsEvents =
7 require('extensionOptionsEvents').ExtensionOptionsEvents; 7 require('extensionOptionsEvents').ExtensionOptionsEvents;
8 var GuestViewInternal = 8 var GuestViewInternal =
9 require('binding').Binding.create('guestViewInternal').generate(); 9 require('binding').Binding.create('guestViewInternal').generate();
10 var IdGenerator = requireNative('id_generator'); 10 var IdGenerator = requireNative('id_generator');
11 11
12 var EXTENSION_OPTIONS_ATTRIBUTES = {
13 'autosize': 'on',
14 'maxheight': 600,
15 'maxwidth': 800,
16 'minheight': 32,
17 'minwidth': 80
18 };
19
12 function ExtensionOptionsInternal(extensionoptionsNode) { 20 function ExtensionOptionsInternal(extensionoptionsNode) {
13 privates(extensionoptionsNode).internal = this; 21 privates(extensionoptionsNode).internal = this;
14 this.extensionoptionsNode = extensionoptionsNode; 22 this.extensionoptionsNode = extensionoptionsNode;
15 this.viewInstanceId = IdGenerator.GetNextId(); 23 this.viewInstanceId = IdGenerator.GetNextId();
16 24
17 // on* Event handlers. 25 // on* Event handlers.
18 this.eventHandlers = {}; 26 this.eventHandlers = {};
19 new ExtensionOptionsEvents(this, this.viewInstanceId); 27 new ExtensionOptionsEvents(this, this.viewInstanceId);
20 28
21 this.setupNodeProperties(); 29 this.setupNodeProperties();
22 30
23 if (this.parseExtensionAttribute()) 31 if (this.parseExtensionAttribute())
24 this.init(); 32 this.init();
25 }; 33 };
26 34
27 ExtensionOptionsInternal.prototype.attachWindow = function(instanceId) { 35 ExtensionOptionsInternal.prototype.attachWindow = function(instanceId) {
28 this.instanceId = instanceId; 36 this.instanceId = instanceId;
29 var params = { 37 var params = {
30 'instanceId': this.viewInstanceId, 38 'instanceId': this.viewInstanceId,
31 } 39 }
32 return this.browserPluginNode['-internal-attach'](instanceId, params); 40 return this.browserPluginNode['-internal-attach'](instanceId, params);
33 }; 41 };
34 42
35 ExtensionOptionsInternal.prototype.createBrowserPluginNode = function() { 43 ExtensionOptionsInternal.prototype.createBrowserPluginNode = function() {
36 var browserPluginNode = new ExtensionOptionsInternal.BrowserPlugin(); 44 var browserPluginNode = new ExtensionOptionsInternal.BrowserPlugin();
37 privates(browserPluginNode).internal = this; 45 privates(browserPluginNode).internal = this;
46
47 for (var attributeName in EXTENSION_OPTIONS_ATTRIBUTES) {
48 if (!EXTENSION_OPTIONS_ATTRIBUTES.hasOwnProperty(attributeName)) {
49 continue;
50 }
not at google - send to devlin 2014/07/31 00:26:06 better than using "var .. in" and then checking ha
ericzeng 2014/07/31 18:29:57 Done.
51
52 if (this.extensionoptionsNode.hasAttribute(attributeName)) {
53 browserPluginNode.setAttribute(
54 attributeName, this.extensionoptionsNode.getAttribute(attributeName));
55 } else {
56 browserPluginNode.setAttribute(
57 attributeName, EXTENSION_OPTIONS_ATTRIBUTES.attributeName);
not at google - send to devlin 2014/07/31 00:26:06 (you'd need EXTENSION_OPTIONS_ATTRIBUTES[attribute
ericzeng 2014/07/31 18:29:57 Done.
58 }
59 }
60
61 $Array.forEach(EXTENSION_OPTIONS_ATTRIBUTES, function(attributeName) {
not at google - send to devlin 2014/07/31 00:26:06 does $Array.forEach work on objects like this?
ericzeng 2014/07/31 18:29:57 I forgot to delete this block of code, the loop ab
not at google - send to devlin 2014/07/31 19:46:47 forEach doesn't work for objects, and EXTENSION_OP
62 // Only copy attributes that have been assigned values, rather than copying
63 // a series of undefined attributes to BrowserPlugin.
64 if (this.extensionoptionsNode.hasAttribute(attributeName)) {
65 browserPluginNode.setAttribute(
66 attributeName, this.extensionoptionsNode.getAttribute(attributeName));
67 }
68 }, this);
69
38 return browserPluginNode; 70 return browserPluginNode;
39 }; 71 };
40 72
41 ExtensionOptionsInternal.prototype.createGuest = function() { 73 ExtensionOptionsInternal.prototype.createGuest = function() {
42 var params = { 74 var params = {
43 'extensionId': this.extensionId, 75 'extensionId': this.extensionId,
44 }; 76 };
45 var self = this; 77 var self = this;
46 GuestViewInternal.createGuest( 78 GuestViewInternal.createGuest(
47 'extensionoptions', 79 'extensionoptions',
48 params, 80 params,
49 function(instanceId) { 81 function(instanceId) {
50 if (instanceId == 0) { 82 if (instanceId == 0) {
51 self.initCalled = false; 83 self.initCalled = false;
52 } else { 84 } else {
53 self.attachWindow(instanceId); 85 self.attachWindow(instanceId);
54 } 86 }
55 }); 87 });
56 }; 88 };
57 89
58 ExtensionOptionsInternal.prototype.dispatchEvent = 90 ExtensionOptionsInternal.prototype.dispatchEvent =
59 function(extensionOptionsEvent) { 91 function(extensionOptionsEvent) {
60 return this.extensionoptionsNode.dispatchEvent(extensionOptionsEvent); 92 return this.extensionoptionsNode.dispatchEvent(extensionOptionsEvent);
61 }; 93 };
62 94
63 ExtensionOptionsInternal.prototype.handleExtensionOptionsAttributeMutation = 95 ExtensionOptionsInternal.prototype.handleExtensionOptionsAttributeMutation =
64 function(name, oldValue, newValue) { 96 function(name, oldValue, newValue) {
65 if (name != 'extension')
66 return;
67 // We treat null attribute (attribute removed) and the empty string as 97 // We treat null attribute (attribute removed) and the empty string as
68 // one case. 98 // one case.
69 oldValue = oldValue || ''; 99 oldValue = oldValue || '';
70 newValue = newValue || ''; 100 newValue = newValue || '';
71 101
72 if (oldValue === newValue) 102 if (oldValue === newValue)
73 return; 103 return;
74 this.extensionId = newValue;
75 104
76 // Create new guest view if one hasn't been created for this element. 105 if (name == 'extension') {
77 if (!this.instanceId && this.parseExtensionAttribute()) 106 this.extensionId = newValue;
78 this.init(); 107 // Create new guest view if one hasn't been created for this element.
79 // TODO(ericzeng): Implement navigation to another guest view if we want 108 if (!this.instanceId && this.parseExtensionAttribute())
80 // that functionality. 109 this.init();
110 // TODO(ericzeng): Implement navigation to another guest view if we want
111 // that functionality.
112 return;
113 }
114
115 if (this.browserPluginNode.hasOwnProperty(name)) {
116 this.browserPluginNode[name] = newValue;
117 } else {
118 this.browserPluginNode.setAttribute(name, newValue);
119 }
81 }; 120 };
82 121
83 ExtensionOptionsInternal.prototype.init = function() { 122 ExtensionOptionsInternal.prototype.init = function() {
84 if (this.initCalled) 123 if (this.initCalled)
85 return; 124 return;
86 125
87 this.initCalled = true; 126 this.initCalled = true;
88 this.browserPluginNode = this.createBrowserPluginNode(); 127 this.browserPluginNode = this.createBrowserPluginNode();
89 var shadowRoot = this.extensionoptionsNode.createShadowRoot(); 128 var shadowRoot = this.extensionoptionsNode.createShadowRoot();
90 shadowRoot.appendChild(this.browserPluginNode); 129 shadowRoot.appendChild(this.browserPluginNode);
91 this.createGuest(); 130 this.createGuest();
92 }; 131 };
93 132
133 ExtensionOptionsInternal.prototype.onSizeChanged = function(width, height) {
134 this.browserPluginNode.style.width = width + 'px';
135 this.browserPluginNode.style.height = height + 'px';
136 };
137
94 ExtensionOptionsInternal.prototype.parseExtensionAttribute = function() { 138 ExtensionOptionsInternal.prototype.parseExtensionAttribute = function() {
95 if (this.extensionoptionsNode.hasAttribute('extension')) { 139 if (this.extensionoptionsNode.hasAttribute('extension')) {
96 var extensionId = this.extensionoptionsNode.getAttribute('extension'); 140 var extensionId = this.extensionoptionsNode.getAttribute('extension');
97 // Only allow extensions to embed their own options page (if it has one). 141 // Only allow extensions to embed their own options page (if it has one).
98 if (chrome.runtime.id == extensionId && 142 if (chrome.runtime.id == extensionId &&
99 chrome.runtime.getManifest().hasOwnProperty('options_page')) { 143 chrome.runtime.getManifest().hasOwnProperty('options_page')) {
100 this.extensionId = extensionId; 144 this.extensionId = extensionId;
101 return true; 145 return true;
102 } 146 }
103 } 147 }
(...skipping 16 matching lines...) Expand all
120 eventName, self.eventHandlers[propertyName]); 164 eventName, self.eventHandlers[propertyName]);
121 self.eventHandlers[propertyName] = value; 165 self.eventHandlers[propertyName] = value;
122 if (value) 166 if (value)
123 extensionoptionsNode.addEventListener(eventName, value); 167 extensionoptionsNode.addEventListener(eventName, value);
124 }, 168 },
125 enumerable: true 169 enumerable: true
126 }); 170 });
127 }; 171 };
128 172
129 ExtensionOptionsInternal.prototype.setupNodeProperties = function() { 173 ExtensionOptionsInternal.prototype.setupNodeProperties = function() {
174 $Array.forEach(EXTENSION_OPTIONS_ATTRIBUTES, function(attributeName) {
not at google - send to devlin 2014/07/31 00:26:06 likewise
175 Object.defineProperty(this.extensionoptionsNode, attributeName, {
176 get: function() {
177 if (this.browserPluginNode.hasOwnProperty(attributeName))
178 return this.browserPluginNode[attributeName];
179 return this.browserPluginNode.getAttribute(attributeName);
180 },
181 set: function(value) {
182 if (this.browserPluginNode.hasOwnProperty(attributeName)) {
183 // Give the BrowserPlugin first stab at the attribute so that it can
184 // throw an exception if there is a problem. This attribute will then
185 // be propagated back to the <extensionoptions>.
186 this.browserPluginNode[attributeName] = value;
187 } else {
188 this.browserPluginNode.setAttribute(attributeName, value);
189 }
190 },
191 enumerable: true
192 });
193 }, this);
194
130 var self = this; 195 var self = this;
131 this.extensionId = this.extensionoptionsNode.getAttribute('extension');
132 Object.defineProperty(this.extensionoptionsNode, 'extension', { 196 Object.defineProperty(this.extensionoptionsNode, 'extension', {
133 get: function() { 197 get: function() {
134 return self.extensionId; 198 return self.extensionId;
135 }, 199 },
136 set: function(value) { 200 set: function(value) {
137 self.extensionoptionsNode.setAttribute('extension', value); 201 self.extensionoptionsNode.setAttribute('extension', value);
138 }, 202 },
139 enumerable: true 203 enumerable: true
140 }); 204 });
141 }; 205 };
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 254
191 var useCapture = true; 255 var useCapture = true;
192 window.addEventListener('readystatechange', function listener(event) { 256 window.addEventListener('readystatechange', function listener(event) {
193 if (document.readyState == 'loading') 257 if (document.readyState == 'loading')
194 return; 258 return;
195 259
196 registerBrowserPluginElement(); 260 registerBrowserPluginElement();
197 registerExtensionOptionsElement(); 261 registerExtensionOptionsElement();
198 window.removeEventListener(event.type, listener, useCapture); 262 window.removeEventListener(event.type, listener, useCapture);
199 }, useCapture); 263 }, useCapture);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698