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

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: Another GYP fix 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
(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/virtual_time_domain.h"
9 #include "components/scheduler/child/scheduler_tqm_delegate.h"
10 #include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h"
11 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
12 #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
13 #include "third_party/WebKit/public/platform/WebFrameScheduler.h"
14 #include "third_party/WebKit/public/web/WebConsoleMessage.h"
15 #include "third_party/WebKit/public/web/WebFrame.h"
16 #include "third_party/WebKit/public/web/WebView.h"
17
18 namespace scheduler {
19
20 WebViewSchedulerImpl::WebViewSchedulerImpl(
21 blink::WebView* web_view,
22 RendererSchedulerImpl* renderer_scheduler,
23 bool disable_background_timer_throttling)
24 : virtual_time_pump_policy_(TaskQueue::PumpPolicy::AUTO),
25 web_view_(web_view),
26 renderer_scheduler_(renderer_scheduler),
27 virtual_time_policy_(VirtualTimePolicy::ADVANCE),
28 page_visible_(true),
29 disable_background_timer_throttling_(disable_background_timer_throttling),
30 allow_virtual_time_to_advance_(true) {
31 renderer_scheduler->AddWebViewScheduler(this);
32 }
33
34 WebViewSchedulerImpl::~WebViewSchedulerImpl() {
35 // TODO(alexclarke): Find out why we can't rely on the web view outliving the
36 // frame.
37 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
38 frame_scheduler->DetachFromWebViewScheduler();
39 }
40 renderer_scheduler_->RemoveWebViewScheduler(this);
41 if (virtual_time_domain_)
42 renderer_scheduler_->UnregisterTimeDomain(virtual_time_domain_.get());
43 }
44
45 void WebViewSchedulerImpl::setPageVisible(bool page_visible) {
46 if (disable_background_timer_throttling_ || page_visible_ == page_visible)
47 return;
48
49 page_visible_ = page_visible;
50
51 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
52 frame_scheduler->setPageVisible(page_visible_);
53 }
54 }
55
56 std::unique_ptr<WebFrameSchedulerImpl>
57 WebViewSchedulerImpl::createWebFrameSchedulerImpl(
58 base::trace_event::BlameContext* blame_context) {
59 std::unique_ptr<WebFrameSchedulerImpl> frame_scheduler(
60 new WebFrameSchedulerImpl(renderer_scheduler_, this, blame_context));
61 frame_scheduler->setPageVisible(page_visible_);
62 frame_schedulers_.insert(frame_scheduler.get());
63 return frame_scheduler;
64 }
65
66 std::unique_ptr<blink::WebFrameScheduler>
67 WebViewSchedulerImpl::createFrameScheduler(blink::BlameContext* blame_context) {
68 return createWebFrameSchedulerImpl(blame_context);
69 }
70
71 void WebViewSchedulerImpl::Unregister(WebFrameSchedulerImpl* frame_scheduler) {
72 DCHECK(frame_schedulers_.find(frame_scheduler) != frame_schedulers_.end());
73 frame_schedulers_.erase(frame_scheduler);
74 }
75
76 void WebViewSchedulerImpl::AddConsoleWarning(const std::string& message) {
77 if (!web_view_ || !web_view_->mainFrame())
78 return;
79 blink::WebConsoleMessage console_message(
80 blink::WebConsoleMessage::LevelWarning,
81 blink::WebString::fromUTF8(message));
82 web_view_->mainFrame()->addMessageToConsole(console_message);
83 }
84
85 void WebViewSchedulerImpl::enableVirtualTime() {
86 // If we've already switched to virtual time then we don't need to do
87 // anything more.
88 if (virtual_time_domain_.get())
89 return;
90
91 virtual_time_domain_.reset(new AutoAdvancingVirtualTimeDomain(
92 renderer_scheduler_->tick_clock()->NowTicks()));
93 renderer_scheduler_->RegisterTimeDomain(virtual_time_domain_.get());
94
95 virtual_time_domain_->SetCanAdvanceVirtualTime(
96 allow_virtual_time_to_advance_);
97
98 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
99 frame_scheduler->OnVirtualTimeDomainChanged();
100 }
101 }
102
103 void WebViewSchedulerImpl::setAllowVirtualTimeToAdvance(
104 bool allow_virtual_time_to_advance) {
105 if (allow_virtual_time_to_advance_ == allow_virtual_time_to_advance)
106 return;
107
108 allow_virtual_time_to_advance_ = allow_virtual_time_to_advance;
109
110 if (virtual_time_domain_) {
111 virtual_time_domain_->SetCanAdvanceVirtualTime(
112 allow_virtual_time_to_advance);
113 }
114 }
115
116 bool WebViewSchedulerImpl::virtualTimeAllowedToAdvance() const {
117 return allow_virtual_time_to_advance_;
118 }
119
120 void WebViewSchedulerImpl::DidStartLoading(unsigned long identifier) {
121 pending_loads_.insert(identifier);
122
123 if (virtual_time_policy_ !=
124 VirtualTimePolicy::PAUSE_IF_NETWORK_FETCHES_PENDING) {
125 return;
126 }
127
128 if (pending_loads_.size() == 1u)
129 setAllowVirtualTimeToAdvance(false);
130 }
131
132 void WebViewSchedulerImpl::DidStopLoading(unsigned long identifier) {
133 pending_loads_.erase(identifier);
134
135 if (virtual_time_policy_ !=
136 VirtualTimePolicy::PAUSE_IF_NETWORK_FETCHES_PENDING) {
137 return;
138 }
139
140 if (pending_loads_.size() == 0)
141 setAllowVirtualTimeToAdvance(true);
142 }
143
144 void WebViewSchedulerImpl::setVirtualTimePolicy(VirtualTimePolicy policy) {
145 virtual_time_policy_ = policy;
146
147 switch (virtual_time_policy_) {
148 case VirtualTimePolicy::ADVANCE:
149 setAllowVirtualTimeToAdvance(true);
150 break;
151
152 case VirtualTimePolicy::PAUSE:
153 setAllowVirtualTimeToAdvance(false);
154 break;
155
156 case VirtualTimePolicy::PAUSE_IF_NETWORK_FETCHES_PENDING:
157 setAllowVirtualTimeToAdvance(pending_loads_.size() == 0);
158 break;
159 }
160 }
161
162 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698