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

Side by Side Diff: components/scheduler/renderer/web_frame_scheduler_impl.cc

Issue 2023033003: scheduler: Throttle timers in out-of-view frames (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" 5 #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
6 6
7 #include "base/trace_event/blame_context.h" 7 #include "base/trace_event/blame_context.h"
8 #include "components/scheduler/base/real_time_domain.h" 8 #include "components/scheduler/base/real_time_domain.h"
9 #include "components/scheduler/base/virtual_time_domain.h" 9 #include "components/scheduler/base/virtual_time_domain.h"
10 #include "components/scheduler/child/web_task_runner_impl.h" 10 #include "components/scheduler/child/web_task_runner_impl.h"
11 #include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h" 11 #include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h"
12 #include "components/scheduler/renderer/renderer_scheduler_impl.h" 12 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
13 #include "components/scheduler/renderer/web_view_scheduler_impl.h" 13 #include "components/scheduler/renderer/web_view_scheduler_impl.h"
14 #include "third_party/WebKit/public/platform/BlameContext.h" 14 #include "third_party/WebKit/public/platform/BlameContext.h"
15 #include "third_party/WebKit/public/platform/WebString.h" 15 #include "third_party/WebKit/public/platform/WebString.h"
16 16
17 namespace scheduler { 17 namespace scheduler {
18 18
19 WebFrameSchedulerImpl::WebFrameSchedulerImpl( 19 WebFrameSchedulerImpl::WebFrameSchedulerImpl(
20 RendererSchedulerImpl* renderer_scheduler, 20 RendererSchedulerImpl* renderer_scheduler,
21 WebViewSchedulerImpl* parent_web_view_scheduler, 21 WebViewSchedulerImpl* parent_web_view_scheduler,
22 base::trace_event::BlameContext* blame_context) 22 base::trace_event::BlameContext* blame_context,
23 bool allow_hidden_timer_throttling)
23 : renderer_scheduler_(renderer_scheduler), 24 : renderer_scheduler_(renderer_scheduler),
24 parent_web_view_scheduler_(parent_web_view_scheduler), 25 parent_web_view_scheduler_(parent_web_view_scheduler),
25 blame_context_(blame_context), 26 blame_context_(blame_context),
26 frame_visible_(true), 27 frame_visible_(true),
27 page_visible_(true) {} 28 page_visible_(true),
29 cross_origin_(false),
30 allow_hidden_timer_throttling_(allow_hidden_timer_throttling) {}
28 31
29 WebFrameSchedulerImpl::~WebFrameSchedulerImpl() { 32 WebFrameSchedulerImpl::~WebFrameSchedulerImpl() {
30 if (loading_task_queue_.get()) { 33 if (loading_task_queue_.get()) {
31 loading_task_queue_->UnregisterTaskQueue(); 34 loading_task_queue_->UnregisterTaskQueue();
32 loading_task_queue_->SetBlameContext(nullptr); 35 loading_task_queue_->SetBlameContext(nullptr);
33 } 36 }
34 37
35 if (timer_task_queue_.get()) { 38 if (timer_task_queue_.get()) {
36 timer_task_queue_->UnregisterTaskQueue(); 39 timer_task_queue_->UnregisterTaskQueue();
37 timer_task_queue_->SetBlameContext(nullptr); 40 timer_task_queue_->SetBlameContext(nullptr);
38 } 41 }
39 42
43 if (default_task_queue_.get()) {
44 default_task_queue_->UnregisterTaskQueue();
45 default_task_queue_->SetBlameContext(nullptr);
46 }
47
40 if (parent_web_view_scheduler_) 48 if (parent_web_view_scheduler_)
41 parent_web_view_scheduler_->Unregister(this); 49 parent_web_view_scheduler_->Unregister(this);
42 } 50 }
43 51
44 void WebFrameSchedulerImpl::DetachFromWebViewScheduler() { 52 void WebFrameSchedulerImpl::DetachFromWebViewScheduler() {
45 parent_web_view_scheduler_ = nullptr; 53 parent_web_view_scheduler_ = nullptr;
46 } 54 }
47 55
48 void WebFrameSchedulerImpl::setFrameVisible(bool frame_visible) { 56 void WebFrameSchedulerImpl::setFrameVisible(bool frame_visible) {
57 DCHECK(parent_web_view_scheduler_);
58 if (frame_visible_ == frame_visible)
59 return;
60 bool was_throttled = ShouldThrottleTimers();
49 frame_visible_ = frame_visible; 61 frame_visible_ = frame_visible;
50 // TODO(alexclarke): Do something with this flag. 62 UpdateTimerThrottling(was_throttled);
63 }
64
65 void WebFrameSchedulerImpl::setCrossOrigin(bool cross_origin) {
66 DCHECK(parent_web_view_scheduler_);
67 if (cross_origin_ == cross_origin)
68 return;
69 bool was_throttled = ShouldThrottleTimers();
70 cross_origin_ = cross_origin;
71 UpdateTimerThrottling(was_throttled);
51 } 72 }
52 73
53 blink::WebTaskRunner* WebFrameSchedulerImpl::loadingTaskRunner() { 74 blink::WebTaskRunner* WebFrameSchedulerImpl::loadingTaskRunner() {
54 DCHECK(parent_web_view_scheduler_); 75 DCHECK(parent_web_view_scheduler_);
55 if (!loading_web_task_runner_) { 76 if (!loading_web_task_runner_) {
56 loading_task_queue_ = 77 loading_task_queue_ =
57 renderer_scheduler_->NewLoadingTaskRunner("frame_loading_tq"); 78 renderer_scheduler_->NewLoadingTaskRunner("frame_loading_tq");
58 loading_task_queue_->SetBlameContext(blame_context_); 79 loading_task_queue_->SetBlameContext(blame_context_);
59 if (parent_web_view_scheduler_->virtual_time_domain()) { 80 if (parent_web_view_scheduler_->virtual_time_domain()) {
60 loading_task_queue_->SetTimeDomain( 81 loading_task_queue_->SetTimeDomain(
61 parent_web_view_scheduler_->virtual_time_domain()); 82 parent_web_view_scheduler_->virtual_time_domain());
62 } 83 }
63 loading_web_task_runner_.reset(new WebTaskRunnerImpl(loading_task_queue_)); 84 loading_web_task_runner_.reset(new WebTaskRunnerImpl(loading_task_queue_));
64 } 85 }
65 return loading_web_task_runner_.get(); 86 return loading_web_task_runner_.get();
66 } 87 }
67 88
68 blink::WebTaskRunner* WebFrameSchedulerImpl::timerTaskRunner() { 89 blink::WebTaskRunner* WebFrameSchedulerImpl::timerTaskRunner() {
69 DCHECK(parent_web_view_scheduler_); 90 DCHECK(parent_web_view_scheduler_);
70 if (!timer_web_task_runner_) { 91 if (!timer_web_task_runner_) {
71 timer_task_queue_ = 92 timer_task_queue_ =
72 renderer_scheduler_->NewTimerTaskRunner("frame_timer_tq"); 93 renderer_scheduler_->NewTimerTaskRunner("frame_timer_tq");
73 timer_task_queue_->SetBlameContext(blame_context_); 94 timer_task_queue_->SetBlameContext(blame_context_);
74 if (parent_web_view_scheduler_->virtual_time_domain()) { 95 if (parent_web_view_scheduler_->virtual_time_domain()) {
75 timer_task_queue_->SetTimeDomain( 96 timer_task_queue_->SetTimeDomain(
76 parent_web_view_scheduler_->virtual_time_domain()); 97 parent_web_view_scheduler_->virtual_time_domain());
77 } else if (!page_visible_) { 98 } else if (ShouldThrottleTimers()) {
78 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount( 99 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount(
79 timer_task_queue_.get()); 100 timer_task_queue_.get());
80 } 101 }
81 timer_web_task_runner_.reset(new WebTaskRunnerImpl(timer_task_queue_)); 102 timer_web_task_runner_.reset(new WebTaskRunnerImpl(timer_task_queue_));
82 } 103 }
83 return timer_web_task_runner_.get(); 104 return timer_web_task_runner_.get();
84 } 105 }
85 106
107 blink::WebTaskRunner* WebFrameSchedulerImpl::defaultTaskRunner() {
108 DCHECK(parent_web_view_scheduler_);
109 if (!default_web_task_runner_) {
110 default_task_queue_ =
111 renderer_scheduler_->NewDefaultTaskRunner("frame_default_tq");
112 default_task_queue_->SetBlameContext(blame_context_);
113 if (parent_web_view_scheduler_->virtual_time_domain()) {
114 default_task_queue_->SetTimeDomain(
115 parent_web_view_scheduler_->virtual_time_domain());
116 }
117 default_web_task_runner_.reset(new WebTaskRunnerImpl(default_task_queue_));
118 }
119 return default_web_task_runner_.get();
120 }
121
86 void WebFrameSchedulerImpl::setPageVisible(bool page_visible) { 122 void WebFrameSchedulerImpl::setPageVisible(bool page_visible) {
87 DCHECK(parent_web_view_scheduler_); 123 DCHECK(parent_web_view_scheduler_);
88 if (page_visible_ == page_visible) 124 if (page_visible_ == page_visible)
89 return; 125 return;
90 126 bool was_throttled = ShouldThrottleTimers();
91 page_visible_ = page_visible; 127 page_visible_ = page_visible;
92 128 UpdateTimerThrottling(was_throttled);
93 if (!timer_web_task_runner_ ||
94 parent_web_view_scheduler_->virtual_time_domain()) {
95 return;
96 }
97
98 if (page_visible_) {
99 renderer_scheduler_->throttling_helper()->DecreaseThrottleRefCount(
100 timer_task_queue_.get());
101 } else {
102 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount(
103 timer_task_queue_.get());
104 }
105 } 129 }
106 130
107 void WebFrameSchedulerImpl::OnVirtualTimeDomainChanged() { 131 void WebFrameSchedulerImpl::OnVirtualTimeDomainChanged() {
108 DCHECK(parent_web_view_scheduler_); 132 DCHECK(parent_web_view_scheduler_);
109 DCHECK(parent_web_view_scheduler_->virtual_time_domain()); 133 DCHECK(parent_web_view_scheduler_->virtual_time_domain());
110 134
111 if (timer_task_queue_) { 135 if (timer_task_queue_) {
112 renderer_scheduler_->throttling_helper()->UnregisterTaskQueue( 136 renderer_scheduler_->throttling_helper()->UnregisterTaskQueue(
113 timer_task_queue_.get()); 137 timer_task_queue_.get());
114 timer_task_queue_->SetTimeDomain( 138 timer_task_queue_->SetTimeDomain(
115 parent_web_view_scheduler_->virtual_time_domain()); 139 parent_web_view_scheduler_->virtual_time_domain());
116 } 140 }
117 141
118 if (loading_task_queue_) { 142 if (loading_task_queue_) {
119 loading_task_queue_->SetTimeDomain( 143 loading_task_queue_->SetTimeDomain(
120 parent_web_view_scheduler_->virtual_time_domain()); 144 parent_web_view_scheduler_->virtual_time_domain());
121 } 145 }
122 } 146 }
123 147
148 bool WebFrameSchedulerImpl::ShouldThrottleTimers() const {
149 return !page_visible_ ||
150 (allow_hidden_timer_throttling_ && !frame_visible_ && cross_origin_);
151 }
152
153 void WebFrameSchedulerImpl::UpdateTimerThrottling(bool was_throttled) {
154 bool should_throttle = ShouldThrottleTimers();
155 // Don't throttle frames which are using virtual time.
156 if (was_throttled == should_throttle || !timer_web_task_runner_ ||
157 parent_web_view_scheduler_->virtual_time_domain()) {
158 return;
159 }
160 if (should_throttle) {
161 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount(
162 timer_task_queue_.get());
163 } else {
164 renderer_scheduler_->throttling_helper()->DecreaseThrottleRefCount(
165 timer_task_queue_.get());
166 }
167 }
168
124 } // namespace scheduler 169 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698