Commit bb917a9e authored by Adam Raine's avatar Adam Raine Committed by Commit Bot

Added input argument types member to MainThreadDocumentPaintDefinition

CSSPaintImageGeneratorImpl::InputArgumentTypes required an extra case
for off main thread CSS Paint to uses MainThreadDocumentPaintDefinition
instead of DocumentPaintDefinition.  This required
MainThreadDocumentPaintDefinition to have an addition member to include
the input argument types.

An extra parameter was added to
PaintWorklet::RegisterMainThreadDocumentPaintDefinition and its
references were also changed to accommodate the extra member for the
input argument types.

Unit testing was added.

Bug: 946519
Change-Id: I038e5146a5bb6f2d2cec96799f32eae9eb6f5dfa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1635732Reviewed-by: default avatarAnders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: default avatarXida Chen <xidachen@chromium.org>
Commit-Queue: Adam Raine <asraine@google.com>
Cr-Commit-Position: refs/heads/master@{#665922}
parent b76475d4
......@@ -5,6 +5,7 @@
#include "third_party/blink/renderer/core/css/css_paint_value.h"
#include "third_party/blink/renderer/core/css/css_custom_ident_value.h"
#include "third_party/blink/renderer/core/css/css_paint_image_generator.h"
#include "third_party/blink/renderer/core/css/css_syntax_descriptor.h"
#include "third_party/blink/renderer/core/css/cssom/paint_worklet_deferred_image.h"
#include "third_party/blink/renderer/core/css/cssom/paint_worklet_input.h"
......@@ -60,15 +61,12 @@ scoped_refptr<Image> CSSPaintValue::GetImage(
GetName(), document, paint_image_generator_observer_);
}
if (!ParseInputArguments(document))
return nullptr;
// For Off-Thread PaintWorklet, we just collect the necessary inputs together
// and defer the actual JavaScript call until much later (during cc Raster).
if (RuntimeEnabledFeatures::OffMainThreadCSSPaintEnabled()) {
// If the main-thread does not yet know about this painter, there is no
// point sending it to cc - they won't be able to paint it. Once (or if) a
// matching painter is registered the |paint_image_generator_observer_| will
// cause us to be repainted.
if (!generator_->IsImageGeneratorReady())
return nullptr;
// TODO(crbug.com/946515): Break dependency on LayoutObject.
const LayoutObject& layout_object =
......@@ -89,9 +87,6 @@ scoped_refptr<Image> CSSPaintValue::GetImage(
return PaintWorkletDeferredImage::Create(std::move(input), target_size);
}
if (!ParseInputArguments(document))
return nullptr;
return generator_->Paint(client, target_size, parsed_input_arguments_);
}
......
......@@ -161,6 +161,17 @@ const CSSValue* CSSSyntaxDescriptor::Parse(CSSParserTokenRange range,
is_animation_tainted);
}
CSSSyntaxDescriptor CSSSyntaxDescriptor::IsolatedCopy() const {
Vector<CSSSyntaxComponent> syntax_components_copy;
syntax_components_copy.ReserveCapacity(syntax_components_.size());
for (const auto& syntax_component : syntax_components_) {
syntax_components_copy.push_back(CSSSyntaxComponent(
syntax_component.GetType(), syntax_component.GetString().IsolatedCopy(),
syntax_component.GetRepeat()));
}
return CSSSyntaxDescriptor(std::move(syntax_components_copy));
}
CSSSyntaxDescriptor::CSSSyntaxDescriptor(Vector<CSSSyntaxComponent> components)
: syntax_components_(std::move(components)) {
DCHECK(syntax_components_.size());
......
......@@ -34,6 +34,8 @@ class CORE_EXPORT CSSSyntaxDescriptor {
return Components() != a.Components();
}
CSSSyntaxDescriptor IsolatedCopy() const;
private:
friend class CSSSyntaxStringParser;
friend class CSSSyntaxStringParserTest;
......
......@@ -145,6 +145,12 @@ bool CSSPaintImageGeneratorImpl::HasAlpha() const {
const Vector<CSSSyntaxDescriptor>&
CSSPaintImageGeneratorImpl::InputArgumentTypes() const {
DEFINE_STATIC_LOCAL(Vector<CSSSyntaxDescriptor>, empty_vector, ());
if (RuntimeEnabledFeatures::OffMainThreadCSSPaintEnabled()) {
MainThreadDocumentPaintDefinition* definition;
if (!GetValidMainThreadDocumentDefinition(definition))
return empty_vector;
return definition->InputArgumentTypes();
}
DocumentPaintDefinition* definition;
if (!GetValidDocumentDefinition(definition))
return empty_vector;
......
......@@ -11,8 +11,10 @@ namespace blink {
MainThreadDocumentPaintDefinition::MainThreadDocumentPaintDefinition(
const Vector<CSSPropertyID>& native_invalidation_properties,
const Vector<String>& custom_invalidation_properties,
const Vector<CSSSyntaxDescriptor>& input_argument_types,
bool alpha)
: native_invalidation_properties_(native_invalidation_properties),
input_argument_types_(input_argument_types),
alpha_(alpha) {
custom_invalidation_properties_.ReserveInitialCapacity(
custom_invalidation_properties.size());
......
......@@ -6,6 +6,7 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_MAIN_THREAD_DOCUMENT_PAINT_DEFINITION_H_
#include "third_party/blink/renderer/core/css/css_property_names.h"
#include "third_party/blink/renderer/core/css/css_syntax_descriptor.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
......@@ -16,17 +17,12 @@ namespace blink {
// MainThreadDocumentPaintDefinition is a version of DocumentPaintDefinition for
// the OffMainThreadCSSPaint project. It is created on the main thread, using a
// copied version of native and custom invalidation properties.
//
// MainThreadDocumentPaintDefinition consists of:
// * A input properties which is a list of DOMStrings.
// * A input argument syntaxes which is a list of parsed CSS Properties and
// Values - not currently supported.
// * A context alpha flag.
class MODULES_EXPORT MainThreadDocumentPaintDefinition {
public:
explicit MainThreadDocumentPaintDefinition(
const Vector<CSSPropertyID>& native_invalidation_properties,
const Vector<String>& custom_invalidation_properties,
const Vector<CSSSyntaxDescriptor>& input_argument_types,
bool alpha);
virtual ~MainThreadDocumentPaintDefinition();
......@@ -38,11 +34,16 @@ class MODULES_EXPORT MainThreadDocumentPaintDefinition {
return custom_invalidation_properties_;
}
const Vector<CSSSyntaxDescriptor>& InputArgumentTypes() const {
return input_argument_types_;
}
bool alpha() const { return alpha_; }
private:
Vector<CSSPropertyID> native_invalidation_properties_;
Vector<AtomicString> custom_invalidation_properties_;
Vector<CSSSyntaxDescriptor> input_argument_types_;
bool alpha_;
};
......
......@@ -7,7 +7,9 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
#include "third_party/blink/renderer/core/css/css_property_names.h"
#include "third_party/blink/renderer/core/css/css_syntax_component.h"
#include "third_party/blink/renderer/core/css/css_syntax_descriptor.h"
#include "third_party/blink/renderer/core/css/css_syntax_string_parser.h"
#include "third_party/blink/renderer/modules/csspaint/css_paint_definition.h"
#include "third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d_settings.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
......@@ -23,9 +25,11 @@ TEST(MainThreadDocumentPaintDefinitionTest, NativeInvalidationProperties) {
CSSPropertyID::kTop,
};
Vector<String> custom_invalidation_properties;
Vector<CSSSyntaxDescriptor> input_argument_types;
MainThreadDocumentPaintDefinition document_definition(
native_invalidation_properties, custom_invalidation_properties, true);
native_invalidation_properties, custom_invalidation_properties,
input_argument_types, true);
EXPECT_EQ(document_definition.NativeInvalidationProperties().size(), 3u);
for (size_t i = 0; i < 3; i++) {
EXPECT_EQ(native_invalidation_properties[i],
......@@ -39,9 +43,11 @@ TEST(MainThreadDocumentPaintDefinitionTest, CustomInvalidationProperties) {
"--my-property",
"--another-property",
};
Vector<CSSSyntaxDescriptor> input_argument_types;
MainThreadDocumentPaintDefinition document_definition(
native_invalidation_properties, custom_invalidation_properties, true);
native_invalidation_properties, custom_invalidation_properties,
input_argument_types, true);
EXPECT_EQ(document_definition.CustomInvalidationProperties().size(), 2u);
for (size_t i = 0; i < 2; i++) {
EXPECT_EQ(custom_invalidation_properties[i],
......@@ -52,14 +58,35 @@ TEST(MainThreadDocumentPaintDefinitionTest, CustomInvalidationProperties) {
TEST(MainThreadDocumentPaintDefinitionTest, Alpha) {
Vector<CSSPropertyID> native_invalidation_properties;
Vector<String> custom_invalidation_properties;
Vector<CSSSyntaxDescriptor> input_argument_types;
MainThreadDocumentPaintDefinition document_definition_with_alpha(
native_invalidation_properties, custom_invalidation_properties, true);
native_invalidation_properties, custom_invalidation_properties,
input_argument_types, true);
MainThreadDocumentPaintDefinition document_definition_without_alpha(
native_invalidation_properties, custom_invalidation_properties, false);
native_invalidation_properties, custom_invalidation_properties,
input_argument_types, false);
EXPECT_TRUE(document_definition_with_alpha.alpha());
EXPECT_FALSE(document_definition_without_alpha.alpha());
}
TEST(MainThreadDocumentPaintDefinitionTest, InputArgumentTypes) {
Vector<CSSPropertyID> native_invalidation_properties;
Vector<String> custom_invalidation_properties;
Vector<CSSSyntaxDescriptor> input_argument_types = {
CSSSyntaxStringParser("<length> | <color>").Parse().value(),
CSSSyntaxStringParser("<integer> | foo | <color>").Parse().value()};
MainThreadDocumentPaintDefinition document_definition(
native_invalidation_properties, custom_invalidation_properties,
input_argument_types, true);
EXPECT_EQ(document_definition.InputArgumentTypes().size(), 2u);
for (size_t i = 0; i < 2; i++) {
EXPECT_EQ(input_argument_types[i],
document_definition.InputArgumentTypes()[i]);
}
}
} // namespace blink
......@@ -149,10 +149,12 @@ void PaintWorklet::RegisterMainThreadDocumentPaintDefinition(
const String& name,
Vector<CSSPropertyID> native_properties,
Vector<String> custom_properties,
std::unique_ptr<Vector<CSSSyntaxDescriptor>> input_argument_types,
double alpha) {
DCHECK(!main_thread_document_definition_map_.Contains(name));
auto definition = std::make_unique<MainThreadDocumentPaintDefinition>(
std::move(native_properties), std::move(custom_properties), alpha);
std::move(native_properties), std::move(custom_properties),
std::move(*input_argument_types), alpha);
main_thread_document_definition_map_.insert(name, std::move(definition));
pending_generator_registry_->NotifyGeneratorReady(name);
}
......
......@@ -5,7 +5,10 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_PAINT_WORKLET_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_PAINT_WORKLET_H_
#include <memory>
#include "base/macros.h"
#include "third_party/blink/renderer/core/css/css_syntax_descriptor.h"
#include "third_party/blink/renderer/core/workers/worklet.h"
#include "third_party/blink/renderer/modules/csspaint/document_paint_definition.h"
#include "third_party/blink/renderer/modules/csspaint/main_thread_document_paint_definition.h"
......@@ -65,6 +68,7 @@ class MODULES_EXPORT PaintWorklet : public Worklet,
const String& name,
Vector<CSSPropertyID> native_properties,
Vector<String> custom_properties,
std::unique_ptr<Vector<CSSSyntaxDescriptor>> input_argument_types,
double alpha);
typedef HashMap<String, std::unique_ptr<MainThreadDocumentPaintDefinition>>
MainThreadDocumentDefinitionMap;
......
......@@ -4,6 +4,8 @@
#include "third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.h"
#include <memory>
#include "base/single_thread_task_runner.h"
#include "third_party/blink/renderer/core/css/cssom/paint_worklet_input.h"
#include "third_party/blink/renderer/core/dom/document.h"
......@@ -109,12 +111,18 @@ void PaintWorkletProxyClient::RegisterCSSPaintDefinition(
Vector<String> passed_custom_properties;
for (const auto& property : custom_properties)
passed_custom_properties.push_back(property.GetString());
Vector<CSSSyntaxDescriptor> passed_input_argument_types;
for (const auto& syntax_descriptor : definition->InputArgumentTypes())
passed_input_argument_types.push_back(syntax_descriptor.IsolatedCopy());
PostCrossThreadTask(
*main_thread_runner_, FROM_HERE,
CrossThreadBindOnce(
&PaintWorklet::RegisterMainThreadDocumentPaintDefinition,
paint_worklet_, name, definition->NativeInvalidationProperties(),
WTF::Passed(std::move(passed_custom_properties)),
std::make_unique<Vector<CSSSyntaxDescriptor>>(
passed_input_argument_types),
definition->GetPaintRenderingContext2DSettings()->alpha()));
}
}
......
......@@ -9,6 +9,7 @@
#include "third_party/blink/renderer/bindings/core/v8/script_source_code.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
#include "third_party/blink/renderer/core/css/css_syntax_descriptor.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/layout/layout_object.h"
......@@ -189,7 +190,7 @@ TEST_F(PaintWorkletTest, NativeAndCustomProperties) {
TestPaintWorklet* paint_worklet_to_test = GetTestPaintWorklet();
paint_worklet_to_test->RegisterMainThreadDocumentPaintDefinition(
"foo", native_invalidation_properties, custom_invalidation_properties,
true);
std::make_unique<Vector<CSSSyntaxDescriptor>>(), true);
CSSPaintImageGeneratorImpl* generator =
MakeGarbageCollected<CSSPaintImageGeneratorImpl>(paint_worklet_to_test,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment