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

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

Issue 698973003: Got rid of the internal copies of webview attributes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small fix. Created 6 years, 1 month 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 8405e38412fce3072fd339724285dc3bed34bf92..31f4b531d2bc5dcb027622f01bc8a5544fab70da 100644
--- a/extensions/renderer/resources/guest_view/web_view.js
+++ b/extensions/renderer/resources/guest_view/web_view.js
@@ -34,7 +34,6 @@ function WebView(webviewNode) {
this.beforeFirstNavigation = true;
this.contentWindow = null;
- this.validPartitionId = true;
// Used to save some state upon deferred attachment.
// If <object> bindings is not available, we defer attachment.
// This state contains whether or not the attachment request was for
@@ -82,7 +81,6 @@ WebView.prototype.reset = function() {
GuestViewInternal.destroyGuest(this.guestInstanceId);
this.guestInstanceId = undefined;
this.beforeFirstNavigation = true;
- this.validPartitionId = true;
this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId =
true;
this.contentWindow = null;
@@ -129,14 +127,12 @@ WebView.prototype.validateExecuteCodeCall = function() {
WebView.prototype.setupAutoSizeProperties = function() {
$Array.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) {
- this.attributes[attributeName].setValue(
- this.webviewNode.getAttribute(attributeName));
Object.defineProperty(this.webviewNode, attributeName, {
get: function() {
return this.attributes[attributeName].getValue();
}.bind(this),
set: function(value) {
- this.webviewNode.setAttribute(attributeName, value);
+ this.attributes[attributeName].setValue(value);
}.bind(this),
enumerable: true
});
@@ -153,9 +149,8 @@ WebView.prototype.setupWebviewNodeProperties = function() {
getValue();
}.bind(this),
set: function(value) {
- this.webviewNode.setAttribute(
- WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY,
- value);
+ this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].
+ setValue(value);
}.bind(this),
enumerable: true
});
@@ -179,7 +174,7 @@ WebView.prototype.setupWebviewNodeProperties = function() {
return this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue();
}.bind(this),
set: function(value) {
- this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_NAME, value);
+ this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValue(value);
}.bind(this),
enumerable: true
});
@@ -190,25 +185,17 @@ WebView.prototype.setupWebviewNodeProperties = function() {
return this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].getValue();
}.bind(this),
set: function(value) {
- var result = this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].
- setValue(value);
- if (result.error) {
- throw result.error;
- }
- this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_PARTITION,
- value);
+ this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(value);
}.bind(this),
enumerable: true
});
- this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(
- this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_SRC));
Object.defineProperty(this.webviewNode, WebViewConstants.ATTRIBUTE_SRC, {
get: function() {
return this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue();
}.bind(this),
set: function(value) {
- this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_SRC, value);
+ this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(value);
}.bind(this),
enumerable: true
});
@@ -223,7 +210,7 @@ WebView.prototype.setupWebViewSrcAttributeMutationObserver =
this.srcAndPartitionObserver = new MutationObserver(function(mutations) {
$Array.forEach(mutations, function(mutation) {
var oldValue = mutation.oldValue;
- var newValue = this.webviewNode.getAttribute(mutation.attributeName);
+ var newValue = this.attributes[mutation.attributeName].getValue();
if (oldValue != newValue) {
return;
}
@@ -246,17 +233,22 @@ WebView.prototype.setupWebViewSrcAttributeMutationObserver =
// attribute, if necessary. See BrowserPlugin::UpdateDOMAttribute for more
// details.
WebView.prototype.handleWebviewAttributeMutation =
- function(name, oldValue, newValue) {
- if (AUTO_SIZE_ATTRIBUTES.indexOf(name) > -1) {
- this.attributes[name].setValue(newValue);
+ function(attributeName, oldValue, newValue) {
+ // Certain changes (such as internally-initiated changes) to attributes should
+ // not be handled normally.
+ if (this.attributes[attributeName] &&
+ this.attributes[attributeName].ignoreNextMutation) {
+ this.attributes[attributeName].ignoreNextMutation = false;
+ return;
+ }
+
+ if (AUTO_SIZE_ATTRIBUTES.indexOf(attributeName) > -1) {
if (!this.guestInstanceId) {
return;
}
- // Convert autosize attribute to boolean.
- var autosize = this.webviewNode.hasAttribute(
- WebViewConstants.ATTRIBUTE_AUTOSIZE);
GuestViewInternal.setAutoSize(this.guestInstanceId, {
- 'enableAutoSize': autosize,
+ 'enableAutoSize': this.attributes[WebViewConstants.ATTRIBUTE_AUTOSIZE].
+ getValue(),
'min': {
'width': parseInt(this.
attributes[WebViewConstants.ATTRIBUTE_MINWIDTH].getValue() || 0),
@@ -271,19 +263,13 @@ WebView.prototype.handleWebviewAttributeMutation =
}
});
return;
- } else if (name == WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY) {
+ } else if (attributeName == WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY) {
// We treat null attribute (attribute removed) and the empty string as
// one case.
oldValue = oldValue || '';
newValue = newValue || '';
- if (oldValue === newValue) {
- return;
- }
- this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].
- setValue(newValue != '');
-
- if (!this.guestInstanceId) {
+ if (oldValue === newValue || !this.guestInstanceId) {
return;
}
@@ -292,7 +278,7 @@ WebView.prototype.handleWebviewAttributeMutation =
this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].
getValue());
return;
- } else if (name == WebViewConstants.ATTRIBUTE_NAME) {
+ } else if (attributeName == WebViewConstants.ATTRIBUTE_NAME) {
// We treat null attribute (attribute removed) and the empty string as
// one case.
oldValue = oldValue || '';
@@ -301,19 +287,19 @@ WebView.prototype.handleWebviewAttributeMutation =
if (oldValue === newValue) {
return;
}
- this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValue(newValue);
+
if (!this.guestInstanceId) {
return;
}
WebViewInternal.setName(this.guestInstanceId, newValue);
return;
- } else if (name == WebViewConstants.ATTRIBUTE_SRC) {
+ } else if (attributeName == WebViewConstants.ATTRIBUTE_SRC) {
// We treat null attribute (attribute removed) and the empty string as
// one case.
oldValue = oldValue || '';
newValue = newValue || '';
// Once we have navigated, we don't allow clearing the src attribute.
- // Once <webview> enters a navigated state, it cannot be return back to a
+ // Once <webview> enters a navigated state, it cannot return to a
// placeholder state.
if (newValue == '' && oldValue != '') {
// src attribute changes normally initiate a navigation. We suppress
@@ -323,28 +309,23 @@ WebView.prototype.handleWebviewAttributeMutation =
this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_SRC, oldValue);
return;
}
- this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(newValue);
+
if (this.ignoreNextSrcAttributeChange) {
// Don't allow the src mutation observer to see this change.
this.srcAndPartitionObserver.takeRecords();
this.ignoreNextSrcAttributeChange = false;
return;
}
- var result = {};
- this.parseSrcAttribute(result);
-
- if (result.error) {
- throw result.error;
- }
- } else if (name == WebViewConstants.ATTRIBUTE_PARTITION) {
- // Note that throwing error here won't synchronously propagate.
- this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(newValue);
+ this.parseSrcAttribute();
+ } else if (attributeName == WebViewConstants.ATTRIBUTE_PARTITION) {
+ this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].handleMutation(
+ oldValue, newValue);
}
};
WebView.prototype.handleBrowserPluginAttributeMutation =
- function(name, oldValue, newValue) {
- if (name == WebViewConstants.ATTRIBUTE_INTERNALINSTANCEID &&
+ function(attributeName, oldValue, newValue) {
+ if (attributeName == WebViewConstants.ATTRIBUTE_INTERNALINSTANCEID &&
!oldValue && !!newValue) {
this.browserPluginNode.removeAttribute(
WebViewConstants.ATTRIBUTE_INTERNALINSTANCEID);
@@ -417,7 +398,7 @@ WebView.prototype.onSizeChanged = function(webViewEvent) {
minHeight = maxHeight;
}
- if (!this.webviewNode.hasAttribute(WebViewConstants.ATTRIBUTE_AUTOSIZE) ||
+ if (!this.attributes[WebViewConstants.ATTRIBUTE_AUTOSIZE].getValue() ||
(newWidth >= minWidth &&
newWidth <= maxWidth &&
newHeight >= minHeight &&
@@ -439,15 +420,9 @@ WebView.prototype.hasNavigated = function() {
return !this.beforeFirstNavigation;
};
-WebView.prototype.parseSrcAttribute = function(result) {
- if (!this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId) {
- result.error = WebViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE;
- return;
- }
- this.attributes[WebViewConstants.ATTRIBUTE_SRC].setValue(
- this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_SRC));
-
- if (!this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue()) {
+WebView.prototype.parseSrcAttribute = function() {
+ if (!this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId ||
+ !this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue()) {
return;
}
@@ -469,22 +444,16 @@ WebView.prototype.parseAttributes = function() {
if (!this.elementAttached) {
return;
}
- var attributeValue = this.webviewNode.getAttribute(
- WebViewConstants.ATTRIBUTE_PARTITION);
- var result = this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(
- attributeValue);
- this.parseSrcAttribute(result);
+ this.parseSrcAttribute();
};
WebView.prototype.createGuest = function() {
if (this.pendingGuestCreation) {
return;
}
- var storagePartitionId =
- this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_PARTITION) ||
- this.webviewNode[WebViewConstants.ATTRIBUTE_PARTITION];
var params = {
- 'storagePartitionId': storagePartitionId
+ 'storagePartitionId': this.attributes[
+ WebViewConstants.ATTRIBUTE_PARTITION].getValue()
};
GuestViewInternal.createGuest(
'webview',
@@ -502,13 +471,11 @@ WebView.prototype.createGuest = function() {
};
WebView.prototype.onFrameNameChanged = function(name) {
- this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValue(name || '');
- if (this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue() === '') {
+ name = name || '';
+ if (name === '') {
this.webviewNode.removeAttribute(WebViewConstants.ATTRIBUTE_NAME);
} else {
- this.webviewNode.setAttribute(
- WebViewConstants.ATTRIBUTE_NAME,
- this.attributes[WebViewConstants.ATTRIBUTE_NAME].getValue());
+ this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValue(name);
}
};
@@ -543,7 +510,7 @@ WebView.prototype.onLoadCommit = function(
this.currentEntryIndex = currentEntryIndex;
this.entryCount = entryCount;
this.processId = processId;
- var oldValue = this.webviewNode.getAttribute(WebViewConstants.ATTRIBUTE_SRC);
+ var oldValue = this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue();
var newValue = url;
if (isTopLevel && (oldValue != newValue)) {
// Touching the src attribute triggers a navigation. To avoid
@@ -555,8 +522,6 @@ WebView.prototype.onLoadCommit = function(
};
WebView.prototype.onAttach = function(storagePartitionId) {
- this.webviewNode.setAttribute(WebViewConstants.ATTRIBUTE_PARTITION,
- storagePartitionId);
this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValue(
storagePartitionId);
};
@@ -564,9 +529,8 @@ WebView.prototype.onAttach = function(storagePartitionId) {
WebView.prototype.buildAttachParams = function(isNewWindow) {
var params = {
'allowtransparency': this.attributes[
- WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].getValue() || false,
- 'autosize': this.webviewNode.hasAttribute(
- WebViewConstants.ATTRIBUTE_AUTOSIZE),
+ WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY].getValue(),
+ 'autosize': this.attributes[WebViewConstants.ATTRIBUTE_AUTOSIZE].getValue(),
'instanceId': this.viewInstanceId,
'maxheight': parseInt(this.attributes[WebViewConstants.ATTRIBUTE_MAXHEIGHT].
getValue() || 0),
@@ -590,7 +554,7 @@ WebView.prototype.buildAttachParams = function(isNewWindow) {
};
WebView.prototype.attachWindow = function(guestInstanceId,
- isNewWindow) {
+ isNewWindow) {
this.guestInstanceId = guestInstanceId;
var params = this.buildAttachParams(isNewWindow);

Powered by Google App Engine
This is Rietveld 408576698