| Index: content/browser/find_request_manager.cc
|
| diff --git a/content/browser/find_request_manager.cc b/content/browser/find_request_manager.cc
|
| index de2783cb1f120e893e44dbb71c905fbde7678824..a9bf7f53933c4c332a933fb42859dcf96c2fa392 100644
|
| --- a/content/browser/find_request_manager.cc
|
| +++ b/content/browser/find_request_manager.cc
|
| @@ -4,70 +4,19 @@
|
|
|
| #include "content/browser/find_request_manager.h"
|
|
|
| -#include <algorithm>
|
| -
|
| #include "content/browser/frame_host/render_frame_host_impl.h"
|
| #include "content/browser/web_contents/web_contents_impl.h"
|
| #include "content/common/frame_messages.h"
|
| #include "content/common/input_messages.h"
|
| -#include "content/public/browser/guest_mode.h"
|
|
|
| namespace content {
|
|
|
| namespace {
|
|
|
| -// The following functions allow traversal over all frames, including those
|
| -// across WebContentses.
|
| -//
|
| -// Note that there are currently two different ways in which an inner
|
| -// WebContents may be embedded in an outer WebContents:
|
| -//
|
| -// 1) As a guest of the outer WebContents's BrowserPluginEmbedder.
|
| -// 2) Within an inner WebContentsTreeNode of the outer WebContents's
|
| -// WebContentsTreeNode.
|
| -
|
| -// Returns all child frames of |node|.
|
| -std::vector<FrameTreeNode*> GetChildren(FrameTreeNode* node) {
|
| - std::vector<FrameTreeNode*> children(node->child_count());
|
| - for (size_t i = 0; i != node->child_count(); ++i)
|
| - children[i] = node->child_at(i);
|
| -
|
| - if (auto* inner_contents = WebContentsImpl::FromOuterFrameTreeNode(node)) {
|
| - children.push_back(inner_contents->GetMainFrame()->frame_tree_node());
|
| - } else {
|
| - auto* contents = WebContentsImpl::FromFrameTreeNode(node);
|
| - if (node->IsMainFrame() && contents->GetBrowserPluginEmbedder()) {
|
| - for (auto* inner_contents : contents->GetInnerWebContents()) {
|
| - children.push_back(inner_contents->GetMainFrame()->frame_tree_node());
|
| - }
|
| - }
|
| - }
|
| -
|
| - return children;
|
| -}
|
| -
|
| -// Returns the first child FrameTreeNode under |node|, if |node| has a child, or
|
| -// nullptr otherwise.
|
| -FrameTreeNode* GetFirstChild(FrameTreeNode* node) {
|
| - auto children = GetChildren(node);
|
| - if (!children.empty())
|
| - return children.front();
|
| - return nullptr;
|
| -}
|
| -
|
| -// Returns the last child FrameTreeNode under |node|, if |node| has a child, or
|
| -// nullptr otherwise.
|
| -FrameTreeNode* GetLastChild(FrameTreeNode* node) {
|
| - auto children = GetChildren(node);
|
| - if (!children.empty())
|
| - return children.back();
|
| - return nullptr;
|
| -}
|
| -
|
| // Returns the deepest last child frame under |node|/|rfh| in the frame tree.
|
| FrameTreeNode* GetDeepestLastChild(FrameTreeNode* node) {
|
| - while (FrameTreeNode* last_child = GetLastChild(node))
|
| - node = last_child;
|
| + while (node->child_count())
|
| + node = node->child_at(node->child_count() - 1);
|
| return node;
|
| }
|
| RenderFrameHost* GetDeepestLastChild(RenderFrameHost* rfh) {
|
| @@ -76,82 +25,20 @@ RenderFrameHost* GetDeepestLastChild(RenderFrameHost* rfh) {
|
| return GetDeepestLastChild(node)->current_frame_host();
|
| }
|
|
|
| -// Returns the parent FrameTreeNode of |node|, if |node| has a parent, or
|
| -// nullptr otherwise.
|
| -FrameTreeNode* GetParent(FrameTreeNode* node) {
|
| - if (node->parent())
|
| - return node->parent();
|
| -
|
| - // The parent frame may be in another WebContents.
|
| - if (node->IsMainFrame()) {
|
| - auto* contents = WebContentsImpl::FromFrameTreeNode(node);
|
| - if (GuestMode::IsCrossProcessFrameGuest(contents)) {
|
| - int node_id = contents->GetOuterDelegateFrameTreeNodeId();
|
| - if (node_id != FrameTreeNode::kFrameTreeNodeInvalidId)
|
| - return FrameTreeNode::GloballyFindByID(node_id);
|
| - } else if (auto* outer_contents = contents->GetOuterWebContents()) {
|
| - return outer_contents->GetMainFrame()->frame_tree_node();
|
| - }
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -// Returns the previous sibling FrameTreeNode of |node|, if one exists, or
|
| -// nullptr otherwise.
|
| -FrameTreeNode* GetPreviousSibling(FrameTreeNode* node) {
|
| - if (FrameTreeNode* previous_sibling = node->PreviousSibling())
|
| - return previous_sibling;
|
| -
|
| - // The previous sibling may be in another WebContents.
|
| - if (FrameTreeNode* parent = GetParent(node)) {
|
| - auto children = GetChildren(parent);
|
| - auto it = std::find(children.begin(), children.end(), node);
|
| - // It is odd that this node may not be a child of its parent, but this is
|
| - // actually possible during teardown, hence the need for the check for
|
| - // "it != children.end()".
|
| - if (it != children.end() && it != children.begin())
|
| - return *--it;
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -// Returns the next sibling FrameTreeNode of |node|, if one exists, or nullptr
|
| -// otherwise.
|
| -FrameTreeNode* GetNextSibling(FrameTreeNode* node) {
|
| - if (FrameTreeNode* next_sibling = node->NextSibling())
|
| - return next_sibling;
|
| -
|
| - // The next sibling may be in another WebContents.
|
| - if (FrameTreeNode* parent = GetParent(node)) {
|
| - auto children = GetChildren(parent);
|
| - auto it = std::find(children.begin(), children.end(), node);
|
| - // It is odd that this node may not be a child of its parent, but this is
|
| - // actually possible during teardown, hence the need for the check for
|
| - // "it != children.end()".
|
| - if (it != children.end() && ++it != children.end())
|
| - return *it;
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| // Returns the FrameTreeNode directly after |node| in the frame tree in search
|
| // order, or nullptr if one does not exist. If |wrap| is set, then wrapping
|
| // between the first and last frames is permitted. Note that this traversal
|
| // follows the same ordering as in blink::FrameTree::traverseNextWithWrap().
|
| FrameTreeNode* TraverseNext(FrameTreeNode* node, bool wrap) {
|
| - if (FrameTreeNode* first_child = GetFirstChild(node))
|
| - return first_child;
|
| + if (node->child_count())
|
| + return node->child_at(0);
|
|
|
| - FrameTreeNode* sibling = GetNextSibling(node);
|
| + FrameTreeNode* sibling = node->NextSibling();
|
| while (!sibling) {
|
| - FrameTreeNode* parent = GetParent(node);
|
| - if (!parent)
|
| + if (!node->parent())
|
| return wrap ? node : nullptr;
|
| - node = parent;
|
| - sibling = GetNextSibling(node);
|
| + node = node->parent();
|
| + sibling = node->NextSibling();
|
| }
|
| return sibling;
|
| }
|
| @@ -161,14 +48,14 @@ FrameTreeNode* TraverseNext(FrameTreeNode* node, bool wrap) {
|
| // between the first and last frames is permitted. Note that this traversal
|
| // follows the same ordering as in blink::FrameTree::traversePreviousWithWrap().
|
| FrameTreeNode* TraversePrevious(FrameTreeNode* node, bool wrap) {
|
| - if (FrameTreeNode* previous_sibling = GetPreviousSibling(node))
|
| + if (FrameTreeNode* previous_sibling = node->PreviousSibling())
|
| return GetDeepestLastChild(previous_sibling);
|
| - if (FrameTreeNode* parent = GetParent(node))
|
| - return parent;
|
| + if (node->parent())
|
| + return node->parent();
|
| return wrap ? GetDeepestLastChild(node) : nullptr;
|
| }
|
|
|
| -// The same as either TraverseNext() or TraversePrevious(), depending on
|
| +// The same as either TraverseNext() or TraversePrevious() depending on
|
| // |forward|.
|
| FrameTreeNode* TraverseNode(FrameTreeNode* node, bool forward, bool wrap) {
|
| return forward ? TraverseNext(node, wrap) : TraversePrevious(node, wrap);
|
| @@ -176,43 +63,6 @@ FrameTreeNode* TraverseNode(FrameTreeNode* node, bool forward, bool wrap) {
|
|
|
| } // namespace
|
|
|
| -// Observes searched WebContentses for frame changes, including deletion,
|
| -// creation, and navigation.
|
| -class FindRequestManager::FrameObserver : public WebContentsObserver {
|
| - public:
|
| - FrameObserver(WebContentsImpl* web_contents, FindRequestManager* manager)
|
| - : WebContentsObserver(web_contents), manager_(manager) {}
|
| -
|
| - ~FrameObserver() override {}
|
| -
|
| - void DidFinishLoad(RenderFrameHost* rfh, const GURL& validated_url) override {
|
| - if (manager_->current_session_id_ == kInvalidId)
|
| - return;
|
| -
|
| - manager_->RemoveFrame(rfh);
|
| - manager_->AddFrame(rfh, true /* force */);
|
| - }
|
| -
|
| - void RenderFrameDeleted(RenderFrameHost* rfh) override {
|
| - manager_->RemoveFrame(rfh);
|
| - }
|
| -
|
| - void RenderFrameHostChanged(RenderFrameHost* old_host,
|
| - RenderFrameHost* new_host) override {
|
| - manager_->RemoveFrame(old_host);
|
| - }
|
| -
|
| - void FrameDeleted(RenderFrameHost* rfh) override {
|
| - manager_->RemoveFrame(rfh);
|
| - }
|
| -
|
| - private:
|
| - // The FindRequestManager that owns this FrameObserver.
|
| - FindRequestManager* const manager_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FrameObserver);
|
| -};
|
| -
|
| #if defined(OS_ANDROID)
|
| FindRequestManager::ActivateNearestFindResultState::
|
| ActivateNearestFindResultState() = default;
|
| @@ -238,7 +88,8 @@ FindRequestManager::FindMatchRectsState::~FindMatchRectsState() {}
|
| const int FindRequestManager::kInvalidId = -1;
|
|
|
| FindRequestManager::FindRequestManager(WebContentsImpl* web_contents)
|
| - : contents_(web_contents),
|
| + : WebContentsObserver(web_contents),
|
| + contents_(web_contents),
|
| current_session_id_(kInvalidId),
|
| pending_find_next_reply_(nullptr),
|
| pending_active_match_ordinal_(false),
|
| @@ -269,10 +120,8 @@ void FindRequestManager::Find(int request_id,
|
| }
|
|
|
| void FindRequestManager::StopFinding(StopFindAction action) {
|
| - for (WebContentsImpl* contents : contents_->GetWebContentsAndAllInner()) {
|
| - contents->SendToAllFrames(
|
| - new FrameMsg_StopFinding(MSG_ROUTING_NONE, action));
|
| - }
|
| + contents_->SendToAllFrames(
|
| + new FrameMsg_StopFinding(MSG_ROUTING_NONE, action));
|
|
|
| current_session_id_ = kInvalidId;
|
| #if defined(OS_ANDROID)
|
| @@ -444,18 +293,16 @@ void FindRequestManager::ActivateNearestFindResult(float x, float y) {
|
|
|
| // Request from each frame the distance to the nearest find result (in that
|
| // frame) from the point (x, y), defined in find-in-page coordinates.
|
| - for (WebContentsImpl* contents : contents_->GetWebContentsAndAllInner()) {
|
| - for (FrameTreeNode* node : contents->GetFrameTree()->Nodes()) {
|
| - RenderFrameHost* rfh = node->current_frame_host();
|
| + for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes()) {
|
| + RenderFrameHost* rfh = node->current_frame_host();
|
|
|
| - if (!CheckFrame(rfh) || !rfh->IsRenderFrameLive())
|
| - continue;
|
| + if (!CheckFrame(rfh) || !rfh->IsRenderFrameLive())
|
| + continue;
|
|
|
| - activate_.pending_replies.insert(rfh);
|
| - rfh->Send(new FrameMsg_GetNearestFindResult(rfh->GetRoutingID(),
|
| - activate_.current_request_id,
|
| - activate_.x, activate_.y));
|
| - }
|
| + activate_.pending_replies.insert(rfh);
|
| + rfh->Send(new FrameMsg_GetNearestFindResult(
|
| + rfh->GetRoutingID(), activate_.current_request_id,
|
| + activate_.x, activate_.y));
|
| }
|
| }
|
|
|
| @@ -481,19 +328,17 @@ void FindRequestManager::RequestFindMatchRects(int current_version) {
|
| match_rects_.request_version = current_version;
|
|
|
| // Request the latest find match rects from each frame.
|
| - for (WebContentsImpl* contents : contents_->GetWebContentsAndAllInner()) {
|
| - for (FrameTreeNode* node : contents->GetFrameTree()->Nodes()) {
|
| - RenderFrameHost* rfh = node->current_frame_host();
|
| -
|
| - if (!CheckFrame(rfh) || !rfh->IsRenderFrameLive())
|
| - continue;
|
| -
|
| - match_rects_.pending_replies.insert(rfh);
|
| - auto it = match_rects_.frame_rects.find(rfh);
|
| - int version = (it != match_rects_.frame_rects.end()) ? it->second.version
|
| - : kInvalidId;
|
| - rfh->Send(new FrameMsg_FindMatchRects(rfh->GetRoutingID(), version));
|
| - }
|
| + for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes()) {
|
| + RenderFrameHost* rfh = node->current_frame_host();
|
| +
|
| + if (!CheckFrame(rfh) || !rfh->IsRenderFrameLive())
|
| + continue;
|
| +
|
| + match_rects_.pending_replies.insert(rfh);
|
| + auto it = match_rects_.frame_rects.find(rfh);
|
| + int version = (it != match_rects_.frame_rects.end())
|
| + ? it->second.version : kInvalidId;
|
| + rfh->Send(new FrameMsg_FindMatchRects(rfh->GetRoutingID(), version));
|
| }
|
| }
|
|
|
| @@ -514,6 +359,28 @@ void FindRequestManager::OnFindMatchRectsReply(
|
| }
|
| #endif
|
|
|
| +void FindRequestManager::DidFinishLoad(RenderFrameHost* rfh,
|
| + const GURL& validated_url) {
|
| + if (current_session_id_ == kInvalidId)
|
| + return;
|
| +
|
| + RemoveFrame(rfh);
|
| + AddFrame(rfh, true /* force */);
|
| +}
|
| +
|
| +void FindRequestManager::RenderFrameDeleted(RenderFrameHost* rfh) {
|
| + RemoveFrame(rfh);
|
| +}
|
| +
|
| +void FindRequestManager::RenderFrameHostChanged(RenderFrameHost* old_host,
|
| + RenderFrameHost* new_host) {
|
| + RemoveFrame(old_host);
|
| +}
|
| +
|
| +void FindRequestManager::FrameDeleted(RenderFrameHost* rfh) {
|
| + RemoveFrame(rfh);
|
| +}
|
| +
|
| void FindRequestManager::Reset(const FindRequest& initial_request) {
|
| current_session_id_ = initial_request.id;
|
| current_request_ = initial_request;
|
| @@ -527,7 +394,6 @@ void FindRequestManager::Reset(const FindRequest& initial_request) {
|
| active_match_ordinal_ = 0;
|
| selection_rect_ = gfx::Rect();
|
| last_reported_id_ = kInvalidId;
|
| - frame_observers_.clear();
|
| #if defined(OS_ANDROID)
|
| activate_ = ActivateNearestFindResultState();
|
| match_rects_.pending_replies.clear();
|
| @@ -548,8 +414,7 @@ void FindRequestManager::FindInternal(const FindRequest& request) {
|
|
|
| // The find next request will be directed at the focused frame if there is
|
| // one, or the first frame with matches otherwise.
|
| - RenderFrameHost* target_rfh =
|
| - contents_->GetFocusedWebContents()->GetFocusedFrame();
|
| + RenderFrameHost* target_rfh = contents_->GetFocusedFrame();
|
| if (!target_rfh || !CheckFrame(target_rfh))
|
| target_rfh = GetInitialFrame(request.options.forward);
|
|
|
| @@ -561,12 +426,8 @@ void FindRequestManager::FindInternal(const FindRequest& request) {
|
|
|
| // This is an initial find operation.
|
| Reset(request);
|
| - for (WebContentsImpl* contents : contents_->GetWebContentsAndAllInner()) {
|
| - frame_observers_.push_back(base::MakeUnique<FrameObserver>(contents, this));
|
| - for (FrameTreeNode* node : contents->GetFrameTree()->Nodes()) {
|
| - AddFrame(node->current_frame_host(), false /* force */);
|
| - }
|
| - }
|
| + for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes())
|
| + AddFrame(node->current_frame_host(), false /* force */);
|
| }
|
|
|
| void FindRequestManager::AdvanceQueue(int request_id) {
|
| @@ -624,7 +485,6 @@ RenderFrameHost* FindRequestManager::Traverse(RenderFrameHost* from_rfh,
|
| bool forward,
|
| bool matches_only,
|
| bool wrap) const {
|
| - DCHECK(from_rfh);
|
| FrameTreeNode* node =
|
| static_cast<RenderFrameHostImpl*>(from_rfh)->frame_tree_node();
|
|
|
| @@ -712,9 +572,7 @@ void FindRequestManager::FinalUpdateReceived(int request_id,
|
| current_request_.options.forward,
|
| true /* matches_only */,
|
| true /* wrap */);
|
| - } else if ((target_rfh =
|
| - contents_->GetFocusedWebContents()->GetFocusedFrame()) !=
|
| - nullptr) {
|
| + } else if ((target_rfh = contents_->GetFocusedFrame()) != nullptr) {
|
| // Otherwise, if there is a focused frame, then the active match will be in
|
| // the next frame with matches after that one.
|
| target_rfh = Traverse(target_rfh,
|
|
|