/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=4 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/. */ /* * Implementation of DOM Traversal's TreeWalker */ #ifndef mozilla_dom_TreeWalker_h #define mozilla_dom_TreeWalker_h #include "nsISupports.h" #include "nsTraversal.h" #include "nsCOMPtr.h" #include "nsTArray.h" #include "nsCycleCollectionParticipant.h" class nsINode; namespace mozilla::dom { class TreeWalker final : public nsISupports, public nsTraversal { virtual ~TreeWalker(); public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS TreeWalker(nsINode* aRoot, uint32_t aWhatToShow, NodeFilter* aFilter); NS_DECL_CYCLE_COLLECTION_CLASS(TreeWalker) // WebIDL API nsINode* Root() const { return mRoot; } uint32_t WhatToShow() const { return mWhatToShow; } NodeFilter* GetFilter() { return mFilter; } nsINode* CurrentNode() const { return mCurrentNode; } void SetCurrentNode(nsINode& aNode, ErrorResult& aResult); // All our traversal methods return strong refs because filtering can // remove nodes from the tree. already_AddRefed ParentNode(ErrorResult& aResult); already_AddRefed FirstChild(ErrorResult& aResult); already_AddRefed LastChild(ErrorResult& aResult); already_AddRefed PreviousSibling(ErrorResult& aResult); already_AddRefed NextSibling(ErrorResult& aResult); already_AddRefed PreviousNode(ErrorResult& aResult); already_AddRefed NextNode(ErrorResult& aResult); bool WrapObject(JSContext* aCx, JS::Handle aGivenProto, JS::MutableHandle aReflector); private: nsCOMPtr mCurrentNode; /* * Implements FirstChild and LastChild which only vary in which direction * they search. * @param aReversed Controls whether we search forwards or backwards * @param aResult Whether we threw or not. * @returns The desired node. Null if no child is found */ already_AddRefed FirstChildInternal(bool aReversed, ErrorResult& aResult); /* * Implements NextSibling and PreviousSibling which only vary in which * direction they search. * @param aReversed Controls whether we search forwards or backwards * @param aResult Whether we threw or not. * @returns The desired node. Null if no child is found */ already_AddRefed NextSiblingInternal(bool aReversed, ErrorResult& aResult); }; } // namespace mozilla::dom #endif // mozilla_dom_TreeWalker_h