| Index: content/shell/test_runner/test_runner.cc
 | 
| diff --git a/content/shell/test_runner/test_runner.cc b/content/shell/test_runner/test_runner.cc
 | 
| index bbee54dc0d5d1e32cb6e5fbc1e300168c2db5677..1a02826ac7e5f1aaf33d2a38c6ff4b5bb01a2af3 100644
 | 
| --- a/content/shell/test_runner/test_runner.cc
 | 
| +++ b/content/shell/test_runner/test_runner.cc
 | 
| @@ -99,7 +99,8 @@ class TestRunnerBindings : public gin::Wrappable<TestRunnerBindings> {
 | 
|  
 | 
|    static void Install(base::WeakPtr<TestRunner> test_runner,
 | 
|                        base::WeakPtr<TestRunnerForSpecificView> view_test_runner,
 | 
| -                      WebLocalFrame* frame);
 | 
| +                      WebLocalFrame* frame,
 | 
| +                      bool is_web_platform_tests_mode);
 | 
|  
 | 
|   private:
 | 
|    explicit TestRunnerBindings(
 | 
| @@ -304,7 +305,8 @@ gin::WrapperInfo TestRunnerBindings::kWrapperInfo = {gin::kEmbedderNativeGin};
 | 
|  void TestRunnerBindings::Install(
 | 
|      base::WeakPtr<TestRunner> test_runner,
 | 
|      base::WeakPtr<TestRunnerForSpecificView> view_test_runner,
 | 
| -    WebLocalFrame* frame) {
 | 
| +    WebLocalFrame* frame,
 | 
| +    bool is_web_platform_tests_mode) {
 | 
|    v8::Isolate* isolate = blink::mainThreadIsolate();
 | 
|    v8::HandleScope handle_scope(isolate);
 | 
|    v8::Local<v8::Context> context = frame->mainWorldScriptContext();
 | 
| @@ -327,6 +329,35 @@ void TestRunnerBindings::Install(
 | 
|    names.push_back("layoutTestController");
 | 
|    for (size_t i = 0; i < names.size(); ++i)
 | 
|      global->Set(gin::StringToV8(isolate, names[i].c_str()), v8_bindings);
 | 
| +
 | 
| +  // The web-platform-tests suite require that reference comparison is delayed
 | 
| +  // for any test with a 'reftest-wait' class on the root element, until that
 | 
| +  // class attribute is removed. To support this approach, we inject some
 | 
| +  // JavaScript that implements the same behavior using TestRunner.
 | 
| +  //
 | 
| +  // See http://web-platform-tests.org/writing-tests/reftests.html for more
 | 
| +  // details about reference tests in the web-platform-tests suite.
 | 
| +  if (is_web_platform_tests_mode) {
 | 
| +    frame->executeScript(blink::WebString(
 | 
| +        R"(window.addEventListener('load', function() {
 | 
| +          if (!window.testRunner) {
 | 
| +            return;
 | 
| +          }
 | 
| +          const target = document.documentElement;
 | 
| +          if (target != null && target.classList.contains('reftest-wait')) {
 | 
| +            window.testRunner.waitUntilDone();
 | 
| +            const observer = new MutationObserver(function(mutations) {
 | 
| +              mutations.forEach(function(mutation) {
 | 
| +                if (!target.classList.contains('reftest-wait')) {
 | 
| +                  window.testRunner.notifyDone();
 | 
| +                }
 | 
| +              });
 | 
| +            });
 | 
| +            const config = {attributes: true};
 | 
| +            observer.observe(target, config);
 | 
| +          }
 | 
| +        });)"));
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  TestRunnerBindings::TestRunnerBindings(
 | 
| @@ -1626,7 +1657,7 @@ void TestRunner::Install(
 | 
|      WebLocalFrame* frame,
 | 
|      base::WeakPtr<TestRunnerForSpecificView> view_test_runner) {
 | 
|    TestRunnerBindings::Install(weak_factory_.GetWeakPtr(), view_test_runner,
 | 
| -                              frame);
 | 
| +                              frame, is_web_platform_tests_mode());
 | 
|  }
 | 
|  
 | 
|  void TestRunner::SetDelegate(WebTestDelegate* delegate) {
 | 
| 
 |