Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
index f928a0e9e749e76e9ceddd54174667c3475d7020..e60508ab3d021c25232001e92441bbee5457a4c6 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
@@ -30,7 +30,7 @@ |
#include "content/browser/frame_host/frame_tree_node.h" |
#include "content/browser/frame_host/render_frame_host_impl.h" |
#include "content/browser/gpu/compositor_util.h" |
-#include "content/browser/renderer_host/compositor_resize_lock_aura.h" |
+#include "content/browser/renderer_host/delegated_frame_host_client_aura.h" |
#include "content/browser/renderer_host/dip_util.h" |
#include "content/browser/renderer_host/input/synthetic_gesture_target_aura.h" |
#include "content/browser/renderer_host/input/touch_selection_controller_client_aura.h" |
@@ -45,6 +45,7 @@ |
#include "content/browser/renderer_host/ui_events_helper.h" |
#include "content/common/content_switches_internal.h" |
#include "content/common/input_messages.h" |
+#include "content/common/render_widget_window_tree_client_factory.mojom.h" |
#include "content/common/site_isolation_policy.h" |
#include "content/common/text_input_state.h" |
#include "content/common/view_messages.h" |
@@ -56,6 +57,8 @@ |
#include "content/public/common/child_process_host.h" |
#include "content/public/common/content_switches.h" |
#include "gpu/ipc/common/gpu_messages.h" |
+#include "services/service_manager/public/cpp/interface_provider.h" |
+#include "services/ui/public/interfaces/window_manager_constants.mojom.h" |
#include "third_party/WebKit/public/platform/WebInputEvent.h" |
#include "third_party/WebKit/public/web/WebCompositionUnderline.h" |
#include "ui/aura/client/aura_constants.h" |
@@ -66,6 +69,7 @@ |
#include "ui/aura/client/transient_window_client.h" |
#include "ui/aura/client/window_parenting_client.h" |
#include "ui/aura/env.h" |
+#include "ui/aura/mus/window_port_mus.h" |
#include "ui/aura/window.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/aura/window_observer.h" |
@@ -93,7 +97,6 @@ |
#include "ui/wm/public/activation_client.h" |
#include "ui/wm/public/scoped_tooltip_disabler.h" |
#include "ui/wm/public/tooltip_client.h" |
-#include "ui/wm/public/window_types.h" |
#if defined(OS_WIN) |
#include "base/time/time.h" |
@@ -123,12 +126,6 @@ namespace content { |
namespace { |
-// When accelerated compositing is enabled and a widget resize is pending, |
-// we delay further resizes of the UI. The following constant is the maximum |
-// length of time that we should delay further UI resizes while waiting for a |
-// resized frame from a renderer. |
-const int kResizeLockTimeoutMs = 67; |
- |
#if defined(OS_WIN) |
// This class implements the ui::OnScreenKeyboardObserver interface |
@@ -211,6 +208,12 @@ class WinScreenKeyboardObserver : public ui::OnScreenKeyboardObserver { |
}; |
#endif // defined(OS_WIN) |
+// Callback from embedding the renderer. |
+void EmbedCallback(bool result) { |
+ if (!result) |
+ DVLOG(1) << "embed failed"; |
+} |
+ |
} // namespace |
// We need to watch for mouse events outside a Web Popup or its parent |
@@ -356,6 +359,12 @@ class RenderWidgetHostViewAura::WindowAncestorObserver |
DISALLOW_COPY_AND_ASSIGN(WindowAncestorObserver); |
}; |
+bool IsMus() { |
+ return aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS && |
+ base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kUseMusInRenderer); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// RenderWidgetHostViewAura, public: |
@@ -386,28 +395,9 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, |
last_active_widget_routing_id_(MSG_ROUTING_NONE), |
event_handler_(new RenderWidgetHostViewEventHandler(host_, this, this)), |
weak_ptr_factory_(this) { |
- // GuestViews have two RenderWidgetHostViews and so we need to make sure |
- // we don't have FrameSinkId collisions. |
- ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
- cc::FrameSinkId frame_sink_id = |
- is_guest_view_hack_ |
- ? factory->GetContextFactoryPrivate()->AllocateFrameSinkId() |
- : cc::FrameSinkId( |
- base::checked_cast<uint32_t>(host_->GetProcess()->GetID()), |
- base::checked_cast<uint32_t>(host_->GetRoutingID())); |
- delegated_frame_host_ = |
- base::MakeUnique<DelegatedFrameHost>(frame_sink_id, this); |
- |
if (!is_guest_view_hack_) |
host_->SetView(this); |
- // Let the page-level input event router know about our surface ID |
- // namespace for surface-based hit testing. |
- if (host_->delegate() && host_->delegate()->GetInputEventRouter()) { |
- host_->delegate()->GetInputEventRouter()->AddFrameSinkIdOwner( |
- GetFrameSinkId(), this); |
- } |
- |
// We should start observing the TextInputManager for IME-related events as |
// well as monitoring its lifetime. |
if (GetTextInputManager()) |
@@ -434,11 +424,9 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, |
void RenderWidgetHostViewAura::InitAsChild( |
gfx::NativeView parent_view) { |
- CreateAuraWindow(); |
- window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); |
- window_->Init(ui::LAYER_SOLID_COLOR); |
- window_->SetName("RenderWidgetHostViewAura"); |
- window_->layer()->SetColor(background_color_); |
+ CreateDelegatedFrameHostClient(); |
+ |
+ CreateAuraWindow(ui::wm::WINDOW_TYPE_CONTROL); |
if (parent_view) |
parent_view->AddChild(GetNativeView()); |
@@ -451,7 +439,8 @@ void RenderWidgetHostViewAura::InitAsChild( |
void RenderWidgetHostViewAura::InitAsPopup( |
RenderWidgetHostView* parent_host_view, |
const gfx::Rect& bounds_in_screen) { |
- CreateAuraWindow(); |
+ CreateDelegatedFrameHostClient(); |
+ |
popup_parent_host_view_ = |
static_cast<RenderWidgetHostViewAura*>(parent_host_view); |
@@ -472,10 +461,7 @@ void RenderWidgetHostViewAura::InitAsPopup( |
old_child->popup_parent_host_view_ = NULL; |
} |
popup_parent_host_view_->SetPopupChild(this); |
- window_->SetType(ui::wm::WINDOW_TYPE_MENU); |
- window_->Init(ui::LAYER_SOLID_COLOR); |
- window_->SetName("RenderWidgetHostViewAura"); |
- window_->layer()->SetColor(background_color_); |
+ CreateAuraWindow(ui::wm::WINDOW_TYPE_MENU); |
// Setting the transient child allows for the popup to get mouse events when |
// in a system modal dialog. Do this before calling ParentWindowWithContext |
@@ -503,13 +489,10 @@ void RenderWidgetHostViewAura::InitAsPopup( |
void RenderWidgetHostViewAura::InitAsFullscreen( |
RenderWidgetHostView* reference_host_view) { |
- CreateAuraWindow(); |
is_fullscreen_ = true; |
- window_->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
- window_->Init(ui::LAYER_SOLID_COLOR); |
- window_->SetName("RenderWidgetHostViewAura"); |
+ CreateDelegatedFrameHostClient(); |
+ CreateAuraWindow(ui::wm::WINDOW_TYPE_NORMAL); |
window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); |
- window_->layer()->SetColor(background_color_); |
aura::Window* parent = NULL; |
gfx::Rect bounds; |
@@ -541,7 +524,8 @@ void RenderWidgetHostViewAura::Show() { |
if (!host_->is_hidden()) |
return; |
- bool has_saved_frame = delegated_frame_host_->HasSavedFrame(); |
+ bool has_saved_frame = |
+ delegated_frame_host_ ? delegated_frame_host_->HasSavedFrame() : false; |
ui::LatencyInfo renderer_latency_info, browser_latency_info; |
if (has_saved_frame) { |
browser_latency_info.AddLatencyNumber( |
@@ -560,7 +544,8 @@ void RenderWidgetHostViewAura::Show() { |
NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); |
} |
- delegated_frame_host_->WasShown(browser_latency_info); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->WasShown(browser_latency_info); |
#if defined(OS_WIN) |
UpdateLegacyWin(); |
@@ -573,7 +558,8 @@ void RenderWidgetHostViewAura::Hide() { |
// TODO(wjmaclean): can host_ ever be null? |
if (host_ && !host_->is_hidden()) { |
host_->WasHidden(); |
- delegated_frame_host_->WasHidden(); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->WasHidden(); |
#if defined(OS_WIN) |
aura::WindowTreeHost* host = window_->GetHost(); |
@@ -744,7 +730,8 @@ bool RenderWidgetHostViewAura::HasFocus() const { |
} |
bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const { |
- return delegated_frame_host_->CanCopyToBitmap(); |
+ return delegated_frame_host_ ? delegated_frame_host_->CanCopyToBitmap() |
+ : false; |
} |
bool RenderWidgetHostViewAura::IsShowing() { |
@@ -851,7 +838,9 @@ void RenderWidgetHostViewAura::SetTooltipText( |
} |
gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const { |
- return delegated_frame_host_->GetRequestedRendererSize(); |
+ return delegated_frame_host_ |
+ ? delegated_frame_host_->GetRequestedRendererSize() |
+ : RenderWidgetHostViewBase::GetRequestedRendererSize(); |
} |
void RenderWidgetHostViewAura::CopyFromCompositingSurface( |
@@ -859,6 +848,8 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurface( |
const gfx::Size& dst_size, |
const ReadbackRequestCallback& callback, |
const SkColorType preferred_color_type) { |
+ if (!delegated_frame_host_) |
+ return; |
delegated_frame_host_->CopyFromCompositingSurface( |
src_subrect, dst_size, callback, preferred_color_type); |
} |
@@ -867,21 +858,26 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame( |
const gfx::Rect& src_subrect, |
const scoped_refptr<media::VideoFrame>& target, |
const base::Callback<void(const gfx::Rect&, bool)>& callback) { |
+ if (!delegated_frame_host_) |
+ return; |
delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame( |
src_subrect, target, callback); |
} |
bool RenderWidgetHostViewAura::CanCopyToVideoFrame() const { |
- return delegated_frame_host_->CanCopyToVideoFrame(); |
+ return delegated_frame_host_ ? delegated_frame_host_->CanCopyToVideoFrame() |
+ : false; |
} |
void RenderWidgetHostViewAura::BeginFrameSubscription( |
std::unique_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { |
- delegated_frame_host_->BeginFrameSubscription(std::move(subscriber)); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->BeginFrameSubscription(std::move(subscriber)); |
} |
void RenderWidgetHostViewAura::EndFrameSubscription() { |
- delegated_frame_host_->EndFrameSubscription(); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->EndFrameSubscription(); |
} |
#if defined(OS_WIN) |
@@ -935,14 +931,17 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame( |
selection.end.SetEdge(end_edge_top, end_edge_bottom); |
} |
- delegated_frame_host_->SwapDelegatedFrame(compositor_frame_sink_id, |
- std::move(frame)); |
+ if (delegated_frame_host_) { |
+ delegated_frame_host_->SwapDelegatedFrame(compositor_frame_sink_id, |
+ std::move(frame)); |
+ } |
SelectionUpdated(selection.is_editable, selection.is_empty_text_form_control, |
selection.start, selection.end); |
} |
void RenderWidgetHostViewAura::ClearCompositorFrame() { |
- delegated_frame_host_->ClearDelegatedFrame(); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->ClearDelegatedFrame(); |
} |
void RenderWidgetHostViewAura::DidStopFlinging() { |
@@ -1601,8 +1600,12 @@ cc::FrameSinkId RenderWidgetHostViewAura::FrameSinkIdAtPoint( |
// |point| from DIPs to pixels before hittesting. |
gfx::Point point_in_pixels = |
gfx::ConvertPointToPixel(device_scale_factor_, point); |
- cc::SurfaceId id = delegated_frame_host_->SurfaceIdAtPoint( |
- delegate, point_in_pixels, transformed_point); |
+ // TODO: this shouldn't be used with aura-mus, so that the null check so |
+ // go away and become a DCHECK. |
+ cc::SurfaceId id = delegated_frame_host_ |
+ ? delegated_frame_host_->SurfaceIdAtPoint( |
+ delegate, point_in_pixels, transformed_point) |
+ : cc::SurfaceId(); |
*transformed_point = |
gfx::ConvertPointToDIP(device_scale_factor_, *transformed_point); |
@@ -1645,7 +1648,10 @@ bool RenderWidgetHostViewAura::TransformPointToLocalCoordSpace( |
// is necessary. |
gfx::Point point_in_pixels = |
gfx::ConvertPointToPixel(device_scale_factor_, point); |
- if (!delegated_frame_host_->TransformPointToLocalCoordSpace( |
+ // TODO: this shouldn't be used with aura-mus, so that the null check so |
+ // go away and become a DCHECK. |
+ if (delegated_frame_host_ && |
+ !delegated_frame_host_->TransformPointToLocalCoordSpace( |
point_in_pixels, original_surface, transformed_point)) |
return false; |
*transformed_point = |
@@ -1657,7 +1663,7 @@ bool RenderWidgetHostViewAura::TransformPointToCoordSpaceForView( |
const gfx::Point& point, |
RenderWidgetHostViewBase* target_view, |
gfx::Point* transformed_point) { |
- if (target_view == this) { |
+ if (target_view == this || !delegated_frame_host_) { |
*transformed_point = point; |
return true; |
} |
@@ -1865,9 +1871,10 @@ RenderWidgetHostViewAura::~RenderWidgetHostViewAura() { |
text_input_manager_->RemoveObserver(this); |
} |
-void RenderWidgetHostViewAura::CreateAuraWindow() { |
+void RenderWidgetHostViewAura::CreateAuraWindow(ui::wm::WindowType type) { |
DCHECK(!window_); |
window_ = new aura::Window(this); |
+ window_->SetName("RenderWidgetHostViewAura"); |
event_handler_->set_window(window_); |
window_observer_.reset(new WindowObserver(this)); |
@@ -1875,6 +1882,55 @@ void RenderWidgetHostViewAura::CreateAuraWindow() { |
aura::client::SetActivationDelegate(window_, this); |
aura::client::SetFocusChangeObserver(window_, this); |
display::Screen::GetScreen()->AddObserver(this); |
+ |
+ window_->SetType(type); |
+ window_->Init(ui::LAYER_SOLID_COLOR); |
+ window_->layer()->SetColor(background_color_); |
+ |
+ if (!IsMus()) |
+ return; |
+ |
+ // Connect to the renderer, pass it a WindowTreeClient interface request |
+ // and embed that client inside our mus window. |
+ mojom::RenderWidgetWindowTreeClientFactoryPtr factory; |
+ host_->GetProcess()->GetRemoteInterfaces()->GetInterface(&factory); |
+ |
+ ui::mojom::WindowTreeClientPtr window_tree_client; |
+ factory->CreateWindowTreeClientForRenderWidget( |
+ host_->GetRoutingID(), mojo::GetProxy(&window_tree_client)); |
+ aura::WindowPortMus::Get(window_)->Embed( |
+ std::move(window_tree_client), |
+ ui::mojom::kEmbedFlagEmbedderInterceptsEvents, |
+ base::Bind(&EmbedCallback)); |
+} |
+ |
+void RenderWidgetHostViewAura::CreateDelegatedFrameHostClient() { |
+ if (IsMus()) |
+ return; |
+ |
+ // GuestViews have two RenderWidgetHostViews and so we need to make sure |
+ // we don't have FrameSinkId collisions. |
+ ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
+ cc::FrameSinkId frame_sink_id = |
+ is_guest_view_hack_ |
+ ? factory->GetContextFactoryPrivate()->AllocateFrameSinkId() |
+ : cc::FrameSinkId( |
+ base::checked_cast<uint32_t>(host_->GetProcess()->GetID()), |
+ base::checked_cast<uint32_t>(host_->GetRoutingID())); |
+ // Tests may set |delegated_frame_host_client_|. |
+ if (!delegated_frame_host_client_) { |
+ delegated_frame_host_client_ = |
+ base::MakeUnique<DelegatedFrameHostClientAura>(this); |
+ } |
+ delegated_frame_host_ = base::MakeUnique<DelegatedFrameHost>( |
+ frame_sink_id, delegated_frame_host_client_.get()); |
+ |
+ // Let the page-level input event router know about our surface ID |
+ // namespace for surface-based hit testing. |
+ if (host_->delegate() && host_->delegate()->GetInputEventRouter()) { |
+ host_->delegate()->GetInputEventRouter()->AddFrameSinkIdOwner( |
+ GetFrameSinkId(), this); |
+ } |
} |
void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() { |
@@ -2053,7 +2109,8 @@ void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) { |
if (!in_bounds_changed_) |
window_->SetBounds(rect); |
host_->WasResized(); |
- delegated_frame_host_->WasResized(); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->WasResized(); |
#if defined(OS_WIN) |
UpdateLegacyWin(); |
@@ -2119,7 +2176,8 @@ void RenderWidgetHostViewAura::AddedToRootWindow() { |
UpdateLegacyWin(); |
#endif |
- delegated_frame_host_->SetCompositor(window_->GetHost()->compositor()); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->SetCompositor(window_->GetHost()->compositor()); |
} |
void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
@@ -2131,7 +2189,8 @@ void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
DetachFromInputMethod(); |
window_->GetHost()->RemoveObserver(this); |
- delegated_frame_host_->ResetCompositor(); |
+ if (delegated_frame_host_) |
+ delegated_frame_host_->ResetCompositor(); |
#if defined(OS_WIN) |
// Update the legacy window's parent temporarily to the hidden window. It |
@@ -2205,81 +2264,6 @@ void RenderWidgetHostViewAura::CreateSelectionController() { |
selection_controller_client_.get(), tsc_config)); |
} |
-//////////////////////////////////////////////////////////////////////////////// |
-// DelegatedFrameHost, public: |
- |
-ui::Layer* RenderWidgetHostViewAura::DelegatedFrameHostGetLayer() const { |
- return window_->layer(); |
-} |
- |
-bool RenderWidgetHostViewAura::DelegatedFrameHostIsVisible() const { |
- return !host_->is_hidden(); |
-} |
- |
-SkColor RenderWidgetHostViewAura::DelegatedFrameHostGetGutterColor( |
- SkColor color) const { |
- // When making an element on the page fullscreen the element's background |
- // may not match the page's, so use black as the gutter color to avoid |
- // flashes of brighter colors during the transition. |
- if (host_->delegate() && host_->delegate()->IsFullscreenForCurrentTab()) |
- return SK_ColorBLACK; |
- return color; |
-} |
- |
-gfx::Size RenderWidgetHostViewAura::DelegatedFrameHostDesiredSizeInDIP() const { |
- return window_->bounds().size(); |
-} |
- |
-bool RenderWidgetHostViewAura::DelegatedFrameCanCreateResizeLock() const { |
-#if !defined(OS_CHROMEOS) |
- // On Windows and Linux, holding pointer moves will not help throttling |
- // resizes. |
- // TODO(piman): on Windows we need to block (nested message loop?) the |
- // WM_SIZE event. On Linux we need to throttle at the WM level using |
- // _NET_WM_SYNC_REQUEST. |
- return false; |
-#else |
- if (host_->auto_resize_enabled()) |
- return false; |
- return true; |
-#endif |
-} |
- |
-std::unique_ptr<ResizeLock> |
-RenderWidgetHostViewAura::DelegatedFrameHostCreateResizeLock( |
- bool defer_compositor_lock) { |
- gfx::Size desired_size = window_->bounds().size(); |
- return std::unique_ptr<ResizeLock>(new CompositorResizeLock( |
- window_->GetHost(), desired_size, defer_compositor_lock, |
- base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs))); |
-} |
- |
-void RenderWidgetHostViewAura::DelegatedFrameHostResizeLockWasReleased() { |
- host_->WasResized(); |
-} |
- |
-void RenderWidgetHostViewAura::DelegatedFrameHostSendReclaimCompositorResources( |
- int compositor_frame_sink_id, |
- bool is_swap_ack, |
- const cc::ReturnedResourceArray& resources) { |
- host_->Send(new ViewMsg_ReclaimCompositorResources( |
- host_->GetRoutingID(), compositor_frame_sink_id, is_swap_ack, resources)); |
-} |
- |
-void RenderWidgetHostViewAura::SetBeginFrameSource( |
- cc::BeginFrameSource* source) { |
- if (begin_frame_source_ && added_frame_observer_) { |
- begin_frame_source_->RemoveObserver(this); |
- added_frame_observer_ = false; |
- } |
- begin_frame_source_ = source; |
- UpdateNeedsBeginFramesInternal(); |
-} |
- |
-bool RenderWidgetHostViewAura::IsAutoResizeEnabled() const { |
- return host_->auto_resize_enabled(); |
-} |
- |
void RenderWidgetHostViewAura::OnDidNavigateMainFrameToNewPage() { |
ui::GestureRecognizer::Get()->CancelActiveTouches(window_); |
} |
@@ -2293,11 +2277,13 @@ void RenderWidgetHostViewAura::UnlockCompositingSurface() { |
} |
cc::FrameSinkId RenderWidgetHostViewAura::GetFrameSinkId() { |
- return delegated_frame_host_->GetFrameSinkId(); |
+ return delegated_frame_host_ ? delegated_frame_host_->GetFrameSinkId() |
+ : cc::FrameSinkId(); |
} |
cc::SurfaceId RenderWidgetHostViewAura::SurfaceIdForTesting() const { |
- return delegated_frame_host_->SurfaceIdForTesting(); |
+ return delegated_frame_host_ ? delegated_frame_host_->SurfaceIdForTesting() |
+ : cc::SurfaceId(); |
} |
void RenderWidgetHostViewAura::OnUpdateTextInputStateCalled( |