| Index: content/browser/frame_host/frame_tree.cc | 
| diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc | 
| index b33f9d0bcbcf7301b0a55399ead0c154855cd275..3c3c0f8978156af82455125155746703b63c9173 100644 | 
| --- a/content/browser/frame_host/frame_tree.cc | 
| +++ b/content/browser/frame_host/frame_tree.cc | 
| @@ -79,6 +79,44 @@ FrameTree::NodeIterator FrameTree::NodeRange::end() { | 
| FrameTree::NodeRange::NodeRange(FrameTree* tree, FrameTreeNode* node_to_skip) | 
| : tree_(tree), node_to_skip_(node_to_skip) {} | 
|  | 
| +FrameTree::ConstNodeIterator::~ConstNodeIterator() {} | 
| + | 
| +FrameTree::ConstNodeIterator& FrameTree::ConstNodeIterator::operator++() { | 
| +  for (size_t i = 0; i < current_node_->child_count(); ++i) { | 
| +    const FrameTreeNode* child = current_node_->child_at(i); | 
| +    queue_.push(child); | 
| +  } | 
| + | 
| +  if (!queue_.empty()) { | 
| +    current_node_ = queue_.front(); | 
| +    queue_.pop(); | 
| +  } else { | 
| +    current_node_ = nullptr; | 
| +  } | 
| + | 
| +  return *this; | 
| +} | 
| + | 
| +bool FrameTree::ConstNodeIterator::operator==( | 
| +    const ConstNodeIterator& rhs) const { | 
| +  return current_node_ == rhs.current_node_; | 
| +} | 
| + | 
| +FrameTree::ConstNodeIterator::ConstNodeIterator( | 
| +    const FrameTreeNode* starting_node) | 
| +    : current_node_(starting_node) {} | 
| + | 
| +FrameTree::ConstNodeIterator FrameTree::ConstNodeRange::begin() { | 
| +  return ConstNodeIterator(tree_->root()); | 
| +} | 
| + | 
| +FrameTree::ConstNodeIterator FrameTree::ConstNodeRange::end() { | 
| +  return ConstNodeIterator(nullptr); | 
| +} | 
| + | 
| +FrameTree::ConstNodeRange::ConstNodeRange(const FrameTree* tree) | 
| +    : tree_(tree) {} | 
| + | 
| FrameTree::FrameTree(Navigator* navigator, | 
| RenderFrameHostDelegate* render_frame_delegate, | 
| RenderViewHostDelegate* render_view_delegate, | 
| @@ -155,6 +193,10 @@ FrameTree::NodeRange FrameTree::NodesExcept(FrameTreeNode* node_to_skip) { | 
| return NodeRange(this, node_to_skip); | 
| } | 
|  | 
| +FrameTree::ConstNodeRange FrameTree::ConstNodes() const { | 
| +  return ConstNodeRange(this); | 
| +} | 
| + | 
| bool FrameTree::AddFrame( | 
| FrameTreeNode* parent, | 
| int process_id, | 
| @@ -424,8 +466,8 @@ void FrameTree::ResetLoadProgress() { | 
| load_progress_ = 0.0; | 
| } | 
|  | 
| -bool FrameTree::IsLoading() { | 
| -  for (FrameTreeNode* node : Nodes()) { | 
| +bool FrameTree::IsLoading() const { | 
| +  for (const FrameTreeNode* node : ConstNodes()) { | 
| if (node->IsLoading()) | 
| return true; | 
| } | 
|  |