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

Side by Side Diff: third_party/WebKit/Source/platform/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: Rebased Created 4 years, 3 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 "platform/scheduler/renderer/web_frame_scheduler_impl.h" 5 #include "platform/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 "platform/scheduler/base/real_time_domain.h" 8 #include "platform/scheduler/base/real_time_domain.h"
9 #include "platform/scheduler/base/virtual_time_domain.h" 9 #include "platform/scheduler/base/virtual_time_domain.h"
10 #include "platform/scheduler/child/web_task_runner_impl.h" 10 #include "platform/scheduler/child/web_task_runner_impl.h"
11 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h" 11 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h"
12 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" 12 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
13 #include "platform/scheduler/renderer/web_view_scheduler_impl.h" 13 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
14 #include "platform/RuntimeEnabledFeatures.h"
14 #include "public/platform/BlameContext.h" 15 #include "public/platform/BlameContext.h"
15 #include "public/platform/WebString.h" 16 #include "public/platform/WebString.h"
16 17
17 namespace blink { 18 namespace blink {
18 namespace scheduler { 19 namespace scheduler {
19 20
20 WebFrameSchedulerImpl::WebFrameSchedulerImpl( 21 WebFrameSchedulerImpl::WebFrameSchedulerImpl(
21 RendererSchedulerImpl* renderer_scheduler, 22 RendererSchedulerImpl* renderer_scheduler,
22 WebViewSchedulerImpl* parent_web_view_scheduler, 23 WebViewSchedulerImpl* parent_web_view_scheduler,
23 base::trace_event::BlameContext* blame_context) 24 base::trace_event::BlameContext* blame_context)
24 : renderer_scheduler_(renderer_scheduler), 25 : renderer_scheduler_(renderer_scheduler),
25 parent_web_view_scheduler_(parent_web_view_scheduler), 26 parent_web_view_scheduler_(parent_web_view_scheduler),
26 blame_context_(blame_context), 27 blame_context_(blame_context),
27 frame_visible_(true), 28 frame_visible_(true),
28 page_visible_(true) {} 29 page_visible_(true),
30 cross_origin_(false) {}
29 31
30 WebFrameSchedulerImpl::~WebFrameSchedulerImpl() { 32 WebFrameSchedulerImpl::~WebFrameSchedulerImpl() {
31 if (loading_task_queue_) { 33 if (loading_task_queue_) {
32 loading_task_queue_->UnregisterTaskQueue(); 34 loading_task_queue_->UnregisterTaskQueue();
33 loading_task_queue_->SetBlameContext(nullptr); 35 loading_task_queue_->SetBlameContext(nullptr);
34 } 36 }
35 37
36 if (timer_task_queue_) { 38 if (timer_task_queue_) {
37 timer_task_queue_->UnregisterTaskQueue(); 39 timer_task_queue_->UnregisterTaskQueue();
38 timer_task_queue_->SetBlameContext(nullptr); 40 timer_task_queue_->SetBlameContext(nullptr);
39 } 41 }
40 42
41 if (unthrottled_task_queue_) { 43 if (unthrottled_task_queue_) {
42 unthrottled_task_queue_->UnregisterTaskQueue(); 44 unthrottled_task_queue_->UnregisterTaskQueue();
43 unthrottled_task_queue_->SetBlameContext(nullptr); 45 unthrottled_task_queue_->SetBlameContext(nullptr);
44 } 46 }
45 47
46 if (parent_web_view_scheduler_) 48 if (parent_web_view_scheduler_)
47 parent_web_view_scheduler_->Unregister(this); 49 parent_web_view_scheduler_->Unregister(this);
48 } 50 }
49 51
50 void WebFrameSchedulerImpl::DetachFromWebViewScheduler() { 52 void WebFrameSchedulerImpl::DetachFromWebViewScheduler() {
51 parent_web_view_scheduler_ = nullptr; 53 parent_web_view_scheduler_ = nullptr;
52 } 54 }
53 55
54 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();
55 frame_visible_ = frame_visible; 61 frame_visible_ = frame_visible;
56 // 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);
57 } 72 }
58 73
59 blink::WebTaskRunner* WebFrameSchedulerImpl::loadingTaskRunner() { 74 blink::WebTaskRunner* WebFrameSchedulerImpl::loadingTaskRunner() {
60 DCHECK(parent_web_view_scheduler_); 75 DCHECK(parent_web_view_scheduler_);
61 if (!loading_web_task_runner_) { 76 if (!loading_web_task_runner_) {
62 loading_task_queue_ = 77 loading_task_queue_ =
63 renderer_scheduler_->NewLoadingTaskRunner("frame_loading_tq"); 78 renderer_scheduler_->NewLoadingTaskRunner("frame_loading_tq");
64 loading_task_queue_->SetBlameContext(blame_context_); 79 loading_task_queue_->SetBlameContext(blame_context_);
65 loading_web_task_runner_.reset(new WebTaskRunnerImpl(loading_task_queue_)); 80 loading_web_task_runner_.reset(new WebTaskRunnerImpl(loading_task_queue_));
66 } 81 }
67 return loading_web_task_runner_.get(); 82 return loading_web_task_runner_.get();
68 } 83 }
69 84
70 blink::WebTaskRunner* WebFrameSchedulerImpl::timerTaskRunner() { 85 blink::WebTaskRunner* WebFrameSchedulerImpl::timerTaskRunner() {
71 DCHECK(parent_web_view_scheduler_); 86 DCHECK(parent_web_view_scheduler_);
72 if (!timer_web_task_runner_) { 87 if (!timer_web_task_runner_) {
73 timer_task_queue_ = 88 timer_task_queue_ =
74 renderer_scheduler_->NewTimerTaskRunner("frame_timer_tq"); 89 renderer_scheduler_->NewTimerTaskRunner("frame_timer_tq");
75 timer_task_queue_->SetBlameContext(blame_context_); 90 timer_task_queue_->SetBlameContext(blame_context_);
76 if (!page_visible_) { 91 if (ShouldThrottleTimers()) {
77 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount( 92 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount(
78 timer_task_queue_.get()); 93 timer_task_queue_.get());
79 } 94 }
80 timer_web_task_runner_.reset(new WebTaskRunnerImpl(timer_task_queue_)); 95 timer_web_task_runner_.reset(new WebTaskRunnerImpl(timer_task_queue_));
81 } 96 }
82 return timer_web_task_runner_.get(); 97 return timer_web_task_runner_.get();
83 } 98 }
84 99
85 blink::WebTaskRunner* WebFrameSchedulerImpl::unthrottledTaskRunner() { 100 blink::WebTaskRunner* WebFrameSchedulerImpl::unthrottledTaskRunner() {
86 DCHECK(parent_web_view_scheduler_); 101 DCHECK(parent_web_view_scheduler_);
(...skipping 26 matching lines...) Expand all
113 if (background_parser_active) 128 if (background_parser_active)
114 parent_web_view_scheduler_->IncrementBackgroundParserCount(); 129 parent_web_view_scheduler_->IncrementBackgroundParserCount();
115 else 130 else
116 parent_web_view_scheduler_->DecrementBackgroundParserCount(); 131 parent_web_view_scheduler_->DecrementBackgroundParserCount();
117 } 132 }
118 133
119 void WebFrameSchedulerImpl::setPageVisible(bool page_visible) { 134 void WebFrameSchedulerImpl::setPageVisible(bool page_visible) {
120 DCHECK(parent_web_view_scheduler_); 135 DCHECK(parent_web_view_scheduler_);
121 if (page_visible_ == page_visible) 136 if (page_visible_ == page_visible)
122 return; 137 return;
138 bool was_throttled = ShouldThrottleTimers();
139 page_visible_ = page_visible;
140 UpdateTimerThrottling(was_throttled);
141 }
123 142
124 page_visible_ = page_visible; 143 bool WebFrameSchedulerImpl::ShouldThrottleTimers() const {
144 if (!page_visible_)
145 return true;
146 return RuntimeEnabledFeatures::timerThrottlingForHiddenFramesEnabled() &&
147 !frame_visible_ && cross_origin_;
148 }
125 149
126 if (!timer_web_task_runner_) 150 void WebFrameSchedulerImpl::UpdateTimerThrottling(bool was_throttled) {
151 bool should_throttle = ShouldThrottleTimers();
152 if (was_throttled == should_throttle || !timer_web_task_runner_)
127 return; 153 return;
128 154 if (should_throttle) {
129 if (page_visible_) { 155 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount(
130 renderer_scheduler_->throttling_helper()->DecreaseThrottleRefCount(
131 timer_task_queue_.get()); 156 timer_task_queue_.get());
132 } else { 157 } else {
133 renderer_scheduler_->throttling_helper()->IncreaseThrottleRefCount( 158 renderer_scheduler_->throttling_helper()->DecreaseThrottleRefCount(
134 timer_task_queue_.get()); 159 timer_task_queue_.get());
135 } 160 }
136 } 161 }
137 162
138 } // namespace scheduler 163 } // namespace scheduler
139 } // namespace blink 164 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698