| // 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_LAYOUT_NG_CUSTOM_CSS_LAYOUT_DEFINITION_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_CUSTOM_CSS_LAYOUT_DEFINITION_H_ |
| |
| #include "third_party/blink/renderer/core/css/css_property_names.h" |
| #include "third_party/blink/renderer/core/css/cssom/css_style_value.h" |
| #include "third_party/blink/renderer/platform/bindings/name_client.h" |
| #include "third_party/blink/renderer/platform/bindings/scoped_persistent.h" |
| #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h" |
| #include "third_party/blink/renderer/platform/heap/handle.h" |
| #include "v8/include/v8.h" |
| |
| namespace blink { |
| |
| class CustomLayoutScope; |
| class FragmentResultOptions; |
| class IntrinsicSizesResultOptions; |
| class LayoutUnit; |
| struct LogicalSize; |
| class NGBlockNode; |
| struct NGBoxStrut; |
| class NGConstraintSpace; |
| class ScriptState; |
| class SerializedScriptValue; |
| class V8IntrinsicSizesCallback; |
| class V8LayoutCallback; |
| class V8NoArgumentConstructor; |
| |
| // Represents a javascript class registered on the LayoutWorkletGlobalScope by |
| // the author. |
| // https://drafts.css-houdini.org/css-layout-api/#layout-definition |
| class CSSLayoutDefinition final : public GarbageCollected<CSSLayoutDefinition>, |
| public NameClient { |
| public: |
| CSSLayoutDefinition( |
| ScriptState*, |
| V8NoArgumentConstructor* constructor, |
| V8IntrinsicSizesCallback* intrinsic_sizes, |
| V8LayoutCallback* layout, |
| const Vector<CSSPropertyID>& native_invalidation_properties, |
| const Vector<AtomicString>& custom_invalidation_properties, |
| const Vector<CSSPropertyID>& child_native_invalidation_properties, |
| const Vector<AtomicString>& child_custom_invalidation_properties); |
| virtual ~CSSLayoutDefinition(); |
| |
| // This class represents an instance of the layout class defined by the |
| // CSSLayoutDefinition. |
| class Instance final : public GarbageCollected<Instance> { |
| public: |
| Instance(CSSLayoutDefinition*, v8::Local<v8::Value> instance); |
| |
| // Runs the web developer defined layout, returns true if everything |
| // succeeded. It populates the FragmentResultOptions dictionary, and |
| // fragment_result_data. |
| bool Layout( |
| const NGConstraintSpace&, |
| const Document&, |
| const NGBlockNode&, |
| const LogicalSize& border_box_size, |
| const NGBoxStrut& border_scrollbar_padding, |
| CustomLayoutScope*, |
| FragmentResultOptions*&, |
| scoped_refptr<SerializedScriptValue>* fragment_result_data); |
| |
| // Runs the web developer defined intrinsicSizes, returns true if everything |
| // succeeded. It populates the IntrinsicSizesResultOptions dictionary. |
| bool IntrinsicSizes( |
| const NGConstraintSpace&, |
| const Document&, |
| const NGBlockNode&, |
| const LogicalSize& border_box_size, |
| const NGBoxStrut& border_scrollbar_padding, |
| const LayoutUnit child_percentage_resolution_block_size_for_min_max, |
| CustomLayoutScope*, |
| IntrinsicSizesResultOptions**, |
| bool* child_depends_on_percentage_block_size); |
| |
| void Trace(Visitor*) const; |
| |
| private: |
| void ReportException(ExceptionState*); |
| |
| Member<CSSLayoutDefinition> definition_; |
| TraceWrapperV8Reference<v8::Value> instance_; |
| }; |
| |
| // Creates an instance of the web developer defined class. May return a |
| // nullptr if constructing the instance failed. |
| Instance* CreateInstance(); |
| |
| const Vector<CSSPropertyID>& NativeInvalidationProperties() const { |
| return native_invalidation_properties_; |
| } |
| const Vector<AtomicString>& CustomInvalidationProperties() const { |
| return custom_invalidation_properties_; |
| } |
| const Vector<CSSPropertyID>& ChildNativeInvalidationProperties() const { |
| return child_native_invalidation_properties_; |
| } |
| const Vector<AtomicString>& ChildCustomInvalidationProperties() const { |
| return child_custom_invalidation_properties_; |
| } |
| |
| ScriptState* GetScriptState() const { return script_state_; } |
| |
| virtual void Trace(Visitor* visitor) const; |
| |
| const char* NameInHeapSnapshot() const override { |
| return "CSSLayoutDefinition"; |
| } |
| |
| private: |
| Member<ScriptState> script_state_; |
| |
| // This object keeps the class instances, constructor function, intrinsic |
| // sizes function, and layout function alive. It participates in wrapper |
| // tracing as it holds onto V8 wrappers. |
| Member<V8NoArgumentConstructor> constructor_; |
| Member<V8IntrinsicSizesCallback> intrinsic_sizes_; |
| Member<V8LayoutCallback> layout_; |
| |
| // If a constructor call ever fails, we'll refuse to create any more |
| // instances of the web developer provided class. |
| bool constructor_has_failed_ = false; |
| |
| Vector<CSSPropertyID> native_invalidation_properties_; |
| Vector<AtomicString> custom_invalidation_properties_; |
| Vector<CSSPropertyID> child_native_invalidation_properties_; |
| Vector<AtomicString> child_custom_invalidation_properties_; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_CUSTOM_CSS_LAYOUT_DEFINITION_H_ |