Commit 2d63bc08 authored by Keishi Hattori's avatar Keishi Hattori Committed by Commit Bot

Make ContentCaptureTask garbage collected

Bug: 1058341
Change-Id: I6e94a95be6e09d33da4424a9e228b69386e43783
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2087240Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Commit-Queue: Keishi Hattori <keishi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#747128}
parent ec4f1e98
...@@ -30,15 +30,14 @@ void ContentCaptureManager::ScheduleTaskIfNeeded() { ...@@ -30,15 +30,14 @@ void ContentCaptureManager::ScheduleTaskIfNeeded() {
void ContentCaptureManager::ScheduleTask( void ContentCaptureManager::ScheduleTask(
ContentCaptureTask::ScheduleReason reason) { ContentCaptureTask::ScheduleReason reason) {
if (!content_capture_idle_task_.get()) { if (!content_capture_idle_task_) {
content_capture_idle_task_ = CreateContentCaptureTask(); content_capture_idle_task_ = CreateContentCaptureTask();
} }
content_capture_idle_task_->Schedule(reason); content_capture_idle_task_->Schedule(reason);
} }
scoped_refptr<ContentCaptureTask> ContentCaptureTask* ContentCaptureManager::CreateContentCaptureTask() {
ContentCaptureManager::CreateContentCaptureTask() { return MakeGarbageCollected<ContentCaptureTask>(*local_frame_root_,
return base::MakeRefCounted<ContentCaptureTask>(*local_frame_root_,
*task_session_); *task_session_);
} }
...@@ -61,6 +60,7 @@ void ContentCaptureManager::OnNodeTextChanged(Node& node) { ...@@ -61,6 +60,7 @@ void ContentCaptureManager::OnNodeTextChanged(Node& node) {
} }
void ContentCaptureManager::Trace(Visitor* visitor) { void ContentCaptureManager::Trace(Visitor* visitor) {
visitor->Trace(content_capture_idle_task_);
visitor->Trace(local_frame_root_); visitor->Trace(local_frame_root_);
visitor->Trace(task_session_); visitor->Trace(task_session_);
visitor->Trace(sent_nodes_); visitor->Trace(sent_nodes_);
...@@ -69,7 +69,7 @@ void ContentCaptureManager::Trace(Visitor* visitor) { ...@@ -69,7 +69,7 @@ void ContentCaptureManager::Trace(Visitor* visitor) {
void ContentCaptureManager::Shutdown() { void ContentCaptureManager::Shutdown() {
if (content_capture_idle_task_) { if (content_capture_idle_task_) {
content_capture_idle_task_->Shutdown(); content_capture_idle_task_->Shutdown();
content_capture_idle_task_.reset(); content_capture_idle_task_ = nullptr;
} }
} }
......
...@@ -42,18 +42,18 @@ class CORE_EXPORT ContentCaptureManager ...@@ -42,18 +42,18 @@ class CORE_EXPORT ContentCaptureManager
virtual void Trace(Visitor*); virtual void Trace(Visitor*);
ContentCaptureTask* GetContentCaptureTaskForTesting() const { ContentCaptureTask* GetContentCaptureTaskForTesting() const {
return content_capture_idle_task_.get(); return content_capture_idle_task_;
} }
protected: protected:
virtual scoped_refptr<ContentCaptureTask> CreateContentCaptureTask(); virtual ContentCaptureTask* CreateContentCaptureTask();
TaskSession& GetTaskSessionForTesting() const { return *task_session_; } TaskSession& GetTaskSessionForTesting() const { return *task_session_; }
private: private:
void NotifyNodeDetached(const Node& node); void NotifyNodeDetached(const Node& node);
void ScheduleTask(ContentCaptureTask::ScheduleReason reason); void ScheduleTask(ContentCaptureTask::ScheduleReason reason);
scoped_refptr<ContentCaptureTask> content_capture_idle_task_; Member<ContentCaptureTask> content_capture_idle_task_;
Member<LocalFrame> local_frame_root_; Member<LocalFrame> local_frame_root_;
......
...@@ -268,4 +268,9 @@ void ContentCaptureTask::CancelTaskForTesting() { ...@@ -268,4 +268,9 @@ void ContentCaptureTask::CancelTaskForTesting() {
delay_task_->Stop(); delay_task_->Stop();
} }
void ContentCaptureTask::Trace(Visitor* visitor) {
visitor->Trace(local_frame_root_);
visitor->Trace(task_session_);
}
} // namespace blink } // namespace blink
...@@ -24,9 +24,8 @@ class LocalFrame; ...@@ -24,9 +24,8 @@ class LocalFrame;
// This class is used to capture the on-screen content and send them out // This class is used to capture the on-screen content and send them out
// through WebContentCaptureClient. // through WebContentCaptureClient.
class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> { class CORE_EXPORT ContentCaptureTask
USING_FAST_MALLOC(ContentCaptureTask); : public GarbageCollected<ContentCaptureTask> {
public: public:
enum class ScheduleReason { enum class ScheduleReason {
kFirstContentChange, kFirstContentChange,
...@@ -69,6 +68,8 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> { ...@@ -69,6 +68,8 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> {
base::TimeDelta GetTaskNextFireIntervalForTesting() const; base::TimeDelta GetTaskNextFireIntervalForTesting() const;
void CancelTaskForTesting(); void CancelTaskForTesting();
void Trace(Visitor*);
protected: protected:
// All protected data and methods are for testing purpose. // All protected data and methods are for testing purpose.
// Return true if the task should pause. // Return true if the task should pause.
...@@ -103,8 +104,8 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> { ...@@ -103,8 +104,8 @@ class CORE_EXPORT ContentCaptureTask : public RefCounted<ContentCaptureTask> {
// Indicates if there is content change since last run. // Indicates if there is content change since last run.
bool has_content_change_ = false; bool has_content_change_ = false;
UntracedMember<LocalFrame> local_frame_root_; Member<LocalFrame> local_frame_root_;
UntracedMember<TaskSession> task_session_; Member<TaskSession> task_session_;
std::unique_ptr<TaskRunnerTimer<ContentCaptureTask>> delay_task_; std::unique_ptr<TaskRunnerTimer<ContentCaptureTask>> delay_task_;
TaskState task_state_ = TaskState::kStop; TaskState task_state_ = TaskState::kStop;
......
...@@ -120,21 +120,26 @@ class ContentCaptureManagerTestHelper : public ContentCaptureManager { ...@@ -120,21 +120,26 @@ class ContentCaptureManagerTestHelper : public ContentCaptureManager {
LocalFrame& local_frame_root, LocalFrame& local_frame_root,
WebContentCaptureClientTestHelper& content_capture_client) WebContentCaptureClientTestHelper& content_capture_client)
: ContentCaptureManager(local_frame_root) { : ContentCaptureManager(local_frame_root) {
content_capture_task_ = base::MakeRefCounted<ContentCaptureTaskTestHelper>( content_capture_task_ = MakeGarbageCollected<ContentCaptureTaskTestHelper>(
local_frame_root, GetTaskSessionForTesting(), content_capture_client); local_frame_root, GetTaskSessionForTesting(), content_capture_client);
} }
scoped_refptr<ContentCaptureTaskTestHelper> GetContentCaptureTask() { ContentCaptureTaskTestHelper* GetContentCaptureTask() {
return content_capture_task_; return content_capture_task_;
} }
void Trace(Visitor* visitor) override {
visitor->Trace(content_capture_task_);
ContentCaptureManager::Trace(visitor);
}
protected: protected:
scoped_refptr<ContentCaptureTask> CreateContentCaptureTask() override { ContentCaptureTask* CreateContentCaptureTask() override {
return content_capture_task_; return content_capture_task_;
} }
private: private:
scoped_refptr<ContentCaptureTaskTestHelper> content_capture_task_; Member<ContentCaptureTaskTestHelper> content_capture_task_;
}; };
class ContentCaptureLocalFrameClientHelper : public EmptyLocalFrameClient { class ContentCaptureLocalFrameClientHelper : public EmptyLocalFrameClient {
...@@ -208,7 +213,7 @@ class ContentCaptureTest : public PageTestBase { ...@@ -208,7 +213,7 @@ class ContentCaptureTest : public PageTestBase {
return content_capture_client_.get(); return content_capture_client_.get();
} }
scoped_refptr<ContentCaptureTaskTestHelper> GetContentCaptureTask() const { ContentCaptureTaskTestHelper* GetContentCaptureTask() const {
return GetContentCaptureManager()->GetContentCaptureTask(); return GetContentCaptureManager()->GetContentCaptureTask();
} }
...@@ -526,7 +531,7 @@ TEST_F(ContentCaptureTest, TaskHistogramReporter) { ...@@ -526,7 +531,7 @@ TEST_F(ContentCaptureTest, TaskHistogramReporter) {
TEST_F(ContentCaptureTest, RescheduleTask) { TEST_F(ContentCaptureTest, RescheduleTask) {
// This test assumes test runs much faster than task's long delay which is 5s. // This test assumes test runs much faster than task's long delay which is 5s.
scoped_refptr<ContentCaptureTaskTestHelper> task = GetContentCaptureTask(); Persistent<ContentCaptureTaskTestHelper> task = GetContentCaptureTask();
task->CancelTaskForTesting(); task->CancelTaskForTesting();
EXPECT_TRUE(task->GetTaskNextFireIntervalForTesting().is_zero()); EXPECT_TRUE(task->GetTaskNextFireIntervalForTesting().is_zero());
task->Schedule(ContentCaptureTask::ScheduleReason::kContentChange); task->Schedule(ContentCaptureTask::ScheduleReason::kContentChange);
...@@ -543,7 +548,7 @@ TEST_F(ContentCaptureTest, RescheduleTask) { ...@@ -543,7 +548,7 @@ TEST_F(ContentCaptureTest, RescheduleTask) {
TEST_F(ContentCaptureTest, NotRescheduleTask) { TEST_F(ContentCaptureTest, NotRescheduleTask) {
// This test assumes test runs much faster than task's long delay which is 5s. // This test assumes test runs much faster than task's long delay which is 5s.
scoped_refptr<ContentCaptureTaskTestHelper> task = GetContentCaptureTask(); Persistent<ContentCaptureTaskTestHelper> task = GetContentCaptureTask();
task->CancelTaskForTesting(); task->CancelTaskForTesting();
EXPECT_TRUE(task->GetTaskNextFireIntervalForTesting().is_zero()); EXPECT_TRUE(task->GetTaskNextFireIntervalForTesting().is_zero());
task->Schedule(ContentCaptureTask::ScheduleReason::kContentChange); task->Schedule(ContentCaptureTask::ScheduleReason::kContentChange);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment