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 webView().scheduler()->enableVirtualTime(); |
| 48 |
| 49 ExecuteJavaScript( |
| 50 "var run_order = [];" |
| 51 "function timerFn(delay, value) {" |
| 52 " setTimeout(function() { run_order.push(value); }, delay);" |
| 53 "};" |
| 54 "var one_hour = 60 * 60 * 1000;" |
| 55 "timerFn(one_hour * 100, 'a');" |
| 56 "timerFn(one_hour * 10, 'b');" |
| 57 "timerFn(one_hour, 'c');"); |
| 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 |
| 63 EXPECT_EQ("c, b, a", ExecuteJavaScript("run_order.join(', ')")); |
| 64 } |
| 65 |
| 66 TEST_F(VirtualTimeTest, SetInterval) |
| 67 { |
| 68 webView().scheduler()->enableVirtualTime(); |
| 69 |
| 70 ExecuteJavaScript( |
| 71 "var run_order = [];" |
| 72 "var count = 10;" |
| 73 "var interval_handle = setInterval(function() {" |
| 74 " if (--window.count == 0) {" |
| 75 " clearInterval(interval_handle);" |
| 76 " }" |
| 77 " run_order.push(count);" |
| 78 "}, 1000);" |
| 79 "setTimeout(function() { run_order.push('timer'); }, 1500);"); |
| 80 |
| 81 // If virtual time is not supplied to TimerBase then the setInterval |
| 82 // won't fire 10x. |
| 83 EXPECT_EQ("9, timer, 8, 7, 6, 5, 4, 3, 2, 1, 0", ExecuteJavaScript("run_orde
r.join(', ')")); |
| 84 } |
| 85 |
| 86 TEST_F(VirtualTimeTest, AllowVirtualTimeToAdvance) |
| 87 { |
| 88 webView().scheduler()->enableVirtualTime(); |
| 89 webView().scheduler()->setAllowVirtualTimeToAdvance(false); |
| 90 |
| 91 ExecuteJavaScript( |
| 92 "var run_order = [];" |
| 93 "timerFn = function(delay, value) {" |
| 94 " setTimeout(function() { run_order.push(value); }, delay);" |
| 95 "};" |
| 96 "timerFn(100, 'a');" |
| 97 "timerFn(10, 'b');" |
| 98 "timerFn(1, 'c');"); |
| 99 |
| 100 EXPECT_EQ("", ExecuteJavaScript("run_order.join(', ')")); |
| 101 |
| 102 webView().scheduler()->setAllowVirtualTimeToAdvance(true); |
| 103 testing::runPendingTasks(); |
| 104 |
| 105 EXPECT_EQ("c, b, a", ExecuteJavaScript("run_order.join(', ')")); |
| 106 } |
| 107 |
| 108 } // namespace blink |
OLD | NEW |