| 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..f00fb9b2e6a3440181199217b7d9d4a3e8bba2c3 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,22 @@ 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);
|
| + return;
|
| + } else if (name == 'src') {
|
| // We treat null attribute (attribute removed) and the empty string as
|
| // one case.
|
| oldValue = oldValue || '';
|
| @@ -595,6 +622,21 @@ WebViewInternal.prototype.setupWebviewNodeEvents = function() {
|
| /**
|
| * @private
|
| */
|
| +WebViewInternal.prototype.setupNameAttribute = function() {
|
| + var self = this;
|
| + FrameNameChangedEvent.addListener(function(event) {
|
| + self.name = event.name || '';
|
| + if (self.name === '') {
|
| + self.webviewNode.removeAttribute('name');
|
| + } else {
|
| + self.webviewNode.setAttribute('name', self.name);
|
| + }
|
| + }, {instanceId: self.instanceId});
|
| +};
|
| +
|
| +/**
|
| + * @private
|
| + */
|
| WebViewInternal.prototype.setupEvent = function(eventName, eventInfo) {
|
| var self = this;
|
| var webviewNode = this.webviewNode;
|
| @@ -1024,17 +1066,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;
|
| };
|
|
|
|
|