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

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

Issue 2673773002: Adds a FlatDomTreeExtractor to headless (Closed)
Patch Set: Fix DCHECKS Created 3 years, 10 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 2017 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/flat_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 FlatDomTreeExtractor::FlatDomTreeExtractor(
14 HeadlessDevToolsClient* devtools_client)
15 : work_in_progress_(false),
16 devtools_client_(devtools_client),
17 weak_factory_(this) {}
18
19 FlatDomTreeExtractor::~FlatDomTreeExtractor() {}
20
21 void FlatDomTreeExtractor::ExtractDomTree(
22 const std::vector<std::string>& css_style_whitelist,
23 DomResultCB callback) {
24 DCHECK(!work_in_progress_);
25 work_in_progress_ = true;
26
27 callback_ = std::move(callback);
28
29 devtools_client_->GetDOM()->GetFlattenedDocument(
30 dom::GetFlattenedDocumentParams::Builder()
31 .SetDepth(-1)
32 .SetPierce(true)
33 .Build(),
34 base::Bind(&FlatDomTreeExtractor::OnDocumentFetched,
35 weak_factory_.GetWeakPtr()));
36
37 devtools_client_->GetCSS()->GetExperimental()->GetLayoutTreeAndStyles(
38 css::GetLayoutTreeAndStylesParams::Builder()
39 .SetComputedStyleWhitelist(css_style_whitelist)
40 .Build(),
41 base::Bind(&FlatDomTreeExtractor::OnLayoutTreeAndStylesFetched,
42 weak_factory_.GetWeakPtr()));
43 }
44
45 void FlatDomTreeExtractor::OnDocumentFetched(
46 std::unique_ptr<dom::GetFlattenedDocumentResult> result) {
47 dom_tree_.document_result_ = std::move(result);
48 MaybeExtractDomTree();
49 }
50
51 void FlatDomTreeExtractor::OnLayoutTreeAndStylesFetched(
52 std::unique_ptr<css::GetLayoutTreeAndStylesResult> result) {
53 dom_tree_.layout_tree_and_styles_result_ = std::move(result);
54 MaybeExtractDomTree();
55 }
56
57 void FlatDomTreeExtractor::MaybeExtractDomTree() {
58 if (dom_tree_.document_result_ && dom_tree_.layout_tree_and_styles_result_) {
59 for (const std::unique_ptr<headless::dom::Node>& node :
60 *dom_tree_.document_result_->GetNodes()) {
61 EnumerateNodes(node.get());
62 }
63 ExtractLayoutTreeNodes();
64 ExtractComputedStyles();
65
66 work_in_progress_ = false;
67
68 callback_.Run(std::move(dom_tree_));
69 }
70 }
71
72 void FlatDomTreeExtractor::EnumerateNodes(const dom::Node* node) {
73 // Allocate an index and record the node pointer.
74 size_t index = dom_tree_.node_id_to_index_.size();
75 dom_tree_.node_id_to_index_[node->GetNodeId()] = index;
76 dom_tree_.dom_nodes_.push_back(node);
77
78 if (node->HasContentDocument())
79 EnumerateNodes(node->GetContentDocument());
80
81 DCHECK(!node->HasChildren() || node->GetChildren()->empty());
82 }
83
84 void FlatDomTreeExtractor::ExtractLayoutTreeNodes() {
85 dom_tree_.layout_tree_nodes_.reserve(
86 dom_tree_.layout_tree_and_styles_result_->GetLayoutTreeNodes()->size());
87
88 for (const std::unique_ptr<css::LayoutTreeNode>& layout_node :
89 *dom_tree_.layout_tree_and_styles_result_->GetLayoutTreeNodes()) {
90 std::unordered_map<NodeId, size_t>::const_iterator it =
91 dom_tree_.node_id_to_index_.find(layout_node->GetNodeId());
92 DCHECK(it != dom_tree_.node_id_to_index_.end());
93 dom_tree_.layout_tree_nodes_.push_back(layout_node.get());
94 }
95 }
96
97 void FlatDomTreeExtractor::ExtractComputedStyles() {
98 dom_tree_.computed_styles_.reserve(
99 dom_tree_.layout_tree_and_styles_result_->GetComputedStyles()->size());
100
101 for (const std::unique_ptr<css::ComputedStyle>& computed_style :
102 *dom_tree_.layout_tree_and_styles_result_->GetComputedStyles()) {
103 dom_tree_.computed_styles_.push_back(computed_style.get());
104 }
105 }
106
107 FlatDomTreeExtractor::DomTree::DomTree() {}
108 FlatDomTreeExtractor::DomTree::~DomTree() {}
109
110 FlatDomTreeExtractor::DomTree::DomTree(DomTree&& other) = default;
111
112 } // namespace headless
OLDNEW
« no previous file with comments | « headless/public/util/flat_dom_tree_extractor.h ('k') | headless/public/util/flat_dom_tree_extractor_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698