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

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

Issue 429763002: Implement createfailed event for <extensionoptions> (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove self hack 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 var utils = require('utils'); 11 var utils = require('utils');
12 12
13 // Mapping of the autosize attribute names to default values 13 // Mapping of the autosize attribute names to default values
14 var AUTO_SIZE_ATTRIBUTES = { 14 var AUTO_SIZE_ATTRIBUTES = {
15 'autosize': 'on', 15 'autosize': 'on',
16 'maxheight': 600, 16 'maxheight': 600,
17 'maxwidth': 800, 17 'maxwidth': 800,
18 'minheight': 32, 18 'minheight': 32,
19 'minwidth': 80 19 'minwidth': 80
20 }; 20 };
21 21
22 function ExtensionOptionsInternal(extensionoptionsNode) { 22 function ExtensionOptionsInternal(extensionoptionsNode) {
23 privates(extensionoptionsNode).internal = this; 23 privates(extensionoptionsNode).internal = this;
24 this.extensionoptionsNode = extensionoptionsNode; 24 this.extensionoptionsNode = extensionoptionsNode;
25 this.viewInstanceId = IdGenerator.GetNextId(); 25 this.viewInstanceId = IdGenerator.GetNextId();
26 26
27 // on* Event handlers. 27 // on* Event handlers.
28 this.eventHandlers = {}; 28 this.eventHandlers = {};
29
30 // setupEventProperty is normally called in extension_options_events.js to
31 // register events, but the createfailed event is registered here because
32 // the event is fired from here instead of through
33 // extension_options_events.js.
34 this.setupEventProperty('createfailed');
35
29 new ExtensionOptionsEvents(this, this.viewInstanceId); 36 new ExtensionOptionsEvents(this, this.viewInstanceId);
30 37
31 this.setupNodeProperties(); 38 this.setupNodeProperties();
32 39
33 if (this.parseExtensionAttribute()) 40 if (this.parseExtensionAttribute())
34 this.init(); 41 this.init();
35 }; 42 };
36 43
37 ExtensionOptionsInternal.prototype.attachWindow = function(instanceId) { 44 ExtensionOptionsInternal.prototype.attachWindow = function(instanceId) {
38 this.instanceId = instanceId; 45 this.instanceId = instanceId;
(...skipping 16 matching lines...) Expand all
55 62
56 ExtensionOptionsInternal.prototype.createGuest = function() { 63 ExtensionOptionsInternal.prototype.createGuest = function() {
57 var params = { 64 var params = {
58 'extensionId': this.extensionId, 65 'extensionId': this.extensionId,
59 }; 66 };
60 GuestViewInternal.createGuest( 67 GuestViewInternal.createGuest(
61 'extensionoptions', 68 'extensionoptions',
62 params, 69 params,
63 function(instanceId) { 70 function(instanceId) {
64 if (instanceId == 0) { 71 if (instanceId == 0) {
72 // Fire a createfailed event here rather than in ExtensionOptionsGuest
73 // because the guest will not be created, and cannot fire an event.
65 this.initCalled = false; 74 this.initCalled = false;
75 var createFailedEvent = new Event('createfailed', { bubbles: true });
76 this.dispatchEvent(createFailedEvent);
66 } else { 77 } else {
67 this.attachWindow(instanceId); 78 this.attachWindow(instanceId);
68 GuestViewInternal.setAutoSize(this.instanceId, { 79 GuestViewInternal.setAutoSize(this.instanceId, {
69 'enableAutoSize': 80 'enableAutoSize':
70 this.extensionoptionsNode.hasAttribute('autosize'), 81 this.extensionoptionsNode.hasAttribute('autosize'),
71 'min': { 82 'min': {
72 'width': parseInt(this.minwidth || 0), 83 'width': parseInt(this.minwidth || 0),
73 'height': parseInt(this.minheight || 0) 84 'height': parseInt(this.minheight || 0)
74 }, 85 },
75 'max': { 86 'max': {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 this.createGuest(); 146 this.createGuest();
136 }; 147 };
137 148
138 ExtensionOptionsInternal.prototype.onSizeChanged = function(width, height) { 149 ExtensionOptionsInternal.prototype.onSizeChanged = function(width, height) {
139 this.browserPluginNode.style.width = width + 'px'; 150 this.browserPluginNode.style.width = width + 'px';
140 this.browserPluginNode.style.height = height + 'px'; 151 this.browserPluginNode.style.height = height + 'px';
141 }; 152 };
142 153
143 ExtensionOptionsInternal.prototype.parseExtensionAttribute = function() { 154 ExtensionOptionsInternal.prototype.parseExtensionAttribute = function() {
144 if (this.extensionoptionsNode.hasAttribute('extension')) { 155 if (this.extensionoptionsNode.hasAttribute('extension')) {
145 var extensionId = this.extensionoptionsNode.getAttribute('extension'); 156 this.extensionId = this.extensionoptionsNode.getAttribute('extension');
146 // Only allow extensions to embed their own options page (if it has one). 157 return true;
147 if (chrome.runtime.id == extensionId &&
148 chrome.runtime.getManifest().hasOwnProperty('options_page')) {
149 this.extensionId = extensionId;
150 return true;
151 }
152 } 158 }
153 return false; 159 return false;
154 }; 160 };
155 161
156 // Adds an 'on<event>' property on the view, which can be used to set/unset 162 // Adds an 'on<event>' property on the view, which can be used to set/unset
157 // an event handler. 163 // an event handler.
158 ExtensionOptionsInternal.prototype.setupEventProperty = function(eventName) { 164 ExtensionOptionsInternal.prototype.setupEventProperty = function(eventName) {
159 var propertyName = 'on' + eventName.toLowerCase(); 165 var propertyName = 'on' + eventName.toLowerCase();
160 var self = this;
161 var extensionoptionsNode = this.extensionoptionsNode; 166 var extensionoptionsNode = this.extensionoptionsNode;
162 Object.defineProperty(extensionoptionsNode, propertyName, { 167 Object.defineProperty(extensionoptionsNode, propertyName, {
163 get: function() { 168 get: function() {
164 return self.eventHandlers[propertyName]; 169 return this.eventHandlers[propertyName];
165 }, 170 }.bind(this),
166 set: function(value) { 171 set: function(value) {
167 if (self.eventHandlers[propertyName]) 172 if (this.eventHandlers[propertyName])
168 extensionoptionsNode.removeEventListener( 173 extensionoptionsNode.removeEventListener(
169 eventName, self.eventHandlers[propertyName]); 174 eventName, this.eventHandlers[propertyName]);
170 self.eventHandlers[propertyName] = value; 175 this.eventHandlers[propertyName] = value;
171 if (value) 176 if (value)
172 extensionoptionsNode.addEventListener(eventName, value); 177 extensionoptionsNode.addEventListener(eventName, value);
173 }, 178 }.bind(this),
174 enumerable: true 179 enumerable: true
175 }); 180 });
176 }; 181 };
177 182
178 ExtensionOptionsInternal.prototype.setupNodeProperties = function() { 183 ExtensionOptionsInternal.prototype.setupNodeProperties = function() {
179 utils.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) { 184 utils.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) {
180 // Get the size constraints from the <extensionoptions> tag, or use the 185 // Get the size constraints from the <extensionoptions> tag, or use the
181 // defaults if not specified 186 // defaults if not specified
182 if (this.extensionoptionsNode.hasAttribute(attributeName)) { 187 if (this.extensionoptionsNode.hasAttribute(attributeName)) {
183 this[attributeName] = 188 this[attributeName] =
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 276
272 var useCapture = true; 277 var useCapture = true;
273 window.addEventListener('readystatechange', function listener(event) { 278 window.addEventListener('readystatechange', function listener(event) {
274 if (document.readyState == 'loading') 279 if (document.readyState == 'loading')
275 return; 280 return;
276 281
277 registerBrowserPluginElement(); 282 registerBrowserPluginElement();
278 registerExtensionOptionsElement(); 283 registerExtensionOptionsElement();
279 window.removeEventListener(event.type, listener, useCapture); 284 window.removeEventListener(event.type, listener, useCapture);
280 }, useCapture); 285 }, useCapture);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698