Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: headless/public/util/dom_tree_extractor.cc

Issue 2385653003: Add a utility class for extracting details of the DOM (Closed)
Patch Set: Nits Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "headless/public/util/dom_tree_extractor.h"
6
7 #include "base/bind.h"
8 #include "base/json/json_writer.h"
9 #include "headless/public/headless_devtools_client.h"
10
11 namespace headless {
12
13 DomTreeExtractor::DomTreeExtractor(HeadlessDevToolsClient* devtools_client)
14 : work_in_progress_(false),
15 devtools_client_(devtools_client),
16 weak_factory_(this) {}
17
18 DomTreeExtractor::~DomTreeExtractor() {}
19
20 void DomTreeExtractor::ExtractDomTree(
21 const std::vector<std::string>& css_style_whitelist,
22 DomResultCB callback) {
23 DCHECK(!work_in_progress_);
24 work_in_progress_ = true;
25
26 callback_ = std::move(callback);
27
28 devtools_client_->GetDOM()->GetDocument(
29 dom::GetDocumentParams::Builder()
30 .SetDepth(-1)
31 .SetTraverseFrames(true)
32 .Build(),
33 base::Bind(&DomTreeExtractor::OnDocumentFetched,
34 weak_factory_.GetWeakPtr()));
35
36 devtools_client_->GetCSS()->GetExperimental()->GetLayoutTreeAndStyles(
37 css::GetLayoutTreeAndStylesParams::Builder()
38 .SetComputedStyleWhitelist(css_style_whitelist)
39 .Build(),
40 base::Bind(&DomTreeExtractor::OnLayoutTreeAndStylesFetched,
41 weak_factory_.GetWeakPtr()));
42 }
43
44 void DomTreeExtractor::OnDocumentFetched(
45 std::unique_ptr<dom::GetDocumentResult> result) {
46 dom_tree_.document_result_ = std::move(result);
47 MaybeExtractDomTree();
48 }
49
50 void DomTreeExtractor::OnLayoutTreeAndStylesFetched(
51 std::unique_ptr<css::GetLayoutTreeAndStylesResult> result) {
52 dom_tree_.layout_tree_and_styles_result_ = std::move(result);
53 MaybeExtractDomTree();
54 }
55
56 void DomTreeExtractor::MaybeExtractDomTree() {
57 if (dom_tree_.document_result_ && dom_tree_.layout_tree_and_styles_result_) {
58 EnumerateNodes(dom_tree_.document_result_->GetRoot());
59 ExtractLayoutTreeNodes();
60 ExtractComputedStyles();
61
62 work_in_progress_ = false;
63
64 callback_.Run(std::move(dom_tree_));
65 }
66 }
67
68 void DomTreeExtractor::EnumerateNodes(const dom::Node* node) {
69 // Allocate an index and record the node pointer.
70 size_t index = dom_tree_.node_id_to_index_.size();
71 dom_tree_.node_id_to_index_[node->GetNodeId()] = index;
72 dom_tree_.dom_nodes_.push_back(node);
73
74 if (node->HasContentDocument())
75 EnumerateNodes(node->GetContentDocument());
76
77 if (node->HasChildren()) {
78 for (const std::unique_ptr<dom::Node>& child : *node->GetChildren()) {
79 EnumerateNodes(child.get());
80 }
81 }
82 }
83
84 void DomTreeExtractor::ExtractLayoutTreeNodes() {
85 dom_tree_.layout_tree_nodes_.reserve(
86 dom_tree_.layout_tree_and_styles_result_->GetLayoutTreeNodes()->size());
87
88 // Only extract layout tree nodes that map to a DOM node.
89 for (const std::unique_ptr<css::LayoutTreeNode>& layout_node :
90 *dom_tree_.layout_tree_and_styles_result_->GetLayoutTreeNodes()) {
91 std::unordered_map<NodeId, size_t>::const_iterator it =
92 dom_tree_.node_id_to_index_.find(layout_node->GetBackendNodeId());
93 if (it == dom_tree_.node_id_to_index_.end())
94 continue;
95
96 dom_tree_.layout_tree_nodes_.push_back(layout_node.get());
97 }
98 }
99
100 void DomTreeExtractor::ExtractComputedStyles() {
101 dom_tree_.computed_styles_.reserve(
102 dom_tree_.layout_tree_and_styles_result_->GetComputedStyles()->size());
103
104 for (const std::unique_ptr<css::ComputedStyle>& computed_style :
105 *dom_tree_.layout_tree_and_styles_result_->GetComputedStyles()) {
106 dom_tree_.computed_styles_.push_back(computed_style.get());
107 }
108 }
109
110 DomTreeExtractor::DomTree::DomTree() {}
111 DomTreeExtractor::DomTree::~DomTree() {}
112
113 DomTreeExtractor::DomTree::DomTree(DomTree&& other) = default;
114
115 } // namespace headless
OLDNEW
« no previous file with comments | « headless/public/util/dom_tree_extractor.h ('k') | headless/public/util/dom_tree_extractor_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698