summaryrefslogtreecommitdiffstats
path: root/layout/style/ServoComputedData.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/ServoComputedData.h')
-rw-r--r--layout/style/ServoComputedData.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/layout/style/ServoComputedData.h b/layout/style/ServoComputedData.h
new file mode 100644
index 0000000000..cc01e5d01e
--- /dev/null
+++ b/layout/style/ServoComputedData.h
@@ -0,0 +1,125 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_ServoComputedData_h
+#define mozilla_ServoComputedData_h
+
+class nsWindowSizes;
+
+#include "mozilla/ServoStyleConsts.h"
+
+/*
+ * ServoComputedData and its related types.
+ */
+
+#define STYLE_STRUCT(name_) struct nsStyle##name_;
+#include "nsStyleStructList.h"
+#undef STYLE_STRUCT
+
+namespace mozilla {
+
+template <typename T>
+struct ServoRawOffsetArc {
+ // This is a pointer to a T that lives inside a servo_arc::Arc<T>, and
+ // which already has had its reference count incremented.
+ T* mPtr;
+};
+
+// A wrapper that gets replaced by ManuallyDrop<T> by bindgen.
+//
+// NOTE(emilio): All this file is a bit gross, and most of this we make cleaner
+// using cbindgen and such.
+template <typename T>
+struct ServoManuallyDrop {
+ T mInner;
+};
+
+struct ServoWritingMode {
+ uint8_t mBits;
+};
+
+struct ServoCustomPropertiesMap {
+ uintptr_t mPtr;
+};
+
+struct ServoRuleNode {
+ uintptr_t mPtr;
+};
+
+class ComputedStyle;
+
+struct ServoVisitedStyle {
+ // This is actually a strong reference but ServoComputedData's
+ // destructor is managed by the Rust code so we just use a regular
+ // pointer
+ ComputedStyle* mPtr;
+};
+
+#define STYLE_STRUCT(name_) struct Gecko##name_;
+#include "nsStyleStructList.h"
+#undef STYLE_STRUCT
+
+} // namespace mozilla
+
+class ServoComputedData;
+
+struct ServoComputedDataForgotten {
+ // Make sure you manually mem::forget the backing ServoComputedData
+ // after calling this
+ explicit ServoComputedDataForgotten(const ServoComputedData* aValue)
+ : mPtr(aValue) {}
+ const ServoComputedData* mPtr;
+};
+
+/**
+ * We want C++ to be able to read the style struct fields of ComputedValues
+ * so we define this type on the C++ side and use the bindgenned version
+ * on the Rust side.
+ */
+class ServoComputedData {
+ friend class mozilla::ComputedStyle;
+
+ public:
+ // Constructs via memcpy. Will not move out of aValue.
+ explicit ServoComputedData(const ServoComputedDataForgotten aValue);
+
+#define STYLE_STRUCT(name_) \
+ mozilla::ServoRawOffsetArc<mozilla::Gecko##name_> name_; \
+ inline const nsStyle##name_* GetStyle##name_() const;
+#include "nsStyleStructList.h"
+#undef STYLE_STRUCT
+
+ void AddSizeOfExcludingThis(nsWindowSizes& aSizes) const;
+
+ mozilla::ServoWritingMode WritingMode() const { return writing_mode; }
+
+ private:
+ mozilla::ServoCustomPropertiesMap custom_properties;
+ mozilla::ServoWritingMode writing_mode;
+ mozilla::StyleComputedValueFlags flags;
+ /// The rule node representing the ordered list of rules matched for this
+ /// node. Can be None for default values and text nodes. This is
+ /// essentially an optimization to avoid referencing the root rule node.
+ mozilla::ServoRuleNode rules;
+ /// The element's computed values if visited, only computed if there's a
+ /// relevant link for this element. A element's "relevant link" is the
+ /// element being matched if it is a link or the nearest ancestor link.
+ mozilla::ServoVisitedStyle visited_style;
+
+ // C++ just sees this struct as a bucket of bits, and will
+ // do the wrong thing if we let it use the default copy ctor/assignment
+ // operator. Remove them so that there is no footgun.
+ //
+ // We remove the move ctor/assignment operator as well, because
+ // moves in C++ don't prevent destructors from being called,
+ // which will lead to double frees.
+ ServoComputedData& operator=(const ServoComputedData&) = delete;
+ ServoComputedData(const ServoComputedData&) = delete;
+ ServoComputedData&& operator=(const ServoComputedData&&) = delete;
+ ServoComputedData(const ServoComputedData&&) = delete;
+};
+
+#endif // mozilla_ServoComputedData_h