|
@@ -264,6 +264,7 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
|
|
|
size_(native_window->GetSize()),
|
|
|
painting_(painting),
|
|
|
is_showing_(!render_widget_host_->is_hidden()),
|
|
|
+ mouse_wheel_phase_handler_(render_widget_host_, this),
|
|
|
weak_ptr_factory_(this) {
|
|
|
DCHECK(render_widget_host_);
|
|
|
bool is_guest_view_hack = parent_host_view_ != nullptr;
|
|
@@ -279,10 +280,8 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
|
|
|
|
|
|
local_surface_id_ = local_surface_id_allocator_.GenerateId();
|
|
|
|
|
|
- // Surface synchronization is not supported with OSR.
|
|
|
- DCHECK(!features::IsSurfaceSynchronizationEnabled());
|
|
|
-
|
|
|
#if defined(OS_MACOSX)
|
|
|
+ last_frame_root_background_color_ = SK_ColorTRANSPARENT;
|
|
|
CreatePlatformWidget(is_guest_view_hack);
|
|
|
#else
|
|
|
// On macOS the ui::Compositor is created/owned by the platform view.
|
|
@@ -303,7 +302,7 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
|
|
|
|
|
|
native_window_->AddObserver(this);
|
|
|
|
|
|
- ResizeRootLayer();
|
|
|
+ ResizeRootLayer(false);
|
|
|
render_widget_host_->SetView(this);
|
|
|
InstallTransparency();
|
|
|
}
|
|
@@ -385,7 +384,7 @@ void OffScreenRenderWidgetHostView::InitAsChild(gfx::NativeView) {
|
|
|
parent_host_view_->set_child_host_view(this);
|
|
|
parent_host_view_->Hide();
|
|
|
|
|
|
- ResizeRootLayer();
|
|
|
+ ResizeRootLayer(false);
|
|
|
Show();
|
|
|
}
|
|
|
|
|
@@ -514,6 +513,10 @@ void OffScreenRenderWidgetHostView::SubmitCompositorFrame(
|
|
|
TRACE_EVENT0("electron",
|
|
|
"OffScreenRenderWidgetHostView::SubmitCompositorFrame");
|
|
|
|
|
|
+#if defined(OS_MACOSX)
|
|
|
+ last_frame_root_background_color_ = frame.metadata.root_background_color;
|
|
|
+#endif
|
|
|
+
|
|
|
if (frame.metadata.root_scroll_offset != last_scroll_offset_) {
|
|
|
last_scroll_offset_ = frame.metadata.root_scroll_offset;
|
|
|
}
|
|
@@ -579,7 +582,7 @@ void OffScreenRenderWidgetHostView::InitAsPopup(
|
|
|
|
|
|
popup_position_ = pos;
|
|
|
|
|
|
- ResizeRootLayer();
|
|
|
+ ResizeRootLayer(false);
|
|
|
Show();
|
|
|
}
|
|
|
|
|
@@ -743,10 +746,6 @@ OffScreenRenderWidgetHostView::DelegatedFrameHostCreateResizeLock() {
|
|
|
return std::make_unique<content::CompositorResizeLock>(this, desired_size);
|
|
|
}
|
|
|
|
|
|
-viz::LocalSurfaceId OffScreenRenderWidgetHostView::GetLocalSurfaceId() const {
|
|
|
- return local_surface_id_;
|
|
|
-}
|
|
|
-
|
|
|
void OffScreenRenderWidgetHostView::OnFirstSurfaceActivation(
|
|
|
const viz::SurfaceInfo& surface_info) {}
|
|
|
|
|
@@ -774,8 +773,26 @@ bool OffScreenRenderWidgetHostView::IsAutoResizeEnabled() const {
|
|
|
return render_widget_host_->auto_resize_enabled();
|
|
|
}
|
|
|
|
|
|
+viz::LocalSurfaceId OffScreenRenderWidgetHostView::GetLocalSurfaceId() const {
|
|
|
+ return local_surface_id_;
|
|
|
+}
|
|
|
+
|
|
|
#endif // !defined(OS_MACOSX)
|
|
|
|
|
|
+viz::FrameSinkId OffScreenRenderWidgetHostView::GetFrameSinkId() {
|
|
|
+ return GetDelegatedFrameHost()->frame_sink_id();
|
|
|
+}
|
|
|
+
|
|
|
+void OffScreenRenderWidgetHostView::DidNavigate() {
|
|
|
+ ResizeRootLayer(true);
|
|
|
+#if defined(OS_MACOSX)
|
|
|
+ browser_compositor_->DidNavigate();
|
|
|
+#else
|
|
|
+ if (delegated_frame_host_)
|
|
|
+ delegated_frame_host_->DidNavigate();
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
bool OffScreenRenderWidgetHostView::TransformPointToLocalCoordSpace(
|
|
|
const gfx::PointF& point,
|
|
|
const viz::SurfaceId& original_surface,
|
|
@@ -882,7 +899,7 @@ OffScreenRenderWidgetHostView::CreateSoftwareOutputDevice(
|
|
|
DCHECK(!copy_frame_generator_);
|
|
|
DCHECK(!software_output_device_);
|
|
|
|
|
|
- ResizeRootLayer();
|
|
|
+ ResizeRootLayer(false);
|
|
|
|
|
|
software_output_device_ = new OffScreenOutputDevice(
|
|
|
transparent_, base::Bind(&OffScreenRenderWidgetHostView::OnPaint,
|
|
@@ -1034,7 +1051,7 @@ void OffScreenRenderWidgetHostView::WasResized() {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- ResizeRootLayer();
|
|
|
+ ResizeRootLayer(false);
|
|
|
if (render_widget_host_)
|
|
|
render_widget_host_->WasResized();
|
|
|
GetDelegatedFrameHost()->WasResized(local_surface_id_, size_,
|
|
@@ -1096,18 +1113,29 @@ void OffScreenRenderWidgetHostView::SendMouseWheelEvent(
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ blink::WebMouseWheelEvent mouse_wheel_event(event);
|
|
|
+
|
|
|
+ mouse_wheel_phase_handler_.SendWheelEndIfNeeded();
|
|
|
+ mouse_wheel_phase_handler_.AddPhaseIfNeededAndScheduleEndEvent(
|
|
|
+ mouse_wheel_event, false);
|
|
|
+
|
|
|
if (!IsPopupWidget()) {
|
|
|
if (popup_host_view_) {
|
|
|
if (popup_host_view_->popup_position_.Contains(
|
|
|
- event.PositionInWidget().x, event.PositionInWidget().y)) {
|
|
|
- blink::WebMouseWheelEvent popup_event(event);
|
|
|
- popup_event.SetPositionInWidget(
|
|
|
- popup_event.PositionInWidget().x -
|
|
|
+ mouse_wheel_event.PositionInWidget().x,
|
|
|
+ mouse_wheel_event.PositionInWidget().y)) {
|
|
|
+ blink::WebMouseWheelEvent popup_mouse_wheel_event(mouse_wheel_event);
|
|
|
+ popup_mouse_wheel_event.SetPositionInWidget(
|
|
|
+ mouse_wheel_event.PositionInWidget().x -
|
|
|
popup_host_view_->popup_position_.x(),
|
|
|
- popup_event.PositionInWidget().y -
|
|
|
+ mouse_wheel_event.PositionInWidget().y -
|
|
|
popup_host_view_->popup_position_.y());
|
|
|
- popup_host_view_->ProcessMouseWheelEvent(popup_event,
|
|
|
- ui::LatencyInfo());
|
|
|
+ popup_mouse_wheel_event.SetPositionInScreen(
|
|
|
+ popup_mouse_wheel_event.PositionInWidget().x,
|
|
|
+ popup_mouse_wheel_event.PositionInWidget().y);
|
|
|
+
|
|
|
+ popup_host_view_->SendMouseWheelEvent(popup_mouse_wheel_event);
|
|
|
return;
|
|
|
} else {
|
|
|
// Scrolling outside of the popup widget so destroy it.
|
|
@@ -1118,6 +1146,28 @@ void OffScreenRenderWidgetHostView::SendMouseWheelEvent(
|
|
|
base::BindOnce(&OffScreenRenderWidgetHostView::CancelWidget,
|
|
|
popup_host_view_->weak_ptr_factory_.GetWeakPtr()));
|
|
|
}
|
|
|
+ } else if (!guest_host_views_.empty()) {
|
|
|
+ for (auto guest_host_view : guest_host_views_) {
|
|
|
+ if (!guest_host_view->render_widget_host_ ||
|
|
|
+ !guest_host_view->render_widget_host_->GetView()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ const gfx::Rect& guest_bounds =
|
|
|
+ guest_host_view->render_widget_host_->GetView()->GetViewBounds();
|
|
|
+ if (guest_bounds.Contains(mouse_wheel_event.PositionInWidget().x,
|
|
|
+ mouse_wheel_event.PositionInWidget().y)) {
|
|
|
+ blink::WebMouseWheelEvent guest_mouse_wheel_event(mouse_wheel_event);
|
|
|
+ guest_mouse_wheel_event.SetPositionInWidget(
|
|
|
+ mouse_wheel_event.PositionInWidget().x - guest_bounds.x(),
|
|
|
+ mouse_wheel_event.PositionInWidget().y - guest_bounds.y());
|
|
|
+ guest_mouse_wheel_event.SetPositionInScreen(
|
|
|
+ guest_mouse_wheel_event.PositionInWidget().x,
|
|
|
+ guest_mouse_wheel_event.PositionInWidget().y);
|
|
|
+
|
|
|
+ guest_host_view->SendMouseWheelEvent(guest_mouse_wheel_event);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
if (!render_widget_host_)
|
|
@@ -1183,8 +1233,10 @@ void OffScreenRenderWidgetHostView::SetupFrameRate(bool force) {
|
|
|
|
|
|
frame_rate_threshold_us_ = 1000000 / frame_rate_;
|
|
|
|
|
|
- GetCompositor()->SetAuthoritativeVSyncInterval(
|
|
|
- base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_));
|
|
|
+ if (GetCompositor()) {
|
|
|
+ GetCompositor()->SetAuthoritativeVSyncInterval(
|
|
|
+ base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_));
|
|
|
+ }
|
|
|
|
|
|
if (copy_frame_generator_.get()) {
|
|
|
copy_frame_generator_->set_frame_rate_threshold_us(
|
|
@@ -1213,7 +1265,7 @@ void OffScreenRenderWidgetHostView::InvalidateBounds(const gfx::Rect& bounds) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void OffScreenRenderWidgetHostView::ResizeRootLayer() {
|
|
|
+void OffScreenRenderWidgetHostView::ResizeRootLayer(bool force) {
|
|
|
SetupFrameRate(false);
|
|
|
|
|
|
const float compositorScaleFactor = GetCompositor()->device_scale_factor();
|
|
@@ -1225,7 +1277,8 @@ void OffScreenRenderWidgetHostView::ResizeRootLayer() {
|
|
|
else
|
|
|
size = popup_position_.size();
|
|
|
|
|
|
- if (!scaleFactorDidChange && size == GetRootLayer()->bounds().size())
|
|
|
+ if (!force && !scaleFactorDidChange &&
|
|
|
+ size == GetRootLayer()->bounds().size())
|
|
|
return;
|
|
|
|
|
|
const gfx::Size& size_in_pixels =
|