Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/browser_plugin/browser_plugin.h" | 5 #include "content/renderer/browser_plugin/browser_plugin.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 content_window_routing_id_(MSG_ROUTING_NONE), | 57 content_window_routing_id_(MSG_ROUTING_NONE), |
| 58 plugin_focused_(false), | 58 plugin_focused_(false), |
| 59 visible_(true), | 59 visible_(true), |
| 60 auto_navigate_(auto_navigate), | 60 auto_navigate_(auto_navigate), |
| 61 mouse_locked_(false), | 61 mouse_locked_(false), |
| 62 browser_plugin_manager_(render_view->GetBrowserPluginManager()), | 62 browser_plugin_manager_(render_view->GetBrowserPluginManager()), |
| 63 weak_ptr_factory_(this) { | 63 weak_ptr_factory_(this) { |
| 64 } | 64 } |
| 65 | 65 |
| 66 BrowserPlugin::~BrowserPlugin() { | 66 BrowserPlugin::~BrowserPlugin() { |
| 67 browser_plugin_manager()->RemoveBrowserPluginInternal( | |
| 68 browser_plugin_instance_id_); | |
| 67 // If the BrowserPlugin has never navigated then the browser process and | 69 // If the BrowserPlugin has never navigated then the browser process and |
| 68 // BrowserPluginManager don't know about it and so there is nothing to do | 70 // BrowserPluginManager don't know about it and so there is nothing to do |
| 69 // here. | 71 // here. |
| 70 if (!HasGuestInstanceID()) | 72 if (!HasGuestInstanceID()) |
| 71 return; | 73 return; |
| 72 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); | 74 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); |
| 73 browser_plugin_manager()->Send( | 75 browser_plugin_manager()->Send( |
| 74 new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_, | 76 new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_, |
| 75 guest_instance_id_)); | 77 guest_instance_id_)); |
| 76 } | 78 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 151 | 153 |
| 152 if (compositing_helper_) | 154 if (compositing_helper_) |
| 153 compositing_helper_->SetContentsOpaque(opaque); | 155 compositing_helper_->SetContentsOpaque(opaque); |
| 154 | 156 |
| 155 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque( | 157 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque( |
| 156 render_view_routing_id_, | 158 render_view_routing_id_, |
| 157 guest_instance_id_, | 159 guest_instance_id_, |
| 158 opaque)); | 160 opaque)); |
| 159 } | 161 } |
| 160 | 162 |
| 161 void BrowserPlugin::Attach(int guest_instance_id, | 163 void BrowserPlugin::Attach(int guest_instance_id) { |
| 162 scoped_ptr<base::DictionaryValue> extra_params) { | 164 CHECK_NE(browser_plugin::kInstanceIDNone, guest_instance_id); |
| 163 CHECK(guest_instance_id != browser_plugin::kInstanceIDNone); | |
| 164 | |
| 165 // If this BrowserPlugin is already attached to a guest, then kill the guest. | 165 // If this BrowserPlugin is already attached to a guest, then kill the guest. |
| 166 if (HasGuestInstanceID()) { | 166 if (HasGuestInstanceID()) { |
| 167 if (guest_instance_id == guest_instance_id_) | 167 if (guest_instance_id == guest_instance_id_) |
| 168 return; | 168 return; |
| 169 guest_crashed_ = false; | 169 guest_crashed_ = false; |
| 170 EnableCompositing(false); | 170 EnableCompositing(false); |
| 171 if (compositing_helper_) { | 171 if (compositing_helper_) { |
| 172 compositing_helper_->OnContainerDestroy(); | 172 compositing_helper_->OnContainerDestroy(); |
| 173 compositing_helper_ = NULL; | 173 compositing_helper_ = NULL; |
| 174 } | 174 } |
| 175 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); | 175 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); |
| 176 browser_plugin_manager()->Send(new BrowserPluginHostMsg_PluginDestroyed( | 176 browser_plugin_manager()->Send(new BrowserPluginHostMsg_PluginDestroyed( |
| 177 render_view_routing_id_, guest_instance_id_)); | 177 render_view_routing_id_, guest_instance_id_)); |
| 178 } | 178 } |
| 179 | 179 |
| 180 // This API may be called directly without setting the src attribute. | |
| 181 // In that case, we need to make sure we don't allocate another instance ID. | |
| 182 guest_instance_id_ = guest_instance_id; | 180 guest_instance_id_ = guest_instance_id; |
| 183 browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this); | 181 browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this); |
| 184 | 182 |
| 185 BrowserPluginHostMsg_Attach_Params attach_params; | 183 BrowserPluginHostMsg_Attach_Params attach_params; |
| 186 attach_params.focused = ShouldGuestBeFocused(); | 184 attach_params.focused = ShouldGuestBeFocused(); |
| 187 attach_params.visible = visible_; | 185 attach_params.visible = visible_; |
| 188 attach_params.opaque = !GetAllowTransparencyAttribute(); | 186 attach_params.opaque = !GetAllowTransparencyAttribute(); |
| 189 attach_params.origin = plugin_rect().origin(); | 187 attach_params.origin = plugin_rect().origin(); |
| 190 GetSizeParams(&attach_params.resize_guest_params, false); | 188 GetSizeParams(&attach_params.resize_guest_params, false); |
| 191 | 189 |
| 192 browser_plugin_manager()->Send( | 190 browser_plugin_manager()->Send(new BrowserPluginHostMsg_Attach( |
| 193 new BrowserPluginHostMsg_Attach(render_view_routing_id_, | 191 render_view_routing_id_, |
| 194 guest_instance_id_, attach_params, | 192 browser_plugin_instance_id_, |
| 195 *extra_params)); | 193 attach_params)); |
| 196 } | 194 } |
| 197 | 195 |
| 198 void BrowserPlugin::DidCommitCompositorFrame() { | 196 void BrowserPlugin::DidCommitCompositorFrame() { |
| 199 if (compositing_helper_.get()) | 197 if (compositing_helper_.get()) |
| 200 compositing_helper_->DidCommitCompositorFrame(); | 198 compositing_helper_->DidCommitCompositorFrame(); |
| 201 } | 199 } |
| 202 | 200 |
| 203 void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) { | 201 void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) { |
| 204 DCHECK(render_view_.get()); | 202 DCHECK(render_view_.get()); |
| 205 render_view_->GetWebView()->advanceFocus(reverse); | 203 render_view_->GetWebView()->advanceFocus(reverse); |
| 206 } | 204 } |
| 207 | 205 |
| 208 void BrowserPlugin::OnAttachACK(int guest_instance_id) { | 206 void BrowserPlugin::OnAttachACK(int guest_instance_id) { |
| 207 DCHECK(!attached()); | |
| 209 attached_ = true; | 208 attached_ = true; |
| 210 } | 209 } |
| 211 | 210 |
| 212 void BrowserPlugin::OnBuffersSwapped( | 211 void BrowserPlugin::OnBuffersSwapped( |
| 213 int instance_id, | 212 int instance_id, |
| 214 const FrameMsg_BuffersSwapped_Params& params) { | 213 const FrameMsg_BuffersSwapped_Params& params) { |
| 215 EnableCompositing(true); | 214 EnableCompositing(true); |
| 216 | 215 |
| 217 compositing_helper_->OnBuffersSwapped(params.size, | 216 compositing_helper_->OnBuffersSwapped(params.size, |
| 218 params.mailbox, | 217 params.mailbox, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 292 OnLockMouseACK(false); | 291 OnLockMouseACK(false); |
| 293 return; | 292 return; |
| 294 } | 293 } |
| 295 render_view_->mouse_lock_dispatcher()->UnlockMouse(this); | 294 render_view_->mouse_lock_dispatcher()->UnlockMouse(this); |
| 296 } | 295 } |
| 297 } | 296 } |
| 298 | 297 |
| 299 void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id, | 298 void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id, |
| 300 bool accept) { | 299 bool accept) { |
| 301 if (container()) { | 300 if (container()) { |
| 302 container()->requestTouchEventType(accept ? | 301 container()->requestTouchEventType( |
| 303 blink::WebPluginContainer::TouchEventRequestTypeRaw : | 302 accept ? WebPluginContainer::TouchEventRequestTypeRaw |
| 304 blink::WebPluginContainer::TouchEventRequestTypeNone); | 303 : WebPluginContainer::TouchEventRequestTypeNone); |
| 305 } | 304 } |
| 306 } | 305 } |
| 307 | 306 |
| 308 void BrowserPlugin::OnUpdateRect( | 307 void BrowserPlugin::OnUpdateRect( |
| 309 int guest_instance_id, | 308 int guest_instance_id, |
| 310 const BrowserPluginMsg_UpdateRect_Params& params) { | 309 const BrowserPluginMsg_UpdateRect_Params& params) { |
| 311 // Note that there is no need to send ACK for this message. | 310 // Note that there is no need to send ACK for this message. |
| 312 // If the guest has updated pixels then it is no longer crashed. | 311 // If the guest has updated pixels then it is no longer crashed. |
| 313 guest_crashed_ = false; | 312 guest_crashed_ = false; |
| 314 | 313 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 should_be_focused)); | 381 should_be_focused)); |
| 383 } | 382 } |
| 384 | 383 |
| 385 bool BrowserPlugin::ShouldGuestBeFocused() const { | 384 bool BrowserPlugin::ShouldGuestBeFocused() const { |
| 386 bool embedder_focused = false; | 385 bool embedder_focused = false; |
| 387 if (render_view_.get()) | 386 if (render_view_.get()) |
| 388 embedder_focused = render_view_->has_focus(); | 387 embedder_focused = render_view_->has_focus(); |
| 389 return plugin_focused_ && embedder_focused; | 388 return plugin_focused_ && embedder_focused; |
| 390 } | 389 } |
| 391 | 390 |
| 392 blink::WebPluginContainer* BrowserPlugin::container() const { | 391 WebPluginContainer* BrowserPlugin::container() const { |
| 393 return container_; | 392 return container_; |
| 394 } | 393 } |
| 395 | 394 |
| 396 bool BrowserPlugin::initialize(WebPluginContainer* container) { | 395 bool BrowserPlugin::initialize(WebPluginContainer* container) { |
| 397 if (!container) | 396 if (!container) |
| 398 return false; | 397 return false; |
| 399 | 398 |
| 400 // Tell |container| to allow this plugin to use script objects. | 399 // Tell |container| to allow this plugin to use script objects. |
| 401 npp_.reset(new NPP_t); | 400 npp_.reset(new NPP_t); |
| 402 container->allowScriptObjects(); | 401 container->allowScriptObjects(); |
| 403 | 402 |
| 404 bindings_.reset(new BrowserPluginBindings(this)); | 403 bindings_.reset(new BrowserPluginBindings(this)); |
| 405 container_ = container; | 404 container_ = container; |
| 406 container_->setWantsWheelEvents(true); | 405 container_->setWantsWheelEvents(true); |
| 407 // This is a way to notify observers of our attributes that we have the | 406 |
| 408 // bindings ready. This also means that this plugin is available in render | 407 // This is a way to notify observers of our attributes that this plugin is |
| 409 // tree. | 408 // available in render tree. |
| 410 UpdateDOMAttribute("internalbindings", "true"); | 409 browser_plugin_instance_id_ = browser_plugin_manager()->GetNextInstanceID(); |
| 410 UpdateDOMAttribute("internalinstanceid", | |
| 411 base::StringPrintf("%d", browser_plugin_instance_id_)); | |
| 412 | |
| 413 browser_plugin_manager()->AddBrowserPluginInternal( | |
| 414 browser_plugin_instance_id_, this); | |
| 411 return true; | 415 return true; |
| 412 } | 416 } |
| 413 | 417 |
| 414 void BrowserPlugin::EnableCompositing(bool enable) { | 418 void BrowserPlugin::EnableCompositing(bool enable) { |
| 415 bool enabled = !!compositing_helper_; | 419 bool enabled = !!compositing_helper_; |
| 416 if (enabled == enable) | 420 if (enabled == enable) |
| 417 return; | 421 return; |
| 418 | 422 |
| 419 if (enable) { | 423 if (enable) { |
| 420 DCHECK(!compositing_helper_.get()); | 424 DCHECK(!compositing_helper_.get()); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 504 SkPaint paint; | 508 SkPaint paint; |
| 505 paint.setStyle(SkPaint::kFill_Style); | 509 paint.setStyle(SkPaint::kFill_Style); |
| 506 paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE); | 510 paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE); |
| 507 canvas->drawRect(image_data_rect, paint); | 511 canvas->drawRect(image_data_rect, paint); |
| 508 } | 512 } |
| 509 | 513 |
| 510 // static | 514 // static |
| 511 bool BrowserPlugin::ShouldForwardToBrowserPlugin( | 515 bool BrowserPlugin::ShouldForwardToBrowserPlugin( |
| 512 const IPC::Message& message) { | 516 const IPC::Message& message) { |
| 513 switch (message.type()) { | 517 switch (message.type()) { |
| 518 case BrowserPluginMsg_Attach_ACK::ID: | |
|
Xi Han
2014/08/12 18:17:55
Please sort it alphabetically, i.e., move to after
Fady Samuel
2014/08/13 22:24:39
Done.
| |
| 514 case BrowserPluginMsg_AdvanceFocus::ID: | 519 case BrowserPluginMsg_AdvanceFocus::ID: |
| 515 case BrowserPluginMsg_Attach_ACK::ID: | |
| 516 case BrowserPluginMsg_BuffersSwapped::ID: | 520 case BrowserPluginMsg_BuffersSwapped::ID: |
| 517 case BrowserPluginMsg_CompositorFrameSwapped::ID: | 521 case BrowserPluginMsg_CompositorFrameSwapped::ID: |
| 518 case BrowserPluginMsg_CopyFromCompositingSurface::ID: | 522 case BrowserPluginMsg_CopyFromCompositingSurface::ID: |
| 519 case BrowserPluginMsg_GuestContentWindowReady::ID: | 523 case BrowserPluginMsg_GuestContentWindowReady::ID: |
| 520 case BrowserPluginMsg_GuestGone::ID: | 524 case BrowserPluginMsg_GuestGone::ID: |
| 521 case BrowserPluginMsg_SetCursor::ID: | 525 case BrowserPluginMsg_SetCursor::ID: |
| 522 case BrowserPluginMsg_SetMouseLock::ID: | 526 case BrowserPluginMsg_SetMouseLock::ID: |
| 523 case BrowserPluginMsg_ShouldAcceptTouchEvents::ID: | 527 case BrowserPluginMsg_ShouldAcceptTouchEvents::ID: |
| 524 case BrowserPluginMsg_UpdateRect::ID: | 528 case BrowserPluginMsg_UpdateRect::ID: |
| 525 return true; | 529 return true; |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 816 const blink::WebMouseEvent& event) { | 820 const blink::WebMouseEvent& event) { |
| 817 browser_plugin_manager()->Send( | 821 browser_plugin_manager()->Send( |
| 818 new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, | 822 new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, |
| 819 guest_instance_id_, | 823 guest_instance_id_, |
| 820 plugin_rect_, | 824 plugin_rect_, |
| 821 &event)); | 825 &event)); |
| 822 return true; | 826 return true; |
| 823 } | 827 } |
| 824 | 828 |
| 825 } // namespace content | 829 } // namespace content |
| OLD | NEW |