OLD | NEW |
| (Empty) |
1 // Copyright 2016 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 "platform/testing/UnitTestHelpers.h" | |
6 #include "public/platform/Platform.h" | |
7 #include "public/platform/WebViewScheduler.h" | |
8 #include "public/web/WebLocalFrame.h" | |
9 #include "public/web/WebScriptExecutionCallback.h" | |
10 #include "public/web/WebScriptSource.h" | |
11 #include "public/web/WebView.h" | |
12 #include "web/tests/sim/SimTest.h" | |
13 | |
14 namespace blink { | |
15 | |
16 namespace { | |
17 class ScriptExecutionCallbackHelper : public WebScriptExecutionCallback { | |
18 public: | |
19 const String result() const { return m_result; } | |
20 | |
21 private: | |
22 void completed(const WebVector<v8::Local<v8::Value>>& values) override | |
23 { | |
24 if (!values.isEmpty() && !values[0].IsEmpty() && values[0]->IsString())
{ | |
25 m_result = toCoreString(v8::Local<v8::String>::Cast(values[0])); | |
26 } | |
27 } | |
28 | |
29 String m_result; | |
30 }; | |
31 } // namespace | |
32 | |
33 class VirtualTimeTest : public SimTest { | |
34 protected: | |
35 String ExecuteJavaScript(String scriptSource) | |
36 { | |
37 ScriptExecutionCallbackHelper callbackHelper; | |
38 webView().mainFrame()->toWebLocalFrame()->requestExecuteScriptAndReturnV
alue( | |
39 WebScriptSource(WebString(scriptSource)), false, &callbackHelper); | |
40 testing::runPendingTasks(); | |
41 return callbackHelper.result(); | |
42 } | |
43 }; | |
44 | |
45 TEST_F(VirtualTimeTest, DOMTimersFireInExpectedOrder) | |
46 { | |
47 ExecuteJavaScript( | |
48 "var run_order = [];" | |
49 "function timerFn(delay, value) {" | |
50 " setTimeout(function() { run_order.push(value); }, delay);" | |
51 "};" | |
52 "var one_hour = 60 * 60 * 1000;" | |
53 "timerFn(one_hour * 100, 'a');" | |
54 "timerFn(one_hour * 10, 'b');" | |
55 "timerFn(one_hour, 'c');"); | |
56 | |
57 webView().scheduler()->enableVirtualTime(); | |
58 | |
59 // Normally the JS runs pretty much instantly but the timer callbacks will | |
60 // take 100h to fire, but thanks to timer fast forwarding we can make them | |
61 // fire immediatly. | |
62 testing::runPendingTasks(); | |
63 | |
64 EXPECT_EQ("c, b, a", ExecuteJavaScript("run_order.join(', ')")); | |
65 } | |
66 | |
67 TEST_F(VirtualTimeTest, SetInterval) | |
68 { | |
69 ExecuteJavaScript( | |
70 "var run_order = [];" | |
71 "var count = 10;" | |
72 "var interval_handle = setInterval(function() {" | |
73 " if (--window.count == 0) {" | |
74 " clearInterval(interval_handle);" | |
75 " }" | |
76 " run_order.push(count);" | |
77 "}, 1000);" | |
78 "setTimeout(function() { run_order.push('timer'); }, 1500);"); | |
79 | |
80 webView().scheduler()->enableVirtualTime(); | |
81 testing::runPendingTasks(); | |
82 | |
83 // If virtual time is not supplied to TimerBase then the setInterval | |
84 // won't fire 10x. | |
85 EXPECT_EQ("9, timer, 8, 7, 6, 5, 4, 3, 2, 1, 0", ExecuteJavaScript("run_orde
r.join(', ')")); | |
86 } | |
87 | |
88 TEST_F(VirtualTimeTest, AllowVirtualTimeToAdvance) | |
89 { | |
90 ExecuteJavaScript( | |
91 "var run_order = [];" | |
92 "timerFn = function(delay, value) {" | |
93 " setTimeout(function() { run_order.push(value); }, delay);" | |
94 "};" | |
95 "timerFn(100, 'a');" | |
96 "timerFn(10, 'b');" | |
97 "timerFn(1, 'c');"); | |
98 | |
99 webView().scheduler()->enableVirtualTime(); | |
100 webView().scheduler()->setAllowVirtualTimeToAdvance(false); | |
101 testing::runPendingTasks(); | |
102 | |
103 EXPECT_EQ("", ExecuteJavaScript("run_order.join(', ')")); | |
104 | |
105 webView().scheduler()->setAllowVirtualTimeToAdvance(true); | |
106 testing::runPendingTasks(); | |
107 | |
108 EXPECT_EQ("c, b, a", ExecuteJavaScript("run_order.join(', ')")); | |
109 } | |
110 | |
111 } // namespace blink | |
OLD | NEW |