Index: webkit/glue/stacking_order_iterator.h |
=================================================================== |
--- webkit/glue/stacking_order_iterator.h (revision 0) |
+++ webkit/glue/stacking_order_iterator.h (revision 0) |
@@ -0,0 +1,73 @@ |
+// Copyright (c) 2006-2008 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. |
+ |
+// Provides some utilities for iterating over a RenderObject graph in |
+// stacking order. |
+ |
+#ifndef WEBKIT_GLUE_STACKING_ORDER_ITERATOR_H__ |
+#define WEBKIT_GLUE_STACKING_ORDER_ITERATOR_H__ |
+ |
+#include <vector> |
+ |
+namespace WebCore { |
+class RenderLayer; |
+class RenderObject; |
+} |
+ |
+// Iterates over a subtree of RenderLayers in stacking order, back to |
+// front. Modifying the RenderObject graph invalidates this iterator. |
+// |
+// TODO(tulrich): this could go in webkit. |
+// TODO(tulrich): needs unittests. |
+class RenderLayerIterator { |
+ public: |
+ RenderLayerIterator(); |
+ |
+ // Sets the RenderLayer subtree to iterate over. |
+ void Reset(WebCore::RenderLayer* rl); |
+ |
+ // Returns the next RenderLayer in stacking order, back to front. |
+ WebCore::RenderLayer* Next(); |
+ private: |
+ class Context { |
+ public: |
+ Context(WebCore::RenderLayer* layer); |
+ |
+ bool HasMoreNeg(); |
+ Context NextNeg(); |
+ bool HasSelf(); |
+ WebCore::RenderLayer* NextSelf(); |
+ bool HasMoreOverflow(); |
+ Context NextOverflow(); |
+ bool HasMorePos(); |
+ Context NextPos(); |
+ |
+ private: |
+ WebCore::RenderLayer* layer_; |
+ size_t next_neg_; |
+ size_t next_self_; |
+ size_t next_overflow_; |
+ size_t next_pos_; |
+ }; |
+ |
+ std::vector<Context> context_stack_; |
+}; |
+ |
+// Iterates over a subtree of RenderObjects below a given RenderLayer. |
+// |
+// TODO(tulrich): this could go in webkit. |
+// TODO(tulrich): needs unittests. |
+class StackingOrderIterator { |
+ public: |
+ StackingOrderIterator(); |
+ void Reset(WebCore::RenderLayer* rl); |
+ WebCore::RenderObject* Next(); |
+ |
+ private: |
+ RenderLayerIterator layer_iterator_; |
+ WebCore::RenderObject* current_object_; |
+ WebCore::RenderObject* current_layer_root_; |
+}; |
+ |
+#endif // WEBKIT_GLUE_STACKING_ORDER_ITERATOR_H__ |