[printing] Fix crash printing selection.
When selection printing occurs a WebView is created that doesn't
composite so accessing a LayerTreeHost is invalid. Change the type of
the provided value to CreateMediaPlayer to be a ptr as opposed to a
reference so it can be optional.
Bug: 1403568
Change-Id: Ib92a8342618debe7fd5192c732b0edf36008b019
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4157352
Reviewed-by: Jeremy Roman <jbroman@chromium.org>
Reviewed-by: Stefan Zager <szager@chromium.org>
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1091511}
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 4d57400d..03fb20bb 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -3250,11 +3250,14 @@
WebMediaPlayerEncryptedMediaClient* encrypted_client,
WebContentDecryptionModule* initial_cdm,
const blink::WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) {
+ // `settings` should be non-null since the WebView created for
+ // RenderFrameImpl always composites.
+ DCHECK(settings);
return media_factory_.CreateMediaPlayer(
source, client, inspector_context, encrypted_client, initial_cdm, sink_id,
- GetLocalRootWebFrameWidget()->GetFrameSinkId(), settings,
+ GetLocalRootWebFrameWidget()->GetFrameSinkId(), *settings,
agent_scheduling_group_.agent_group_scheduler().CompositorTaskRunner(),
std::move(compositor_worker_task_runner));
}
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 6b70546..88d2ef7 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -489,7 +489,7 @@
blink::WebMediaPlayerEncryptedMediaClient* encrypted_client,
blink::WebContentDecryptionModule* initial_cdm,
const blink::WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) override;
std::unique_ptr<blink::WebContentSettingsClient>
CreateWorkerContentSettingsClient() override;
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index c27c7cd3..9fa27d4f 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -169,7 +169,7 @@
WebMediaPlayerEncryptedMediaClient*,
WebContentDecryptionModule*,
const WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) {
return nullptr;
}
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index c2d4e4e..58577e1 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -1671,8 +1671,11 @@
return widget_base_->LayerTreeHost()->GetId();
}
-const cc::LayerTreeSettings& WebFrameWidgetImpl::GetLayerTreeSettings() {
- return widget_base_->LayerTreeHost()->GetSettings();
+const cc::LayerTreeSettings* WebFrameWidgetImpl::GetLayerTreeSettings() {
+ if (!View()->does_composite()) {
+ return nullptr;
+ }
+ return &widget_base_->LayerTreeHost()->GetSettings();
}
void WebFrameWidgetImpl::UpdateBrowserControlsState(
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index 7e9e0b1d..560b82a 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -224,7 +224,7 @@
base::OnceCallback<void(base::TimeTicks)> presentation_callback) final;
void RequestBeginMainFrameNotExpected(bool request) final;
int GetLayerTreeId() final;
- const cc::LayerTreeSettings& GetLayerTreeSettings() final;
+ const cc::LayerTreeSettings* GetLayerTreeSettings() final;
void UpdateBrowserControlsState(cc::BrowserControlsState constraints,
cc::BrowserControlsState current,
bool animate) final;
diff --git a/third_party/blink/renderer/core/html/media/video_auto_fullscreen_test.cc b/third_party/blink/renderer/core/html/media/video_auto_fullscreen_test.cc
index 854447b..bc1baa5 100644
--- a/third_party/blink/renderer/core/html/media/video_auto_fullscreen_test.cc
+++ b/third_party/blink/renderer/core/html/media/video_auto_fullscreen_test.cc
@@ -66,7 +66,7 @@
WebMediaPlayerEncryptedMediaClient*,
WebContentDecryptionModule*,
const WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) final {
return new EmptyWebMediaPlayer();
}
diff --git a/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc b/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc
index 4de1a88..daaccd33 100644
--- a/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc
+++ b/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc
@@ -130,7 +130,7 @@
WebMediaPlayerEncryptedMediaClient*,
WebContentDecryptionModule*,
const WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) override {
return web_media_player_.release();
}
diff --git a/third_party/blink/renderer/core/page/context_menu_controller_test.cc b/third_party/blink/renderer/core/page/context_menu_controller_test.cc
index a74c02a..a387ead 100644
--- a/third_party/blink/renderer/core/page/context_menu_controller_test.cc
+++ b/third_party/blink/renderer/core/page/context_menu_controller_test.cc
@@ -116,7 +116,7 @@
WebMediaPlayerEncryptedMediaClient*,
WebContentDecryptionModule*,
const WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) override {
return new MockWebMediaPlayerForContextMenu();
}
diff --git a/third_party/blink/renderer/core/paint/video_painter_test.cc b/third_party/blink/renderer/core/paint/video_painter_test.cc
index c9fba9a5..0ac85ed 100644
--- a/third_party/blink/renderer/core/paint/video_painter_test.cc
+++ b/third_party/blink/renderer/core/paint/video_painter_test.cc
@@ -157,7 +157,7 @@
WebMediaPlayerEncryptedMediaClient*,
WebContentDecryptionModule*,
const WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) override {
MockWebMediaPlayer* player = new MockWebMediaPlayer(client);
EXPECT_CALL(*player, HasAvailableVideoFrame)
diff --git a/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_test.cc b/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_test.cc
index 857a761..b3f6bbd 100644
--- a/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_test.cc
+++ b/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_test.cc
@@ -279,7 +279,7 @@
WebMediaPlayerEncryptedMediaClient*,
WebContentDecryptionModule*,
const WebString& sink_id,
- const cc::LayerTreeSettings& settings,
+ const cc::LayerTreeSettings* settings,
scoped_refptr<base::TaskRunner> compositor_worker_task_runner) override {
return web_media_player_.release();
}
diff --git a/third_party/blink/renderer/platform/widget/frame_widget.h b/third_party/blink/renderer/platform/widget/frame_widget.h
index 669b180..e941312 100644
--- a/third_party/blink/renderer/platform/widget/frame_widget.h
+++ b/third_party/blink/renderer/platform/widget/frame_widget.h
@@ -90,8 +90,9 @@
virtual int GetLayerTreeId() = 0;
// Return the LayerTreeSettings from the compositor. These are constant from
- // the time the compositor is created.
- virtual const cc::LayerTreeSettings& GetLayerTreeSettings() = 0;
+ // the time the compositor is created. This may return null if the widget
+ // does not composite.
+ virtual const cc::LayerTreeSettings* GetLayerTreeSettings() = 0;
// Sets the state of the browser controls. (Used for URL bar animations.)
virtual void UpdateBrowserControlsState(cc::BrowserControlsState constraints,