| // Copyright 2019 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_DOM_INTERSECTION_OBSERVER_H_ |
| #define COBALT_DOM_INTERSECTION_OBSERVER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/callback.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "cobalt/cssom/css_parser.h" |
| #include "cobalt/cssom/property_list_value.h" |
| #include "cobalt/dom/intersection_observer_entry.h" |
| #include "cobalt/layout/intersection_observer_root.h" |
| #include "cobalt/layout/intersection_observer_target.h" |
| #include "cobalt/script/callback_function.h" |
| #include "cobalt/script/environment_settings.h" |
| #include "cobalt/script/exception_state.h" |
| #include "cobalt/script/script_value.h" |
| #include "cobalt/script/sequence.h" |
| #include "cobalt/script/union_type.h" |
| #include "cobalt/script/wrappable.h" |
| |
| namespace cobalt { |
| namespace dom { |
| |
| class Document; |
| class Element; |
| class IntersectionObserverInit; |
| class IntersectionObserverTaskManager; |
| |
| // The IntersectionObserver can be used to observe changes in the intersection |
| // of an intersection root and one or more target Elements. |
| // https://www.w3.org/TR/intersection-observer/#intersection-observer-interfaces |
| class IntersectionObserver : public base::SupportsWeakPtr<IntersectionObserver>, |
| public script::Wrappable { |
| public: |
| typedef script::Sequence<scoped_refptr<IntersectionObserverEntry>> |
| IntersectionObserverEntrySequence; |
| |
| typedef script::CallbackFunction<void( |
| const IntersectionObserverEntrySequence&, |
| const scoped_refptr<IntersectionObserver>&)> |
| IntersectionObserverCallback; |
| typedef script::ScriptValue<IntersectionObserverCallback> |
| IntersectionObserverCallbackArg; |
| |
| typedef base::Callback<void(const IntersectionObserverEntrySequence&, |
| const scoped_refptr<IntersectionObserver>&)> |
| NativeIntersectionObserverCallback; |
| |
| typedef script::UnionType2<double, script::Sequence<double>> ThresholdType; |
| |
| // Not part of the spec. Support creating IntersectionObservers from native |
| // Cobalt code. |
| IntersectionObserver( |
| const scoped_refptr<Document>& document, cssom::CSSParser* css_parser, |
| const NativeIntersectionObserverCallback& native_callback, |
| script::ExceptionState* exception_state); |
| |
| IntersectionObserver( |
| const scoped_refptr<Document>& document, cssom::CSSParser* css_parser, |
| const NativeIntersectionObserverCallback& native_callback, |
| const IntersectionObserverInit& options, |
| script::ExceptionState* exception_state); |
| |
| // Web API: IntersectionObserver |
| IntersectionObserver(script::EnvironmentSettings* settings, |
| const IntersectionObserverCallbackArg& callback, |
| script::ExceptionState* exception_state); |
| IntersectionObserver(script::EnvironmentSettings* settings, |
| const IntersectionObserverCallbackArg& callback, |
| const IntersectionObserverInit& options, |
| script::ExceptionState* exception_state); |
| ~IntersectionObserver(); |
| |
| const base::WeakPtr<Element>& root() const { return root_; } |
| void set_layout_root( |
| const scoped_refptr<layout::IntersectionObserverRoot>& layout_root); |
| const scoped_refptr<layout::IntersectionObserverRoot>& layout_root() const { |
| return layout_root_; |
| } |
| // Part of the IntersectionObserver interface, but differs from the web spec |
| // in that it returns the exact string passed into |options|, regardless of |
| // whether it is formatted as four space-separated pixels lengths/percentages. |
| std::string root_margin() const { return root_margin_; } |
| // Not part of the IntersectionObserver interface. Returns the root margin |
| // parsed as a PropertyListValue. |
| const scoped_refptr<cssom::PropertyListValue>& root_margin_property_value() |
| const { |
| return root_margin_property_value_; |
| } |
| script::Sequence<double> thresholds() const; |
| std::vector<double> thresholds_vector() const { return thresholds_; } |
| void Observe(const scoped_refptr<Element>& target); |
| void Unobserve(const scoped_refptr<Element>& target); |
| void Disconnect(); |
| IntersectionObserverEntrySequence TakeRecords(); |
| |
| // Not part of the IntersectionObserver interface. Implements the "queue an |
| // IntersectionObserverEntry" algorithm. |
| // https://www.w3.org/TR/intersection-observer/#queue-intersection-observer-entry-algo |
| void QueueIntersectionObserverEntry( |
| const scoped_refptr<IntersectionObserverEntry>& entry); |
| |
| // Not part of the the IntersectionObserver interface. Implements step (3) of |
| // the "notify intersection observers" algorithm. |
| // https://www.w3.org/TR/intersection-observer/#notify-intersection-observers-algo |
| bool Notify(); |
| |
| // Internal helper class to allow creation of a IntersectionObserver with a |
| // script callback. Must be public so it can be inherited from in the .cc |
| // file. |
| class CallbackInternal; |
| |
| DEFINE_WRAPPABLE_TYPE(IntersectionObserver); |
| void TraceMembers(script::Tracer* tracer) override; |
| |
| private: |
| IntersectionObserverTaskManager* task_manager(); |
| void InitNativeCallback( |
| const NativeIntersectionObserverCallback& native_callback); |
| void InitScriptCallback(const IntersectionObserverCallbackArg& callback); |
| void InitIntersectionObserverInternal( |
| const scoped_refptr<Document>& document, cssom::CSSParser* css_parser, |
| const IntersectionObserverInit& options, |
| script::ExceptionState* exception_state); |
| void TrackObservationTarget(const scoped_refptr<Element>& target); |
| void UntrackObservationTarget(const scoped_refptr<Element>& target); |
| |
| std::unique_ptr<CallbackInternal> callback_; |
| base::WeakPtr<Element> root_; |
| scoped_refptr<layout::IntersectionObserverRoot> layout_root_; |
| std::string root_margin_; |
| scoped_refptr<cssom::PropertyListValue> root_margin_property_value_; |
| std::vector<double> thresholds_; |
| typedef std::vector<base::WeakPtr<Element>> ElementVector; |
| ElementVector observation_targets_; |
| IntersectionObserverEntrySequence queued_entries_; |
| scoped_refptr<IntersectionObserverTaskManager> |
| intersection_observer_task_manager_; |
| }; |
| |
| } // namespace dom |
| } // namespace cobalt |
| |
| #endif // COBALT_DOM_INTERSECTION_OBSERVER_H_ |