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

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

Issue 444813002: Remove BrowserPlugin's -internal-attach method (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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: 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 f97867a78a2baf7867273dd1a7c1ffa47850a642..0f2464470f4bc681d2382f62255eab00a0e69bd4 100644
--- a/chrome/renderer/resources/extensions/web_view.js
+++ b/chrome/renderer/resources/extensions/web_view.js
@@ -14,6 +14,7 @@ var IdGenerator = requireNative('id_generator');
// something else.
var WebView = require('webViewInternal').WebView;
var WebViewEvents = require('webViewEvents').WebViewEvents;
+var guestViewInternalNatives = requireNative('guest_view_internal');
var WEB_VIEW_ATTRIBUTE_MAXHEIGHT = 'maxheight';
var WEB_VIEW_ATTRIBUTE_MAXWIDTH = 'maxwidth';
@@ -21,8 +22,6 @@ var WEB_VIEW_ATTRIBUTE_MINHEIGHT = 'minheight';
var WEB_VIEW_ATTRIBUTE_MINWIDTH = 'minwidth';
var WEB_VIEW_ATTRIBUTE_PARTITION = 'partition';
-var PLUGIN_METHOD_ATTACH = '-internal-attach';
-
var ERROR_MSG_ALREADY_NAVIGATED =
'The object has already navigated, so its partition cannot be changed.';
var ERROR_MSG_INVALID_PARTITION_ATTRIBUTE = 'Invalid partition attribute.';
@@ -145,15 +144,16 @@ WebViewInternal.prototype.createBrowserPluginNode = function() {
return browserPluginNode;
};
-WebViewInternal.prototype.getInstanceId = function() {
- return this.instanceId;
+WebViewInternal.prototype.getGuestInstanceId = function() {
+ return this.guestInstanceId;
};
/**
* Resets some state upon reattaching <webview> element to the DOM.
*/
-WebViewInternal.prototype.resetUponReattachment = function() {
- this.instanceId = undefined;
+WebViewInternal.prototype.reset = function() {
+ this.guestInstanceId = undefined;
+ this.internalInstanceId = 0;
this.beforeFirstNavigation = true;
this.validPartitionId = true;
this.partition.validPartitionId = true;
@@ -223,10 +223,10 @@ WebViewInternal.prototype.canGoForward = function() {
* @private
*/
WebViewInternal.prototype.clearData = function() {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- var args = $Array.concat([this.instanceId], $Array.slice(arguments));
+ var args = $Array.concat([this.guestInstanceId], $Array.slice(arguments));
$Function.apply(WebView.clearData, null, args);
};
@@ -241,10 +241,10 @@ WebViewInternal.prototype.getProcessId = function() {
* @private
*/
WebViewInternal.prototype.go = function(relativeIndex) {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.go(this.instanceId, relativeIndex);
+ WebView.go(this.guestInstanceId, relativeIndex);
};
/**
@@ -258,30 +258,30 @@ WebViewInternal.prototype.print = function() {
* @private
*/
WebViewInternal.prototype.reload = function() {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.reload(this.instanceId);
+ WebView.reload(this.guestInstanceId);
};
/**
* @private
*/
WebViewInternal.prototype.stop = function() {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.stop(this.instanceId);
+ WebView.stop(this.guestInstanceId);
};
/**
* @private
*/
WebViewInternal.prototype.terminate = function() {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.terminate(this.instanceId);
+ WebView.terminate(this.guestInstanceId);
};
/**
@@ -290,7 +290,7 @@ WebViewInternal.prototype.terminate = function() {
WebViewInternal.prototype.validateExecuteCodeCall = function() {
var ERROR_MSG_CANNOT_INJECT_SCRIPT = '<webview>: ' +
'Script cannot be injected into content until the page has loaded.';
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
throw new Error(ERROR_MSG_CANNOT_INJECT_SCRIPT);
}
};
@@ -300,7 +300,7 @@ WebViewInternal.prototype.validateExecuteCodeCall = function() {
*/
WebViewInternal.prototype.executeScript = function(var_args) {
this.validateExecuteCodeCall();
- var args = $Array.concat([this.instanceId, this.src],
+ var args = $Array.concat([this.guestInstanceId, this.src],
$Array.slice(arguments));
$Function.apply(WebView.executeScript, null, args);
};
@@ -310,7 +310,7 @@ WebViewInternal.prototype.executeScript = function(var_args) {
*/
WebViewInternal.prototype.insertCSS = function(var_args) {
this.validateExecuteCodeCall();
- var args = $Array.concat([this.instanceId, this.src],
+ var args = $Array.concat([this.guestInstanceId, this.src],
$Array.slice(arguments));
$Function.apply(WebView.insertCSS, null, args);
};
@@ -456,10 +456,10 @@ WebViewInternal.prototype.handleWebviewAttributeMutation =
return;
}
this.name = newValue;
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.setName(this.instanceId, newValue);
+ WebView.setName(this.guestInstanceId, newValue);
return;
} else if (name == 'src') {
// We treat null attribute (attribute removed) and the empty string as
@@ -512,20 +512,21 @@ WebViewInternal.prototype.handleWebviewAttributeMutation =
*/
WebViewInternal.prototype.handleBrowserPluginAttributeMutation =
function(name, oldValue, newValue) {
- if (name == 'internalbindings' && !oldValue && newValue) {
- this.browserPluginNode.removeAttribute('internalbindings');
-
- if (this.deferredAttachState) {
- var self = this;
- // A setTimeout is necessary for the binding to be initialized properly.
+ if (name == 'internalinstanceid' && !oldValue && !!newValue) {
+ this.browserPluginNode.removeAttribute('internalinstanceid');
+ this.internalInstanceId = 1 * newValue;
+ if (this.deferredAttachState && !!this.guestInstanceId &&
+ this.guestInstanceId != 0) {
window.setTimeout(function() {
- if (self.hasBindings()) {
- var params = self.buildAttachParams(
- self.deferredAttachState.isNewWindow);
- self.browserPluginNode[PLUGIN_METHOD_ATTACH](self.instanceId, params);
- self.deferredAttachState = null;
- }
- }, 0);
+ var isNewWindow = this.deferredAttachState ?
+ this.deferredAttachState.isNewWindow : false;
+ var params = this.buildAttachParams(isNewWindow);
+ guestViewInternalNatives.AttachPlugin(
+ this.guestInstanceId,
+ this.internalInstanceId,
+ params,
+ this.browserPluginNode);
+ }.bind(this), 0);
}
return;
}
@@ -605,10 +606,9 @@ WebViewInternal.prototype.onSizeChanged = function(newWidth, newHeight) {
}
};
-// Returns true if Browser Plugin bindings is available.
-// Bindings are unavailable if <object> is not in the render tree.
-WebViewInternal.prototype.hasBindings = function() {
- return 'function' == typeof this.browserPluginNode[PLUGIN_METHOD_ATTACH];
+// Returns if <object> is in the render tree.
+WebViewInternal.prototype.isPluginInRenderTree = function() {
+ return !!this.internalInstanceId && this.internalInstanceId != 0;
};
WebViewInternal.prototype.hasNavigated = function() {
@@ -640,7 +640,7 @@ WebViewInternal.prototype.parseSrcAttribute = function(result) {
}
// Navigate to this.src.
- WebView.navigate(this.instanceId, this.src);
+ WebView.navigate(this.guestInstanceId, this.src);
return true;
};
@@ -653,7 +653,7 @@ WebViewInternal.prototype.parseAttributes = function() {
};
WebViewInternal.prototype.hasGuestInstanceID = function() {
- return this.instanceId != undefined;
+ return this.guestInstanceId != undefined;
};
WebViewInternal.prototype.allocateInstanceId = function() {
@@ -667,10 +667,10 @@ WebViewInternal.prototype.allocateInstanceId = function() {
GuestViewInternal.createGuest(
'webview',
params,
- function(instanceId) {
+ function(guestInstanceId) {
// TODO(lazyboy): Make sure this.autoNavigate_ stuff correctly updated
// |self.src| at this point.
- self.attachWindow(instanceId, false);
+ self.attachWindow(guestInstanceId, false);
});
};
@@ -747,43 +747,43 @@ WebViewInternal.prototype.isUserAgentOverridden = function() {
/** @private */
WebViewInternal.prototype.setUserAgentOverride = function(userAgentOverride) {
this.userAgentOverride = userAgentOverride;
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
// If we are not attached yet, then we will pick up the user agent on
// attachment.
return;
}
- WebView.overrideUserAgent(this.instanceId, userAgentOverride);
+ WebView.overrideUserAgent(this.guestInstanceId, userAgentOverride);
};
/** @private */
WebViewInternal.prototype.find = function(search_text, options, callback) {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.find(this.instanceId, search_text, options, callback);
+ WebView.find(this.guestInstanceId, search_text, options, callback);
};
/** @private */
WebViewInternal.prototype.stopFinding = function(action) {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.stopFinding(this.instanceId, action);
+ WebView.stopFinding(this.guestInstanceId, action);
};
/** @private */
WebViewInternal.prototype.setZoom = function(zoomFactor, callback) {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.setZoom(this.instanceId, zoomFactor, callback);
+ WebView.setZoom(this.guestInstanceId, zoomFactor, callback);
};
WebViewInternal.prototype.getZoom = function(callback) {
- if (!this.instanceId) {
+ if (!this.guestInstanceId) {
return;
}
- WebView.getZoom(this.instanceId, callback);
+ WebView.getZoom(this.guestInstanceId, callback);
};
WebViewInternal.prototype.buildAttachParams = function(isNewWindow) {
@@ -801,19 +801,20 @@ WebViewInternal.prototype.buildAttachParams = function(isNewWindow) {
return params;
};
-WebViewInternal.prototype.attachWindow = function(instanceId, isNewWindow) {
- this.instanceId = instanceId;
+WebViewInternal.prototype.attachWindow = function(guestInstanceId,
+ isNewWindow) {
+ this.guestInstanceId = guestInstanceId;
var params = this.buildAttachParams(isNewWindow);
- if (!this.hasBindings()) {
- // No bindings means that the plugin isn't there (display: none), we defer
- // attachWindow in this case.
+ if (!this.isPluginInRenderTree()) {
this.deferredAttachState = {isNewWindow: isNewWindow};
return false;
}
this.deferredAttachState = null;
- return this.browserPluginNode[PLUGIN_METHOD_ATTACH](this.instanceId, params);
+ return guestViewInternalNatives.AttachPlugin(
+ this.guestInstanceId, this.internalInstanceId, params,
+ this.browserPluginNode);
};
// Registers browser plugin <object> custom element.
@@ -872,6 +873,7 @@ function registerWebViewElement() {
return;
}
internal.elementAttached = false;
+ internal.reset();
};
proto.attachedCallback = function() {
@@ -881,7 +883,6 @@ function registerWebViewElement() {
}
if (!internal.elementAttached) {
internal.elementAttached = true;
- internal.resetUponReattachment();
internal.parseAttributes();
}
};
@@ -968,7 +969,7 @@ WebViewInternal.prototype.maybeHandleContextMenu = function(e, webViewEvent) {
// Setting |params| = undefined will show the context menu unmodified, hence
// the 'contextmenu' API is disabled for stable channel.
var params = undefined;
- WebView.showContextMenu(this.instanceId, requestId, params);
+ WebView.showContextMenu(this.guestInstanceId, requestId, params);
};
/**

Powered by Google App Engine
This is Rietveld 408576698