summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/content_capture
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/content_capture')
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/BUILD.gn2
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/DEPS3
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/README.md19
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.cc32
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.h15
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_task.cc35
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_task.h10
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.cc16
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h16
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_capture_test.cc212
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_holder.cc37
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/content_holder.h47
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/task_session.cc152
-rw-r--r--chromium/third_party/blink/renderer/core/content_capture/task_session.h47
14 files changed, 217 insertions, 426 deletions
diff --git a/chromium/third_party/blink/renderer/core/content_capture/BUILD.gn b/chromium/third_party/blink/renderer/core/content_capture/BUILD.gn
index 1282f765ea4..5a45b0620bd 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/BUILD.gn
+++ b/chromium/third_party/blink/renderer/core/content_capture/BUILD.gn
@@ -12,8 +12,6 @@ blink_core_sources("content_capture") {
"content_capture_task.h",
"content_capture_task_histogram_reporter.cc",
"content_capture_task_histogram_reporter.h",
- "content_holder.cc",
- "content_holder.h",
"sent_nodes.cc",
"sent_nodes.h",
"task_session.cc",
diff --git a/chromium/third_party/blink/renderer/core/content_capture/DEPS b/chromium/third_party/blink/renderer/core/content_capture/DEPS
index 01e64c0c118..c9bd3407b6c 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/DEPS
+++ b/chromium/third_party/blink/renderer/core/content_capture/DEPS
@@ -1,6 +1,5 @@
include_rules = [
"+base/logging.h",
- "+cc/paint/node_holder.h",
- "+cc/paint/text_holder.h",
+ "+cc/paint/node_id.h",
"+cc/trees/layer_tree_host.h",
]
diff --git a/chromium/third_party/blink/renderer/core/content_capture/README.md b/chromium/third_party/blink/renderer/core/content_capture/README.md
index bb87b29c2bd..f22965328e3 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/README.md
+++ b/chromium/third_party/blink/renderer/core/content_capture/README.md
@@ -5,24 +5,9 @@
This directory contains ContentCapture which is for capturing on-screen text
content and streaming it to a client.
-The implementation injects a cc::NodeHolder into cc::DrawTextBlobOp in paint
+The implementation injects a cc::NodeId into cc::DrawTextBlobOp in paint
stage, schedules a best-effort task to retrieve on-screen text content (using
-an r-tree to capture all cc::NodeHolder intersecting the screen), and streams
+an r-tree to capture all cc::NodeId intersecting the screen), and streams
the text out through ContentCaptureClient interface. The ContentCaptureTask is
a best-effort task in the idle queue and could be paused if there are
higher-priority tasks.
-
-There are two ways to associate cc::NodeHolder with Node which are being
-compared. One of these approaches will be removed once performance data is
-available.
-
- 1. NodeHolder::Type::kID where the ID from DOMNodeIds::IdForNode() is used to
-identify nodes.
- 2. NodeHolder::Type::kTextHolder which uses ContentCapture’s implementation of
-cc::TextHolder to identify the node. Since the NodeHolder is captured and sent
-out in a separate task, the Node could be removed. To avoid using removed
-Nodes, a weak pointer to Node is implemented. This weak pointer will be reset
-when the Node associated with the LayoutText is destroyed. Though a Node can be
-associated with multiple LayoutObjects, only the main LayoutObject has the
-pointer back to Node, so it isn’t a problem to use the removing of LayoutText
-to reset the pointer to the Node.
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.cc b/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.cc
index 830d92fef50..c0e166ff3a2 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.cc
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.cc
@@ -4,7 +4,6 @@
#include "third_party/blink/renderer/core/content_capture/content_capture_manager.h"
-#include "third_party/blink/renderer/core/content_capture/content_holder.h"
#include "third_party/blink/renderer/core/content_capture/sent_nodes.h"
#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -12,9 +11,8 @@
namespace blink {
-ContentCaptureManager::ContentCaptureManager(LocalFrame& local_frame_root,
- NodeHolder::Type type)
- : local_frame_root_(&local_frame_root), node_holder_type_(type) {
+ContentCaptureManager::ContentCaptureManager(LocalFrame& local_frame_root)
+ : local_frame_root_(&local_frame_root) {
DCHECK(local_frame_root.IsLocalRoot());
sent_nodes_ = MakeGarbageCollected<SentNodes>();
task_session_ = MakeGarbageCollected<TaskSession>(*sent_nodes_);
@@ -22,16 +20,14 @@ ContentCaptureManager::ContentCaptureManager(LocalFrame& local_frame_root,
ContentCaptureManager::~ContentCaptureManager() = default;
-NodeHolder ContentCaptureManager::GetNodeHolder(Node& node) {
+DOMNodeId ContentCaptureManager::GetNodeId(Node& node) {
if (first_node_holder_created_) {
ScheduleTask(ContentCaptureTask::ScheduleReason::kContentChange);
} else {
ScheduleTask(ContentCaptureTask::ScheduleReason::kFirstContentChange);
first_node_holder_created_ = true;
}
- if (node_holder_type_ == NodeHolder::Type::kID)
- return NodeHolder(DOMNodeIds::IdForNode(&node));
- return NodeHolder(base::MakeRefCounted<ContentHolder>(node));
+ return DOMNodeIds::IdForNode(&node);
}
void ContentCaptureManager::ScheduleTask(
@@ -48,20 +44,12 @@ ContentCaptureManager::CreateContentCaptureTask() {
*task_session_);
}
-void ContentCaptureManager::NotifyNodeDetached(const NodeHolder& node_holder) {
- task_session_->OnNodeDetached(node_holder);
+void ContentCaptureManager::NotifyNodeDetached(const Node& node) {
+ task_session_->OnNodeDetached(node);
}
-void ContentCaptureManager::OnLayoutTextWillBeDestroyed(
- NodeHolder node_holder) {
- DCHECK(!node_holder.is_empty);
- NotifyNodeDetached(node_holder);
- if (node_holder.type == NodeHolder::Type::kTextHolder) {
- ContentHolder* content_holder =
- static_cast<ContentHolder*>(node_holder.text_holder.get());
- if (content_holder)
- content_holder->OnNodeDetachedFromLayoutTree();
- }
+void ContentCaptureManager::OnLayoutTextWillBeDestroyed(const Node& node) {
+ NotifyNodeDetached(node);
ScheduleTask(ContentCaptureTask::ScheduleReason::kContentChange);
}
@@ -69,8 +57,8 @@ void ContentCaptureManager::OnScrollPositionChanged() {
ScheduleTask(ContentCaptureTask::ScheduleReason::kScrolling);
}
-void ContentCaptureManager::OnNodeTextChanged(const NodeHolder& node_holder) {
- task_session_->OnNodeChanged(node_holder);
+void ContentCaptureManager::OnNodeTextChanged(Node& node) {
+ task_session_->OnNodeChanged(node);
ScheduleTask(ContentCaptureTask::ScheduleReason::kContentChange);
}
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.h b/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.h
index fd8a0feadfd..d38c5a0544c 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.h
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_manager.h
@@ -7,8 +7,8 @@
#include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/core/content_capture/content_capture_task.h"
-#include "third_party/blink/renderer/core/content_capture/content_holder.h"
#include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/platform/graphics/dom_node_id.h"
namespace blink {
@@ -21,23 +21,23 @@ class SentNodes;
class CORE_EXPORT ContentCaptureManager
: public GarbageCollectedFinalized<ContentCaptureManager> {
public:
- ContentCaptureManager(LocalFrame& local_frame_root, NodeHolder::Type type);
+ explicit ContentCaptureManager(LocalFrame& local_frame_root);
virtual ~ContentCaptureManager();
// Creates and returns NodeHolder for the given |node|, and schedules
// ContentCaptureTask if it isn't already scheduled.
// Can't use const Node& for parameter, because |node| is passed to
// DOMNodeIds::IdForNode(Node*).
- NodeHolder GetNodeHolder(Node& node);
+ DOMNodeId GetNodeId(Node& node);
// Invokes when the |node_holder| asscociated LayoutText will be destroyed.
- void OnLayoutTextWillBeDestroyed(NodeHolder node_holder);
+ void OnLayoutTextWillBeDestroyed(const Node& node);
// Invokes when scroll position was changed.
void OnScrollPositionChanged();
// Invokes when text node content was changed.
- void OnNodeTextChanged(const NodeHolder& node_holder);
+ void OnNodeTextChanged(Node& node);
// Invokes when the local_frame_root shutdown.
void Shutdown();
@@ -53,16 +53,13 @@ class CORE_EXPORT ContentCaptureManager
TaskSession& GetTaskSessionForTesting() const { return *task_session_; }
private:
- void NotifyNodeDetached(const NodeHolder& node_holder);
+ void NotifyNodeDetached(const Node& node);
void ScheduleTask(ContentCaptureTask::ScheduleReason reason);
scoped_refptr<ContentCaptureTask> content_capture_idle_task_;
Member<LocalFrame> local_frame_root_;
- // Indicates the NodeHolder::Type should be used.
- NodeHolder::Type node_holder_type_;
-
// Indicates if the first NodeHolder is created.
bool first_node_holder_created_ = false;
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.cc b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.cc
index ce7e3955c79..a6d0a07a93e 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.cc
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.cc
@@ -8,7 +8,6 @@
#include "cc/trees/layer_tree_host.h"
#include "third_party/blink/public/web/web_content_capture_client.h"
#include "third_party/blink/public/web/web_content_holder.h"
-#include "third_party/blink/renderer/core/content_capture/content_holder.h"
#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/core/layout/layout_text.h"
@@ -27,7 +26,7 @@ ContentCaptureTask::ContentCaptureTask(LocalFrame& local_frame_root,
->GetTaskTimingParameters(task_short_delay_, task_long_delay_);
// The histogram is all about time, just disable it if high resolution isn't
// supported.
- if (TimeTicks::IsHighResolution()) {
+ if (base::TimeTicks::IsHighResolution()) {
histogram_reporter_ =
base::MakeRefCounted<ContentCaptureTaskHistogramReporter>();
task_session_->SetSentNodeCountCallback(
@@ -44,7 +43,7 @@ void ContentCaptureTask::Shutdown() {
local_frame_root_ = nullptr;
}
-bool ContentCaptureTask::CaptureContent(std::vector<cc::NodeHolder>& data) {
+bool ContentCaptureTask::CaptureContent(Vector<cc::NodeId>& data) {
if (captured_content_for_testing_) {
data = captured_content_for_testing_.value();
return true;
@@ -53,8 +52,15 @@ bool ContentCaptureTask::CaptureContent(std::vector<cc::NodeHolder>& data) {
// lifecycle step so we need to early-out in many cases.
if (const auto* root_frame_view = local_frame_root_->View()) {
if (const auto* cc_layer = root_frame_view->RootCcLayer()) {
- if (auto* layer_tree_host = cc_layer->layer_tree_host())
- return layer_tree_host->CaptureContent(&data);
+ if (auto* layer_tree_host = cc_layer->layer_tree_host()) {
+ std::vector<cc::NodeId> content;
+ if (layer_tree_host->CaptureContent(&content)) {
+ for (auto c : content)
+ data.push_back(std::move(c));
+ return true;
+ }
+ return false;
+ }
}
}
return false;
@@ -62,13 +68,13 @@ bool ContentCaptureTask::CaptureContent(std::vector<cc::NodeHolder>& data) {
bool ContentCaptureTask::CaptureContent() {
DCHECK(task_session_);
- std::vector<cc::NodeHolder> buffer;
+ Vector<cc::NodeId> buffer;
if (histogram_reporter_)
histogram_reporter_->OnCaptureContentStarted();
bool result = CaptureContent(buffer);
if (histogram_reporter_)
histogram_reporter_->OnCaptureContentEnded(buffer.size());
- if (!buffer.empty())
+ if (!buffer.IsEmpty())
task_session_->SetCapturedContent(buffer);
return result;
}
@@ -82,20 +88,19 @@ void ContentCaptureTask::SendContent(
if (histogram_reporter_)
histogram_reporter_->OnSendContentStarted();
- std::vector<scoped_refptr<WebContentHolder>> content_batch;
+ WebVector<WebContentHolder> content_batch;
content_batch.reserve(kBatchSize);
// Only send changed content after the new content was sent.
bool sending_changed_content = !doc_session.HasUnsentCapturedContent();
while (content_batch.size() < kBatchSize) {
- scoped_refptr<ContentHolder> content_holder;
+ Node* node;
if (sending_changed_content)
- content_holder = doc_session.GetNextChangedContentHolder();
+ node = doc_session.GetNextChangedNode();
else
- content_holder = doc_session.GetNextUnsentContentHolder();
- if (!content_holder)
+ node = doc_session.GetNextUnsentNode();
+ if (!node)
break;
- content_batch.push_back(
- base::MakeRefCounted<WebContentHolder>(content_holder));
+ content_batch.emplace_back(WebContentHolder(*node));
}
if (!content_batch.empty()) {
if (sending_changed_content) {
@@ -203,7 +208,7 @@ void ContentCaptureTask::ScheduleInternal(ScheduleReason reason) {
if (is_scheduled_)
return;
- TimeDelta delay;
+ base::TimeDelta delay;
switch (reason) {
case ScheduleReason::kFirstContentChange:
case ScheduleReason::kScrolling:
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.h b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.h
index 01941c8d90b..a428a4fb48b 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.h
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task.h
@@ -6,14 +6,14 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_CONTENT_CAPTURE_CONTENT_CAPTURE_TASK_H_
#include <memory>
-#include <vector>
-#include "cc/paint/node_holder.h"
+#include "cc/paint/node_id.h"
#include "third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h"
#include "third_party/blink/renderer/core/content_capture/task_session.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/timer.h"
#include "third_party/blink/renderer/platform/wtf/ref_counted.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
@@ -59,7 +59,7 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> {
}
void SetCapturedContentForTesting(
- const std::vector<cc::NodeHolder>& captured_content) {
+ const Vector<cc::NodeId>& captured_content) {
captured_content_for_testing_ = captured_content;
}
@@ -94,7 +94,7 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> {
void SendContent(TaskSession::DocumentSession& doc_session);
void ScheduleInternal(ScheduleReason reason);
- bool CaptureContent(std::vector<cc::NodeHolder>& data);
+ bool CaptureContent(Vector<cc::NodeId>& data);
bool is_scheduled_ = false;
@@ -112,7 +112,7 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> {
base::TimeDelta task_long_delay_;
scoped_refptr<ContentCaptureTaskHistogramReporter> histogram_reporter_;
base::Optional<TaskState> task_stop_for_testing_;
- base::Optional<std::vector<cc::NodeHolder>> captured_content_for_testing_;
+ base::Optional<Vector<cc::NodeId>> captured_content_for_testing_;
};
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.cc b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.cc
index 7c3834b2bad..c2afc2de80a 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.cc
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.cc
@@ -10,7 +10,6 @@ namespace blink {
// static
constexpr char ContentCaptureTaskHistogramReporter::kCaptureContentTime[];
-constexpr char ContentCaptureTaskHistogramReporter::kCaptureOneContentTime[];
constexpr char ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime[];
constexpr char ContentCaptureTaskHistogramReporter::kSendContentTime[];
constexpr char ContentCaptureTaskHistogramReporter::kSentContentCount[];
@@ -21,7 +20,6 @@ ContentCaptureTaskHistogramReporter::ContentCaptureTaskHistogramReporter()
30000,
50),
capture_content_time_histogram_(kCaptureContentTime, 0, 50000, 50),
- capture_one_content_time_histogram_(kCaptureOneContentTime, 0, 50000, 50),
send_content_time_histogram_(kSendContentTime, 0, 50000, 50),
sent_content_count_histogram_(kSentContentCount, 0, 10000, 50) {}
@@ -31,11 +29,11 @@ ContentCaptureTaskHistogramReporter::~ContentCaptureTaskHistogramReporter() =
void ContentCaptureTaskHistogramReporter::OnContentChanged() {
if (content_change_time_)
return;
- content_change_time_ = WTF::CurrentTimeTicks();
+ content_change_time_ = base::TimeTicks::Now();
}
void ContentCaptureTaskHistogramReporter::OnCaptureContentStarted() {
- capture_content_start_time_ = WTF::CurrentTimeTicks();
+ capture_content_start_time_ = base::TimeTicks::Now();
}
void ContentCaptureTaskHistogramReporter::OnCaptureContentEnded(
@@ -49,21 +47,19 @@ void ContentCaptureTaskHistogramReporter::OnCaptureContentEnded(
// Gives content_change_time_ to the change occurred while sending the
// content.
captured_content_change_time_ = std::move(content_change_time_);
- base::TimeDelta delta = WTF::CurrentTimeTicks() - capture_content_start_time_;
+ base::TimeDelta delta = base::TimeTicks::Now() - capture_content_start_time_;
capture_content_time_histogram_.CountMicroseconds(delta);
- capture_one_content_time_histogram_.CountMicroseconds(delta /
- captured_content_count);
}
void ContentCaptureTaskHistogramReporter::OnSendContentStarted() {
- send_content_start_time_ = WTF::CurrentTimeTicks();
+ send_content_start_time_ = base::TimeTicks::Now();
}
void ContentCaptureTaskHistogramReporter::OnSendContentEnded(
size_t sent_content_count) {
- TimeTicks now = WTF::CurrentTimeTicks();
+ base::TimeTicks now = base::TimeTicks::Now();
if (captured_content_change_time_) {
- TimeTicks content_change_time = captured_content_change_time_.value();
+ base::TimeTicks content_change_time = captured_content_change_time_.value();
captured_content_change_time_.reset();
capture_content_delay_time_histogram_.CountMilliseconds(
now - content_change_time);
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h
index 49d53895dc0..fad03b77c87 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h
@@ -7,7 +7,7 @@
#include "base/optional.h"
#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
#include "third_party/blink/renderer/platform/wtf/ref_counted.h"
#include "third_party/blink/renderer/platform/wtf/time.h"
@@ -22,8 +22,6 @@ class CORE_EXPORT ContentCaptureTaskHistogramReporter
"ContentCapture.CaptureContentDelayTime";
static constexpr char kCaptureContentTime[] =
"ContentCapture.CaptureContentTime";
- static constexpr char kCaptureOneContentTime[] =
- "ContentCapture.CaptureOneContentTime";
static constexpr char kSendContentTime[] = "ContentCapture.SendContentTime";
static constexpr char kSentContentCount[] = "ContentCapture.SentContentCount";
@@ -39,15 +37,15 @@ class CORE_EXPORT ContentCaptureTaskHistogramReporter
private:
// The time of first content change since the last content captured.
- base::Optional<WTF::TimeTicks> content_change_time_;
+ base::Optional<base::TimeTicks> content_change_time_;
// The copy of |content_change_time| after the content has been captured; we
// need to record the time the content has been sent, |content_change_time_|
// shall be released for the next content change.
- base::Optional<WTF::TimeTicks> captured_content_change_time_;
+ base::Optional<base::TimeTicks> captured_content_change_time_;
// The time to start capturing content.
- WTF::TimeTicks capture_content_start_time_;
+ base::TimeTicks capture_content_start_time_;
// The time to start sending content.
- WTF::TimeTicks send_content_start_time_;
+ base::TimeTicks send_content_start_time_;
// Records time from first content change to content that has been sent, its
// range is 500ms from to 30s.
@@ -55,10 +53,6 @@ class CORE_EXPORT ContentCaptureTaskHistogramReporter
// Records time to capture the content, its range is from 0 to 50,000
// microseconds.
CustomCountHistogram capture_content_time_histogram_;
- // Records time to capture one content, this is the average of all captured
- // content for a specific ContentCapture, its range is from 0 to 50,000
- // microseconds.
- CustomCountHistogram capture_one_content_time_histogram_;
// Records time to send the content, its range is from 0 to 50,000
// microseconds.
CustomCountHistogram send_content_time_histogram_;
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_capture_test.cc b/chromium/third_party/blink/renderer/core/content_capture/content_capture_test.cc
index 4f615d77b0c..8fa581645f2 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/content_capture_test.cc
+++ b/chromium/third_party/blink/renderer/core/content_capture/content_capture_test.cc
@@ -24,14 +24,8 @@ namespace blink {
class WebContentCaptureClientTestHelper : public WebContentCaptureClient {
public:
- WebContentCaptureClientTestHelper(NodeHolder::Type type)
- : node_holder_type_(type) {}
~WebContentCaptureClientTestHelper() override = default;
- NodeHolder::Type GetNodeHolderType() const override {
- return node_holder_type_;
- }
-
void GetTaskTimingParameters(base::TimeDelta& short_delay,
base::TimeDelta& long_delay) const override {
short_delay = GetTaskShortDelay();
@@ -46,57 +40,52 @@ class WebContentCaptureClientTestHelper : public WebContentCaptureClient {
return base::TimeDelta::FromMilliseconds(500);
}
- void DidCaptureContent(
- const std::vector<scoped_refptr<WebContentHolder>>& data,
- bool first_data) override {
+ void DidCaptureContent(const WebVector<WebContentHolder>& data,
+ bool first_data) override {
data_ = data;
first_data_ = first_data;
- for (auto d : data)
- all_text_.push_back(d->GetValue().Utf8());
+ for (auto& d : data)
+ all_text_.push_back(d.GetValue().Utf8());
}
- void DidUpdateContent(
- const std::vector<scoped_refptr<WebContentHolder>>& data) override {
+ void DidUpdateContent(const WebVector<WebContentHolder>& data) override {
updated_data_ = data;
- for (auto d : data)
- updated_text_.push_back(d->GetValue().Utf8());
+ for (auto& d : data)
+ updated_text_.push_back(d.GetValue().Utf8());
}
- void DidRemoveContent(const std::vector<int64_t>& data) override {
+ void DidRemoveContent(WebVector<int64_t> data) override {
removed_data_ = data;
}
bool FirstData() const { return first_data_; }
- const std::vector<scoped_refptr<WebContentHolder>>& Data() const {
- return data_;
- }
+ const WebVector<WebContentHolder>& Data() const { return data_; }
- const std::vector<scoped_refptr<WebContentHolder>>& UpdatedData() const {
+ const WebVector<WebContentHolder>& UpdatedData() const {
return updated_data_;
}
- const std::vector<std::string>& AllText() const { return all_text_; }
+ const Vector<std::string>& AllText() const { return all_text_; }
- const std::vector<std::string>& UpdatedText() const { return updated_text_; }
+ const Vector<std::string>& UpdatedText() const { return updated_text_; }
- const std::vector<int64_t>& RemovedData() const { return removed_data_; }
+ const WebVector<int64_t>& RemovedData() const { return removed_data_; }
void ResetResults() {
first_data_ = false;
- data_.clear();
- updated_data_.clear();
- removed_data_.clear();
+ data_.Clear();
+ updated_data_.Clear();
+ removed_data_.Clear();
}
private:
bool first_data_ = false;
- std::vector<scoped_refptr<WebContentHolder>> data_;
- std::vector<scoped_refptr<WebContentHolder>> updated_data_;
- std::vector<int64_t> removed_data_;
- NodeHolder::Type node_holder_type_;
- std::vector<std::string> all_text_;
- std::vector<std::string> updated_text_;
+ WebVector<WebContentHolder> data_;
+ WebVector<WebContentHolder> updated_data_;
+ WebVector<int64_t> removed_data_;
+ Vector<std::string> all_text_;
+ Vector<std::string> updated_text_;
};
class ContentCaptureTaskTestHelper : public ContentCaptureTask {
@@ -128,8 +117,7 @@ class ContentCaptureManagerTestHelper : public ContentCaptureManager {
ContentCaptureManagerTestHelper(
LocalFrame& local_frame_root,
WebContentCaptureClientTestHelper& content_capture_client)
- : ContentCaptureManager(local_frame_root,
- content_capture_client.GetNodeHolderType()) {
+ : ContentCaptureManager(local_frame_root) {
content_capture_task_ = base::MakeRefCounted<ContentCaptureTaskTestHelper>(
local_frame_root, GetTaskSessionForTesting(), content_capture_client);
}
@@ -160,15 +148,13 @@ class ContentCaptureLocalFrameClientHelper : public EmptyLocalFrameClient {
WebContentCaptureClient& client_;
};
-class ContentCaptureTest
- : public PageTestBase,
- public ::testing::WithParamInterface<NodeHolder::Type> {
+class ContentCaptureTest : public PageTestBase {
public:
ContentCaptureTest() { EnablePlatform(); }
void SetUp() override {
content_capture_client_ =
- std::make_unique<WebContentCaptureClientTestHelper>(GetParam());
+ std::make_unique<WebContentCaptureClientTestHelper>();
local_frame_client_ =
MakeGarbageCollected<ContentCaptureLocalFrameClientHelper>(
*content_capture_client_);
@@ -194,7 +180,7 @@ class ContentCaptureTest
// Setup captured content to ContentCaptureTask, it isn't necessary once
// ContentCaptureManager is created by LocalFrame.
content_capture_manager_->GetContentCaptureTask()
- ->SetCapturedContentForTesting(node_holders_);
+ ->SetCapturedContentForTesting(node_ids_);
}
void CreateTextNodeAndNotifyManager() {
@@ -205,8 +191,8 @@ class ContentCaptureTest
Element* div_element = GetElementById("d1");
div_element->appendChild(element);
UpdateAllLifecyclePhasesForTest();
- created_node_holder_ = GetContentCaptureManager()->GetNodeHolder(*node);
- std::vector<NodeHolder> captured_content{created_node_holder_};
+ created_node_id_ = GetContentCaptureManager()->GetNodeId(*node);
+ Vector<DOMNodeId> captured_content{created_node_id_};
content_capture_manager_->GetContentCaptureTask()
->SetCapturedContentForTesting(captured_content);
}
@@ -233,20 +219,38 @@ class ContentCaptureTest
platform()->RunForPeriod(GetWebContentCaptureClient()->GetTaskLongDelay());
}
- void RemoveNode(NodeHolder node_holder, Node* node) {
+ void RemoveNode(Node* node) {
// Remove the node.
node->remove();
- GetContentCaptureManager()->OnLayoutTextWillBeDestroyed(node_holder);
+ GetContentCaptureManager()->OnLayoutTextWillBeDestroyed(*node);
+ }
+
+ void RemoveUnsentNode(const WebVector<WebContentHolder>& sent_nodes) {
+ // Find a node isn't in sent_nodes
+ for (auto node : nodes_) {
+ bool found_in_sent = false;
+ for (auto& sent : sent_nodes) {
+ found_in_sent = (node->nodeValue().Utf8().c_str() == sent.GetValue());
+ if (found_in_sent)
+ break;
+ }
+ if (!found_in_sent) {
+ RemoveNode(node);
+ return;
+ }
+ }
+ // Didn't find unsent nodes.
+ NOTREACHED();
}
size_t GetExpectedFirstResultSize() { return ContentCaptureTask::kBatchSize; }
size_t GetExpectedSecondResultSize() {
- return node_holders_.size() - GetExpectedFirstResultSize();
+ return node_ids_.size() - GetExpectedFirstResultSize();
}
- const std::vector<NodeHolder>& NodeHolders() const { return node_holders_; }
- const std::vector<Node*> Nodes() const { return nodes_; }
+ const Vector<DOMNodeId>& NodeIds() const { return node_ids_; }
+ const Vector<Persistent<Node>> Nodes() const { return nodes_; }
private:
void ResetResult() {
@@ -255,8 +259,7 @@ class ContentCaptureTest
// TODO(michaelbai): Remove this once integrate with LayoutText.
void InitNodeHolders() {
- std::vector<std::string> ids{"p1", "p2", "p3", "p4",
- "p5", "p6", "p7", "p8"};
+ Vector<std::string> ids{"p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8"};
for (auto id : ids) {
Node* node = GetElementById(id.c_str())->firstChild();
CHECK(node);
@@ -264,24 +267,19 @@ class ContentCaptureTest
CHECK(layout_object);
CHECK(layout_object->IsText());
nodes_.push_back(node);
- node_holders_.push_back(GetContentCaptureManager()->GetNodeHolder(*node));
+ node_ids_.push_back(GetContentCaptureManager()->GetNodeId(*node));
}
}
- std::vector<Node*> nodes_;
- std::vector<NodeHolder> node_holders_;
+ Vector<Persistent<Node>> nodes_;
+ Vector<DOMNodeId> node_ids_;
std::unique_ptr<WebContentCaptureClientTestHelper> content_capture_client_;
Persistent<ContentCaptureManagerTestHelper> content_capture_manager_;
Persistent<ContentCaptureLocalFrameClientHelper> local_frame_client_;
- NodeHolder created_node_holder_;
+ DOMNodeId created_node_id_ = kInvalidDOMNodeId;
};
-INSTANTIATE_TEST_SUITE_P(,
- ContentCaptureTest,
- testing::Values(NodeHolder::Type::kID,
- NodeHolder::Type::kTextHolder));
-
-TEST_P(ContentCaptureTest, Basic) {
+TEST_F(ContentCaptureTest, Basic) {
RunContentCaptureTask();
EXPECT_EQ(ContentCaptureTask::TaskState::kStop,
GetContentCaptureTask()->GetTaskStateForTesting());
@@ -290,7 +288,7 @@ TEST_P(ContentCaptureTest, Basic) {
GetWebContentCaptureClient()->Data().size());
}
-TEST_P(ContentCaptureTest, PauseAndResume) {
+TEST_F(ContentCaptureTest, PauseAndResume) {
// The task stops before captures content.
GetContentCaptureTask()->SetTaskStopState(
ContentCaptureTask::TaskState::kCaptureContent);
@@ -330,7 +328,7 @@ TEST_P(ContentCaptureTest, PauseAndResume) {
GetWebContentCaptureClient()->Data().size());
}
-TEST_P(ContentCaptureTest, NodeOnlySendOnce) {
+TEST_F(ContentCaptureTest, NodeOnlySendOnce) {
// Send all nodes
RunContentCaptureTask();
EXPECT_FALSE(GetWebContentCaptureClient()->Data().empty());
@@ -343,7 +341,7 @@ TEST_P(ContentCaptureTest, NodeOnlySendOnce) {
EXPECT_TRUE(GetWebContentCaptureClient()->RemovedData().empty());
}
-TEST_P(ContentCaptureTest, RemoveNodeBeforeSendingOut) {
+TEST_F(ContentCaptureTest, RemoveNodeBeforeSendingOut) {
// Capture the content, but didn't send them.
GetContentCaptureTask()->SetTaskStopState(
ContentCaptureTask::TaskState::kProcessCurrentSession);
@@ -351,7 +349,7 @@ TEST_P(ContentCaptureTest, RemoveNodeBeforeSendingOut) {
EXPECT_TRUE(GetWebContentCaptureClient()->Data().empty());
// Remove the node and sent the captured content out.
- RemoveNode(NodeHolders().at(0), Nodes().at(0));
+ RemoveNode(Nodes().at(0));
GetContentCaptureTask()->SetTaskStopState(
ContentCaptureTask::TaskState::kProcessRetryTask);
RunContentCaptureTask();
@@ -369,7 +367,7 @@ TEST_P(ContentCaptureTest, RemoveNodeBeforeSendingOut) {
EXPECT_EQ(0u, GetWebContentCaptureClient()->RemovedData().size());
}
-TEST_P(ContentCaptureTest, RemoveNodeInBetweenSendingOut) {
+TEST_F(ContentCaptureTest, RemoveNodeInBetweenSendingOut) {
// Capture the content, but didn't send them.
GetContentCaptureTask()->SetTaskStopState(
ContentCaptureTask::TaskState::kProcessCurrentSession);
@@ -384,9 +382,8 @@ TEST_P(ContentCaptureTest, RemoveNodeInBetweenSendingOut) {
GetWebContentCaptureClient()->Data().size());
EXPECT_EQ(0u, GetWebContentCaptureClient()->RemovedData().size());
- // This depends on the DocumentSession returning the unsent nodes reversely.
- // Remove the first node and sent the captured content out.
- RemoveNode(NodeHolders().at(0), Nodes().at(0));
+ // This relies on each node to have different value.
+ RemoveUnsentNode(GetWebContentCaptureClient()->Data());
GetContentCaptureTask()->SetTaskStopState(
ContentCaptureTask::TaskState::kProcessRetryTask);
RunContentCaptureTask();
@@ -400,7 +397,7 @@ TEST_P(ContentCaptureTest, RemoveNodeInBetweenSendingOut) {
EXPECT_EQ(0u, GetWebContentCaptureClient()->RemovedData().size());
}
-TEST_P(ContentCaptureTest, RemoveNodeAfterSendingOut) {
+TEST_F(ContentCaptureTest, RemoveNodeAfterSendingOut) {
// Captures the content, but didn't send them.
GetContentCaptureTask()->SetTaskStopState(
ContentCaptureTask::TaskState::kProcessCurrentSession);
@@ -422,13 +419,13 @@ TEST_P(ContentCaptureTest, RemoveNodeAfterSendingOut) {
EXPECT_EQ(0u, GetWebContentCaptureClient()->RemovedData().size());
// Remove the node.
- RemoveNode(NodeHolders().at(0), Nodes().at(0));
+ RemoveNode(Nodes().at(0));
RunLongDelayContentCaptureTask();
EXPECT_EQ(0u, GetWebContentCaptureClient()->Data().size());
EXPECT_EQ(1u, GetWebContentCaptureClient()->RemovedData().size());
}
-TEST_P(ContentCaptureTest, TaskHistogramReporter) {
+TEST_F(ContentCaptureTest, TaskHistogramReporter) {
// This performs gc for all DocumentSession, flushes the existing
// SentContentCount and give a clean baseline for histograms.
// We are not sure if it always work, maybe still be the source of flaky.
@@ -443,8 +440,6 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentTime, 0u);
histograms.ExpectTotalCount(
- ContentCaptureTaskHistogramReporter::kCaptureOneContentTime, 0u);
- histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kSendContentTime, 0u);
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime, 0u);
@@ -459,8 +454,6 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentTime, 1u);
histograms.ExpectTotalCount(
- ContentCaptureTaskHistogramReporter::kCaptureOneContentTime, 1u);
- histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kSendContentTime, 0u);
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime, 0u);
@@ -477,8 +470,6 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentTime, 1u);
histograms.ExpectTotalCount(
- ContentCaptureTaskHistogramReporter::kCaptureOneContentTime, 1u);
- histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kSendContentTime, 1u);
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime, 1u);
@@ -494,8 +485,6 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentTime, 1u);
histograms.ExpectTotalCount(
- ContentCaptureTaskHistogramReporter::kCaptureOneContentTime, 1u);
- histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kSendContentTime, 2u);
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime, 1u);
@@ -510,8 +499,6 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentTime, 2u);
histograms.ExpectTotalCount(
- ContentCaptureTaskHistogramReporter::kCaptureOneContentTime, 2u);
- histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kSendContentTime, 3u);
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime, 2u);
@@ -523,8 +510,6 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentTime, 2u);
histograms.ExpectTotalCount(
- ContentCaptureTaskHistogramReporter::kCaptureOneContentTime, 2u);
- histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kSendContentTime, 3u);
histograms.ExpectTotalCount(
ContentCaptureTaskHistogramReporter::kCaptureContentDelayTime, 2u);
@@ -537,13 +522,11 @@ TEST_P(ContentCaptureTest, TaskHistogramReporter) {
// TODO(michaelbai): use RenderingTest instead of PageTestBase for multiple
// frame test.
-class ContentCaptureSimTest
- : public SimTest,
- public ::testing::WithParamInterface<NodeHolder::Type> {
+class ContentCaptureSimTest : public SimTest {
public:
static const char* kEditableContent;
- ContentCaptureSimTest() : client_(GetParam()), child_client_(GetParam()) {}
+ ContentCaptureSimTest() : client_(), child_client_() {}
void SetUp() override {
SimTest::SetUp();
MainFrame().SetContentCaptureClient(&client_);
@@ -571,9 +554,9 @@ class ContentCaptureSimTest
} else if (type == ContentType::kChildFrame) {
SetCapturedContent(child_frame_content_);
} else if (type == ContentType::kAll) {
- std::vector<NodeHolder> holders(main_frame_content_);
- holders.insert(holders.end(), child_frame_content_.begin(),
- child_frame_content_.end());
+ Vector<DOMNodeId> holders(main_frame_content_);
+ holders.AppendRange(child_frame_content_.begin(),
+ child_frame_content_.end());
SetCapturedContent(holders);
}
}
@@ -597,11 +580,11 @@ class ContentCaptureSimTest
DeleteNodeContent(GetDocument(), "editable_id", offset, length);
}
- const std::vector<std::string>& MainFrameExpectedText() const {
+ const Vector<std::string>& MainFrameExpectedText() const {
return main_frame_expected_text_;
}
- const std::vector<std::string>& ChildFrameExpectedText() const {
+ const Vector<std::string>& ChildFrameExpectedText() const {
return child_frame_expected_text_;
}
@@ -654,8 +637,8 @@ class ContentCaptureSimTest
}
void InitMainFrameNodeHolders() {
- std::vector<std::string> ids = {"p1", "p2", "p3", "p4", "p5",
- "p6", "p7", "s8", "editable_id"};
+ Vector<std::string> ids = {"p1", "p2", "p3", "p4", "p5",
+ "p6", "p7", "s8", "editable_id"};
main_frame_expected_text_ = {
"Hello World1", "Hello World2", "Hello World3",
"Hello World4", "Hello World5", "Hello World6",
@@ -665,24 +648,24 @@ class ContentCaptureSimTest
}
void InitChildFrameNodeHolders(const Document& doc) {
- std::vector<std::string> ids = {"c1", "c2"};
+ Vector<std::string> ids = {"c1", "c2"};
child_frame_expected_text_ = {"Hello World11", "Hello World12"};
InitNodeHolders(child_frame_content_, ids, doc);
EXPECT_EQ(2u, child_frame_content_.size());
}
- void InitNodeHolders(std::vector<NodeHolder>& buffer,
- const std::vector<std::string>& ids,
+ void InitNodeHolders(Vector<DOMNodeId>& buffer,
+ const Vector<std::string>& ids,
const Document& document) {
for (auto id : ids) {
LayoutText* layout_text = ToLayoutText(
document.getElementById(id.c_str())->firstChild()->GetLayoutObject());
- EXPECT_TRUE(layout_text->HasNodeHolder());
- buffer.push_back(layout_text->EnsureNodeHolder());
+ EXPECT_TRUE(layout_text->HasNodeId());
+ buffer.push_back(layout_text->EnsureNodeId());
}
}
- void AddNodeToDocument(Document& doc, std::vector<NodeHolder>& buffer) {
+ void AddNodeToDocument(Document& doc, Vector<DOMNodeId>& buffer) {
Node* node = doc.createTextNode("New Text");
Element* element = Element::Create(html_names::kPTag, &doc);
element->appendChild(node);
@@ -690,8 +673,8 @@ class ContentCaptureSimTest
div_element->appendChild(element);
Compositor().BeginFrame();
LayoutText* layout_text = ToLayoutText(node->GetLayoutObject());
- EXPECT_TRUE(layout_text->HasNodeHolder());
- buffer.insert(buffer.begin(), layout_text->EnsureNodeHolder());
+ EXPECT_TRUE(layout_text->HasNodeId());
+ buffer.push_front(layout_text->EnsureNodeId());
}
void InsertNodeContent(Document& doc,
@@ -713,7 +696,7 @@ class ContentCaptureSimTest
Compositor().BeginFrame();
}
- void SetCapturedContent(const std::vector<NodeHolder>& captured_content) {
+ void SetCapturedContent(const Vector<DOMNodeId>& captured_content) {
GetDocument()
.GetFrame()
->LocalFrameRoot()
@@ -722,10 +705,10 @@ class ContentCaptureSimTest
->SetCapturedContentForTesting(captured_content);
}
- std::vector<std::string> main_frame_expected_text_;
- std::vector<std::string> child_frame_expected_text_;
- std::vector<NodeHolder> main_frame_content_;
- std::vector<NodeHolder> child_frame_content_;
+ Vector<std::string> main_frame_expected_text_;
+ Vector<std::string> child_frame_expected_text_;
+ Vector<DOMNodeId> main_frame_content_;
+ Vector<DOMNodeId> child_frame_content_;
WebContentCaptureClientTestHelper client_;
WebContentCaptureClientTestHelper child_client_;
Persistent<Document> child_document_;
@@ -733,12 +716,7 @@ class ContentCaptureSimTest
const char* ContentCaptureSimTest::kEditableContent = "editable";
-INSTANTIATE_TEST_SUITE_P(,
- ContentCaptureSimTest,
- testing::Values(NodeHolder::Type::kID,
- NodeHolder::Type::kTextHolder));
-
-TEST_P(ContentCaptureSimTest, MultiFrame) {
+TEST_F(ContentCaptureSimTest, MultiFrame) {
SetCapturedContent(ContentType::kAll);
RunContentCaptureTaskUntil(ContentCaptureTask::TaskState::kStop);
EXPECT_EQ(4u, Client().Data().size());
@@ -749,7 +727,7 @@ TEST_P(ContentCaptureSimTest, MultiFrame) {
testing::UnorderedElementsAreArray(ChildFrameExpectedText()));
}
-TEST_P(ContentCaptureSimTest, AddNodeToMultiFrame) {
+TEST_F(ContentCaptureSimTest, AddNodeToMultiFrame) {
SetCapturedContent(ContentType::kMainFrame);
// Stops after capturing content.
RunContentCaptureTaskUntil(
@@ -791,7 +769,7 @@ TEST_P(ContentCaptureSimTest, AddNodeToMultiFrame) {
EXPECT_TRUE(ChildClient().FirstData());
}
-TEST_P(ContentCaptureSimTest, ChangeNode) {
+TEST_F(ContentCaptureSimTest, ChangeNode) {
SetCapturedContent(ContentType::kMainFrame);
RunContentCaptureTaskUntil(ContentCaptureTask::TaskState::kStop);
EXPECT_EQ(4u, Client().Data().size());
@@ -799,7 +777,7 @@ TEST_P(ContentCaptureSimTest, ChangeNode) {
EXPECT_TRUE(ChildClient().Data().empty());
EXPECT_THAT(Client().AllText(),
testing::UnorderedElementsAreArray(MainFrameExpectedText()));
- std::vector<std::string> expected_text_update;
+ Vector<std::string> expected_text_update;
std::string insert_text = "content ";
// Changed content to 'content editable'.
@@ -833,7 +811,7 @@ TEST_P(ContentCaptureSimTest, ChangeNode) {
testing::UnorderedElementsAreArray(expected_text_update));
}
-TEST_P(ContentCaptureSimTest, ChangeNodeBeforeCapture) {
+TEST_F(ContentCaptureSimTest, ChangeNodeBeforeCapture) {
// Changed content to 'content editable' before capture.
std::string insert_text = "content ";
InsertMainFrameEditableContent(insert_text, 0);
@@ -860,7 +838,7 @@ TEST_P(ContentCaptureSimTest, ChangeNodeBeforeCapture) {
testing::UnorderedElementsAreArray(MainFrameExpectedText()));
}
-TEST_P(ContentCaptureSimTest, DeleteNodeContent) {
+TEST_F(ContentCaptureSimTest, DeleteNodeContent) {
SetCapturedContent(ContentType::kMainFrame);
RunContentCaptureTaskUntil(ContentCaptureTask::TaskState::kStop);
EXPECT_EQ(4u, Client().Data().size());
@@ -876,7 +854,7 @@ TEST_P(ContentCaptureSimTest, DeleteNodeContent) {
EXPECT_EQ(1u, Client().UpdatedData().size());
EXPECT_FALSE(Client().FirstData());
EXPECT_TRUE(ChildClient().Data().empty());
- std::vector<std::string> expected_text_update;
+ Vector<std::string> expected_text_update;
expected_text_update.push_back("edit");
EXPECT_THAT(Client().UpdatedText(),
testing::UnorderedElementsAreArray(expected_text_update));
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_holder.cc b/chromium/third_party/blink/renderer/core/content_capture/content_holder.cc
deleted file mode 100644
index 6e33164a581..00000000000
--- a/chromium/third_party/blink/renderer/core/content_capture/content_holder.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2019 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.
-
-#include "third_party/blink/renderer/core/content_capture/content_holder.h"
-
-#include "third_party/blink/renderer/core/dom/node.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-
-namespace blink {
-
-ContentHolder::ContentHolder(Node& node) : node_(&node) {}
-
-ContentHolder::~ContentHolder() {}
-
-String ContentHolder::GetValue() const {
- DCHECK(IsValid());
- if (node_)
- return node_->nodeValue();
- return String();
-}
-
-IntRect ContentHolder::GetBoundingBox() const {
- DCHECK(IsValid());
- if (node_ && node_->GetLayoutObject())
- return EnclosingIntRect(node_->GetLayoutObject()->VisualRectInDocument());
- return IntRect();
-}
-
-uint64_t ContentHolder::GetId() const {
- DCHECK(IsValid());
- if (node_)
- return reinterpret_cast<uint64_t>(node_.Get());
- return 0;
-}
-
-} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/content_capture/content_holder.h b/chromium/third_party/blink/renderer/core/content_capture/content_holder.h
deleted file mode 100644
index cc0f33cc963..00000000000
--- a/chromium/third_party/blink/renderer/core/content_capture/content_holder.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2019 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.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CONTENT_CAPTURE_CONTENT_HOLDER_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_CONTENT_CAPTURE_CONTENT_HOLDER_H_
-
-#include "cc/paint/node_holder.h"
-#include "cc/paint/text_holder.h"
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/platform/geometry/int_rect.h"
-#include "third_party/blink/renderer/platform/heap/member.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-
-namespace blink {
-
-using NodeHolder = cc::NodeHolder;
-
-class Node;
-
-class CORE_EXPORT ContentHolder : public cc::TextHolder {
- public:
- ContentHolder(Node& node);
- ~ContentHolder() override;
-
- bool IsValid() const { return node_; }
-
- String GetValue() const;
- IntRect GetBoundingBox() const;
- uint64_t GetId() const;
-
- void SetHasSent() { has_sent_ = true; }
- bool HasSent() const { return has_sent_; }
-
- const Node* GetNode() { return node_; }
-
- void OnNodeDetachedFromLayoutTree() { node_ = nullptr; }
-
- private:
- bool has_sent_ = false;
-
- UntracedMember<const Node> node_;
-};
-
-} // namespace blink
-
-#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CONTENT_CAPTURE_CONTENT_HOLDER_H_
diff --git a/chromium/third_party/blink/renderer/core/content_capture/task_session.cc b/chromium/third_party/blink/renderer/core/content_capture/task_session.cc
index 5b14b14a6c0..ce4ae094187 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/task_session.cc
+++ b/chromium/third_party/blink/renderer/core/content_capture/task_session.cc
@@ -6,7 +6,6 @@
#include <utility>
-#include "third_party/blink/renderer/core/content_capture/content_holder.h"
#include "third_party/blink/renderer/core/content_capture/sent_nodes.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
@@ -23,84 +22,56 @@ TaskSession::DocumentSession::~DocumentSession() {
callback_.value().Run(total_sent_nodes_);
}
-void TaskSession::DocumentSession::AddNodeHolder(cc::NodeHolder node_holder) {
- captured_content_.push_back(node_holder);
+void TaskSession::DocumentSession::AddCapturedNode(Node& node) {
+ captured_content_.insert(WeakMember<Node>(&node));
}
void TaskSession::DocumentSession::AddDetachedNode(int64_t id) {
- detached_nodes_.push_back(id);
+ detached_nodes_.emplace_back(id);
}
-void TaskSession::DocumentSession::AddChangedNodeHolder(
- cc::NodeHolder node_holder) {
- changed_content_.push_back(node_holder);
+void TaskSession::DocumentSession::AddChangedNode(Node& node) {
+ changed_content_.insert(WeakMember<Node>(&node));
}
-std::vector<int64_t> TaskSession::DocumentSession::MoveDetachedNodes() {
+WebVector<int64_t> TaskSession::DocumentSession::MoveDetachedNodes() {
return std::move(detached_nodes_);
}
-scoped_refptr<blink::ContentHolder>
-TaskSession::DocumentSession::GetNextUnsentContentHolder() {
- scoped_refptr<ContentHolder> content_holder;
- while (!captured_content_.empty() && !content_holder) {
- auto node_holder = captured_content_.back();
- if (node_holder.type == cc::NodeHolder::Type::kID) {
- Node* node = DOMNodeIds::NodeForId(node_holder.id);
- if (node && node->GetLayoutObject() && !sent_nodes_->HasSent(*node)) {
- sent_nodes_->OnSent(*node);
- content_holder = base::MakeRefCounted<ContentHolder>(*node);
- }
- } else if (node_holder.type == cc::NodeHolder::Type::kTextHolder &&
- node_holder.text_holder) {
- content_holder = scoped_refptr<ContentHolder>(
- static_cast<ContentHolder*>(node_holder.text_holder.get()));
- if (content_holder && content_holder->IsValid() &&
- !content_holder->HasSent()) {
- content_holder->SetHasSent();
- } else {
- content_holder.reset();
- }
+Node* TaskSession::DocumentSession::GetNextUnsentNode() {
+ while (!captured_content_.IsEmpty()) {
+ Node* node = captured_content_.TakeAny().Get();
+ if (node && node->GetLayoutObject() && !sent_nodes_->HasSent(*node)) {
+ sent_nodes_->OnSent(*node);
+ total_sent_nodes_++;
+ return node;
}
- captured_content_.pop_back();
}
- if (content_holder)
- total_sent_nodes_++;
- return content_holder;
-}
-
-scoped_refptr<blink::ContentHolder>
-TaskSession::DocumentSession::GetNextChangedContentHolder() {
- scoped_refptr<ContentHolder> content_holder;
- while (!changed_content_.empty() && !content_holder) {
- auto node_holder = changed_content_.back();
- if (node_holder.type == cc::NodeHolder::Type::kID) {
- Node* node = DOMNodeIds::NodeForId(node_holder.id);
- if (node && node->GetLayoutObject())
- content_holder = base::MakeRefCounted<ContentHolder>(*node);
- } else if (node_holder.type == cc::NodeHolder::Type::kTextHolder &&
- node_holder.text_holder) {
- content_holder = scoped_refptr<ContentHolder>(
- static_cast<ContentHolder*>(node_holder.text_holder.get()));
- if (content_holder && !content_holder->IsValid())
- content_holder.reset();
+ return nullptr;
+}
+
+Node* TaskSession::DocumentSession::GetNextChangedNode() {
+ while (!changed_content_.IsEmpty()) {
+ Node* node = changed_content_.TakeAny().Get();
+ if (node && node->GetLayoutObject()) {
+ total_sent_nodes_++;
+ return node;
}
- changed_content_.pop_back();
}
- if (content_holder)
- total_sent_nodes_++;
- return content_holder;
+ return nullptr;
}
void TaskSession::DocumentSession::Trace(blink::Visitor* visitor) {
+ visitor->Trace(captured_content_);
visitor->Trace(sent_nodes_);
visitor->Trace(document_);
+ visitor->Trace(changed_content_);
}
void TaskSession::DocumentSession::Reset() {
changed_content_.clear();
captured_content_.clear();
- detached_nodes_.clear();
+ detached_nodes_.Clear();
}
TaskSession::TaskSession(SentNodes& sent_nodes) : sent_nodes_(sent_nodes) {}
@@ -116,78 +87,43 @@ TaskSession::DocumentSession* TaskSession::GetNextUnsentDocumentSession() {
}
void TaskSession::SetCapturedContent(
- const std::vector<cc::NodeHolder>& captured_content) {
+ const Vector<cc::NodeId>& captured_content) {
DCHECK(!HasUnsentData());
- DCHECK(!captured_content.empty());
+ DCHECK(!captured_content.IsEmpty());
GroupCapturedContentByDocument(captured_content);
has_unsent_data_ = true;
}
void TaskSession::GroupCapturedContentByDocument(
- const std::vector<cc::NodeHolder>& captured_content) {
- for (const cc::NodeHolder& node_holder : captured_content) {
- if (const Node* node = GetNode(node_holder)) {
- node = changed_nodes_.Take(node);
- if (node) {
+ const Vector<cc::NodeId>& captured_content) {
+ for (const cc::NodeId& node_id : captured_content) {
+ if (Node* node = DOMNodeIds::NodeForId(node_id)) {
+ if (changed_nodes_.Take(node)) {
// The changed node might not be sent.
- if (GetNodeIf(true, node_holder)) {
- EnsureDocumentSession(node->GetDocument())
- .AddChangedNodeHolder(node_holder);
+ if (sent_nodes_->HasSent(*node)) {
+ EnsureDocumentSession(node->GetDocument()).AddChangedNode(*node);
} else {
- EnsureDocumentSession(node->GetDocument()).AddNodeHolder(node_holder);
+ EnsureDocumentSession(node->GetDocument()).AddCapturedNode(*node);
}
continue;
}
- }
- if (const Node* node = GetNodeIf(false /* sent */, node_holder)) {
- EnsureDocumentSession(node->GetDocument()).AddNodeHolder(node_holder);
+ if (!sent_nodes_->HasSent(*node)) {
+ EnsureDocumentSession(node->GetDocument()).AddCapturedNode(*node);
+ }
}
}
}
-void TaskSession::OnNodeDetached(const cc::NodeHolder& node_holder) {
- if (const Node* node = GetNodeIf(true /* sent */, node_holder)) {
- EnsureDocumentSession(node->GetDocument())
- .AddDetachedNode(reinterpret_cast<int64_t>(node));
+void TaskSession::OnNodeDetached(const Node& node) {
+ if (sent_nodes_->HasSent(node)) {
+ EnsureDocumentSession(node.GetDocument())
+ .AddDetachedNode(reinterpret_cast<int64_t>(&node));
has_unsent_data_ = true;
}
}
-void TaskSession::OnNodeChanged(const cc::NodeHolder& node_holder) {
- if (const Node* node = GetNode(node_holder)) {
- changed_nodes_.insert(WeakMember<const Node>(node));
- }
-}
-
-const Node* TaskSession::GetNodeIf(bool sent,
- const cc::NodeHolder& node_holder) const {
- Node* node = nullptr;
- if (node_holder.type == cc::NodeHolder::Type::kID) {
- node = DOMNodeIds::NodeForId(node_holder.id);
- if (node && (sent_nodes_->HasSent(*node) == sent))
- return node;
- } else if (node_holder.type == cc::NodeHolder::Type::kTextHolder) {
- ContentHolder* content_holder =
- static_cast<ContentHolder*>(node_holder.text_holder.get());
- if (content_holder && content_holder->IsValid() &&
- (content_holder->HasSent() == sent)) {
- return content_holder->GetNode();
- }
- }
- return nullptr;
-}
-
-const Node* TaskSession::GetNode(const cc::NodeHolder& node_holder) const {
- if (node_holder.type == cc::NodeHolder::Type::kID)
- return DOMNodeIds::NodeForId(node_holder.id);
-
- if (node_holder.type == cc::NodeHolder::Type::kTextHolder) {
- ContentHolder* content_holder =
- static_cast<ContentHolder*>(node_holder.text_holder.get());
- if (content_holder)
- return content_holder->GetNode();
- }
- return nullptr;
+void TaskSession::OnNodeChanged(Node& node) {
+ changed_nodes_.insert(WeakMember<Node>(&node));
}
TaskSession::DocumentSession& TaskSession::EnsureDocumentSession(
diff --git a/chromium/third_party/blink/renderer/core/content_capture/task_session.h b/chromium/third_party/blink/renderer/core/content_capture/task_session.h
index b91c1ac3589..e648a52f396 100644
--- a/chromium/third_party/blink/renderer/core/content_capture/task_session.h
+++ b/chromium/third_party/blink/renderer/core/content_capture/task_session.h
@@ -6,19 +6,19 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_CONTENT_CAPTURE_TASK_SESSION_H_
#include <utility>
-#include <vector>
#include "base/callback.h"
#include "base/memory/scoped_refptr.h"
-#include "cc/paint/node_holder.h"
+#include "cc/paint/node_id.h"
+#include "third_party/blink/public/platform/web_vector.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
#include "third_party/blink/renderer/platform/heap/member.h"
#include "third_party/blink/renderer/platform/wtf/hash_map.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
-class ContentHolder;
class Document;
class SentNodes;
@@ -35,7 +35,7 @@ class SentNodes;
// they are saved to the DocumentSession directly.
//
// ContentCaptureTask gets the data per document by using
-// GetUnsentDocumentSession() and GetNextUnsentContentHolder(), and must send
+// GetUnsentDocumentSession() and GetNextUnsentNode(), and must send
// all data out before capturing on-screen content again.
class TaskSession : public GarbageCollectedFinalized<TaskSession> {
public:
@@ -52,26 +52,27 @@ class TaskSession : public GarbageCollectedFinalized<TaskSession> {
SentNodes& sent_nodes,
SentNodeCountCallback& call_back);
~DocumentSession();
- void AddNodeHolder(cc::NodeHolder node_holder);
+ void AddCapturedNode(Node& node);
void AddDetachedNode(int64_t id);
- void AddChangedNodeHolder(cc::NodeHolder node);
+ void AddChangedNode(Node& node);
bool HasUnsentData() const {
return HasUnsentCapturedContent() || HasUnsentChangedContent() ||
HasUnsentDetachedNodes();
}
- bool HasUnsentCapturedContent() const { return !captured_content_.empty(); }
- bool HasUnsentChangedContent() const { return !changed_content_.empty(); }
+ bool HasUnsentCapturedContent() const {
+ return !captured_content_.IsEmpty();
+ }
+ bool HasUnsentChangedContent() const { return !changed_content_.IsEmpty(); }
bool HasUnsentDetachedNodes() const { return !detached_nodes_.empty(); }
- std::vector<int64_t> MoveDetachedNodes();
+ WebVector<int64_t> MoveDetachedNodes();
const Document* GetDocument() const { return document_; }
bool FirstDataHasSent() const { return first_data_has_sent_; }
void SetFirstDataHasSent() { first_data_has_sent_ = true; }
- // Removes the unsent node from |captured_content_|, and returns it as
- // ContentHolder.
- scoped_refptr<ContentHolder> GetNextUnsentContentHolder();
+ // Removes the unsent node from |captured_content_|, and returns it.
+ Node* GetNextUnsentNode();
- scoped_refptr<ContentHolder> GetNextChangedContentHolder();
+ Node* GetNextChangedNode();
// Resets the |captured_content_| and the |detached_nodes_|, shall only be
// used if those data doesn't need to be sent, e.g. there is no
@@ -82,20 +83,20 @@ class TaskSession : public GarbageCollectedFinalized<TaskSession> {
private:
// The captured content that belongs to this document.
- std::vector<cc::NodeHolder> captured_content_;
+ HeapHashSet<WeakMember<Node>> captured_content_;
// The list of content id of node that has been detached from the
// LayoutTree.
- std::vector<int64_t> detached_nodes_;
+ WebVector<int64_t> detached_nodes_;
WeakMember<const Document> document_;
Member<SentNodes> sent_nodes_;
// The list of changed nodes that needs to be sent.
- std::vector<cc::NodeHolder> changed_content_;
+ HeapHashSet<WeakMember<Node>> changed_content_;
bool first_data_has_sent_ = false;
// This is for the metrics to record the total node that has been sent.
size_t total_sent_nodes_ = 0;
// Histogram could be disabed in low time resolution OS, see
- // TimeTicks::IsHighResolution and ContentCaptureTask.
+ // base::TimeTicks::IsHighResolution and ContentCaptureTask.
base::Optional<SentNodeCountCallback> callback_;
};
@@ -106,11 +107,11 @@ class TaskSession : public GarbageCollectedFinalized<TaskSession> {
// This can only be invoked when all data has been sent (i.e. HasUnsentData()
// returns False).
- void SetCapturedContent(const std::vector<cc::NodeHolder>& captured_content);
+ void SetCapturedContent(const Vector<cc::NodeId>& captured_content);
- void OnNodeDetached(const cc::NodeHolder& node_holder);
+ void OnNodeDetached(const Node& node);
- void OnNodeChanged(const cc::NodeHolder& node_holder);
+ void OnNodeChanged(Node& node);
bool HasUnsentData() const { return has_unsent_data_; }
@@ -125,16 +126,14 @@ class TaskSession : public GarbageCollectedFinalized<TaskSession> {
private:
void GroupCapturedContentByDocument(
- const std::vector<cc::NodeHolder>& captured_content);
+ const Vector<cc::NodeId>& captured_content);
DocumentSession& EnsureDocumentSession(const Document& doc);
DocumentSession* GetDocumentSession(const Document& document) const;
- const Node* GetNodeIf(bool sent, const cc::NodeHolder& node_holder) const;
- const Node* GetNode(const cc::NodeHolder& node_holder) const;
Member<SentNodes> sent_nodes_;
// The list of node whose value has changed.
- HeapHashSet<WeakMember<const Node>> changed_nodes_;
+ HeapHashSet<WeakMember<Node>> changed_nodes_;
// This owns the DocumentSession which is released along with Document.
HeapHashMap<WeakMember<const Document>, Member<DocumentSession>>