| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/browser/browser_plugin/browser_plugin_guest.h" | 5 #include "content/browser/browser_plugin/browser_plugin_guest.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" | 
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 61 | 61 | 
| 62  private: | 62  private: | 
| 63   BrowserPluginGuest* browser_plugin_guest_; | 63   BrowserPluginGuest* browser_plugin_guest_; | 
| 64 | 64 | 
| 65   DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); | 65   DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); | 
| 66 }; | 66 }; | 
| 67 | 67 | 
| 68 BrowserPluginGuest::BrowserPluginGuest( | 68 BrowserPluginGuest::BrowserPluginGuest( | 
| 69     int instance_id, | 69     int instance_id, | 
| 70     bool has_render_view, | 70     bool has_render_view, | 
| 71     WebContentsImpl* web_contents) | 71     WebContentsImpl* web_contents, | 
|  | 72     BrowserPluginGuestDelegate* delegate) | 
| 72     : WebContentsObserver(web_contents), | 73     : WebContentsObserver(web_contents), | 
| 73       embedder_web_contents_(NULL), | 74       embedder_web_contents_(NULL), | 
| 74       instance_id_(instance_id), | 75       instance_id_(instance_id), | 
| 75       guest_device_scale_factor_(1.0f), | 76       guest_device_scale_factor_(1.0f), | 
| 76       focused_(false), | 77       focused_(false), | 
| 77       mouse_locked_(false), | 78       mouse_locked_(false), | 
| 78       pending_lock_request_(false), | 79       pending_lock_request_(false), | 
| 79       guest_visible_(false), | 80       guest_visible_(false), | 
| 80       guest_opaque_(true), | 81       guest_opaque_(true), | 
| 81       embedder_visible_(true), | 82       embedder_visible_(true), | 
| 82       auto_size_enabled_(false), | 83       auto_size_enabled_(false), | 
| 83       copy_request_id_(0), | 84       copy_request_id_(0), | 
| 84       has_render_view_(has_render_view), | 85       has_render_view_(has_render_view), | 
| 85       last_seen_auto_size_enabled_(false), | 86       last_seen_auto_size_enabled_(false), | 
| 86       is_in_destruction_(false), | 87       is_in_destruction_(false), | 
| 87       last_text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 88       last_text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 
| 88       last_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 89       last_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 
| 89       last_can_compose_inline_(true), | 90       last_can_compose_inline_(true), | 
| 90       delegate_(NULL), | 91       delegate_(delegate), | 
| 91       weak_ptr_factory_(this) { | 92       weak_ptr_factory_(this) { | 
| 92   DCHECK(web_contents); | 93   DCHECK(web_contents); | 
|  | 94   DCHECK(delegate); | 
|  | 95   RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create")); | 
|  | 96   web_contents->SetBrowserPluginGuest(this); | 
|  | 97   delegate->RegisterDestructionCallback( | 
|  | 98       base::Bind(&BrowserPluginGuest::WillDestroy, AsWeakPtr())); | 
| 93 } | 99 } | 
| 94 | 100 | 
| 95 void BrowserPluginGuest::WillDestroy() { | 101 void BrowserPluginGuest::WillDestroy() { | 
| 96   is_in_destruction_ = true; | 102   is_in_destruction_ = true; | 
| 97   embedder_web_contents_ = NULL; | 103   embedder_web_contents_ = NULL; | 
| 98   delegate_ = NULL; |  | 
| 99 } | 104 } | 
| 100 | 105 | 
| 101 base::WeakPtr<BrowserPluginGuest> BrowserPluginGuest::AsWeakPtr() { | 106 base::WeakPtr<BrowserPluginGuest> BrowserPluginGuest::AsWeakPtr() { | 
| 102   return weak_ptr_factory_.GetWeakPtr(); | 107   return weak_ptr_factory_.GetWeakPtr(); | 
| 103 } | 108 } | 
| 104 | 109 | 
| 105 bool BrowserPluginGuest::LockMouse(bool allowed) { | 110 bool BrowserPluginGuest::LockMouse(bool allowed) { | 
| 106   if (!attached() || (mouse_locked_ == allowed)) | 111   if (!attached() || (mouse_locked_ == allowed)) | 
| 107     return false; | 112     return false; | 
| 108 | 113 | 
| 109   return embedder_web_contents()->GotResponseToLockMouseRequest(allowed); | 114   return embedder_web_contents()->GotResponseToLockMouseRequest(allowed); | 
| 110 } | 115 } | 
| 111 | 116 | 
| 112 void BrowserPluginGuest::Destroy() { | 117 void BrowserPluginGuest::Destroy() { | 
| 113   if (!delegate_) |  | 
| 114     return; |  | 
| 115   delegate_->Destroy(); | 118   delegate_->Destroy(); | 
| 116 } | 119 } | 
| 117 | 120 | 
|  | 121 WebContentsImpl* BrowserPluginGuest::CreateNewGuestWindow( | 
|  | 122     const WebContents::CreateParams& params) { | 
|  | 123   WebContentsImpl* new_contents = | 
|  | 124       static_cast<WebContentsImpl*>(delegate_->CreateNewGuestWindow(params)); | 
|  | 125   DCHECK(new_contents); | 
|  | 126   return new_contents; | 
|  | 127 } | 
|  | 128 | 
| 118 bool BrowserPluginGuest::OnMessageReceivedFromEmbedder( | 129 bool BrowserPluginGuest::OnMessageReceivedFromEmbedder( | 
| 119     const IPC::Message& message) { | 130     const IPC::Message& message) { | 
| 120   bool handled = true; | 131   bool handled = true; | 
| 121   IPC_BEGIN_MESSAGE_MAP(BrowserPluginGuest, message) | 132   IPC_BEGIN_MESSAGE_MAP(BrowserPluginGuest, message) | 
| 122     IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_CompositorFrameSwappedACK, | 133     IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_CompositorFrameSwappedACK, | 
| 123                         OnCompositorFrameSwappedACK) | 134                         OnCompositorFrameSwappedACK) | 
| 124     IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_CopyFromCompositingSurfaceAck, | 135     IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_CopyFromCompositingSurfaceAck, | 
| 125                         OnCopyFromCompositingSurfaceAck) | 136                         OnCopyFromCompositingSurfaceAck) | 
| 126     IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_DragStatusUpdate, | 137     IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_DragStatusUpdate, | 
| 127                         OnDragStatusUpdate) | 138                         OnDragStatusUpdate) | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 227   // Inform the embedder of the guest's attachment. | 238   // Inform the embedder of the guest's attachment. | 
| 228   SendMessageToEmbedder(new BrowserPluginMsg_Attach_ACK(instance_id_)); | 239   SendMessageToEmbedder(new BrowserPluginMsg_Attach_ACK(instance_id_)); | 
| 229 } | 240 } | 
| 230 | 241 | 
| 231 BrowserPluginGuest::~BrowserPluginGuest() { | 242 BrowserPluginGuest::~BrowserPluginGuest() { | 
| 232 } | 243 } | 
| 233 | 244 | 
| 234 // static | 245 // static | 
| 235 BrowserPluginGuest* BrowserPluginGuest::Create( | 246 BrowserPluginGuest* BrowserPluginGuest::Create( | 
| 236     int instance_id, | 247     int instance_id, | 
| 237     SiteInstance* guest_site_instance, |  | 
| 238     WebContentsImpl* web_contents, | 248     WebContentsImpl* web_contents, | 
| 239     scoped_ptr<base::DictionaryValue> extra_params, | 249     BrowserPluginGuestDelegate* delegate) { | 
| 240     BrowserPluginGuest* opener) { | 250   return new BrowserPluginGuest( | 
| 241   RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create")); | 251       instance_id, web_contents->opener() != NULL, web_contents, delegate); | 
| 242   BrowserPluginGuest* guest = new BrowserPluginGuest( |  | 
| 243       instance_id, web_contents->opener() != NULL, web_contents); |  | 
| 244   web_contents->SetBrowserPluginGuest(guest); |  | 
| 245   WebContents* opener_web_contents = NULL; |  | 
| 246   if (opener) { |  | 
| 247     opener_web_contents = opener->GetWebContents(); |  | 
| 248     guest_site_instance = opener_web_contents->GetSiteInstance(); |  | 
| 249   } |  | 
| 250   BrowserPluginGuestDelegate* delegate = NULL; |  | 
| 251   GetContentClient()->browser()->GuestWebContentsCreated( |  | 
| 252       instance_id, |  | 
| 253       guest_site_instance, |  | 
| 254       web_contents, |  | 
| 255       opener_web_contents, |  | 
| 256       &delegate, |  | 
| 257       extra_params.Pass()); |  | 
| 258   if (delegate) { |  | 
| 259     delegate->RegisterDestructionCallback( |  | 
| 260         base::Bind(&BrowserPluginGuest::WillDestroy, |  | 
| 261                    base::Unretained(guest))); |  | 
| 262     guest->set_delegate(delegate); |  | 
| 263   } |  | 
| 264   return guest; |  | 
| 265 } | 252 } | 
| 266 | 253 | 
| 267 // static | 254 // static | 
| 268 bool BrowserPluginGuest::IsGuest(WebContentsImpl* web_contents) { | 255 bool BrowserPluginGuest::IsGuest(WebContentsImpl* web_contents) { | 
| 269   return web_contents && web_contents->GetBrowserPluginGuest(); | 256   return web_contents && web_contents->GetBrowserPluginGuest(); | 
| 270 } | 257 } | 
| 271 | 258 | 
| 272 // static | 259 // static | 
| 273 bool BrowserPluginGuest::IsGuest(RenderViewHostImpl* render_view_host) { | 260 bool BrowserPluginGuest::IsGuest(RenderViewHostImpl* render_view_host) { | 
| 274   return render_view_host && IsGuest( | 261   return render_view_host && IsGuest( | 
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 646 void BrowserPluginGuest::OnLockMouse(bool user_gesture, | 633 void BrowserPluginGuest::OnLockMouse(bool user_gesture, | 
| 647                                      bool last_unlocked_by_target, | 634                                      bool last_unlocked_by_target, | 
| 648                                      bool privileged) { | 635                                      bool privileged) { | 
| 649   if (pending_lock_request_) { | 636   if (pending_lock_request_) { | 
| 650     // Immediately reject the lock because only one pointerLock may be active | 637     // Immediately reject the lock because only one pointerLock may be active | 
| 651     // at a time. | 638     // at a time. | 
| 652     Send(new ViewMsg_LockMouse_ACK(routing_id(), false)); | 639     Send(new ViewMsg_LockMouse_ACK(routing_id(), false)); | 
| 653     return; | 640     return; | 
| 654   } | 641   } | 
| 655 | 642 | 
| 656   if (!delegate_) |  | 
| 657     return; |  | 
| 658 |  | 
| 659   pending_lock_request_ = true; | 643   pending_lock_request_ = true; | 
| 660 | 644 | 
| 661   delegate_->RequestPointerLockPermission( | 645   delegate_->RequestPointerLockPermission( | 
| 662       user_gesture, | 646       user_gesture, | 
| 663       last_unlocked_by_target, | 647       last_unlocked_by_target, | 
| 664       base::Bind(&BrowserPluginGuest::PointerLockPermissionResponse, | 648       base::Bind(&BrowserPluginGuest::PointerLockPermissionResponse, | 
| 665                  weak_ptr_factory_.GetWeakPtr())); | 649                  weak_ptr_factory_.GetWeakPtr())); | 
| 666 } | 650 } | 
| 667 | 651 | 
| 668 void BrowserPluginGuest::OnLockMouseAck(int instance_id, bool succeeded) { | 652 void BrowserPluginGuest::OnLockMouseAck(int instance_id, bool succeeded) { | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 691     render_widget_host->ResetSizeAndRepaintPendingFlags(); | 675     render_widget_host->ResetSizeAndRepaintPendingFlags(); | 
| 692 | 676 | 
| 693     if (guest_device_scale_factor_ != params.scale_factor) { | 677     if (guest_device_scale_factor_ != params.scale_factor) { | 
| 694       guest_device_scale_factor_ = params.scale_factor; | 678       guest_device_scale_factor_ = params.scale_factor; | 
| 695       render_widget_host->NotifyScreenInfoChanged(); | 679       render_widget_host->NotifyScreenInfoChanged(); | 
| 696     } | 680     } | 
| 697   } | 681   } | 
| 698   // When autosize is turned off and as a result there is a layout change, we | 682   // When autosize is turned off and as a result there is a layout change, we | 
| 699   // send a sizechanged event. | 683   // send a sizechanged event. | 
| 700   if (!auto_size_enabled_ && last_seen_auto_size_enabled_ && | 684   if (!auto_size_enabled_ && last_seen_auto_size_enabled_ && | 
| 701       !params.view_size.IsEmpty() && delegate_) { | 685       !params.view_size.IsEmpty()) { | 
| 702     delegate_->SizeChanged(last_seen_view_size_, params.view_size); | 686     delegate_->SizeChanged(last_seen_view_size_, params.view_size); | 
| 703     last_seen_auto_size_enabled_ = false; | 687     last_seen_auto_size_enabled_ = false; | 
| 704   } | 688   } | 
| 705   // Just resize the WebContents and repaint if needed. | 689   // Just resize the WebContents and repaint if needed. | 
| 706   full_size_ = params.view_size; | 690   full_size_ = params.view_size; | 
| 707   if (!params.view_size.IsEmpty()) | 691   if (!params.view_size.IsEmpty()) | 
| 708     GetWebContents()->GetView()->SizeContents(params.view_size); | 692     GetWebContents()->GetView()->SizeContents(params.view_size); | 
| 709   if (params.repaint) | 693   if (params.repaint) | 
| 710     Send(new ViewMsg_Repaint(routing_id(), params.view_size)); | 694     Send(new ViewMsg_Repaint(routing_id(), params.view_size)); | 
| 711 } | 695 } | 
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 859   relay_params.view_size = params.view_size; | 843   relay_params.view_size = params.view_size; | 
| 860   relay_params.scale_factor = params.scale_factor; | 844   relay_params.scale_factor = params.scale_factor; | 
| 861   relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack( | 845   relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack( | 
| 862       params.flags); | 846       params.flags); | 
| 863 | 847 | 
| 864   bool size_changed = last_seen_view_size_ != params.view_size; | 848   bool size_changed = last_seen_view_size_ != params.view_size; | 
| 865   gfx::Size old_size = last_seen_view_size_; | 849   gfx::Size old_size = last_seen_view_size_; | 
| 866   last_seen_view_size_ = params.view_size; | 850   last_seen_view_size_ = params.view_size; | 
| 867 | 851 | 
| 868   if ((auto_size_enabled_ || last_seen_auto_size_enabled_) && | 852   if ((auto_size_enabled_ || last_seen_auto_size_enabled_) && | 
| 869       size_changed && delegate_) { | 853       size_changed) { | 
| 870     delegate_->SizeChanged(old_size, last_seen_view_size_); | 854     delegate_->SizeChanged(old_size, last_seen_view_size_); | 
| 871   } | 855   } | 
| 872   last_seen_auto_size_enabled_ = auto_size_enabled_; | 856   last_seen_auto_size_enabled_ = auto_size_enabled_; | 
| 873 | 857 | 
| 874   SendMessageToEmbedder( | 858   SendMessageToEmbedder( | 
| 875       new BrowserPluginMsg_UpdateRect(instance_id(), relay_params)); | 859       new BrowserPluginMsg_UpdateRect(instance_id(), relay_params)); | 
| 876 } | 860 } | 
| 877 | 861 | 
| 878 void BrowserPluginGuest::OnTextInputStateChanged( | 862 void BrowserPluginGuest::OnTextInputStateChanged( | 
| 879     const ViewHostMsg_TextInputState_Params& params) { | 863     const ViewHostMsg_TextInputState_Params& params) { | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 895 void BrowserPluginGuest::OnImeCompositionRangeChanged( | 879 void BrowserPluginGuest::OnImeCompositionRangeChanged( | 
| 896       const gfx::Range& range, | 880       const gfx::Range& range, | 
| 897       const std::vector<gfx::Rect>& character_bounds) { | 881       const std::vector<gfx::Rect>& character_bounds) { | 
| 898   static_cast<RenderWidgetHostViewBase*>( | 882   static_cast<RenderWidgetHostViewBase*>( | 
| 899       web_contents()->GetRenderWidgetHostView())->ImeCompositionRangeChanged( | 883       web_contents()->GetRenderWidgetHostView())->ImeCompositionRangeChanged( | 
| 900           range, character_bounds); | 884           range, character_bounds); | 
| 901 } | 885 } | 
| 902 #endif | 886 #endif | 
| 903 | 887 | 
| 904 }  // namespace content | 888 }  // namespace content | 
| OLD | NEW | 
|---|