diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index 737f424398f9188da074fadfc1cf0827052a1ced..b03be1313afa245269769a0ce5529bfd0a14ae22 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -332,6 +332,7 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost *widget
     , m_cursorPosition(0)
     , m_emptyPreviousSelection(true)
     , m_wheelAckPending(false)
+    , m_pendingResize(false)
     , m_mouseWheelPhaseHandler(this)
 {
     host()->SetView(this);
@@ -348,6 +349,8 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost *widget
 
     const QPlatformInputContext *context = QGuiApplicationPrivate::platformIntegration()->inputContext();
     m_imeHasHiddenTextCapability = context && context->hasCapability(QPlatformInputContext::HiddenTextCapability);
+
+    m_localSurfaceId = m_localSurfaceIdAllocator.GenerateId();
 }
 
 RenderWidgetHostViewQt::~RenderWidgetHostViewQt()
@@ -734,11 +737,6 @@ void RenderWidgetHostViewQt::SubmitCompositorFrame(const viz::LocalSurfaceId &lo
     bool contentsSizeChanged = (m_lastContentsSize != frame.metadata.root_layer_size);
     m_lastScrollOffset = frame.metadata.root_scroll_offset;
     m_lastContentsSize = frame.metadata.root_layer_size;
-    if (m_localSurfaceId != local_surface_id) {
-        m_localSurfaceId = local_surface_id;
-        // FIXME: update frame_size and device_scale_factor?
-        // FIXME: showPrimarySurface()?
-    }
 
     // Force to process swap messages
     uint32_t frame_token = frame.metadata.frame_token;
@@ -940,15 +938,41 @@ void RenderWidgetHostViewQt::OnGestureEvent(const ui::GestureEventData& gesture)
     host()->ForwardGestureEvent(ui::CreateWebGestureEventFromGestureEventData(gesture));
 }
 
+viz::ScopedSurfaceIdAllocator RenderWidgetHostViewQt::DidUpdateVisualProperties(const cc::RenderFrameMetadata &metadata)
+{
+    base::OnceCallback<void()> allocation_task =
+        base::BindOnce(&RenderWidgetHostViewQt::OnDidUpdateVisualPropertiesComplete,
+                       base::Unretained(this), metadata);
+    return viz::ScopedSurfaceIdAllocator(std::move(allocation_task));
+}
+
+void RenderWidgetHostViewQt::OnDidUpdateVisualPropertiesComplete(const cc::RenderFrameMetadata &metadata)
+{
+    if (metadata.local_surface_id)
+        m_localSurfaceIdAllocator.UpdateFromChild(*metadata.local_surface_id);
+
+    m_localSurfaceId = m_localSurfaceIdAllocator.GenerateId();
+    host()->SendScreenRects();
+    if (m_pendingResize) {
+        if (host()->SynchronizeVisualProperties())
+            m_pendingResize = false;
+    }
+}
+
 QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode)
 {
+    if (m_pendingResize && host()) {
+        if (host()->SynchronizeVisualProperties())
+            m_pendingResize = false;
+    }
     return m_compositor->updatePaintNode(oldNode);
 }
 
 void RenderWidgetHostViewQt::notifyResize()
 {
-    host()->SynchronizeVisualProperties();
-    host()->SendScreenRects();
+    m_pendingResize = true;
+    if (host()->SynchronizeVisualProperties())
+        m_pendingResize = false;
 }
 
 void RenderWidgetHostViewQt::notifyShown()
diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h
index 92cc422a8db8d73034458ac4e3747370c36fc881..9624e1c6d07962e21b621dec6d071a8784842dee 100644
--- a/src/core/render_widget_host_view_qt.h
+++ b/src/core/render_widget_host_view_qt.h
@@ -45,6 +45,7 @@
 #include "base/memory/weak_ptr.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/common/resources/transferable_resource.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
@@ -143,6 +144,8 @@ public:
     void SubmitCompositorFrame(const viz::LocalSurfaceId&, viz::CompositorFrame, base::Optional<viz::HitTestRegionList>) override;
     void WheelEventAck(const blink::WebMouseWheelEvent &event, content::InputEventAckState ack_result) override;
     content::MouseWheelPhaseHandler *GetMouseWheelPhaseHandler() override;
+    viz::ScopedSurfaceIdAllocator DidUpdateVisualProperties(const cc::RenderFrameMetadata &metadata) override;
+    void OnDidUpdateVisualPropertiesComplete(const cc::RenderFrameMetadata &metadata);
 
     void GetScreenInfo(content::ScreenInfo* results) const override;
     gfx::Rect GetBoundsInRootWindow() override;
@@ -245,6 +248,7 @@ private:
     gfx::Vector2dF m_lastScrollOffset;
     gfx::SizeF m_lastContentsSize;
     viz::LocalSurfaceId m_localSurfaceId;
+    viz::ParentLocalSurfaceIdAllocator m_localSurfaceIdAllocator;
 
     uint m_imState;
     int m_anchorPositionWithinSelection;
@@ -256,6 +260,7 @@ private:
     bool m_imeHasHiddenTextCapability;
 
     bool m_wheelAckPending;
+    bool m_pendingResize;
     QList<blink::WebMouseWheelEvent> m_pendingWheelEvents;
     content::MouseWheelPhaseHandler m_mouseWheelPhaseHandler;