| // Copyright 2018 the Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_PAINT_WORKLET_STYLE_PROPERTY_MAP_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_PAINT_WORKLET_STYLE_PROPERTY_MAP_H_ |
| |
| #include <memory> |
| |
| #include "third_party/blink/renderer/core/css/cssom/cross_thread_style_value.h" |
| #include "third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h" |
| #include "third_party/blink/renderer/platform/graphics/compositor_element_id.h" |
| #include "third_party/blink/renderer/platform/graphics/platform_paint_worklet_layer_painter.h" |
| #include "third_party/blink/renderer/platform/wtf/vector.h" |
| |
| namespace blink { |
| |
| class ComputedStyle; |
| |
| // This class is designed for CSS Paint such that it can be safely passed cross |
| // threads. |
| // |
| // Here is a typical usage. |
| // At CSSPaintValue::GetImage which is on the main thread, call the |
| // BuildCrossThreadData and give the data to the Blink::PaintWorkletInput. |
| // The PaintWorkletInput is passed to the worklet thread, and we build an |
| // instance of PaintWorkletStylePropertyMap from the data, and the instance is |
| // eventually pass to the JS paint callback. |
| class CORE_EXPORT PaintWorkletStylePropertyMap |
| : public StylePropertyMapReadOnly { |
| public: |
| using StylePropertyMapEntry = std::pair<String, CSSStyleValueVector>; |
| using CrossThreadData = |
| HashMap<String, std::unique_ptr<CrossThreadStyleValue>>; |
| // Build the data that will be passed to the worklet thread to construct a |
| // style map. Should be called on the main thread only. |
| // TODO(xidachen): consider making the input_property_ids as part of the |
| // return value. Or make both CrossThreadData and input_property_ids as |
| // params and return a bool. |
| static base::Optional<CrossThreadData> BuildCrossThreadData( |
| const Document&, |
| UniqueObjectId unique_object_id, |
| const ComputedStyle&, |
| const Vector<CSSPropertyID>& native_properties, |
| const Vector<AtomicString>& custom_properties, |
| CompositorPaintWorkletInput::PropertyKeys& input_property_keys); |
| |
| static CrossThreadData CopyCrossThreadData(const CrossThreadData& data); |
| |
| // This constructor should be called on the worklet-thread only. |
| explicit PaintWorkletStylePropertyMap(CrossThreadData data); |
| PaintWorkletStylePropertyMap(const PaintWorkletStylePropertyMap&) = delete; |
| PaintWorkletStylePropertyMap& operator=(const PaintWorkletStylePropertyMap&) = |
| delete; |
| |
| CSSStyleValue* get(const ExecutionContext*, |
| const String& property_name, |
| ExceptionState&) const override; |
| |
| CSSStyleValueVector getAll(const ExecutionContext*, |
| const String& property_name, |
| ExceptionState&) const override; |
| |
| bool has(const ExecutionContext*, |
| const String& property_name, |
| ExceptionState&) const override; |
| |
| unsigned int size() const override; |
| |
| void Trace(Visitor*) const override; |
| |
| const CrossThreadData& StyleMapDataForTest() const { return data_; } |
| |
| CrossThreadData& StyleMapData() { return data_; } |
| |
| private: |
| IterationSource* StartIteration(ScriptState*, ExceptionState&) override; |
| |
| CrossThreadData data_; |
| }; |
| |
| } // namespace blink |
| |
| #endif |