diff options
Diffstat (limited to 'chromium/content/browser/frame_host/render_widget_host_view_guest.cc')
-rw-r--r-- | chromium/content/browser/frame_host/render_widget_host_view_guest.cc | 140 |
1 files changed, 63 insertions, 77 deletions
diff --git a/chromium/content/browser/frame_host/render_widget_host_view_guest.cc b/chromium/content/browser/frame_host/render_widget_host_view_guest.cc index ecda893dbb7..6d4a1811c5b 100644 --- a/chromium/content/browser/frame_host/render_widget_host_view_guest.cc +++ b/chromium/content/browser/frame_host/render_widget_host_view_guest.cc @@ -2,18 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "content/browser/frame_host/render_widget_host_view_guest.h" + +#include <utility> + #include "base/bind_helpers.h" #include "base/command_line.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" +#include "build/build_config.h" #include "cc/surfaces/surface.h" #include "cc/surfaces/surface_factory.h" #include "cc/surfaces/surface_manager.h" #include "cc/surfaces/surface_sequence.h" #include "content/browser/browser_plugin/browser_plugin_guest.h" #include "content/browser/compositor/surface_utils.h" -#include "content/browser/frame_host/render_widget_host_view_guest.h" #include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/renderer_host/render_widget_host_delegate.h" +#include "content/browser/renderer_host/render_widget_host_input_event_router.h" #include "content/common/browser_plugin/browser_plugin_messages.h" #include "content/common/frame_messages.h" #include "content/common/gpu/gpu_messages.h" @@ -56,16 +62,9 @@ RenderWidgetHostViewGuest::RenderWidgetHostViewGuest( // |guest| is NULL during test. guest_(guest ? guest->AsWeakPtr() : base::WeakPtr<BrowserPluginGuest>()), platform_view_(platform_view) { -#if defined(USE_AURA) - gesture_recognizer_.reset(ui::GestureRecognizer::Create()); - gesture_recognizer_->AddGestureEventHelper(this); -#endif // defined(USE_AURA) } RenderWidgetHostViewGuest::~RenderWidgetHostViewGuest() { -#if defined(USE_AURA) - gesture_recognizer_->RemoveGestureEventHelper(this); -#endif // defined(USE_AURA) } bool RenderWidgetHostViewGuest::OnMessageReceivedFromEmbedder( @@ -95,8 +94,22 @@ void RenderWidgetHostViewGuest::Show() { // The two sizes may fall out of sync if we switch RenderWidgetHostViews, // resize, and then switch page, as is the case with interstitial pages. // NOTE: |guest_| is NULL in unit tests. - if (guest_) + if (guest_) { SetSize(guest_->web_contents()->GetViewBounds().size()); + // Since we were last shown, our renderer may have had a different surface + // set (e.g. showing an interstitial), so we resend our current surface to + // the renderer. + if (!surface_id_.is_null()) { + cc::SurfaceSequence sequence = cc::SurfaceSequence( + id_allocator_->id_namespace(), next_surface_sequence_++); + GetSurfaceManager() + ->GetSurfaceForId(surface_id_) + ->AddDestructionDependency(sequence); + guest_->SetChildFrameSurface(surface_id_, current_surface_size_, + current_surface_scale_factor_, + sequence); + } + } host_->WasShown(ui::LatencyInfo()); } @@ -133,29 +146,43 @@ bool RenderWidgetHostViewGuest::HasFocus() const { #if defined(USE_AURA) void RenderWidgetHostViewGuest::ProcessAckedTouchEvent( const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) { - // TODO(fsamuel): Currently we will only take this codepath if the guest has - // requested touch events. A better solution is to always forward touchpresses - // to the embedder process to target a BrowserPlugin, and then route all - // subsequent touch points of that touchdown to the appropriate guest until - // that touch point is released. - ScopedVector<ui::TouchEvent> events; - if (!MakeUITouchEventsFromWebTouchEvents(touch, &events, LOCAL_COORDINATES)) - return; + // TODO(tdresser): Since all ProcessAckedTouchEvent() uses is the event id, + // don't pass the full event object here. https://crbug.com/550581. + GetOwnerRenderWidgetHostView()->ProcessAckedTouchEvent(touch, ack_result); +} +#endif - ui::EventResult result = (ack_result == - INPUT_EVENT_ACK_STATE_CONSUMED) ? ui::ER_HANDLED : ui::ER_UNHANDLED; - for (ScopedVector<ui::TouchEvent>::iterator iter = events.begin(), - end = events.end(); iter != end; ++iter) { - if (!gesture_recognizer_->ProcessTouchEventPreDispatch(*iter, this)) - continue; - - scoped_ptr<ui::GestureRecognizer::Gestures> gestures; - gestures.reset(gesture_recognizer_->AckTouchEvent( - (*iter)->unique_event_id(), result, this)); - ProcessGestures(gestures.get()); +void RenderWidgetHostViewGuest::ProcessTouchEvent( + const blink::WebTouchEvent& event, + const ui::LatencyInfo& latency) { + if (event.type == blink::WebInputEvent::TouchStart) { + DCHECK(guest_->GetOwnerRenderWidgetHostView()); + RenderWidgetHostImpl* embedder = static_cast<RenderWidgetHostImpl*>( + guest_->GetOwnerRenderWidgetHostView()->GetRenderWidgetHost()); + if (!embedder->GetView()->HasFocus()) + embedder->GetView()->Focus(); + } + + host_->ForwardTouchEventWithLatencyInfo(event, latency); +} + +void RenderWidgetHostViewGuest::RegisterSurfaceNamespaceId() { + DCHECK(host_); + if (host_->delegate() && host_->delegate()->GetInputEventRouter()) { + RenderWidgetHostInputEventRouter* router = + host_->delegate()->GetInputEventRouter(); + if (!router->is_registered(GetSurfaceIdNamespace())) + router->AddSurfaceIdNamespaceOwner(GetSurfaceIdNamespace(), this); + } +} + +void RenderWidgetHostViewGuest::UnregisterSurfaceNamespaceId() { + DCHECK(host_); + if (host_->delegate() && host_->delegate()->GetInputEventRouter()) { + host_->delegate()->GetInputEventRouter()->RemoveSurfaceIdNamespaceOwner( + GetSurfaceIdNamespace()); } } -#endif gfx::Rect RenderWidgetHostViewGuest::GetViewBounds() const { if (!guest_) @@ -205,7 +232,7 @@ void RenderWidgetHostViewGuest::SetTooltipText( } void RenderWidgetHostViewGuest::OnSwapCompositorFrame( - uint32 output_surface_id, + uint32_t output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { if (!guest_ || !guest_->attached()) { // We shouldn't hang on to a surface while we are detached. @@ -217,15 +244,13 @@ void RenderWidgetHostViewGuest::OnSwapCompositorFrame( // When not using surfaces, the frame just gets proxied to // the embedder's renderer to be composited. if (!frame->delegated_frame_data || !use_surfaces_) { - guest_->SwapCompositorFrame(output_surface_id, - host_->GetProcess()->GetID(), - host_->GetRoutingID(), - frame.Pass()); + guest_->SwapCompositorFrame(output_surface_id, host_->GetProcess()->GetID(), + host_->GetRoutingID(), std::move(frame)); return; } cc::RenderPass* root_pass = - frame->delegated_frame_data->render_pass_list.back(); + frame->delegated_frame_data->render_pass_list.back().get(); gfx::Size frame_size = root_pass->output_rect.size(); float scale_factor = frame->metadata.device_scale_factor; @@ -271,7 +296,7 @@ void RenderWidgetHostViewGuest::OnSwapCompositorFrame( ack_pending_count_++; // If this value grows very large, something is going wrong. DCHECK(ack_pending_count_ < 1000); - surface_factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), + surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame), ack_callback); } @@ -420,19 +445,6 @@ void RenderWidgetHostViewGuest::SelectionBoundsChanged( rwhv->SelectionBoundsChanged(guest_params); } -void RenderWidgetHostViewGuest::SetBackgroundColor(SkColor color) { - // Content embedders can toggle opaque backgrounds through this API. - // We plumb the value here so that BrowserPlugin updates its compositing - // state in response to this change. We also want to preserve this flag - // after recovering from a crash so we let BrowserPluginGuest store it. - if (!guest_) - return; - RenderWidgetHostViewBase::SetBackgroundColor(color); - bool opaque = GetBackgroundOpaque(); - host_->SetBackgroundOpaque(opaque); - guest_->SetContentsOpaque(opaque); -} - bool RenderWidgetHostViewGuest::LockMouse() { return platform_view_->LockMouse(); } @@ -526,13 +538,13 @@ void RenderWidgetHostViewGuest::ShowDisambiguationPopup( } #endif // defined(OS_ANDROID) || defined(USE_AURA) -#if defined(OS_ANDROID) void RenderWidgetHostViewGuest::LockCompositingSurface() { + NOTIMPLEMENTED(); } void RenderWidgetHostViewGuest::UnlockCompositingSurface() { + NOTIMPLEMENTED(); } -#endif // defined(OS_ANDROID) #if defined(OS_WIN) void RenderWidgetHostViewGuest::SetParentNativeViewAccessible( @@ -551,32 +563,6 @@ void RenderWidgetHostViewGuest::DestroyGuestView() { base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); } -bool RenderWidgetHostViewGuest::CanDispatchToConsumer( - ui::GestureConsumer* consumer) { - CHECK_EQ(static_cast<RenderWidgetHostViewGuest*>(consumer), this); - return true; -} - -void RenderWidgetHostViewGuest::DispatchGestureEvent( - ui::GestureEvent* event) { - ForwardGestureEventToRenderer(event); -} - -void RenderWidgetHostViewGuest::DispatchCancelTouchEvent( - ui::TouchEvent* event) { - if (!host_) - return; - - blink::WebTouchEvent cancel_event; - // TODO(rbyers): This event has no touches in it. Don't we need to know what - // touches are currently active in order to cancel them all properly? - WebTouchEventTraits::ResetType(blink::WebInputEvent::TouchCancel, - event->time_stamp().InSecondsF(), - &cancel_event); - - host_->ForwardTouchEventWithLatencyInfo(cancel_event, *event->latency()); -} - bool RenderWidgetHostViewGuest::ForwardGestureEventToRenderer( ui::GestureEvent* gesture) { #if defined(USE_AURA) |