Chromium Code Reviews| 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 3a8627c0cbe4c7cb67e3b306f2ef7888a99650d0..cbbe5cf57e9a0184a098f81fe47324e7555ca6ac 100644 |
| --- a/chrome/renderer/resources/extensions/web_view.js |
| +++ b/chrome/renderer/resources/extensions/web_view.js |
| @@ -26,7 +26,6 @@ var WEB_VIEW_ATTRIBUTE_MINWIDTH = 'minwidth'; |
| var WEB_VIEW_ATTRIBUTES = [ |
| 'allowtransparency', |
| 'autosize', |
| - 'name', |
| 'partition', |
| WEB_VIEW_ATTRIBUTE_MINHEIGHT, |
| WEB_VIEW_ATTRIBUTE_MINWIDTH, |
| @@ -53,6 +52,9 @@ var CreateEvent = function(name) { |
| // behavior can be canceled. If the default action associated with the event |
| // is prevented, then its dispatch function will return false in its event |
| // handler. The event must have a custom handler for this to be meaningful. |
| + |
| +var FrameNameChangedEvent = CreateEvent('webview.onFrameNameChanged'); |
| + |
| var WEB_VIEW_EVENTS = { |
| 'close': { |
| evt: CreateEvent('webview.onClose'), |
| @@ -387,6 +389,16 @@ WebViewInternal.prototype.setupWebviewNodeProperties = function() { |
| enumerable: true |
| }); |
| + Object.defineProperty(this.webviewNode, 'name', { |
| + get: function() { |
| + return self.name; |
| + }, |
| + set: function(value) { |
| + self.webviewNode.setAttribute('name', value); |
| + }, |
| + enumerable: true |
| + }); |
| + |
| // We cannot use {writable: true} property descriptor because we want a |
| // dynamic getter value. |
| Object.defineProperty(this.webviewNode, 'contentWindow', { |
| @@ -446,7 +458,21 @@ WebViewInternal.prototype.handleWebviewAttributeMutation = |
| // a BrowserPlugin property will update the corresponding BrowserPlugin |
| // attribute, if necessary. See BrowserPlugin::UpdateDOMAttribute for more |
| // details. |
| - if (name == 'src') { |
| + if (name == 'name') { |
| + // We treat null attribute (attribute removed) and the empty string as |
| + // one case. |
| + oldValue = oldValue || ''; |
| + newValue = newValue || ''; |
| + |
| + if (oldValue === newValue) { |
| + return; |
| + } |
| + this.name = newValue; |
| + if (!this.instanceId) { |
| + return; |
| + } |
| + WebView.setName(this.instanceId, newValue); |
| + } else if (name == 'src') { |
| // We treat null attribute (attribute removed) and the empty string as |
| // one case. |
| oldValue = oldValue || ''; |
| @@ -595,6 +621,18 @@ WebViewInternal.prototype.setupWebviewNodeEvents = function() { |
| /** |
| * @private |
| */ |
| +WebViewInternal.prototype.setupNameAttribute = function() { |
| + var self = this; |
| + FrameNameChangedEvent.addListener(function(event) { |
| + self.name = event.name; |
| + self.webviewNode.setAttribute('name', self.name); |
| + }, {instanceId: self.instanceId}); |
| + |
|
lazyboy
2014/05/21 16:27:05
Remove empty line.
Fady Samuel
2014/05/21 16:56:49
Done.
|
| +}; |
| + |
| +/** |
| + * @private |
| + */ |
| WebViewInternal.prototype.setupEvent = function(eventName, eventInfo) { |
| var self = this; |
| var webviewNode = this.webviewNode; |
| @@ -1024,17 +1062,20 @@ WebViewInternal.prototype.attachWindowAndSetUpEvents = function(instanceId) { |
| this.instanceId = instanceId; |
| var params = { |
| 'api': 'webview', |
| - 'instanceId': this.viewInstanceId |
| + 'instanceId': this.viewInstanceId, |
| + 'name': this.name |
| }; |
| if (this.userAgentOverride) { |
| params['userAgentOverride'] = this.userAgentOverride; |
| } |
| - this.browserPluginNode['-internal-attach'](this.instanceId, params); |
| - |
| + this.setupNameAttribute(); |
| var events = this.getEvents(); |
| for (var eventName in events) { |
| this.setupEvent(eventName, events[eventName]); |
| } |
| + |
| + this.browserPluginNode['-internal-attach'](this.instanceId, params); |
| + |
| return true; |
| }; |