OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/shell/test_runner/test_runner.h" | 5 #include "content/shell/test_runner/test_runner.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <limits> | 8 #include <limits> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
92 } | 92 } |
93 | 93 |
94 } // namespace | 94 } // namespace |
95 | 95 |
96 class TestRunnerBindings : public gin::Wrappable<TestRunnerBindings> { | 96 class TestRunnerBindings : public gin::Wrappable<TestRunnerBindings> { |
97 public: | 97 public: |
98 static gin::WrapperInfo kWrapperInfo; | 98 static gin::WrapperInfo kWrapperInfo; |
99 | 99 |
100 static void Install(base::WeakPtr<TestRunner> test_runner, | 100 static void Install(base::WeakPtr<TestRunner> test_runner, |
101 base::WeakPtr<TestRunnerForSpecificView> view_test_runner, | 101 base::WeakPtr<TestRunnerForSpecificView> view_test_runner, |
102 WebLocalFrame* frame); | 102 WebLocalFrame* frame, |
103 bool is_web_platform_tests_mode); | |
103 | 104 |
104 private: | 105 private: |
105 explicit TestRunnerBindings( | 106 explicit TestRunnerBindings( |
106 base::WeakPtr<TestRunner> test_runner, | 107 base::WeakPtr<TestRunner> test_runner, |
107 base::WeakPtr<TestRunnerForSpecificView> view_test_runner); | 108 base::WeakPtr<TestRunnerForSpecificView> view_test_runner); |
108 ~TestRunnerBindings() override; | 109 ~TestRunnerBindings() override; |
109 | 110 |
110 // gin::Wrappable: | 111 // gin::Wrappable: |
111 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( | 112 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( |
112 v8::Isolate* isolate) override; | 113 v8::Isolate* isolate) override; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
297 | 298 |
298 DISALLOW_COPY_AND_ASSIGN(TestRunnerBindings); | 299 DISALLOW_COPY_AND_ASSIGN(TestRunnerBindings); |
299 }; | 300 }; |
300 | 301 |
301 gin::WrapperInfo TestRunnerBindings::kWrapperInfo = {gin::kEmbedderNativeGin}; | 302 gin::WrapperInfo TestRunnerBindings::kWrapperInfo = {gin::kEmbedderNativeGin}; |
302 | 303 |
303 // static | 304 // static |
304 void TestRunnerBindings::Install( | 305 void TestRunnerBindings::Install( |
305 base::WeakPtr<TestRunner> test_runner, | 306 base::WeakPtr<TestRunner> test_runner, |
306 base::WeakPtr<TestRunnerForSpecificView> view_test_runner, | 307 base::WeakPtr<TestRunnerForSpecificView> view_test_runner, |
307 WebLocalFrame* frame) { | 308 WebLocalFrame* frame, |
309 bool is_web_platform_tests_mode) { | |
308 v8::Isolate* isolate = blink::mainThreadIsolate(); | 310 v8::Isolate* isolate = blink::mainThreadIsolate(); |
309 v8::HandleScope handle_scope(isolate); | 311 v8::HandleScope handle_scope(isolate); |
310 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); | 312 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); |
311 if (context.IsEmpty()) | 313 if (context.IsEmpty()) |
312 return; | 314 return; |
313 | 315 |
314 v8::Context::Scope context_scope(context); | 316 v8::Context::Scope context_scope(context); |
315 | 317 |
316 TestRunnerBindings* wrapped = | 318 TestRunnerBindings* wrapped = |
317 new TestRunnerBindings(test_runner, view_test_runner); | 319 new TestRunnerBindings(test_runner, view_test_runner); |
318 gin::Handle<TestRunnerBindings> bindings = | 320 gin::Handle<TestRunnerBindings> bindings = |
319 gin::CreateHandle(isolate, wrapped); | 321 gin::CreateHandle(isolate, wrapped); |
320 if (bindings.IsEmpty()) | 322 if (bindings.IsEmpty()) |
321 return; | 323 return; |
322 v8::Local<v8::Object> global = context->Global(); | 324 v8::Local<v8::Object> global = context->Global(); |
323 v8::Local<v8::Value> v8_bindings = bindings.ToV8(); | 325 v8::Local<v8::Value> v8_bindings = bindings.ToV8(); |
324 | 326 |
325 std::vector<std::string> names; | 327 std::vector<std::string> names; |
326 names.push_back("testRunner"); | 328 names.push_back("testRunner"); |
327 names.push_back("layoutTestController"); | 329 names.push_back("layoutTestController"); |
328 for (size_t i = 0; i < names.size(); ++i) | 330 for (size_t i = 0; i < names.size(); ++i) |
329 global->Set(gin::StringToV8(isolate, names[i].c_str()), v8_bindings); | 331 global->Set(gin::StringToV8(isolate, names[i].c_str()), v8_bindings); |
332 | |
333 // The web-platform-tests suite require that reference comparison is delayed | |
334 // for any test with a 'reftest-wait' class on the root element, until that | |
335 // class attribute is removed. To support this approach, we inject some | |
336 // javascript that implements the same behavior using TestRunner. | |
qyearsley
2017/03/06 16:51:42
Nit: Some people write javascript as JavaScript.
smcgruer
2017/03/06 17:35:45
Done.
| |
337 // | |
338 // See http://web-platform-tests.org/writing-tests/reftests.html for more | |
339 // details on web-platform-tests expectations on reference tests. | |
qyearsley
2017/03/06 16:51:42
Possible rephrasing: "...details about reference t
smcgruer
2017/03/06 17:35:45
Done.
| |
340 if (is_web_platform_tests_mode) { | |
341 frame->executeScript(blink::WebString( | |
342 R"(window.addEventListener('load', function() { | |
343 if (!window.testRunner) { | |
344 return; | |
345 } | |
346 const target = document.documentElement; | |
347 if (target.classList.contains('reftest-wait')) { | |
348 window.testRunner.waitUntilDone(); | |
349 const observer = new MutationObserver(function(mutations) { | |
350 mutations.forEach(function(mutation) { | |
351 if (!target.classList.contains('reftest-wait')) { | |
352 window.testRunner.notifyDone(); | |
353 } | |
354 }); | |
355 }); | |
356 const config = { attributes: true }; | |
qyearsley
2017/03/06 16:51:42
Style nit: No need for spaces after "{" or before
smcgruer
2017/03/06 17:35:45
Done.
| |
357 observer.observe(target, config); | |
358 } | |
359 });)")); | |
360 } | |
330 } | 361 } |
331 | 362 |
332 TestRunnerBindings::TestRunnerBindings( | 363 TestRunnerBindings::TestRunnerBindings( |
333 base::WeakPtr<TestRunner> runner, | 364 base::WeakPtr<TestRunner> runner, |
334 base::WeakPtr<TestRunnerForSpecificView> view_runner) | 365 base::WeakPtr<TestRunnerForSpecificView> view_runner) |
335 : runner_(runner), view_runner_(view_runner) {} | 366 : runner_(runner), view_runner_(view_runner) {} |
336 | 367 |
337 TestRunnerBindings::~TestRunnerBindings() {} | 368 TestRunnerBindings::~TestRunnerBindings() {} |
338 | 369 |
339 gin::ObjectTemplateBuilder TestRunnerBindings::GetObjectTemplateBuilder( | 370 gin::ObjectTemplateBuilder TestRunnerBindings::GetObjectTemplateBuilder( |
(...skipping 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1619 effective_connection_type_( | 1650 effective_connection_type_( |
1620 blink::WebEffectiveConnectionType::TypeUnknown), | 1651 blink::WebEffectiveConnectionType::TypeUnknown), |
1621 weak_factory_(this) {} | 1652 weak_factory_(this) {} |
1622 | 1653 |
1623 TestRunner::~TestRunner() {} | 1654 TestRunner::~TestRunner() {} |
1624 | 1655 |
1625 void TestRunner::Install( | 1656 void TestRunner::Install( |
1626 WebLocalFrame* frame, | 1657 WebLocalFrame* frame, |
1627 base::WeakPtr<TestRunnerForSpecificView> view_test_runner) { | 1658 base::WeakPtr<TestRunnerForSpecificView> view_test_runner) { |
1628 TestRunnerBindings::Install(weak_factory_.GetWeakPtr(), view_test_runner, | 1659 TestRunnerBindings::Install(weak_factory_.GetWeakPtr(), view_test_runner, |
1629 frame); | 1660 frame, is_web_platform_tests_mode()); |
1630 } | 1661 } |
1631 | 1662 |
1632 void TestRunner::SetDelegate(WebTestDelegate* delegate) { | 1663 void TestRunner::SetDelegate(WebTestDelegate* delegate) { |
1633 delegate_ = delegate; | 1664 delegate_ = delegate; |
1634 mock_content_settings_client_->SetDelegate(delegate); | 1665 mock_content_settings_client_->SetDelegate(delegate); |
1635 spellcheck_->SetDelegate(delegate); | 1666 spellcheck_->SetDelegate(delegate); |
1636 if (speech_recognizer_) | 1667 if (speech_recognizer_) |
1637 speech_recognizer_->SetDelegate(delegate); | 1668 speech_recognizer_->SetDelegate(delegate); |
1638 } | 1669 } |
1639 | 1670 |
(...skipping 1168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2808 | 2839 |
2809 void TestRunner::NotifyDone() { | 2840 void TestRunner::NotifyDone() { |
2810 if (layout_test_runtime_flags_.wait_until_done() && !topLoadingFrame() && | 2841 if (layout_test_runtime_flags_.wait_until_done() && !topLoadingFrame() && |
2811 !will_navigate_ && work_queue_.is_empty()) | 2842 !will_navigate_ && work_queue_.is_empty()) |
2812 delegate_->TestFinished(); | 2843 delegate_->TestFinished(); |
2813 layout_test_runtime_flags_.set_wait_until_done(false); | 2844 layout_test_runtime_flags_.set_wait_until_done(false); |
2814 OnLayoutTestRuntimeFlagsChanged(); | 2845 OnLayoutTestRuntimeFlagsChanged(); |
2815 } | 2846 } |
2816 | 2847 |
2817 } // namespace test_runner | 2848 } // namespace test_runner |
OLD | NEW |