Chromium Code Reviews| 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..30b812f7c6f70b2cb41b44c1d82d0e509320fb03 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 webview_src = this.src; |
|
lazyboy
2014/10/09 20:27:20
nit: rename to webviewSrc
|
| + if (this.baseUrlForDataUrl != '') { |
| + webview_src = this.baseUrlForDataUrl; |
| + } |
| + var args = $Array.concat([this.guestInstanceId, webview_src], |
| + $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 webview_src = this.src; |
|
lazyboy
2014/10/09 20:27:20
Same
|
| + if (this.baseUrlForDataUrl != '') { |
| + webview_src = this.baseUrlForDataUrl; |
| + } |
| + var args = $Array.concat([this.guestInstanceId, webview_src], |
| + $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. |