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

Unified Diff: extensions/renderer/resources/guest_view/web_view.js

Issue 663483004: Webview attributes overhaul. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments. Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: extensions/renderer/resources/guest_view/web_view.js
diff --git a/extensions/renderer/resources/guest_view/web_view.js b/extensions/renderer/resources/guest_view/web_view.js
index 76ecfd26c6f05518f60c97a95545b2eb192950d1..8405e38412fce3072fd339724285dc3bed34bf92 100644
--- a/extensions/renderer/resources/guest_view/web_view.js
+++ b/extensions/renderer/resources/guest_view/web_view.js
@@ -15,6 +15,7 @@ var WebViewConstants = require('webViewConstants').WebViewConstants;
var WebViewEvents = require('webViewEvents').WebViewEvents;
var WebViewInternal = require('webViewInternal').WebViewInternal;
+// Attributes.
var AUTO_SIZE_ATTRIBUTES = [
WebViewConstants.ATTRIBUTE_AUTOSIZE,
WebViewConstants.ATTRIBUTE_MAXHEIGHT,
@@ -23,47 +24,6 @@ var AUTO_SIZE_ATTRIBUTES = [
WebViewConstants.ATTRIBUTE_MINWIDTH
];
-// Represents the state of the storage partition.
-function Partition() {
- this.validPartitionId = true;
- this.persistStorage = false;
- this.storagePartitionId = '';
-}
-
-Partition.prototype.toAttribute = function() {
- if (!this.validPartitionId) {
- return '';
- }
- return (this.persistStorage ? 'persist:' : '') + this.storagePartitionId;
-};
-
-Partition.prototype.fromAttribute = function(value, hasNavigated) {
- var result = {};
- if (hasNavigated) {
- result.error = WebViewConstants.ERROR_MSG_ALREADY_NAVIGATED;
- return result;
- }
- if (!value) {
- value = '';
- }
-
- var LEN = 'persist:'.length;
- if (value.substr(0, LEN) == 'persist:') {
- value = value.substr(LEN);
- if (!value) {
- this.validPartitionId = false;
- result.error = WebViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE;
- return result;
- }
- this.persistStorage = true;
- } else {
- this.persistStorage = false;
- }
-
- this.storagePartitionId = value;
- return result;
-};
-
// Represents the internal state of the WebView node.
function WebView(webviewNode) {
privates(webviewNode).internal = this;
@@ -86,8 +46,7 @@ function WebView(webviewNode) {
this.browserPluginNode = this.createBrowserPluginNode();
var shadowRoot = this.webviewNode.createShadowRoot();
- this.partition = new Partition();
-
+ this.setupWebViewAttributes();
this.setupWebViewSrcAttributeMutationObserver();
this.setupFocusPropagation();
this.setupWebviewNodeProperties();
@@ -124,7 +83,8 @@ WebView.prototype.reset = function() {
this.guestInstanceId = undefined;
this.beforeFirstNavigation = true;
this.validPartitionId = true;
- this.partition.validPartitionId = true;
+ this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId =
+ true;
this.contentWindow = null;
}
this.internalInstanceId = 0;
@@ -169,10 +129,11 @@ WebView.prototype.validateExecuteCodeCall = function() {
WebView.prototype.setupAutoSizeProperties = function() {
$Array.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) {
- this[attributeName] = this.webviewNode.getAttribute(attributeName);
+ this.attributes[attributeName].setValue(
+ this.webviewNode.getAttribute(attributeName));
Object.defineProperty(this.webviewNode, attributeName, {
get: function() {
- return this[attributeName];
+ return this.attributes[attributeName].getValue();
}.bind(this),
set: function(value) {
this.webviewNode.setAttribute(attributeName, value);
@@ -188,7 +149,8 @@ WebView.prototype.setupWebviewNodeProperties = function() {
Object.defineProperty(this.webviewNode,
WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY, {
get: function() {
- return this.allowtransparency;
+ return this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].
+ getValue();
}.bind(this),
set: function(value) {
this.webviewNode.setAttribute(
@@ -212,39 +174,42 @@ WebView.prototype.setupWebviewNodeProperties = function() {
enumerable: true
});
- Object.defineProperty(this.webviewNode, 'name', {
+ Object.defineProperty(this.webviewNode, WebViewConstants.ATTRIBUTE_NAME, {
get: function() {
- return this.name;
+ return this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue();
}.bind(this),
set: function(value) {
- this.webviewNode.setAttribute('name', value);
+ this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_NAME, value);
}.bind(this),
enumerable: true
});
- Object.defineProperty(this.webviewNode, 'partition', {
+ Object.defineProperty(this.webviewNode,
+ WebViewConstants.ATTRIBUTE_PARTITION, {
get: function() {
- return this.partition.toAttribute();
+ return this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].getValue();
}.bind(this),
set: function(value) {
- var result = this.partition.fromAttribute(value, this.hasNavigated());
+ var result = this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].
+ setValue(value);
if (result.error) {
throw result.error;
}
- this.webviewNode.setAttribute('partition', value);
+ this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_PARTITION,
+ value);
}.bind(this),
enumerable: true
});
- this.src = this.webviewNode.getAttribute('src');
- Object.defineProperty(this.webviewNode, 'src', {
+ this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(
+ this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_SRC));
+ Object.defineProperty(this.webviewNode, WebViewConstants.ATTRIBUTE_SRC, {
get: function() {
- return this.src;
+ return this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue();
}.bind(this),
set: function(value) {
- this.webviewNode.setAttribute('src', value);
+ this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_SRC, value);
}.bind(this),
- // No setter.
enumerable: true
});
};
@@ -269,7 +234,8 @@ WebView.prototype.setupWebViewSrcAttributeMutationObserver =
var params = {
attributes: true,
attributeOldValue: true,
- attributeFilter: ['src', 'partition']
+ attributeFilter: [WebViewConstants.ATTRIBUTE_SRC,
+ WebViewConstants.ATTRIBUTE_PARTITION]
};
this.srcAndPartitionObserver.observe(this.webviewNode, params);
};
@@ -282,7 +248,7 @@ WebView.prototype.setupWebViewSrcAttributeMutationObserver =
WebView.prototype.handleWebviewAttributeMutation =
function(name, oldValue, newValue) {
if (AUTO_SIZE_ATTRIBUTES.indexOf(name) > -1) {
- this[name] = newValue;
+ this.attributes[name].setValue(newValue);
if (!this.guestInstanceId) {
return;
}
@@ -292,12 +258,16 @@ WebView.prototype.handleWebviewAttributeMutation =
GuestViewInternal.setAutoSize(this.guestInstanceId, {
'enableAutoSize': autosize,
'min': {
- 'width': parseInt(this.minwidth || 0),
- 'height': parseInt(this.minheight || 0)
+ 'width': parseInt(this.
+ attributes[WebViewConstants.ATTRIBUTE_MINWIDTH].getValue() || 0),
+ 'height': parseInt(this.
+ attributes[WebViewConstants.ATTRIBUTE_MINHEIGHT].getValue() || 0)
},
'max': {
- 'width': parseInt(this.maxwidth || 0),
- 'height': parseInt(this.maxheight || 0)
+ 'width': parseInt(this.
+ attributes[WebViewConstants.ATTRIBUTE_MAXWIDTH].getValue() || 0),
+ 'height': parseInt(this.
+ attributes[WebViewConstants.ATTRIBUTE_MAXHEIGHT].getValue() || 0)
}
});
return;
@@ -310,16 +280,19 @@ WebView.prototype.handleWebviewAttributeMutation =
if (oldValue === newValue) {
return;
}
- this.allowtransparency = newValue != '';
+ this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].
+ setValue(newValue != '');
if (!this.guestInstanceId) {
return;
}
- WebViewInternal.setAllowTransparency(this.guestInstanceId,
- this.allowtransparency);
+ WebViewInternal.setAllowTransparency(
+ this.guestInstanceId,
+ this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].
+ getValue());
return;
- } else if (name == 'name') {
+ } else if (name == WebViewConstants.ATTRIBUTE_NAME) {
// We treat null attribute (attribute removed) and the empty string as
// one case.
oldValue = oldValue || '';
@@ -328,13 +301,13 @@ WebView.prototype.handleWebviewAttributeMutation =
if (oldValue === newValue) {
return;
}
- this.name = newValue;
+ this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValue(newValue);
if (!this.guestInstanceId) {
return;
}
WebViewInternal.setName(this.guestInstanceId, newValue);
return;
- } else if (name == 'src') {
+ } else if (name == WebViewConstants.ATTRIBUTE_SRC) {
// We treat null attribute (attribute removed) and the empty string as
// one case.
oldValue = oldValue || '';
@@ -347,10 +320,10 @@ WebView.prototype.handleWebviewAttributeMutation =
// the next src attribute handler call to avoid reloading the page
// on every guest-initiated navigation.
this.ignoreNextSrcAttributeChange = true;
- this.webviewNode.setAttribute('src', oldValue);
+ this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_SRC, oldValue);
return;
}
- this.src = newValue;
+ this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(newValue);
if (this.ignoreNextSrcAttributeChange) {
// Don't allow the src mutation observer to see this change.
this.srcAndPartitionObserver.takeRecords();
@@ -363,16 +336,18 @@ WebView.prototype.handleWebviewAttributeMutation =
if (result.error) {
throw result.error;
}
- } else if (name == 'partition') {
+ } else if (name == WebViewConstants.ATTRIBUTE_PARTITION) {
// Note that throwing error here won't synchronously propagate.
- this.partition.fromAttribute(newValue, this.hasNavigated());
+ this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(newValue);
}
};
WebView.prototype.handleBrowserPluginAttributeMutation =
function(name, oldValue, newValue) {
- if (name == 'internalinstanceid' && !oldValue && !!newValue) {
- this.browserPluginNode.removeAttribute('internalinstanceid');
+ if (name == WebViewConstants.ATTRIBUTE_INTERNALINSTANCEID &&
+ !oldValue && !!newValue) {
+ this.browserPluginNode.removeAttribute(
+ WebViewConstants.ATTRIBUTE_INTERNALINSTANCEID);
this.internalInstanceId = parseInt(newValue);
if (!!this.guestInstanceId && this.guestInstanceId != 0) {
@@ -465,13 +440,14 @@ WebView.prototype.hasNavigated = function() {
};
WebView.prototype.parseSrcAttribute = function(result) {
- if (!this.partition.validPartitionId) {
+ if (!this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId) {
result.error = WebViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE;
return;
}
- this.src = this.webviewNode.getAttribute('src');
+ this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(
+ this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_SRC));
- if (!this.src) {
+ if (!this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue()) {
return;
}
@@ -484,16 +460,19 @@ WebView.prototype.parseSrcAttribute = function(result) {
}
// Navigate to |this.src|.
- WebViewInternal.navigate(this.guestInstanceId, this.src);
+ WebViewInternal.navigate(
+ this.guestInstanceId,
+ this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue());
};
WebView.prototype.parseAttributes = function() {
if (!this.elementAttached) {
return;
}
- var hasNavigated = this.hasNavigated();
- var attributeValue = this.webviewNode.getAttribute('partition');
- var result = this.partition.fromAttribute(attributeValue, hasNavigated);
+ var attributeValue = this.webviewNode.getAttribute(
+ WebViewConstants.ATTRIBUTE_PARTITION);
+ var result = this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(
+ attributeValue);
this.parseSrcAttribute(result);
};
@@ -523,11 +502,13 @@ WebView.prototype.createGuest = function() {
};
WebView.prototype.onFrameNameChanged = function(name) {
- this.name = name || '';
- if (this.name === '') {
- this.webviewNode.removeAttribute('name');
+ this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValue(name || '');
+ if (this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue() === '') {
+ this.webviewNode.removeAttribute(WebViewConstants.ATTRIBUTE_NAME);
} else {
- this.webviewNode.setAttribute('name', this.name);
+ this.webviewNode.setAttribute(
+ WebViewConstants.ATTRIBUTE_NAME,
+ this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue());
}
};
@@ -562,38 +543,47 @@ WebView.prototype.onLoadCommit = function(
this.currentEntryIndex = currentEntryIndex;
this.entryCount = entryCount;
this.processId = processId;
- var oldValue = this.webviewNode.getAttribute('src');
+ var oldValue = this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_SRC);
var newValue = url;
if (isTopLevel && (oldValue != newValue)) {
// Touching the src attribute triggers a navigation. To avoid
// triggering a page reload on every guest-initiated navigation,
// we use the flag ignoreNextSrcAttributeChange here.
this.ignoreNextSrcAttributeChange = true;
- this.webviewNode.setAttribute('src', newValue);
+ this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_SRC, newValue);
}
};
WebView.prototype.onAttach = function(storagePartitionId) {
- this.webviewNode.setAttribute('partition', storagePartitionId);
- this.partition.fromAttribute(storagePartitionId, this.hasNavigated());
+ this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_PARTITION,
+ storagePartitionId);
+ this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(
+ storagePartitionId);
};
WebView.prototype.buildAttachParams = function(isNewWindow) {
var params = {
- 'allowtransparency': this.allowtransparency || false,
+ 'allowtransparency': this.attributes[
+ WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].getValue() || false,
'autosize': this.webviewNode.hasAttribute(
WebViewConstants.ATTRIBUTE_AUTOSIZE),
'instanceId': this.viewInstanceId,
- 'maxheight': parseInt(this.maxheight || 0),
- 'maxwidth': parseInt(this.maxwidth || 0),
- 'minheight': parseInt(this.minheight || 0),
- 'minwidth': parseInt(this.minwidth || 0),
- 'name': this.name,
+ 'maxheight': parseInt(this.attributes[WebViewConstants.ATTRIBUTE_MAXHEIGHT].
+ getValue() || 0),
+ 'maxwidth': parseInt(this.attributes[WebViewConstants.ATTRIBUTE_MAXWIDTH].
+ getValue() || 0),
+ 'minheight': parseInt(this.attributes[WebViewConstants.ATTRIBUTE_MINHEIGHT].
+ getValue() || 0),
+ 'minwidth': parseInt(this.attributes[WebViewConstants.ATTRIBUTE_MINWIDTH].
+ getValue() || 0),
+ 'name': this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue(),
// We don't need to navigate new window from here.
- 'src': isNewWindow ? undefined : this.src,
+ 'src': isNewWindow ? undefined :
+ this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue(),
// If we have a partition from the opener, that will also be already
// set via this.onAttach().
- 'storagePartitionId': this.partition.toAttribute(),
+ 'storagePartitionId': this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].
+ getValue(),
'userAgentOverride': this.userAgentOverride
};
return params;
@@ -651,7 +641,7 @@ WebView.prototype.clearData = function() {
// Injects JavaScript code into the guest page.
WebView.prototype.executeScript = function(var_args) {
this.validateExecuteCodeCall();
- var webviewSrc = this.src;
+ var webviewSrc = this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue();
if (this.baseUrlForDataUrl != '') {
webviewSrc = this.baseUrlForDataUrl;
}
@@ -704,7 +694,7 @@ WebView.prototype.go = function(relativeIndex, callback) {
// Injects CSS into the guest page.
WebView.prototype.insertCSS = function(var_args) {
this.validateExecuteCodeCall();
- var webviewSrc = this.src;
+ var webviewSrc = this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue();
if (this.baseUrlForDataUrl != '') {
webviewSrc = this.baseUrlForDataUrl;
}

Powered by Google App Engine
This is Rietveld 408576698