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

Side by Side 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 unified diff | Download patch
OLDNEW
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 22 matching lines...) Expand all
33 #include "ui/events/keycodes/keyboard_codes.h" 33 #include "ui/events/keycodes/keyboard_codes.h"
34 34
35 using blink::WebCanvas; 35 using blink::WebCanvas;
36 using blink::WebPluginContainer; 36 using blink::WebPluginContainer;
37 using blink::WebPluginParams; 37 using blink::WebPluginParams;
38 using blink::WebPoint; 38 using blink::WebPoint;
39 using blink::WebRect; 39 using blink::WebRect;
40 using blink::WebURL; 40 using blink::WebURL;
41 using blink::WebVector; 41 using blink::WebVector;
42 42
43 namespace {
44 typedef std::map<blink::WebPluginContainer*, content::BrowserPlugin*>
45 PluginContainerMap;
46 static base::LazyInstance<PluginContainerMap> g_plugin_container_map =
47 LAZY_INSTANCE_INITIALIZER;
48
49 } // namespace
50
43 namespace content { 51 namespace content {
44 52
45 BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view, 53 BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
46 blink::WebFrame* frame, 54 blink::WebFrame* frame,
47 bool auto_navigate) 55 bool auto_navigate)
48 : guest_instance_id_(browser_plugin::kInstanceIDNone), 56 : guest_instance_id_(browser_plugin::kInstanceIDNone),
49 attached_(false), 57 attached_(false),
58 attach_pending_(false),
50 render_view_(render_view->AsWeakPtr()), 59 render_view_(render_view->AsWeakPtr()),
51 render_view_routing_id_(render_view->GetRoutingID()), 60 render_view_routing_id_(render_view->GetRoutingID()),
52 container_(NULL), 61 container_(NULL),
53 paint_ack_received_(true), 62 paint_ack_received_(true),
54 last_device_scale_factor_(GetDeviceScaleFactor()), 63 last_device_scale_factor_(GetDeviceScaleFactor()),
55 sad_guest_(NULL), 64 sad_guest_(NULL),
56 guest_crashed_(false), 65 guest_crashed_(false),
57 is_auto_size_state_dirty_(false), 66 is_auto_size_state_dirty_(false),
58 content_window_routing_id_(MSG_ROUTING_NONE), 67 content_window_routing_id_(MSG_ROUTING_NONE),
59 plugin_focused_(false), 68 plugin_focused_(false),
60 visible_(true), 69 visible_(true),
61 auto_navigate_(auto_navigate), 70 auto_navigate_(auto_navigate),
62 mouse_locked_(false), 71 mouse_locked_(false),
63 browser_plugin_manager_(render_view->GetBrowserPluginManager()), 72 browser_plugin_manager_(render_view->GetBrowserPluginManager()),
73 in_render_tree_(false),
64 weak_ptr_factory_(this) { 74 weak_ptr_factory_(this) {
65 } 75 }
66 76
67 BrowserPlugin::~BrowserPlugin() { 77 BrowserPlugin::~BrowserPlugin() {
78 if (in_render_tree_) {
79 browser_plugin_manager()->RemoveBrowserPluginInternal(instance_id_);
80 }
68 // If the BrowserPlugin has never navigated then the browser process and 81 // If the BrowserPlugin has never navigated then the browser process and
69 // BrowserPluginManager don't know about it and so there is nothing to do 82 // BrowserPluginManager don't know about it and so there is nothing to do
70 // here. 83 // here.
71 if (!HasGuestInstanceID()) 84 if (!attached())
72 return; 85 return;
73 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); 86 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_);
74 browser_plugin_manager()->Send( 87 browser_plugin_manager()->Send(
75 new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_, 88 new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_,
76 guest_instance_id_)); 89 guest_instance_id_));
77 } 90 }
78 91
79 bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) { 92 bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
80 bool handled = true; 93 bool handled = true;
81 IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message) 94 IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message)
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 int BrowserPlugin::GetAdjustedMinWidth() const { 211 int BrowserPlugin::GetAdjustedMinWidth() const {
199 int min_width = GetMinWidthAttribute(); 212 int min_width = GetMinWidthAttribute();
200 // FrameView.cpp does not allow this value to be <= 0, so when the value is 213 // FrameView.cpp does not allow this value to be <= 0, so when the value is
201 // unset (or set to 0), we set it to the container size. 214 // unset (or set to 0), we set it to the container size.
202 min_width = min_width ? min_width : width(); 215 min_width = min_width ? min_width : width();
203 // For autosize, minWidth should not be bigger than maxWidth. 216 // For autosize, minWidth should not be bigger than maxWidth.
204 return std::min(min_width, GetAdjustedMaxWidth()); 217 return std::min(min_width, GetAdjustedMaxWidth());
205 } 218 }
206 219
207 void BrowserPlugin::ParseAllowTransparencyAttribute() { 220 void BrowserPlugin::ParseAllowTransparencyAttribute() {
208 if (!HasGuestInstanceID()) 221 if (!attached())
209 return; 222 return;
210 223
211 bool opaque = !GetAllowTransparencyAttribute(); 224 bool opaque = !GetAllowTransparencyAttribute();
212 225
213 if (compositing_helper_) 226 if (compositing_helper_)
214 compositing_helper_->SetContentsOpaque(opaque); 227 compositing_helper_->SetContentsOpaque(opaque);
215 228
216 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque( 229 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque(
217 render_view_routing_id_, 230 render_view_routing_id_,
218 guest_instance_id_, 231 guest_instance_id_,
(...skipping 20 matching lines...) Expand all
239 max_auto_size_ = params->max_size; 252 max_auto_size_ = params->max_size;
240 } else { 253 } else {
241 max_auto_size_ = gfx::Size(); 254 max_auto_size_ = gfx::Size();
242 } 255 }
243 } 256 }
244 257
245 void BrowserPlugin::UpdateGuestAutoSizeState(bool auto_size_enabled) { 258 void BrowserPlugin::UpdateGuestAutoSizeState(bool auto_size_enabled) {
246 // If we haven't yet heard back from the guest about the last resize request, 259 // If we haven't yet heard back from the guest about the last resize request,
247 // then we don't issue another request until we do in 260 // then we don't issue another request until we do in
248 // BrowserPlugin::OnUpdateRect. 261 // BrowserPlugin::OnUpdateRect.
249 if (!HasGuestInstanceID() || !paint_ack_received_) 262 if (!attached() || !paint_ack_received_)
250 return; 263 return;
251 264
252 BrowserPluginHostMsg_AutoSize_Params auto_size_params; 265 BrowserPluginHostMsg_AutoSize_Params auto_size_params;
253 BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; 266 BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params;
254 if (auto_size_enabled) { 267 if (auto_size_enabled) {
255 GetSizeParams(&auto_size_params, &resize_guest_params, true); 268 GetSizeParams(&auto_size_params, &resize_guest_params, true);
256 } else { 269 } else {
257 GetSizeParams(NULL, &resize_guest_params, true); 270 GetSizeParams(NULL, &resize_guest_params, true);
258 } 271 }
259 paint_ack_received_ = false; 272 paint_ack_received_ = false;
260 browser_plugin_manager()->Send( 273 browser_plugin_manager()->Send(
261 new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_, 274 new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_,
262 guest_instance_id_, 275 guest_instance_id_,
263 auto_size_params, 276 auto_size_params,
264 resize_guest_params)); 277 resize_guest_params));
265 } 278 }
266 279
267 void BrowserPlugin::Attach(int guest_instance_id, 280 void BrowserPlugin::Attach() {
268 scoped_ptr<base::DictionaryValue> extra_params) { 281 if (attach_pending_)
269 CHECK(guest_instance_id != browser_plugin::kInstanceIDNone); 282 return;
270 283
271 // If this BrowserPlugin is already attached to a guest, then kill the guest. 284 // If this BrowserPlugin is already attached to a guest, then kill the guest.
272 if (HasGuestInstanceID()) { 285 if (attached()) {
273 if (guest_instance_id == guest_instance_id_)
274 return;
275 guest_crashed_ = false; 286 guest_crashed_ = false;
276 EnableCompositing(false); 287 EnableCompositing(false);
277 if (compositing_helper_) { 288 if (compositing_helper_) {
278 compositing_helper_->OnContainerDestroy(); 289 compositing_helper_->OnContainerDestroy();
279 compositing_helper_ = NULL; 290 compositing_helper_ = NULL;
280 } 291 }
281 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); 292 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_);
282 browser_plugin_manager()->Send(new BrowserPluginHostMsg_PluginDestroyed( 293 browser_plugin_manager()->Send(new BrowserPluginHostMsg_PluginDestroyed(
283 render_view_routing_id_, guest_instance_id_)); 294 render_view_routing_id_, guest_instance_id_));
284 } 295 }
285 296
286 // This API may be called directly without setting the src attribute.
287 // In that case, we need to make sure we don't allocate another instance ID.
288 guest_instance_id_ = guest_instance_id;
289 browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
290
291 BrowserPluginHostMsg_Attach_Params attach_params; 297 BrowserPluginHostMsg_Attach_Params attach_params;
292 attach_params.focused = ShouldGuestBeFocused(); 298 attach_params.focused = ShouldGuestBeFocused();
293 attach_params.visible = visible_; 299 attach_params.visible = visible_;
294 attach_params.opaque = !GetAllowTransparencyAttribute(); 300 attach_params.opaque = !GetAllowTransparencyAttribute();
295 attach_params.origin = plugin_rect().origin(); 301 attach_params.origin = plugin_rect().origin();
296 GetSizeParams(&attach_params.auto_size_params, 302 GetSizeParams(&attach_params.auto_size_params,
297 &attach_params.resize_guest_params, 303 &attach_params.resize_guest_params,
298 false); 304 false);
299 305
300 browser_plugin_manager()->Send( 306 browser_plugin_manager()->Send(new BrowserPluginHostMsg_Attach(
301 new BrowserPluginHostMsg_Attach(render_view_routing_id_, 307 render_view_routing_id_,
302 guest_instance_id_, attach_params, 308 instance_id_,
303 *extra_params)); 309 attach_params));
310
311 attach_pending_ = true;
304 } 312 }
305 313
306 void BrowserPlugin::DidCommitCompositorFrame() { 314 void BrowserPlugin::DidCommitCompositorFrame() {
307 if (compositing_helper_.get()) 315 if (compositing_helper_.get())
308 compositing_helper_->DidCommitCompositorFrame(); 316 compositing_helper_->DidCommitCompositorFrame();
309 } 317 }
310 318
311 void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) { 319 void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) {
312 DCHECK(render_view_.get()); 320 DCHECK(render_view_.get());
313 render_view_->GetWebView()->advanceFocus(reverse); 321 render_view_->GetWebView()->advanceFocus(reverse);
314 } 322 }
315 323
316 void BrowserPlugin::OnAttachACK(int guest_instance_id) { 324 void BrowserPlugin::OnAttachACK(int browser_plugin_instance_id,
325 int guest_instance_id) {
326 DCHECK(!attached());
327 guest_instance_id_ = guest_instance_id;
328 browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
317 attached_ = true; 329 attached_ = true;
330 attach_pending_ = false;
318 } 331 }
319 332
320 void BrowserPlugin::OnBuffersSwapped( 333 void BrowserPlugin::OnBuffersSwapped(
321 int instance_id, 334 int instance_id,
322 const FrameMsg_BuffersSwapped_Params& params) { 335 const FrameMsg_BuffersSwapped_Params& params) {
323 EnableCompositing(true); 336 EnableCompositing(true);
324 337
325 compositing_helper_->OnBuffersSwapped(params.size, 338 compositing_helper_->OnBuffersSwapped(params.size,
326 params.mailbox, 339 params.mailbox,
327 params.gpu_route_id, 340 params.gpu_route_id,
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 OnLockMouseACK(false); 413 OnLockMouseACK(false);
401 return; 414 return;
402 } 415 }
403 render_view_->mouse_lock_dispatcher()->UnlockMouse(this); 416 render_view_->mouse_lock_dispatcher()->UnlockMouse(this);
404 } 417 }
405 } 418 }
406 419
407 void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id, 420 void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id,
408 bool accept) { 421 bool accept) {
409 if (container()) { 422 if (container()) {
410 container()->requestTouchEventType(accept ? 423 container()->requestTouchEventType(
411 blink::WebPluginContainer::TouchEventRequestTypeRaw : 424 accept ? WebPluginContainer::TouchEventRequestTypeRaw
412 blink::WebPluginContainer::TouchEventRequestTypeNone); 425 : WebPluginContainer::TouchEventRequestTypeNone);
413 } 426 }
414 } 427 }
415 428
416 void BrowserPlugin::OnUpdateRect( 429 void BrowserPlugin::OnUpdateRect(
417 int guest_instance_id, 430 int guest_instance_id,
418 const BrowserPluginMsg_UpdateRect_Params& params) { 431 const BrowserPluginMsg_UpdateRect_Params& params) {
419 // Note that there is no need to send ACK for this message. 432 // Note that there is no need to send ACK for this message.
420 // If the guest has updated pixels then it is no longer crashed. 433 // If the guest has updated pixels then it is no longer crashed.
421 guest_crashed_ = false; 434 guest_crashed_ = false;
422 435
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 if (content_window_routing_id_ == MSG_ROUTING_NONE) 486 if (content_window_routing_id_ == MSG_ROUTING_NONE)
474 return NULL; 487 return NULL;
475 RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID( 488 RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID(
476 content_window_routing_id_); 489 content_window_routing_id_);
477 if (!guest_render_view) 490 if (!guest_render_view)
478 return NULL; 491 return NULL;
479 blink::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame(); 492 blink::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame();
480 return guest_frame->windowObject(); 493 return guest_frame->windowObject();
481 } 494 }
482 495
483 bool BrowserPlugin::HasGuestInstanceID() const {
484 return guest_instance_id_ != browser_plugin::kInstanceIDNone;
485 }
486
487 void BrowserPlugin::ShowSadGraphic() { 496 void BrowserPlugin::ShowSadGraphic() {
488 // If the BrowserPlugin is scheduled to be deleted, then container_ will be 497 // If the BrowserPlugin is scheduled to be deleted, then container_ will be
489 // NULL so we shouldn't attempt to access it. 498 // NULL so we shouldn't attempt to access it.
490 if (container_) 499 if (container_)
491 container_->invalidate(); 500 container_->invalidate();
492 } 501 }
493 502
494 float BrowserPlugin::GetDeviceScaleFactor() const { 503 float BrowserPlugin::GetDeviceScaleFactor() const {
495 if (!render_view_.get()) 504 if (!render_view_.get())
496 return 1.0f; 505 return 1.0f;
497 return render_view_->GetWebView()->deviceScaleFactor(); 506 return render_view_->GetWebView()->deviceScaleFactor();
498 } 507 }
499 508
500 void BrowserPlugin::UpdateDeviceScaleFactor(float device_scale_factor) { 509 void BrowserPlugin::UpdateDeviceScaleFactor(float device_scale_factor) {
501 if (last_device_scale_factor_ == device_scale_factor || !paint_ack_received_) 510 if (last_device_scale_factor_ == device_scale_factor || !paint_ack_received_)
502 return; 511 return;
503 512
504 BrowserPluginHostMsg_ResizeGuest_Params params; 513 BrowserPluginHostMsg_ResizeGuest_Params params;
505 PopulateResizeGuestParameters(&params, plugin_size(), true); 514 PopulateResizeGuestParameters(&params, plugin_size(), true);
506 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 515 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
507 render_view_routing_id_, 516 render_view_routing_id_,
508 guest_instance_id_, 517 guest_instance_id_,
509 params)); 518 params));
510 } 519 }
511 520
512 void BrowserPlugin::UpdateGuestFocusState() { 521 void BrowserPlugin::UpdateGuestFocusState() {
513 if (!HasGuestInstanceID()) 522 if (!attached())
514 return; 523 return;
515 bool should_be_focused = ShouldGuestBeFocused(); 524 bool should_be_focused = ShouldGuestBeFocused();
516 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus( 525 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus(
517 render_view_routing_id_, 526 render_view_routing_id_,
518 guest_instance_id_, 527 guest_instance_id_,
519 should_be_focused)); 528 should_be_focused));
520 } 529 }
521 530
522 bool BrowserPlugin::ShouldGuestBeFocused() const { 531 bool BrowserPlugin::ShouldGuestBeFocused() const {
523 bool embedder_focused = false; 532 bool embedder_focused = false;
524 if (render_view_.get()) 533 if (render_view_.get())
525 embedder_focused = render_view_->has_focus(); 534 embedder_focused = render_view_->has_focus();
526 return plugin_focused_ && embedder_focused; 535 return plugin_focused_ && embedder_focused;
527 } 536 }
528 537
529 blink::WebPluginContainer* BrowserPlugin::container() const { 538 WebPluginContainer* BrowserPlugin::container() const {
530 return container_; 539 return container_;
531 } 540 }
532 541
533 bool BrowserPlugin::initialize(WebPluginContainer* container) { 542 bool BrowserPlugin::initialize(WebPluginContainer* container) {
534 if (!container) 543 if (!container)
535 return false; 544 return false;
536 545
537 // Tell |container| to allow this plugin to use script objects. 546 // Tell |container| to allow this plugin to use script objects.
538 npp_.reset(new NPP_t); 547 npp_.reset(new NPP_t);
539 container->allowScriptObjects(); 548 container->allowScriptObjects();
540 549
541 bindings_.reset(new BrowserPluginBindings(this)); 550 bindings_.reset(new BrowserPluginBindings(this));
542 container_ = container; 551 container_ = container;
543 container_->setWantsWheelEvents(true); 552 container_->setWantsWheelEvents(true);
544 // This is a way to notify observers of our attributes that we have the 553
545 // bindings ready. This also means that this plugin is available in render 554 g_plugin_container_map.Get().insert(std::make_pair(container_, this));
546 // tree. 555
547 UpdateDOMAttribute("internalbindings", "true"); 556 // This is a way to notify observers of our attributes that this plugin is
557 // available in render tree.
558 const int next_instance_id = browser_plugin_manager()->GetNextInstanceID();
559 instance_id_ = next_instance_id;
560 UpdateDOMAttribute("internalinstanceid",
561 base::StringPrintf("%d", next_instance_id));
562 in_render_tree_ = true;
563
564 browser_plugin_manager()->AddBrowserPluginInternal(instance_id_, this);
548 return true; 565 return true;
549 } 566 }
550 567
551 void BrowserPlugin::EnableCompositing(bool enable) { 568 void BrowserPlugin::EnableCompositing(bool enable) {
552 bool enabled = !!compositing_helper_; 569 bool enabled = !!compositing_helper_;
553 if (enabled == enable) 570 if (enabled == enable)
554 return; 571 return;
555 572
556 if (enable) { 573 if (enable) {
557 DCHECK(!compositing_helper_.get()); 574 DCHECK(!compositing_helper_.get());
(...skipping 12 matching lines...) Expand all
570 } 587 }
571 } 588 }
572 589
573 void BrowserPlugin::destroy() { 590 void BrowserPlugin::destroy() {
574 // If the plugin was initialized then it has a valid |npp_| identifier, and 591 // If the plugin was initialized then it has a valid |npp_| identifier, and
575 // the |container_| must clear references to the plugin's script objects. 592 // the |container_| must clear references to the plugin's script objects.
576 DCHECK(!npp_ || container_); 593 DCHECK(!npp_ || container_);
577 if (container_) 594 if (container_)
578 container_->clearScriptObjects(); 595 container_->clearScriptObjects();
579 596
597 // The BrowserPlugin's WebPluginContainer is deleted immediately after this
598 // call returns, so let's not keep a reference to it around.
599 g_plugin_container_map.Get().erase(container_);
600
580 if (compositing_helper_.get()) 601 if (compositing_helper_.get())
581 compositing_helper_->OnContainerDestroy(); 602 compositing_helper_->OnContainerDestroy();
582 container_ = NULL; 603 container_ = NULL;
583 // Will be a no-op if the mouse is not currently locked. 604 // Will be a no-op if the mouse is not currently locked.
584 if (render_view_.get()) 605 if (render_view_.get())
585 render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(this); 606 render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(this);
586 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 607 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
587 } 608 }
588 609
589 NPObject* BrowserPlugin::scriptableObject() { 610 NPObject* BrowserPlugin::scriptableObject() {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 SkIntToScalar(plugin_rect_.height())); 658 SkIntToScalar(plugin_rect_.height()));
638 canvas->clipRect(image_data_rect); 659 canvas->clipRect(image_data_rect);
639 // Paint black or white in case we have nothing in our backing store or we 660 // Paint black or white in case we have nothing in our backing store or we
640 // need to show a gutter. 661 // need to show a gutter.
641 SkPaint paint; 662 SkPaint paint;
642 paint.setStyle(SkPaint::kFill_Style); 663 paint.setStyle(SkPaint::kFill_Style);
643 paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE); 664 paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE);
644 canvas->drawRect(image_data_rect, paint); 665 canvas->drawRect(image_data_rect, paint);
645 } 666 }
646 667
668 // static.
669 BrowserPlugin* BrowserPlugin::FromNode(blink::WebNode& node) {
670 blink::WebPluginContainer* container = node.pluginContainer();
671 if (!container)
672 return NULL;
673
674 PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer();
675 PluginContainerMap::iterator it = browser_plugins->find(container);
676 return it == browser_plugins->end() ? NULL : it->second;
677 }
678
647 // static 679 // static
648 bool BrowserPlugin::ShouldForwardToBrowserPlugin( 680 bool BrowserPlugin::ShouldForwardToBrowserPlugin(
649 const IPC::Message& message) { 681 const IPC::Message& message) {
650 switch (message.type()) { 682 switch (message.type()) {
651 case BrowserPluginMsg_AdvanceFocus::ID: 683 case BrowserPluginMsg_AdvanceFocus::ID:
652 case BrowserPluginMsg_Attach_ACK::ID:
653 case BrowserPluginMsg_BuffersSwapped::ID: 684 case BrowserPluginMsg_BuffersSwapped::ID:
654 case BrowserPluginMsg_CompositorFrameSwapped::ID: 685 case BrowserPluginMsg_CompositorFrameSwapped::ID:
655 case BrowserPluginMsg_CopyFromCompositingSurface::ID: 686 case BrowserPluginMsg_CopyFromCompositingSurface::ID:
656 case BrowserPluginMsg_GuestContentWindowReady::ID: 687 case BrowserPluginMsg_GuestContentWindowReady::ID:
657 case BrowserPluginMsg_GuestGone::ID: 688 case BrowserPluginMsg_GuestGone::ID:
658 case BrowserPluginMsg_SetCursor::ID: 689 case BrowserPluginMsg_SetCursor::ID:
659 case BrowserPluginMsg_SetMouseLock::ID: 690 case BrowserPluginMsg_SetMouseLock::ID:
660 case BrowserPluginMsg_ShouldAcceptTouchEvents::ID: 691 case BrowserPluginMsg_ShouldAcceptTouchEvents::ID:
661 case BrowserPluginMsg_UpdateRect::ID: 692 case BrowserPluginMsg_UpdateRect::ID:
662 return true; 693 return true;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 void BrowserPlugin::updateFocus(bool focused) { 766 void BrowserPlugin::updateFocus(bool focused) {
736 plugin_focused_ = focused; 767 plugin_focused_ = focused;
737 UpdateGuestFocusState(); 768 UpdateGuestFocusState();
738 } 769 }
739 770
740 void BrowserPlugin::updateVisibility(bool visible) { 771 void BrowserPlugin::updateVisibility(bool visible) {
741 if (visible_ == visible) 772 if (visible_ == visible)
742 return; 773 return;
743 774
744 visible_ = visible; 775 visible_ = visible;
745 if (!HasGuestInstanceID()) 776 if (!attached())
746 return; 777 return;
747 778
748 if (compositing_helper_.get()) 779 if (compositing_helper_.get())
749 compositing_helper_->UpdateVisibility(visible); 780 compositing_helper_->UpdateVisibility(visible);
750 781
751 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetVisibility( 782 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetVisibility(
752 render_view_routing_id_, 783 render_view_routing_id_,
753 guest_instance_id_, 784 guest_instance_id_,
754 visible)); 785 visible));
755 } 786 }
756 787
757 bool BrowserPlugin::acceptsInputEvents() { 788 bool BrowserPlugin::acceptsInputEvents() {
758 return true; 789 return true;
759 } 790 }
760 791
761 bool BrowserPlugin::handleInputEvent(const blink::WebInputEvent& event, 792 bool BrowserPlugin::handleInputEvent(const blink::WebInputEvent& event,
762 blink::WebCursorInfo& cursor_info) { 793 blink::WebCursorInfo& cursor_info) {
763 if (guest_crashed_ || !HasGuestInstanceID()) 794 if (guest_crashed_ || !attached())
764 return false; 795 return false;
765 796
766 if (event.type == blink::WebInputEvent::ContextMenu) 797 if (event.type == blink::WebInputEvent::ContextMenu)
767 return true; 798 return true;
768 799
769 const blink::WebInputEvent* modified_event = &event; 800 const blink::WebInputEvent* modified_event = &event;
770 scoped_ptr<blink::WebTouchEvent> touch_event; 801 scoped_ptr<blink::WebTouchEvent> touch_event;
771 if (blink::WebInputEvent::isTouchEventType(event.type)) { 802 if (blink::WebInputEvent::isTouchEventType(event.type)) {
772 const blink::WebTouchEvent* orig_touch_event = 803 const blink::WebTouchEvent* orig_touch_event =
773 static_cast<const blink::WebTouchEvent*>(&event); 804 static_cast<const blink::WebTouchEvent*>(&event);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 modified_event)); 857 modified_event));
827 GetWebKitCursorInfo(cursor_, &cursor_info); 858 GetWebKitCursorInfo(cursor_, &cursor_info);
828 return true; 859 return true;
829 } 860 }
830 861
831 bool BrowserPlugin::handleDragStatusUpdate(blink::WebDragStatus drag_status, 862 bool BrowserPlugin::handleDragStatusUpdate(blink::WebDragStatus drag_status,
832 const blink::WebDragData& drag_data, 863 const blink::WebDragData& drag_data,
833 blink::WebDragOperationsMask mask, 864 blink::WebDragOperationsMask mask,
834 const blink::WebPoint& position, 865 const blink::WebPoint& position,
835 const blink::WebPoint& screen) { 866 const blink::WebPoint& screen) {
836 if (guest_crashed_ || !HasGuestInstanceID()) 867 if (guest_crashed_ || !attached())
837 return false; 868 return false;
838 browser_plugin_manager()->Send( 869 browser_plugin_manager()->Send(
839 new BrowserPluginHostMsg_DragStatusUpdate( 870 new BrowserPluginHostMsg_DragStatusUpdate(
840 render_view_routing_id_, 871 render_view_routing_id_,
841 guest_instance_id_, 872 guest_instance_id_,
842 drag_status, 873 drag_status,
843 DropDataBuilder::Build(drag_data), 874 DropDataBuilder::Build(drag_data),
844 mask, 875 mask,
845 position)); 876 position));
846 return true; 877 return true;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 edit_commands_.push_back(EditCommand(name.utf8(), value.utf8())); 923 edit_commands_.push_back(EditCommand(name.utf8(), value.utf8()));
893 // BrowserPlugin swallows edit commands. 924 // BrowserPlugin swallows edit commands.
894 return true; 925 return true;
895 } 926 }
896 927
897 bool BrowserPlugin::setComposition( 928 bool BrowserPlugin::setComposition(
898 const blink::WebString& text, 929 const blink::WebString& text,
899 const blink::WebVector<blink::WebCompositionUnderline>& underlines, 930 const blink::WebVector<blink::WebCompositionUnderline>& underlines,
900 int selectionStart, 931 int selectionStart,
901 int selectionEnd) { 932 int selectionEnd) {
902 if (!HasGuestInstanceID()) 933 if (!attached())
903 return false; 934 return false;
904 std::vector<blink::WebCompositionUnderline> std_underlines; 935 std::vector<blink::WebCompositionUnderline> std_underlines;
905 for (size_t i = 0; i < underlines.size(); ++i) { 936 for (size_t i = 0; i < underlines.size(); ++i) {
906 std_underlines.push_back(underlines[i]); 937 std_underlines.push_back(underlines[i]);
907 } 938 }
908 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeSetComposition( 939 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeSetComposition(
909 render_view_routing_id_, 940 render_view_routing_id_,
910 guest_instance_id_, 941 guest_instance_id_,
911 text.utf8(), 942 text.utf8(),
912 std_underlines, 943 std_underlines,
913 selectionStart, 944 selectionStart,
914 selectionEnd)); 945 selectionEnd));
915 // TODO(kochi): This assumes the IPC handling always succeeds. 946 // TODO(kochi): This assumes the IPC handling always succeeds.
916 return true; 947 return true;
917 } 948 }
918 949
919 bool BrowserPlugin::confirmComposition( 950 bool BrowserPlugin::confirmComposition(
920 const blink::WebString& text, 951 const blink::WebString& text,
921 blink::WebWidget::ConfirmCompositionBehavior selectionBehavior) { 952 blink::WebWidget::ConfirmCompositionBehavior selectionBehavior) {
922 if (!HasGuestInstanceID()) 953 if (!attached())
923 return false; 954 return false;
924 bool keep_selection = (selectionBehavior == blink::WebWidget::KeepSelection); 955 bool keep_selection = (selectionBehavior == blink::WebWidget::KeepSelection);
925 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeConfirmComposition( 956 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeConfirmComposition(
926 render_view_routing_id_, 957 render_view_routing_id_,
927 guest_instance_id_, 958 guest_instance_id_,
928 text.utf8(), 959 text.utf8(),
929 keep_selection)); 960 keep_selection));
930 // TODO(kochi): This assumes the IPC handling always succeeds. 961 // TODO(kochi): This assumes the IPC handling always succeeds.
931 return true; 962 return true;
932 } 963 }
933 964
934 void BrowserPlugin::extendSelectionAndDelete(int before, int after) { 965 void BrowserPlugin::extendSelectionAndDelete(int before, int after) {
935 if (!HasGuestInstanceID()) 966 if (!attached())
936 return; 967 return;
937 browser_plugin_manager()->Send( 968 browser_plugin_manager()->Send(
938 new BrowserPluginHostMsg_ExtendSelectionAndDelete( 969 new BrowserPluginHostMsg_ExtendSelectionAndDelete(
939 render_view_routing_id_, 970 render_view_routing_id_,
940 guest_instance_id_, 971 guest_instance_id_,
941 before, 972 before,
942 after)); 973 after));
943 } 974 }
944 975
945 void BrowserPlugin::OnLockMouseACK(bool succeeded) { 976 void BrowserPlugin::OnLockMouseACK(bool succeeded) {
(...skipping 15 matching lines...) Expand all
961 const blink::WebMouseEvent& event) { 992 const blink::WebMouseEvent& event) {
962 browser_plugin_manager()->Send( 993 browser_plugin_manager()->Send(
963 new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, 994 new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_,
964 guest_instance_id_, 995 guest_instance_id_,
965 plugin_rect_, 996 plugin_rect_,
966 &event)); 997 &event));
967 return true; 998 return true;
968 } 999 }
969 1000
970 } // namespace content 1001 } // namespace content
OLDNEW
« 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