Index: extensions/renderer/resources/web_view.js |
diff --git a/extensions/renderer/resources/web_view.js b/extensions/renderer/resources/web_view.js |
index 88540fbf60e8f3b3bf4761b8c1befc7b1c9bb539..3965e6106a67f1cc16eeac40817c1283af41aedf 100644 |
--- a/extensions/renderer/resources/web_view.js |
+++ b/extensions/renderer/resources/web_view.js |
@@ -107,7 +107,7 @@ function WebViewInternal(webviewNode) { |
var shadowRoot = this.webviewNode.createShadowRoot(); |
this.partition = new Partition(); |
- this.setupWebviewNodeAttributes(); |
+ this.setupWebViewSrcAttributeMutationObserver(); |
this.setupFocusPropagation(); |
this.setupWebviewNodeProperties(); |
@@ -169,7 +169,6 @@ WebViewInternal.prototype.setupFocusPropagation = function() { |
// See http://crbug.com/231664. |
this.webviewNode.setAttribute('tabIndex', -1); |
} |
- var self = this; |
this.webviewNode.addEventListener('focus', function(e) { |
// Focus the BrowserPlugin when the <webview> takes focus. |
this.browserPluginNode.focus(); |
@@ -180,110 +179,13 @@ WebViewInternal.prototype.setupFocusPropagation = function() { |
}.bind(this)); |
}; |
-// Navigates to the previous history entry. |
-WebViewInternal.prototype.back = function(callback) { |
- return this.go(-1, callback); |
-}; |
- |
-// Navigates to the subsequent history entry. |
-WebViewInternal.prototype.forward = function(callback) { |
- return this.go(1, callback); |
-}; |
- |
-// Returns whether there is a previous history entry to navigate to. |
-WebViewInternal.prototype.canGoBack = function() { |
- return this.entryCount > 1 && this.currentEntryIndex > 0; |
-}; |
- |
-// Returns whether there is a subsequent history entry to navigate to. |
-WebViewInternal.prototype.canGoForward = function() { |
- return this.currentEntryIndex >= 0 && |
- this.currentEntryIndex < (this.entryCount - 1); |
-}; |
- |
-// Clears browsing data for the WebView partition. |
-WebViewInternal.prototype.clearData = function() { |
- if (!this.guestInstanceId) { |
- return; |
- } |
- var args = $Array.concat([this.guestInstanceId], $Array.slice(arguments)); |
- $Function.apply(WebView.clearData, null, args); |
-}; |
- |
-// Returns Chrome's internal process ID for the guest web page's current |
-// process. |
-WebViewInternal.prototype.getProcessId = function() { |
- return this.processId; |
-}; |
- |
-// Navigates to a history entry using a history index relative to the current |
-// navigation. |
-WebViewInternal.prototype.go = function(relativeIndex, callback) { |
- if (!this.guestInstanceId) { |
- return; |
- } |
- WebView.go(this.guestInstanceId, relativeIndex, callback); |
-}; |
- |
-// Prints the contents of the webview. |
-WebViewInternal.prototype.print = function() { |
- this.executeScript({code: 'window.print();'}); |
-}; |
- |
-// Reloads the current top-level page. |
-WebViewInternal.prototype.reload = function() { |
- if (!this.guestInstanceId) { |
- return; |
- } |
- WebView.reload(this.guestInstanceId); |
-}; |
- |
-// Stops loading the current navigation if one is in progress. |
-WebViewInternal.prototype.stop = function() { |
- if (!this.guestInstanceId) { |
- return; |
- } |
- WebView.stop(this.guestInstanceId); |
-}; |
- |
-// Forcibly kills the guest web page's renderer process. |
-WebViewInternal.prototype.terminate = function() { |
- if (!this.guestInstanceId) { |
- return; |
- } |
- WebView.terminate(this.guestInstanceId); |
-}; |
- |
+// Validation helper function for executeScript() and insertCSS(). |
WebViewInternal.prototype.validateExecuteCodeCall = function() { |
if (!this.guestInstanceId) { |
throw new Error(ERROR_MSG_CANNOT_INJECT_SCRIPT); |
} |
}; |
-// Injects JavaScript code into the guest page. |
-WebViewInternal.prototype.executeScript = function(var_args) { |
- this.validateExecuteCodeCall(); |
- var webview_src = this.src; |
- if (this.baseUrlForDataUrl != '') { |
- webview_src = this.baseUrlForDataUrl; |
- } |
- var args = $Array.concat([this.guestInstanceId, webview_src], |
- $Array.slice(arguments)); |
- $Function.apply(WebView.executeScript, null, args); |
-}; |
- |
-// Injects CSS into the guest page. |
-WebViewInternal.prototype.insertCSS = function(var_args) { |
- this.validateExecuteCodeCall(); |
- var webview_src = this.src; |
- if (this.baseUrlForDataUrl != '') { |
- webview_src = this.baseUrlForDataUrl; |
- } |
- var args = $Array.concat([this.guestInstanceId, webview_src], |
- $Array.slice(arguments)); |
- $Function.apply(WebView.insertCSS, null, args); |
-}; |
- |
WebViewInternal.prototype.setupAutoSizeProperties = function() { |
$Array.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) { |
this[attributeName] = this.webviewNode.getAttribute(attributeName); |
@@ -364,10 +266,6 @@ WebViewInternal.prototype.setupWebviewNodeProperties = function() { |
}); |
}; |
-WebViewInternal.prototype.setupWebviewNodeAttributes = function() { |
- this.setupWebViewSrcAttributeMutationObserver(); |
-}; |
- |
// The purpose of this mutation observer is to catch assignment to the src |
// attribute without any changes to its value. This is useful in the case |
// where the webview guest has crashed and navigating to the same address |
@@ -592,7 +490,7 @@ WebViewInternal.prototype.parseSrcAttribute = function(result) { |
return; |
} |
- if (!this.hasGuestInstanceID()) { |
+ if (this.guestInstanceId == undefined) { |
if (this.beforeFirstNavigation) { |
this.beforeFirstNavigation = false; |
this.createGuest(); |
@@ -602,7 +500,6 @@ WebViewInternal.prototype.parseSrcAttribute = function(result) { |
// Navigate to |this.src|. |
WebView.navigate(this.guestInstanceId, this.src); |
- return true; |
}; |
WebViewInternal.prototype.parseAttributes = function() { |
@@ -615,10 +512,6 @@ WebViewInternal.prototype.parseAttributes = function() { |
this.parseSrcAttribute(result); |
}; |
-WebViewInternal.prototype.hasGuestInstanceID = function() { |
- return this.guestInstanceId != undefined; |
-}; |
- |
WebViewInternal.prototype.createGuest = function() { |
if (this.pendingGuestCreation) { |
return; |
@@ -700,17 +593,159 @@ WebViewInternal.prototype.onAttach = function(storagePartitionId) { |
this.partition.fromAttribute(storagePartitionId, this.hasNavigated()); |
}; |
+WebViewInternal.prototype.buildAttachParams = function(isNewWindow) { |
+ var params = { |
+ 'allowtransparency': this.allowtransparency || false, |
+ 'autosize': this.webviewNode.hasAttribute(WEB_VIEW_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, |
+ // We don't need to navigate new window from here. |
+ 'src': isNewWindow ? undefined : this.src, |
+ // If we have a partition from the opener, that will also be already |
+ // set via this.onAttach(). |
+ 'storagePartitionId': this.partition.toAttribute(), |
+ 'userAgentOverride': this.userAgentOverride |
+ }; |
+ return params; |
+}; |
+ |
+WebViewInternal.prototype.attachWindow = function(guestInstanceId, |
+ isNewWindow) { |
+ this.guestInstanceId = guestInstanceId; |
+ var params = this.buildAttachParams(isNewWindow); |
+ |
+ if (!this.isPluginInRenderTree()) { |
+ this.deferredAttachState = {isNewWindow: isNewWindow}; |
+ return true; |
+ } |
+ |
+ this.deferredAttachState = null; |
+ return guestViewInternalNatives.AttachGuest( |
+ this.internalInstanceId, |
+ this.guestInstanceId, |
+ params, function(w) { |
+ this.contentWindow = w; |
+ }.bind(this) |
+ ); |
+}; |
+ |
+// ----------------------------------------------------------------------------- |
+// Public-facing API methods. |
+ |
+ |
+// Navigates to the previous history entry. |
+WebViewInternal.prototype.back = function(callback) { |
+ return this.go(-1, callback); |
+}; |
+ |
+// Returns whether there is a previous history entry to navigate to. |
+WebViewInternal.prototype.canGoBack = function() { |
+ return this.entryCount > 1 && this.currentEntryIndex > 0; |
+}; |
+ |
+// Returns whether there is a subsequent history entry to navigate to. |
+WebViewInternal.prototype.canGoForward = function() { |
+ return this.currentEntryIndex >= 0 && |
+ this.currentEntryIndex < (this.entryCount - 1); |
+}; |
+ |
+// Clears browsing data for the WebView partition. |
+WebViewInternal.prototype.clearData = function() { |
+ if (!this.guestInstanceId) { |
+ return; |
+ } |
+ var args = $Array.concat([this.guestInstanceId], $Array.slice(arguments)); |
+ $Function.apply(WebView.clearData, null, args); |
+}; |
+ |
+// Injects JavaScript code into the guest page. |
+WebViewInternal.prototype.executeScript = function(var_args) { |
+ this.validateExecuteCodeCall(); |
+ var webviewSrc = this.src; |
+ if (this.baseUrlForDataUrl != '') { |
+ webviewSrc = this.baseUrlForDataUrl; |
+ } |
+ var args = $Array.concat([this.guestInstanceId, webviewSrc], |
+ $Array.slice(arguments)); |
+ $Function.apply(WebView.executeScript, null, args); |
+}; |
+ |
+// Initiates a find-in-page request. |
+WebViewInternal.prototype.find = function(search_text, options, callback) { |
+ if (!this.guestInstanceId) { |
+ return; |
+ } |
+ WebView.find(this.guestInstanceId, search_text, options, callback); |
+}; |
+ |
+// Navigates to the subsequent history entry. |
+WebViewInternal.prototype.forward = function(callback) { |
+ return this.go(1, callback); |
+}; |
+ |
+// Returns Chrome's internal process ID for the guest web page's current |
+// process. |
+WebViewInternal.prototype.getProcessId = function() { |
+ return this.processId; |
+}; |
+ |
// Returns the user agent string used by the webview for guest page requests. |
WebViewInternal.prototype.getUserAgent = function() { |
return this.userAgentOverride || navigator.userAgent; |
}; |
+// Gets the current zoom factor. |
+WebViewInternal.prototype.getZoom = function(callback) { |
+ if (!this.guestInstanceId) { |
+ return; |
+ } |
+ WebView.getZoom(this.guestInstanceId, callback); |
+}; |
+ |
+// Navigates to a history entry using a history index relative to the current |
+// navigation. |
+WebViewInternal.prototype.go = function(relativeIndex, callback) { |
+ if (!this.guestInstanceId) { |
+ return; |
+ } |
+ WebView.go(this.guestInstanceId, relativeIndex, callback); |
+}; |
+ |
+// Injects CSS into the guest page. |
+WebViewInternal.prototype.insertCSS = function(var_args) { |
+ this.validateExecuteCodeCall(); |
+ var webviewSrc = this.src; |
+ if (this.baseUrlForDataUrl != '') { |
+ webviewSrc = this.baseUrlForDataUrl; |
+ } |
+ var args = $Array.concat([this.guestInstanceId, webviewSrc], |
+ $Array.slice(arguments)); |
+ $Function.apply(WebView.insertCSS, null, args); |
+}; |
+ |
// Indicates whether or not the webview's user agent string has been overridden. |
WebViewInternal.prototype.isUserAgentOverridden = function() { |
return !!this.userAgentOverride && |
this.userAgentOverride != navigator.userAgent; |
}; |
+// Prints the contents of the webview. |
+WebViewInternal.prototype.print = function() { |
+ this.executeScript({code: 'window.print();'}); |
+}; |
+ |
+// Reloads the current top-level page. |
+WebViewInternal.prototype.reload = function() { |
+ if (!this.guestInstanceId) { |
+ return; |
+ } |
+ WebView.reload(this.guestInstanceId); |
+}; |
+ |
// Override the user agent string used by the webview for guest page requests. |
WebViewInternal.prototype.setUserAgentOverride = function(userAgentOverride) { |
this.userAgentOverride = userAgentOverride; |
@@ -722,77 +757,39 @@ WebViewInternal.prototype.setUserAgentOverride = function(userAgentOverride) { |
WebView.overrideUserAgent(this.guestInstanceId, userAgentOverride); |
}; |
-// Initiates a find-in-page request. |
-WebViewInternal.prototype.find = function(search_text, options, callback) { |
+// Changes the zoom factor of the page. |
+WebViewInternal.prototype.setZoom = function(zoomFactor, callback) { |
if (!this.guestInstanceId) { |
return; |
} |
- WebView.find(this.guestInstanceId, search_text, options, callback); |
+ WebView.setZoom(this.guestInstanceId, zoomFactor, callback); |
}; |
-// Ends the current find session. |
-WebViewInternal.prototype.stopFinding = function(action) { |
+// Stops loading the current navigation if one is in progress. |
+WebViewInternal.prototype.stop = function() { |
if (!this.guestInstanceId) { |
return; |
} |
- WebView.stopFinding(this.guestInstanceId, action); |
+ WebView.stop(this.guestInstanceId); |
}; |
-// Changes the zoom factor of the page. |
-WebViewInternal.prototype.setZoom = function(zoomFactor, callback) { |
+// Ends the current find session. |
+WebViewInternal.prototype.stopFinding = function(action) { |
if (!this.guestInstanceId) { |
return; |
} |
- WebView.setZoom(this.guestInstanceId, zoomFactor, callback); |
+ WebView.stopFinding(this.guestInstanceId, action); |
}; |
-// Gets the current zoom factor. |
-WebViewInternal.prototype.getZoom = function(callback) { |
+// Forcibly kills the guest web page's renderer process. |
+WebViewInternal.prototype.terminate = function() { |
if (!this.guestInstanceId) { |
return; |
} |
- WebView.getZoom(this.guestInstanceId, callback); |
-}; |
- |
-WebViewInternal.prototype.buildAttachParams = function(isNewWindow) { |
- var params = { |
- 'allowtransparency': this.allowtransparency || false, |
- 'autosize': this.webviewNode.hasAttribute(WEB_VIEW_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, |
- // We don't need to navigate new window from here. |
- 'src': isNewWindow ? undefined : this.src, |
- // If we have a partition from the opener, that will also be already |
- // set via this.onAttach(). |
- 'storagePartitionId': this.partition.toAttribute(), |
- 'userAgentOverride': this.userAgentOverride |
- }; |
- return params; |
+ WebView.terminate(this.guestInstanceId); |
}; |
-WebViewInternal.prototype.attachWindow = function(guestInstanceId, |
- isNewWindow) { |
- this.guestInstanceId = guestInstanceId; |
- var params = this.buildAttachParams(isNewWindow); |
- |
- if (!this.isPluginInRenderTree()) { |
- this.deferredAttachState = {isNewWindow: isNewWindow}; |
- return true; |
- } |
- |
- this.deferredAttachState = null; |
- return guestViewInternalNatives.AttachGuest( |
- this.internalInstanceId, |
- this.guestInstanceId, |
- params, function(w) { |
- this.contentWindow = w; |
- }.bind(this) |
- ); |
-}; |
+// ----------------------------------------------------------------------------- |
// Registers browser plugin <object> custom element. |
function registerBrowserPluginElement() { |
@@ -868,25 +865,25 @@ function registerWebViewElement() { |
// Public-facing API methods. |
var methods = [ |
'back', |
- 'find', |
- 'forward', |
'canGoBack', |
'canGoForward', |
'clearData', |
+ 'executeScript', |
+ 'find', |
+ 'forward', |
'getProcessId', |
+ 'getUserAgent', |
'getZoom', |
'go', |
+ 'insertCSS', |
+ 'isUserAgentOverridden', |
'print', |
'reload', |
+ 'setUserAgentOverride', |
'setZoom', |
'stop', |
'stopFinding', |
- 'terminate', |
- 'executeScript', |
- 'insertCSS', |
- 'getUserAgent', |
- 'isUserAgentOverridden', |
- 'setUserAgentOverride' |
+ 'terminate' |
]; |
// Add the experimental API methods, if available. |