diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/content_capture')
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>> |