| Index: content/browser/browser_plugin/browser_plugin_guest.cc
|
| diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
|
| index 33262a832e5803f3baa57fbd231f72c947cd5481..500a6682b40d5caebf2e69581419a639a9134f34 100644
|
| --- a/content/browser/browser_plugin/browser_plugin_guest.cc
|
| +++ b/content/browser/browser_plugin/browser_plugin_guest.cc
|
| @@ -90,7 +90,7 @@ BrowserPluginGuest::BrowserPluginGuest(bool has_render_view,
|
| focused_(false),
|
| mouse_locked_(false),
|
| pending_lock_request_(false),
|
| - guest_visible_(false),
|
| + container_visible_(false),
|
| embedder_visible_(true),
|
| is_full_page_plugin_(false),
|
| has_render_view_(has_render_view),
|
| @@ -145,6 +145,36 @@ int BrowserPluginGuest::GetGuestProxyRoutingID() {
|
| return guest_proxy_routing_id_;
|
| }
|
|
|
| +void BrowserPluginGuest::Attach(int element_instance_id,
|
| + WebContents* embedder_web_contents,
|
| + const GuestAttachParams& attach_params) {
|
| + browser_plugin_instance_id_ = element_instance_id;
|
| + // If a guest is detaching from one container and attaching to another
|
| + // container, then late arriving ACKs may be lost if the mapping from
|
| + // |browser_plugin_instance_id| to |guest_instance_id| changes. Thus we
|
| + // ensure that we always get new frames on attachment by ACKing the pending
|
| + // frame if it's still waiting on the ACK.
|
| + if (last_pending_frame_) {
|
| + cc::CompositorFrameAck ack;
|
| + RenderWidgetHostImpl::SendSwapCompositorFrameAck(
|
| + last_pending_frame_->producing_route_id,
|
| + last_pending_frame_->output_surface_id,
|
| + last_pending_frame_->producing_host_id, ack);
|
| + last_pending_frame_.reset();
|
| + }
|
| +
|
| + // The guest is owned by the embedder. Attach is queued up so we cannot
|
| + // change embedders before attach completes. If the embedder goes away,
|
| + // so does the guest and so we will never call WillAttachComplete because
|
| + // we have a weak ptr.
|
| + delegate_->WillAttach(
|
| + embedder_web_contents, element_instance_id, attach_params.is_full_page,
|
| + base::Bind(&BrowserPluginGuest::OnWillAttachComplete,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + static_cast<WebContentsImpl*>(embedder_web_contents),
|
| + attach_params));
|
| +}
|
| +
|
| int BrowserPluginGuest::LoadURLWithParams(
|
| const NavigationController::LoadURLParams& load_params) {
|
| GetWebContents()->GetController().LoadURLWithParams(load_params);
|
| @@ -158,10 +188,55 @@ void BrowserPluginGuest::GuestResizeDueToAutoResize(const gfx::Size& new_size) {
|
| }
|
| }
|
|
|
| +void BrowserPluginGuest::SetContainerVisible(bool visible) {
|
| + container_visible_ = visible;
|
| + UpdateVisibility();
|
| +}
|
| +
|
| +void BrowserPluginGuest::SetFocus(bool focused,
|
| + blink::WebFocusType focus_type) {
|
| + RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView();
|
| + RenderWidgetHost* rwh = rwhv ? rwhv->GetRenderWidgetHost() : nullptr;
|
| + SetFocusForRenderWidgetHost(rwh, focused, focus_type);
|
| +}
|
| +
|
| void BrowserPluginGuest::SizeContents(const gfx::Size& new_size) {
|
| GetWebContents()->GetView()->SizeContents(new_size);
|
| }
|
|
|
| +void BrowserPluginGuest::ForwardInputEvent(const blink::WebInputEvent* event) {
|
| + RenderWidgetHostImpl* embedder_host =
|
| + embedder_web_contents()->GetMainFrame()->GetRenderWidgetHost();
|
| + RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView();
|
| + RenderWidgetHostImpl* host = static_cast<RenderWidgetHostImpl*>(
|
| + rwhv ? rwhv->GetRenderWidgetHost() : nullptr);
|
| + if (!host)
|
| + return;
|
| +
|
| + if (blink::WebInputEvent::isMouseEventType(event->type)) {
|
| + host->ForwardMouseEvent(*static_cast<const blink::WebMouseEvent*>(event));
|
| + } else if (event->type == blink::WebInputEvent::MouseWheel) {
|
| + host->ForwardWheelEvent(
|
| + *static_cast<const blink::WebMouseWheelEvent*>(event));
|
| + } else if (blink::WebInputEvent::isGestureEventType(event->type)) {
|
| + host->ForwardGestureEvent(
|
| + *static_cast<const blink::WebGestureEvent*>(event));
|
| + } else if (blink::WebInputEvent::isKeyboardEventType(event->type)) {
|
| + if (!embedder_host->GetLastKeyboardEvent())
|
| + return;
|
| + NativeWebKeyboardEvent keyboard_event(
|
| + *embedder_host->GetLastKeyboardEvent());
|
| + host->ForwardKeyboardEvent(keyboard_event);
|
| + } else if (blink::WebInputEvent::isTouchEventType(event->type)) {
|
| + if (event->type == blink::WebInputEvent::TouchStart &&
|
| + !embedder_host->GetView()->HasFocus()) {
|
| + embedder_host->GetView()->Focus();
|
| + }
|
| + host->ForwardTouchEventWithLatencyInfo(
|
| + *static_cast<const blink::WebTouchEvent*>(event), ui::LatencyInfo());
|
| + }
|
| +}
|
| +
|
| void BrowserPluginGuest::WillDestroy() {
|
| is_in_destruction_ = true;
|
| owner_web_contents_ = nullptr;
|
| @@ -182,16 +257,17 @@ void BrowserPluginGuest::Init() {
|
| WebContentsImpl* owner_web_contents = static_cast<WebContentsImpl*>(
|
| delegate_->GetOwnerWebContents());
|
| owner_web_contents->CreateBrowserPluginEmbedderIfNecessary();
|
| - InitInternal(BrowserPluginHostMsg_Attach_Params(), owner_web_contents);
|
| + InitInternal(GuestAttachParams(), owner_web_contents);
|
| }
|
|
|
| base::WeakPtr<BrowserPluginGuest> BrowserPluginGuest::AsWeakPtr() {
|
| return weak_ptr_factory_.GetWeakPtr();
|
| }
|
|
|
| -void BrowserPluginGuest::SetFocus(RenderWidgetHost* rwh,
|
| - bool focused,
|
| - blink::WebFocusType focus_type) {
|
| +void BrowserPluginGuest::SetFocusForRenderWidgetHost(
|
| + RenderWidgetHost* rwh,
|
| + bool focused,
|
| + blink::WebFocusType focus_type) {
|
| focused_ = focused;
|
| if (!rwh)
|
| return;
|
| @@ -279,18 +355,12 @@ bool BrowserPluginGuest::OnMessageReceivedFromEmbedder(
|
| return handled;
|
| }
|
|
|
| -void BrowserPluginGuest::InitInternal(
|
| - const BrowserPluginHostMsg_Attach_Params& params,
|
| - WebContentsImpl* owner_web_contents) {
|
| - focused_ = params.focused;
|
| - OnSetFocus(browser_plugin::kInstanceIDNone,
|
| - focused_,
|
| - blink::WebFocusTypeNone);
|
| +void BrowserPluginGuest::InitInternal(const GuestAttachParams& params,
|
| + WebContentsImpl* owner_web_contents) {
|
| + SetContainerVisible(params.visible);
|
| + SetFocus(params.focused, blink::WebFocusTypeNone);
|
|
|
| - guest_visible_ = params.visible;
|
| - UpdateVisibility();
|
| -
|
| - is_full_page_plugin_ = params.is_full_page_plugin;
|
| + is_full_page_plugin_ = params.is_full_page;
|
| guest_window_rect_ = params.view_rect;
|
|
|
| if (owner_web_contents_ != owner_web_contents) {
|
| @@ -346,6 +416,8 @@ void BrowserPluginGuest::InitInternal(
|
| WebPreferences prefs =
|
| GetWebContents()->GetRenderViewHost()->GetWebkitPreferences();
|
| prefs.navigate_on_drag_drop = false;
|
| + prefs.viewport_enabled = false;
|
| + prefs.viewport_meta_enabled = false;
|
| GetWebContents()->GetRenderViewHost()->UpdateWebkitPreferences(prefs);
|
| }
|
|
|
| @@ -379,7 +451,10 @@ RenderWidgetHostView* BrowserPluginGuest::GetOwnerRenderWidgetHostView() {
|
| }
|
|
|
| void BrowserPluginGuest::UpdateVisibility() {
|
| - OnSetVisibility(browser_plugin_instance_id(), visible());
|
| + if (embedder_visible_ && container_visible_)
|
| + GetWebContents()->WasShown();
|
| + else
|
| + GetWebContents()->WasHidden();
|
| }
|
|
|
| BrowserPluginGuestManager*
|
| @@ -421,6 +496,10 @@ void BrowserPluginGuest::SetChildFrameSurface(
|
| float scale_factor,
|
| const cc::SurfaceSequence& sequence) {
|
| has_attached_since_surface_set_ = false;
|
| + if (delegate_->SetChildFrameSurface(surface_id, frame_size, scale_factor,
|
| + sequence)) {
|
| + return;
|
| + }
|
| SendMessageToEmbedder(new BrowserPluginMsg_SetChildFrameSurface(
|
| browser_plugin_instance_id(), surface_id, frame_size, scale_factor,
|
| sequence));
|
| @@ -697,9 +776,8 @@ bool BrowserPluginGuest::OnMessageReceived(const IPC::Message& message) {
|
| // TODO(lazyboy): Fix this as part of http://crbug.com/330264. The required
|
| // parts of code from this class should be extracted to a separate class for
|
| // --site-per-process.
|
| - if (BrowserPluginGuestMode::UseCrossProcessFramesForGuests()) {
|
| + if (BrowserPluginGuestMode::UseCrossProcessFramesForGuests())
|
| return false;
|
| - }
|
|
|
| IPC_BEGIN_MESSAGE_MAP(BrowserPluginGuest, message)
|
| IPC_MESSAGE_HANDLER(InputHostMsg_ImeCancelComposition,
|
| @@ -751,36 +829,17 @@ void BrowserPluginGuest::Attach(
|
| int browser_plugin_instance_id,
|
| WebContentsImpl* embedder_web_contents,
|
| const BrowserPluginHostMsg_Attach_Params& params) {
|
| - browser_plugin_instance_id_ = browser_plugin_instance_id;
|
| - // If a guest is detaching from one container and attaching to another
|
| - // container, then late arriving ACKs may be lost if the mapping from
|
| - // |browser_plugin_instance_id| to |guest_instance_id| changes. Thus we
|
| - // ensure that we always get new frames on attachment by ACKing the pending
|
| - // frame if it's still waiting on the ACK.
|
| - if (last_pending_frame_) {
|
| - cc::CompositorFrameAck ack;
|
| - RenderWidgetHostImpl::SendSwapCompositorFrameAck(
|
| - last_pending_frame_->producing_route_id,
|
| - last_pending_frame_->output_surface_id,
|
| - last_pending_frame_->producing_host_id,
|
| - ack);
|
| - last_pending_frame_.reset();
|
| - }
|
| -
|
| - // The guest is owned by the embedder. Attach is queued up so we cannot
|
| - // change embedders before attach completes. If the embedder goes away,
|
| - // so does the guest and so we will never call WillAttachComplete because
|
| - // we have a weak ptr.
|
| - delegate_->WillAttach(embedder_web_contents, browser_plugin_instance_id,
|
| - params.is_full_page_plugin,
|
| - base::Bind(&BrowserPluginGuest::OnWillAttachComplete,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - embedder_web_contents, params));
|
| + GuestAttachParams attach_params;
|
| + attach_params.focused = params.focused;
|
| + attach_params.visible = params.visible;
|
| + attach_params.view_rect = params.view_rect;
|
| + attach_params.is_full_page = params.is_full_page_plugin;
|
| + Attach(browser_plugin_instance_id, embedder_web_contents, attach_params);
|
| }
|
|
|
| void BrowserPluginGuest::OnWillAttachComplete(
|
| WebContentsImpl* embedder_web_contents,
|
| - const BrowserPluginHostMsg_Attach_Params& params) {
|
| + const GuestAttachParams& params) {
|
| bool use_cross_process_frames =
|
| BrowserPluginGuestMode::UseCrossProcessFramesForGuests();
|
| // If a RenderView has already been created for this new window, then we need
|
| @@ -959,9 +1018,7 @@ void BrowserPluginGuest::OnLockMouseAck(int browser_plugin_instance_id,
|
| void BrowserPluginGuest::OnSetFocus(int browser_plugin_instance_id,
|
| bool focused,
|
| blink::WebFocusType focus_type) {
|
| - RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView();
|
| - RenderWidgetHost* rwh = rwhv ? rwhv->GetRenderWidgetHost() : nullptr;
|
| - SetFocus(rwh, focused, focus_type);
|
| + SetFocus(focused, focus_type);
|
| }
|
|
|
| void BrowserPluginGuest::OnSetEditCommandsForNextKeyEvent(
|
| @@ -973,11 +1030,7 @@ void BrowserPluginGuest::OnSetEditCommandsForNextKeyEvent(
|
|
|
| void BrowserPluginGuest::OnSetVisibility(int browser_plugin_instance_id,
|
| bool visible) {
|
| - guest_visible_ = visible;
|
| - if (embedder_visible_ && guest_visible_)
|
| - GetWebContents()->WasShown();
|
| - else
|
| - GetWebContents()->WasHidden();
|
| + SetContainerVisible(visible);
|
| }
|
|
|
| void BrowserPluginGuest::OnUnlockMouse() {
|
|
|