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

Unified Diff: content/renderer/browser_plugin/browser_plugin.cc

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: content/renderer/browser_plugin/browser_plugin.cc
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc
index 3962ccfcab2c2aedc83fb37745842bbd9f78155e..fa155e718a2caf618f125396dc9b5dd7cbbf2e09 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -40,6 +40,14 @@ using blink::WebRect;
using blink::WebURL;
using blink::WebVector;
+namespace {
+typedef std::map<blink::WebPluginContainer*, content::BrowserPlugin*>
+ PluginContainerMap;
+static base::LazyInstance<PluginContainerMap> g_plugin_container_map =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
namespace content {
BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
@@ -47,6 +55,7 @@ BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
bool auto_navigate)
: guest_instance_id_(browser_plugin::kInstanceIDNone),
attached_(false),
+ attach_pending_(false),
render_view_(render_view->AsWeakPtr()),
render_view_routing_id_(render_view->GetRoutingID()),
container_(NULL),
@@ -61,14 +70,18 @@ BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
auto_navigate_(auto_navigate),
mouse_locked_(false),
browser_plugin_manager_(render_view->GetBrowserPluginManager()),
+ in_render_tree_(false),
weak_ptr_factory_(this) {
}
BrowserPlugin::~BrowserPlugin() {
+ if (in_render_tree_) {
+ browser_plugin_manager()->RemoveBrowserPluginInternal(instance_id_);
+ }
// If the BrowserPlugin has never navigated then the browser process and
// BrowserPluginManager don't know about it and so there is nothing to do
// here.
- if (!HasGuestInstanceID())
+ if (!attached())
return;
browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_);
browser_plugin_manager()->Send(
@@ -205,7 +218,7 @@ int BrowserPlugin::GetAdjustedMinWidth() const {
}
void BrowserPlugin::ParseAllowTransparencyAttribute() {
- if (!HasGuestInstanceID())
+ if (!attached())
return;
bool opaque = !GetAllowTransparencyAttribute();
@@ -246,7 +259,7 @@ void BrowserPlugin::UpdateGuestAutoSizeState(bool auto_size_enabled) {
// If we haven't yet heard back from the guest about the last resize request,
// then we don't issue another request until we do in
// BrowserPlugin::OnUpdateRect.
- if (!HasGuestInstanceID() || !paint_ack_received_)
+ if (!attached() || !paint_ack_received_)
return;
BrowserPluginHostMsg_AutoSize_Params auto_size_params;
@@ -264,14 +277,12 @@ void BrowserPlugin::UpdateGuestAutoSizeState(bool auto_size_enabled) {
resize_guest_params));
}
-void BrowserPlugin::Attach(int guest_instance_id,
- scoped_ptr<base::DictionaryValue> extra_params) {
- CHECK(guest_instance_id != browser_plugin::kInstanceIDNone);
+void BrowserPlugin::Attach() {
+ if (attach_pending_)
+ return;
// If this BrowserPlugin is already attached to a guest, then kill the guest.
- if (HasGuestInstanceID()) {
- if (guest_instance_id == guest_instance_id_)
- return;
+ if (attached()) {
guest_crashed_ = false;
EnableCompositing(false);
if (compositing_helper_) {
@@ -283,11 +294,6 @@ void BrowserPlugin::Attach(int guest_instance_id,
render_view_routing_id_, guest_instance_id_));
}
- // This API may be called directly without setting the src attribute.
- // In that case, we need to make sure we don't allocate another instance ID.
- guest_instance_id_ = guest_instance_id;
- browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
-
BrowserPluginHostMsg_Attach_Params attach_params;
attach_params.focused = ShouldGuestBeFocused();
attach_params.visible = visible_;
@@ -297,10 +303,12 @@ void BrowserPlugin::Attach(int guest_instance_id,
&attach_params.resize_guest_params,
false);
- browser_plugin_manager()->Send(
- new BrowserPluginHostMsg_Attach(render_view_routing_id_,
- guest_instance_id_, attach_params,
- *extra_params));
+ browser_plugin_manager()->Send(new BrowserPluginHostMsg_Attach(
+ render_view_routing_id_,
+ instance_id_,
+ attach_params));
+
+ attach_pending_ = true;
}
void BrowserPlugin::DidCommitCompositorFrame() {
@@ -313,8 +321,13 @@ void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) {
render_view_->GetWebView()->advanceFocus(reverse);
}
-void BrowserPlugin::OnAttachACK(int guest_instance_id) {
+void BrowserPlugin::OnAttachACK(int browser_plugin_instance_id,
+ int guest_instance_id) {
+ DCHECK(!attached());
+ guest_instance_id_ = guest_instance_id;
+ browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
attached_ = true;
+ attach_pending_ = false;
}
void BrowserPlugin::OnBuffersSwapped(
@@ -407,9 +420,9 @@ void BrowserPlugin::OnSetMouseLock(int guest_instance_id,
void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id,
bool accept) {
if (container()) {
- container()->requestTouchEventType(accept ?
- blink::WebPluginContainer::TouchEventRequestTypeRaw :
- blink::WebPluginContainer::TouchEventRequestTypeNone);
+ container()->requestTouchEventType(
+ accept ? WebPluginContainer::TouchEventRequestTypeRaw
+ : WebPluginContainer::TouchEventRequestTypeNone);
}
}
@@ -480,10 +493,6 @@ NPObject* BrowserPlugin::GetContentWindow() const {
return guest_frame->windowObject();
}
-bool BrowserPlugin::HasGuestInstanceID() const {
- return guest_instance_id_ != browser_plugin::kInstanceIDNone;
-}
-
void BrowserPlugin::ShowSadGraphic() {
// If the BrowserPlugin is scheduled to be deleted, then container_ will be
// NULL so we shouldn't attempt to access it.
@@ -510,7 +519,7 @@ void BrowserPlugin::UpdateDeviceScaleFactor(float device_scale_factor) {
}
void BrowserPlugin::UpdateGuestFocusState() {
- if (!HasGuestInstanceID())
+ if (!attached())
return;
bool should_be_focused = ShouldGuestBeFocused();
browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus(
@@ -526,7 +535,7 @@ bool BrowserPlugin::ShouldGuestBeFocused() const {
return plugin_focused_ && embedder_focused;
}
-blink::WebPluginContainer* BrowserPlugin::container() const {
+WebPluginContainer* BrowserPlugin::container() const {
return container_;
}
@@ -541,10 +550,18 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) {
bindings_.reset(new BrowserPluginBindings(this));
container_ = container;
container_->setWantsWheelEvents(true);
- // This is a way to notify observers of our attributes that we have the
- // bindings ready. This also means that this plugin is available in render
- // tree.
- UpdateDOMAttribute("internalbindings", "true");
+
+ g_plugin_container_map.Get().insert(std::make_pair(container_, this));
+
+ // This is a way to notify observers of our attributes that this plugin is
+ // available in render tree.
+ const int next_instance_id = browser_plugin_manager()->GetNextInstanceID();
+ instance_id_ = next_instance_id;
+ UpdateDOMAttribute("internalinstanceid",
+ base::StringPrintf("%d", next_instance_id));
+ in_render_tree_ = true;
+
+ browser_plugin_manager()->AddBrowserPluginInternal(instance_id_, this);
return true;
}
@@ -577,6 +594,10 @@ void BrowserPlugin::destroy() {
if (container_)
container_->clearScriptObjects();
+ // The BrowserPlugin's WebPluginContainer is deleted immediately after this
+ // call returns, so let's not keep a reference to it around.
+ g_plugin_container_map.Get().erase(container_);
+
if (compositing_helper_.get())
compositing_helper_->OnContainerDestroy();
container_ = NULL;
@@ -644,12 +665,22 @@ void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) {
canvas->drawRect(image_data_rect, paint);
}
+// static.
+BrowserPlugin* BrowserPlugin::FromNode(blink::WebNode& node) {
+ blink::WebPluginContainer* container = node.pluginContainer();
+ if (!container)
+ return NULL;
+
+ PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer();
+ PluginContainerMap::iterator it = browser_plugins->find(container);
+ return it == browser_plugins->end() ? NULL : it->second;
+}
+
// static
bool BrowserPlugin::ShouldForwardToBrowserPlugin(
const IPC::Message& message) {
switch (message.type()) {
case BrowserPluginMsg_AdvanceFocus::ID:
- case BrowserPluginMsg_Attach_ACK::ID:
case BrowserPluginMsg_BuffersSwapped::ID:
case BrowserPluginMsg_CompositorFrameSwapped::ID:
case BrowserPluginMsg_CopyFromCompositingSurface::ID:
@@ -742,7 +773,7 @@ void BrowserPlugin::updateVisibility(bool visible) {
return;
visible_ = visible;
- if (!HasGuestInstanceID())
+ if (!attached())
return;
if (compositing_helper_.get())
@@ -760,7 +791,7 @@ bool BrowserPlugin::acceptsInputEvents() {
bool BrowserPlugin::handleInputEvent(const blink::WebInputEvent& event,
blink::WebCursorInfo& cursor_info) {
- if (guest_crashed_ || !HasGuestInstanceID())
+ if (guest_crashed_ || !attached())
return false;
if (event.type == blink::WebInputEvent::ContextMenu)
@@ -833,7 +864,7 @@ bool BrowserPlugin::handleDragStatusUpdate(blink::WebDragStatus drag_status,
blink::WebDragOperationsMask mask,
const blink::WebPoint& position,
const blink::WebPoint& screen) {
- if (guest_crashed_ || !HasGuestInstanceID())
+ if (guest_crashed_ || !attached())
return false;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_DragStatusUpdate(
@@ -899,7 +930,7 @@ bool BrowserPlugin::setComposition(
const blink::WebVector<blink::WebCompositionUnderline>& underlines,
int selectionStart,
int selectionEnd) {
- if (!HasGuestInstanceID())
+ if (!attached())
return false;
std::vector<blink::WebCompositionUnderline> std_underlines;
for (size_t i = 0; i < underlines.size(); ++i) {
@@ -919,7 +950,7 @@ bool BrowserPlugin::setComposition(
bool BrowserPlugin::confirmComposition(
const blink::WebString& text,
blink::WebWidget::ConfirmCompositionBehavior selectionBehavior) {
- if (!HasGuestInstanceID())
+ if (!attached())
return false;
bool keep_selection = (selectionBehavior == blink::WebWidget::KeepSelection);
browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeConfirmComposition(
@@ -932,7 +963,7 @@ bool BrowserPlugin::confirmComposition(
}
void BrowserPlugin::extendSelectionAndDelete(int before, int after) {
- if (!HasGuestInstanceID())
+ if (!attached())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_ExtendSelectionAndDelete(
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin.h ('k') | content/renderer/browser_plugin/browser_plugin_bindings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698