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

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

Issue 2118903002: scheduler: Move the Blink scheduler into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 4 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/scheduler/renderer/web_view_scheduler_impl.h"
6
7 #include "base/logging.h"
8 #include "components/scheduler/base/real_time_domain.h"
9 #include "components/scheduler/base/virtual_time_domain.h"
10 #include "components/scheduler/child/scheduler_tqm_delegate.h"
11 #include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h"
12 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
13 #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
14 #include "third_party/WebKit/public/platform/WebFrameScheduler.h"
15 #include "third_party/WebKit/public/web/WebConsoleMessage.h"
16 #include "third_party/WebKit/public/web/WebFrame.h"
17 #include "third_party/WebKit/public/web/WebView.h"
18
19 namespace scheduler {
20
21 WebViewSchedulerImpl::WebViewSchedulerImpl(
22 blink::WebView* web_view,
23 RendererSchedulerImpl* renderer_scheduler,
24 bool disable_background_timer_throttling)
25 : web_view_(web_view),
26 renderer_scheduler_(renderer_scheduler),
27 virtual_time_policy_(VirtualTimePolicy::ADVANCE),
28 background_parser_count_(0),
29 page_visible_(true),
30 disable_background_timer_throttling_(disable_background_timer_throttling),
31 allow_virtual_time_to_advance_(true),
32 have_seen_loading_task_(false),
33 virtual_time_(false) {
34 renderer_scheduler->AddWebViewScheduler(this);
35 }
36
37 WebViewSchedulerImpl::~WebViewSchedulerImpl() {
38 // TODO(alexclarke): Find out why we can't rely on the web view outliving the
39 // frame.
40 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
41 frame_scheduler->DetachFromWebViewScheduler();
42 }
43 renderer_scheduler_->RemoveWebViewScheduler(this);
44 }
45
46 void WebViewSchedulerImpl::setPageVisible(bool page_visible) {
47 if (disable_background_timer_throttling_ || page_visible_ == page_visible)
48 return;
49
50 page_visible_ = page_visible;
51
52 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
53 frame_scheduler->setPageVisible(page_visible_);
54 }
55 }
56
57 std::unique_ptr<WebFrameSchedulerImpl>
58 WebViewSchedulerImpl::createWebFrameSchedulerImpl(
59 base::trace_event::BlameContext* blame_context) {
60 std::unique_ptr<WebFrameSchedulerImpl> frame_scheduler(
61 new WebFrameSchedulerImpl(renderer_scheduler_, this, blame_context));
62 frame_scheduler->setPageVisible(page_visible_);
63 frame_schedulers_.insert(frame_scheduler.get());
64 return frame_scheduler;
65 }
66
67 std::unique_ptr<blink::WebFrameScheduler>
68 WebViewSchedulerImpl::createFrameScheduler(blink::BlameContext* blame_context) {
69 return createWebFrameSchedulerImpl(blame_context);
70 }
71
72 void WebViewSchedulerImpl::Unregister(WebFrameSchedulerImpl* frame_scheduler) {
73 DCHECK(frame_schedulers_.find(frame_scheduler) != frame_schedulers_.end());
74 frame_schedulers_.erase(frame_scheduler);
75 }
76
77 void WebViewSchedulerImpl::AddConsoleWarning(const std::string& message) {
78 if (!web_view_ || !web_view_->mainFrame())
79 return;
80 blink::WebConsoleMessage console_message(
81 blink::WebConsoleMessage::LevelWarning,
82 blink::WebString::fromUTF8(message));
83 web_view_->mainFrame()->addMessageToConsole(console_message);
84 }
85
86 void WebViewSchedulerImpl::enableVirtualTime() {
87 if (virtual_time_)
88 return;
89
90 virtual_time_ = true;
91 renderer_scheduler_->GetVirtualTimeDomain()->SetCanAdvanceVirtualTime(
92 allow_virtual_time_to_advance_);
93
94 renderer_scheduler_->EnableVirtualTime();
95 }
96
97 void WebViewSchedulerImpl::setAllowVirtualTimeToAdvance(
98 bool allow_virtual_time_to_advance) {
99 allow_virtual_time_to_advance_ = allow_virtual_time_to_advance;
100
101 if (!virtual_time_)
102 return;
103
104 renderer_scheduler_->GetVirtualTimeDomain()->SetCanAdvanceVirtualTime(
105 allow_virtual_time_to_advance);
106 }
107
108 bool WebViewSchedulerImpl::virtualTimeAllowedToAdvance() const {
109 return allow_virtual_time_to_advance_;
110 }
111
112 void WebViewSchedulerImpl::DidStartLoading(unsigned long identifier) {
113 pending_loads_.insert(identifier);
114 have_seen_loading_task_ = true;
115 ApplyVirtualTimePolicy();
116 }
117
118 void WebViewSchedulerImpl::DidStopLoading(unsigned long identifier) {
119 pending_loads_.erase(identifier);
120 ApplyVirtualTimePolicy();
121 }
122
123 void WebViewSchedulerImpl::IncrementBackgroundParserCount() {
124 background_parser_count_++;
125 ApplyVirtualTimePolicy();
126 }
127
128 void WebViewSchedulerImpl::DecrementBackgroundParserCount() {
129 background_parser_count_--;
130 DCHECK_GE(background_parser_count_, 0);
131 ApplyVirtualTimePolicy();
132 }
133
134 void WebViewSchedulerImpl::setVirtualTimePolicy(VirtualTimePolicy policy) {
135 virtual_time_policy_ = policy;
136
137 switch (virtual_time_policy_) {
138 case VirtualTimePolicy::ADVANCE:
139 setAllowVirtualTimeToAdvance(true);
140 break;
141
142 case VirtualTimePolicy::PAUSE:
143 setAllowVirtualTimeToAdvance(false);
144 break;
145
146 case VirtualTimePolicy::DETERMINISTIC_LOADING:
147 ApplyVirtualTimePolicy();
148 break;
149 }
150 }
151
152 void WebViewSchedulerImpl::ApplyVirtualTimePolicy() {
153 if (virtual_time_policy_ != VirtualTimePolicy::DETERMINISTIC_LOADING) {
154 return;
155 }
156
157 // We pause virtual time until we've seen a loading task posted, because
158 // otherwise we could advance virtual time arbitarially far before the
159 // first load arrives.
160 setAllowVirtualTimeToAdvance(pending_loads_.size() == 0 &&
161 background_parser_count_ == 0 &&
162 have_seen_loading_task_);
163 }
164
165 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698