Home | History | Annotate | Download | only in test_runner
      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
      3 // found in the LICENSE file.
      4 
      5 #include "content/shell/renderer/test_runner/test_runner.h"
      6 
      7 #include <limits>
      8 
      9 #include "base/logging.h"
     10 #include "content/public/test/layouttest_support.h"
     11 #include "content/shell/common/test_runner/test_preferences.h"
     12 #include "content/shell/renderer/binding_helpers.h"
     13 #include "content/shell/renderer/test_runner/mock_credential_manager_client.h"
     14 #include "content/shell/renderer/test_runner/mock_web_push_client.h"
     15 #include "content/shell/renderer/test_runner/mock_web_speech_recognizer.h"
     16 #include "content/shell/renderer/test_runner/notification_presenter.h"
     17 #include "content/shell/renderer/test_runner/test_interfaces.h"
     18 #include "content/shell/renderer/test_runner/web_permissions.h"
     19 #include "content/shell/renderer/test_runner/web_test_delegate.h"
     20 #include "content/shell/renderer/test_runner/web_test_proxy.h"
     21 #include "gin/arguments.h"
     22 #include "gin/array_buffer.h"
     23 #include "gin/handle.h"
     24 #include "gin/object_template_builder.h"
     25 #include "gin/wrappable.h"
     26 #include "third_party/WebKit/public/platform/WebArrayBuffer.h"
     27 #include "third_party/WebKit/public/platform/WebBatteryStatus.h"
     28 #include "third_party/WebKit/public/platform/WebCanvas.h"
     29 #include "third_party/WebKit/public/platform/WebData.h"
     30 #include "third_party/WebKit/public/platform/WebDeviceMotionData.h"
     31 #include "third_party/WebKit/public/platform/WebDeviceOrientationData.h"
     32 #include "third_party/WebKit/public/platform/WebLocalCredential.h"
     33 #include "third_party/WebKit/public/platform/WebPoint.h"
     34 #include "third_party/WebKit/public/platform/WebURLResponse.h"
     35 #include "third_party/WebKit/public/web/WebArrayBufferConverter.h"
     36 #include "third_party/WebKit/public/web/WebBindings.h"
     37 #include "third_party/WebKit/public/web/WebDataSource.h"
     38 #include "third_party/WebKit/public/web/WebDocument.h"
     39 #include "third_party/WebKit/public/web/WebFindOptions.h"
     40 #include "third_party/WebKit/public/web/WebFrame.h"
     41 #include "third_party/WebKit/public/web/WebInputElement.h"
     42 #include "third_party/WebKit/public/web/WebKit.h"
     43 #include "third_party/WebKit/public/web/WebMIDIClientMock.h"
     44 #include "third_party/WebKit/public/web/WebPageOverlay.h"
     45 #include "third_party/WebKit/public/web/WebScriptSource.h"
     46 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
     47 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
     48 #include "third_party/WebKit/public/web/WebSettings.h"
     49 #include "third_party/WebKit/public/web/WebSurroundingText.h"
     50 #include "third_party/WebKit/public/web/WebView.h"
     51 #include "third_party/skia/include/core/SkBitmap.h"
     52 #include "third_party/skia/include/core/SkCanvas.h"
     53 
     54 #if defined(__linux__) || defined(ANDROID)
     55 #include "third_party/WebKit/public/web/linux/WebFontRendering.h"
     56 #endif
     57 
     58 using namespace blink;
     59 
     60 namespace content {
     61 
     62 namespace {
     63 
     64 WebString V8StringToWebString(v8::Handle<v8::String> v8_str) {
     65   int length = v8_str->Utf8Length() + 1;
     66   scoped_ptr<char[]> chars(new char[length]);
     67   v8_str->WriteUtf8(chars.get(), length);
     68   return WebString::fromUTF8(chars.get());
     69 }
     70 
     71 class HostMethodTask : public WebMethodTask<TestRunner> {
     72  public:
     73   typedef void (TestRunner::*CallbackMethodType)();
     74   HostMethodTask(TestRunner* object, CallbackMethodType callback)
     75       : WebMethodTask<TestRunner>(object), callback_(callback) {}
     76 
     77   virtual void RunIfValid() OVERRIDE { (object_->*callback_)(); }
     78 
     79  private:
     80   CallbackMethodType callback_;
     81 };
     82 
     83 }  // namespace
     84 
     85 class InvokeCallbackTask : public WebMethodTask<TestRunner> {
     86  public:
     87   InvokeCallbackTask(TestRunner* object, v8::Handle<v8::Function> callback)
     88       : WebMethodTask<TestRunner>(object),
     89         callback_(blink::mainThreadIsolate(), callback),
     90         argc_(0) {}
     91 
     92   virtual void RunIfValid() OVERRIDE {
     93     v8::Isolate* isolate = blink::mainThreadIsolate();
     94     v8::HandleScope handle_scope(isolate);
     95     WebFrame* frame = object_->web_view_->mainFrame();
     96 
     97     v8::Handle<v8::Context> context = frame->mainWorldScriptContext();
     98     if (context.IsEmpty())
     99       return;
    100 
    101     v8::Context::Scope context_scope(context);
    102 
    103     scoped_ptr<v8::Handle<v8::Value>[]> local_argv;
    104     if (argc_) {
    105         local_argv.reset(new v8::Handle<v8::Value>[argc_]);
    106         for (int i = 0; i < argc_; ++i)
    107           local_argv[i] = v8::Local<v8::Value>::New(isolate, argv_[i]);
    108     }
    109 
    110     frame->callFunctionEvenIfScriptDisabled(
    111         v8::Local<v8::Function>::New(isolate, callback_),
    112         context->Global(),
    113         argc_,
    114         local_argv.get());
    115   }
    116 
    117   void SetArguments(int argc, v8::Handle<v8::Value> argv[]) {
    118     v8::Isolate* isolate = blink::mainThreadIsolate();
    119     argc_ = argc;
    120     argv_.reset(new v8::UniquePersistent<v8::Value>[argc]);
    121     for (int i = 0; i < argc; ++i)
    122       argv_[i] = v8::UniquePersistent<v8::Value>(isolate, argv[i]);
    123   }
    124 
    125  private:
    126   v8::UniquePersistent<v8::Function> callback_;
    127   int argc_;
    128   scoped_ptr<v8::UniquePersistent<v8::Value>[]> argv_;
    129 };
    130 
    131 class TestRunnerBindings : public gin::Wrappable<TestRunnerBindings> {
    132  public:
    133   static gin::WrapperInfo kWrapperInfo;
    134 
    135   static void Install(base::WeakPtr<TestRunner> controller,
    136                       WebFrame* frame);
    137 
    138  private:
    139   explicit TestRunnerBindings(
    140       base::WeakPtr<TestRunner> controller);
    141   virtual ~TestRunnerBindings();
    142 
    143   // gin::Wrappable:
    144   virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
    145       v8::Isolate* isolate) OVERRIDE;
    146 
    147   void LogToStderr(const std::string& output);
    148   void NotifyDone();
    149   void WaitUntilDone();
    150   void QueueBackNavigation(int how_far_back);
    151   void QueueForwardNavigation(int how_far_forward);
    152   void QueueReload();
    153   void QueueLoadingScript(const std::string& script);
    154   void QueueNonLoadingScript(const std::string& script);
    155   void QueueLoad(gin::Arguments* args);
    156   void QueueLoadHTMLString(gin::Arguments* args);
    157   void SetCustomPolicyDelegate(gin::Arguments* args);
    158   void WaitForPolicyDelegate();
    159   int WindowCount();
    160   void SetCloseRemainingWindowsWhenComplete(gin::Arguments* args);
    161   void ResetTestHelperControllers();
    162   void SetTabKeyCyclesThroughElements(bool tab_key_cycles_through_elements);
    163   void ExecCommand(gin::Arguments* args);
    164   bool IsCommandEnabled(const std::string& command);
    165   bool CallShouldCloseOnWebView();
    166   void SetDomainRelaxationForbiddenForURLScheme(bool forbidden,
    167                                                 const std::string& scheme);
    168   v8::Handle<v8::Value> EvaluateScriptInIsolatedWorldAndReturnValue(
    169       int world_id, const std::string& script);
    170   void EvaluateScriptInIsolatedWorld(int world_id, const std::string& script);
    171   void SetIsolatedWorldSecurityOrigin(int world_id,
    172                                       v8::Handle<v8::Value> origin);
    173   void SetIsolatedWorldContentSecurityPolicy(int world_id,
    174                                              const std::string& policy);
    175   void AddOriginAccessWhitelistEntry(const std::string& source_origin,
    176                                      const std::string& destination_protocol,
    177                                      const std::string& destination_host,
    178                                      bool allow_destination_subdomains);
    179   void RemoveOriginAccessWhitelistEntry(const std::string& source_origin,
    180                                         const std::string& destination_protocol,
    181                                         const std::string& destination_host,
    182                                         bool allow_destination_subdomains);
    183   bool HasCustomPageSizeStyle(int page_index);
    184   void ForceRedSelectionColors();
    185   void InjectStyleSheet(const std::string& source_code, bool all_frames);
    186   bool FindString(const std::string& search_text,
    187                   const std::vector<std::string>& options_array);
    188   std::string SelectionAsMarkup();
    189   void SetTextSubpixelPositioning(bool value);
    190   void SetPageVisibility(const std::string& new_visibility);
    191   void SetTextDirection(const std::string& direction_name);
    192   void UseUnfortunateSynchronousResizeMode();
    193   bool EnableAutoResizeMode(int min_width,
    194                             int min_height,
    195                             int max_width,
    196                             int max_height);
    197   bool DisableAutoResizeMode(int new_width, int new_height);
    198   void SetMockDeviceLight(double value);
    199   void ResetDeviceLight();
    200   void SetMockDeviceMotion(gin::Arguments* args);
    201   void SetMockDeviceOrientation(gin::Arguments* args);
    202   void SetMockScreenOrientation(const std::string& orientation);
    203   void DidChangeBatteryStatus(bool charging,
    204                               double chargingTime,
    205                               double dischargingTime,
    206                               double level);
    207   void ResetBatteryStatus();
    208   void DidAcquirePointerLock();
    209   void DidNotAcquirePointerLock();
    210   void DidLosePointerLock();
    211   void SetPointerLockWillFailSynchronously();
    212   void SetPointerLockWillRespondAsynchronously();
    213   void SetPopupBlockingEnabled(bool block_popups);
    214   void SetJavaScriptCanAccessClipboard(bool can_access);
    215   void SetXSSAuditorEnabled(bool enabled);
    216   void SetAllowUniversalAccessFromFileURLs(bool allow);
    217   void SetAllowFileAccessFromFileURLs(bool allow);
    218   void OverridePreference(const std::string key, v8::Handle<v8::Value> value);
    219   void SetAcceptLanguages(const std::string& accept_languages);
    220   void SetPluginsEnabled(bool enabled);
    221   void DumpEditingCallbacks();
    222   void DumpAsMarkup();
    223   void DumpAsText();
    224   void DumpAsTextWithPixelResults();
    225   void DumpChildFrameScrollPositions();
    226   void DumpChildFramesAsMarkup();
    227   void DumpChildFramesAsText();
    228   void DumpIconChanges();
    229   void SetAudioData(const gin::ArrayBufferView& view);
    230   void DumpFrameLoadCallbacks();
    231   void DumpPingLoaderCallbacks();
    232   void DumpUserGestureInFrameLoadCallbacks();
    233   void DumpTitleChanges();
    234   void DumpCreateView();
    235   void SetCanOpenWindows();
    236   void DumpResourceLoadCallbacks();
    237   void DumpResourceRequestCallbacks();
    238   void DumpResourceResponseMIMETypes();
    239   void SetImagesAllowed(bool allowed);
    240   void SetMediaAllowed(bool allowed);
    241   void SetScriptsAllowed(bool allowed);
    242   void SetStorageAllowed(bool allowed);
    243   void SetPluginsAllowed(bool allowed);
    244   void SetAllowDisplayOfInsecureContent(bool allowed);
    245   void SetAllowRunningOfInsecureContent(bool allowed);
    246   void DumpPermissionClientCallbacks();
    247   void DumpWindowStatusChanges();
    248   void DumpProgressFinishedCallback();
    249   void DumpSpellCheckCallbacks();
    250   void DumpBackForwardList();
    251   void DumpSelectionRect();
    252   void SetPrinting();
    253   void ClearPrinting();
    254   void SetShouldStayOnPageAfterHandlingBeforeUnload(bool value);
    255   void SetWillSendRequestClearHeader(const std::string& header);
    256   void DumpResourceRequestPriorities();
    257   void SetUseMockTheme(bool use);
    258   void WaitUntilExternalURLLoad();
    259   void ShowWebInspector(gin::Arguments* args);
    260   void CloseWebInspector();
    261   bool IsChooserShown();
    262   void EvaluateInWebInspector(int call_id, const std::string& script);
    263   void ClearAllDatabases();
    264   void SetDatabaseQuota(int quota);
    265   void SetAlwaysAcceptCookies(bool accept);
    266   void SetWindowIsKey(bool value);
    267   std::string PathToLocalResource(const std::string& path);
    268   void SetBackingScaleFactor(double value, v8::Handle<v8::Function> callback);
    269   void SetColorProfile(const std::string& name,
    270                        v8::Handle<v8::Function> callback);
    271   void SetPOSIXLocale(const std::string& locale);
    272   void SetMIDIAccessorResult(bool result);
    273   void SetMIDISysexPermission(bool value);
    274   void GrantWebNotificationPermission(gin::Arguments* args);
    275   void ClearWebNotificationPermissions();
    276   bool SimulateWebNotificationClick(const std::string& value);
    277   void AddMockSpeechRecognitionResult(const std::string& transcript,
    278                                       double confidence);
    279   void SetMockSpeechRecognitionError(const std::string& error,
    280                                      const std::string& message);
    281   bool WasMockSpeechRecognitionAborted();
    282   void AddMockCredentialManagerResponse(const std::string& id,
    283                                         const std::string& name,
    284                                         const std::string& avatar,
    285                                         const std::string& password);
    286   void AddWebPageOverlay();
    287   void RemoveWebPageOverlay();
    288   void DisplayAsync();
    289   void DisplayAsyncThen(v8::Handle<v8::Function> callback);
    290   void GetManifestThen(v8::Handle<v8::Function> callback);
    291   void CapturePixelsAsyncThen(v8::Handle<v8::Function> callback);
    292   void CopyImageAtAndCapturePixelsAsyncThen(int x,
    293                                             int y,
    294                                             v8::Handle<v8::Function> callback);
    295   void SetCustomTextOutput(std::string output);
    296   void SetViewSourceForFrame(const std::string& name, bool enabled);
    297   void SetMockPushClientSuccess(const std::string& endpoint,
    298                                 const std::string& registration_id);
    299   void SetMockPushClientError(const std::string& message);
    300 
    301   std::string PlatformName();
    302   std::string TooltipText();
    303   bool DisableNotifyDone();
    304   int WebHistoryItemCount();
    305   bool InterceptPostMessage();
    306   void SetInterceptPostMessage(bool value);
    307 
    308   void NotImplemented(const gin::Arguments& args);
    309 
    310   base::WeakPtr<TestRunner> runner_;
    311 
    312   DISALLOW_COPY_AND_ASSIGN(TestRunnerBindings);
    313 };
    314 
    315 gin::WrapperInfo TestRunnerBindings::kWrapperInfo = {
    316     gin::kEmbedderNativeGin};
    317 
    318 // static
    319 void TestRunnerBindings::Install(base::WeakPtr<TestRunner> runner,
    320                                  WebFrame* frame) {
    321   std::vector<std::string> names;
    322   names.push_back("testRunner");
    323   names.push_back("layoutTestController");
    324   return InstallAsWindowProperties(
    325       new TestRunnerBindings(runner), frame, names);
    326 }
    327 
    328 TestRunnerBindings::TestRunnerBindings(base::WeakPtr<TestRunner> runner)
    329     : runner_(runner) {}
    330 
    331 TestRunnerBindings::~TestRunnerBindings() {}
    332 
    333 gin::ObjectTemplateBuilder TestRunnerBindings::GetObjectTemplateBuilder(
    334     v8::Isolate* isolate) {
    335   return gin::Wrappable<TestRunnerBindings>::GetObjectTemplateBuilder(isolate)
    336       // Methods controlling test execution.
    337       .SetMethod("logToStderr", &TestRunnerBindings::LogToStderr)
    338       .SetMethod("notifyDone", &TestRunnerBindings::NotifyDone)
    339       .SetMethod("waitUntilDone", &TestRunnerBindings::WaitUntilDone)
    340       .SetMethod("queueBackNavigation",
    341                  &TestRunnerBindings::QueueBackNavigation)
    342       .SetMethod("queueForwardNavigation",
    343                  &TestRunnerBindings::QueueForwardNavigation)
    344       .SetMethod("queueReload", &TestRunnerBindings::QueueReload)
    345       .SetMethod("queueLoadingScript", &TestRunnerBindings::QueueLoadingScript)
    346       .SetMethod("queueNonLoadingScript",
    347                  &TestRunnerBindings::QueueNonLoadingScript)
    348       .SetMethod("queueLoad", &TestRunnerBindings::QueueLoad)
    349       .SetMethod("queueLoadHTMLString",
    350                  &TestRunnerBindings::QueueLoadHTMLString)
    351       .SetMethod("setCustomPolicyDelegate",
    352                  &TestRunnerBindings::SetCustomPolicyDelegate)
    353       .SetMethod("waitForPolicyDelegate",
    354                  &TestRunnerBindings::WaitForPolicyDelegate)
    355       .SetMethod("windowCount", &TestRunnerBindings::WindowCount)
    356       .SetMethod("setCloseRemainingWindowsWhenComplete",
    357                  &TestRunnerBindings::SetCloseRemainingWindowsWhenComplete)
    358       .SetMethod("resetTestHelperControllers",
    359                  &TestRunnerBindings::ResetTestHelperControllers)
    360       .SetMethod("setTabKeyCyclesThroughElements",
    361                  &TestRunnerBindings::SetTabKeyCyclesThroughElements)
    362       .SetMethod("execCommand", &TestRunnerBindings::ExecCommand)
    363       .SetMethod("isCommandEnabled", &TestRunnerBindings::IsCommandEnabled)
    364       .SetMethod("callShouldCloseOnWebView",
    365                  &TestRunnerBindings::CallShouldCloseOnWebView)
    366       .SetMethod("setDomainRelaxationForbiddenForURLScheme",
    367                  &TestRunnerBindings::SetDomainRelaxationForbiddenForURLScheme)
    368       .SetMethod(
    369            "evaluateScriptInIsolatedWorldAndReturnValue",
    370            &TestRunnerBindings::EvaluateScriptInIsolatedWorldAndReturnValue)
    371       .SetMethod("evaluateScriptInIsolatedWorld",
    372                  &TestRunnerBindings::EvaluateScriptInIsolatedWorld)
    373       .SetMethod("setIsolatedWorldSecurityOrigin",
    374                  &TestRunnerBindings::SetIsolatedWorldSecurityOrigin)
    375       .SetMethod("setIsolatedWorldContentSecurityPolicy",
    376                  &TestRunnerBindings::SetIsolatedWorldContentSecurityPolicy)
    377       .SetMethod("addOriginAccessWhitelistEntry",
    378                  &TestRunnerBindings::AddOriginAccessWhitelistEntry)
    379       .SetMethod("removeOriginAccessWhitelistEntry",
    380                  &TestRunnerBindings::RemoveOriginAccessWhitelistEntry)
    381       .SetMethod("hasCustomPageSizeStyle",
    382                  &TestRunnerBindings::HasCustomPageSizeStyle)
    383       .SetMethod("forceRedSelectionColors",
    384                  &TestRunnerBindings::ForceRedSelectionColors)
    385       .SetMethod("injectStyleSheet", &TestRunnerBindings::InjectStyleSheet)
    386       .SetMethod("findString", &TestRunnerBindings::FindString)
    387       .SetMethod("selectionAsMarkup", &TestRunnerBindings::SelectionAsMarkup)
    388       .SetMethod("setTextSubpixelPositioning",
    389                  &TestRunnerBindings::SetTextSubpixelPositioning)
    390       .SetMethod("setPageVisibility", &TestRunnerBindings::SetPageVisibility)
    391       .SetMethod("setTextDirection", &TestRunnerBindings::SetTextDirection)
    392       .SetMethod("useUnfortunateSynchronousResizeMode",
    393                  &TestRunnerBindings::UseUnfortunateSynchronousResizeMode)
    394       .SetMethod("enableAutoResizeMode",
    395                  &TestRunnerBindings::EnableAutoResizeMode)
    396       .SetMethod("disableAutoResizeMode",
    397                  &TestRunnerBindings::DisableAutoResizeMode)
    398       .SetMethod("setMockDeviceLight", &TestRunnerBindings::SetMockDeviceLight)
    399       .SetMethod("resetDeviceLight", &TestRunnerBindings::ResetDeviceLight)
    400       .SetMethod("setMockDeviceMotion",
    401                  &TestRunnerBindings::SetMockDeviceMotion)
    402       .SetMethod("setMockDeviceOrientation",
    403                  &TestRunnerBindings::SetMockDeviceOrientation)
    404       .SetMethod("setMockScreenOrientation",
    405                  &TestRunnerBindings::SetMockScreenOrientation)
    406       .SetMethod("didChangeBatteryStatus",
    407                  &TestRunnerBindings::DidChangeBatteryStatus)
    408       .SetMethod("resetBatteryStatus", &TestRunnerBindings::ResetBatteryStatus)
    409       .SetMethod("didAcquirePointerLock",
    410                  &TestRunnerBindings::DidAcquirePointerLock)
    411       .SetMethod("didNotAcquirePointerLock",
    412                  &TestRunnerBindings::DidNotAcquirePointerLock)
    413       .SetMethod("didLosePointerLock", &TestRunnerBindings::DidLosePointerLock)
    414       .SetMethod("setPointerLockWillFailSynchronously",
    415                  &TestRunnerBindings::SetPointerLockWillFailSynchronously)
    416       .SetMethod("setPointerLockWillRespondAsynchronously",
    417                  &TestRunnerBindings::SetPointerLockWillRespondAsynchronously)
    418       .SetMethod("setPopupBlockingEnabled",
    419                  &TestRunnerBindings::SetPopupBlockingEnabled)
    420       .SetMethod("setJavaScriptCanAccessClipboard",
    421                  &TestRunnerBindings::SetJavaScriptCanAccessClipboard)
    422       .SetMethod("setXSSAuditorEnabled",
    423                  &TestRunnerBindings::SetXSSAuditorEnabled)
    424       .SetMethod("setAllowUniversalAccessFromFileURLs",
    425                  &TestRunnerBindings::SetAllowUniversalAccessFromFileURLs)
    426       .SetMethod("setAllowFileAccessFromFileURLs",
    427                  &TestRunnerBindings::SetAllowFileAccessFromFileURLs)
    428       .SetMethod("overridePreference", &TestRunnerBindings::OverridePreference)
    429       .SetMethod("setAcceptLanguages", &TestRunnerBindings::SetAcceptLanguages)
    430       .SetMethod("setPluginsEnabled", &TestRunnerBindings::SetPluginsEnabled)
    431       .SetMethod("dumpEditingCallbacks",
    432                  &TestRunnerBindings::DumpEditingCallbacks)
    433       .SetMethod("dumpAsMarkup", &TestRunnerBindings::DumpAsMarkup)
    434       .SetMethod("dumpAsText", &TestRunnerBindings::DumpAsText)
    435       .SetMethod("dumpAsTextWithPixelResults",
    436                  &TestRunnerBindings::DumpAsTextWithPixelResults)
    437       .SetMethod("dumpChildFrameScrollPositions",
    438                  &TestRunnerBindings::DumpChildFrameScrollPositions)
    439       .SetMethod("dumpChildFramesAsText",
    440                  &TestRunnerBindings::DumpChildFramesAsText)
    441       .SetMethod("dumpChildFramesAsMarkup",
    442                  &TestRunnerBindings::DumpChildFramesAsMarkup)
    443       .SetMethod("dumpIconChanges", &TestRunnerBindings::DumpIconChanges)
    444       .SetMethod("setAudioData", &TestRunnerBindings::SetAudioData)
    445       .SetMethod("dumpFrameLoadCallbacks",
    446                  &TestRunnerBindings::DumpFrameLoadCallbacks)
    447       .SetMethod("dumpPingLoaderCallbacks",
    448                  &TestRunnerBindings::DumpPingLoaderCallbacks)
    449       .SetMethod("dumpUserGestureInFrameLoadCallbacks",
    450                  &TestRunnerBindings::DumpUserGestureInFrameLoadCallbacks)
    451       .SetMethod("dumpTitleChanges", &TestRunnerBindings::DumpTitleChanges)
    452       .SetMethod("dumpCreateView", &TestRunnerBindings::DumpCreateView)
    453       .SetMethod("setCanOpenWindows", &TestRunnerBindings::SetCanOpenWindows)
    454       .SetMethod("dumpResourceLoadCallbacks",
    455                  &TestRunnerBindings::DumpResourceLoadCallbacks)
    456       .SetMethod("dumpResourceRequestCallbacks",
    457                  &TestRunnerBindings::DumpResourceRequestCallbacks)
    458       .SetMethod("dumpResourceResponseMIMETypes",
    459                  &TestRunnerBindings::DumpResourceResponseMIMETypes)
    460       .SetMethod("setImagesAllowed", &TestRunnerBindings::SetImagesAllowed)
    461       .SetMethod("setMediaAllowed", &TestRunnerBindings::SetMediaAllowed)
    462       .SetMethod("setScriptsAllowed", &TestRunnerBindings::SetScriptsAllowed)
    463       .SetMethod("setStorageAllowed", &TestRunnerBindings::SetStorageAllowed)
    464       .SetMethod("setPluginsAllowed", &TestRunnerBindings::SetPluginsAllowed)
    465       .SetMethod("setAllowDisplayOfInsecureContent",
    466                  &TestRunnerBindings::SetAllowDisplayOfInsecureContent)
    467       .SetMethod("setAllowRunningOfInsecureContent",
    468                  &TestRunnerBindings::SetAllowRunningOfInsecureContent)
    469       .SetMethod("dumpPermissionClientCallbacks",
    470                  &TestRunnerBindings::DumpPermissionClientCallbacks)
    471       .SetMethod("dumpWindowStatusChanges",
    472                  &TestRunnerBindings::DumpWindowStatusChanges)
    473       .SetMethod("dumpProgressFinishedCallback",
    474                  &TestRunnerBindings::DumpProgressFinishedCallback)
    475       .SetMethod("dumpSpellCheckCallbacks",
    476                  &TestRunnerBindings::DumpSpellCheckCallbacks)
    477       .SetMethod("dumpBackForwardList",
    478                  &TestRunnerBindings::DumpBackForwardList)
    479       .SetMethod("dumpSelectionRect", &TestRunnerBindings::DumpSelectionRect)
    480       .SetMethod("setPrinting", &TestRunnerBindings::SetPrinting)
    481       .SetMethod("clearPrinting", &TestRunnerBindings::ClearPrinting)
    482       .SetMethod(
    483            "setShouldStayOnPageAfterHandlingBeforeUnload",
    484            &TestRunnerBindings::SetShouldStayOnPageAfterHandlingBeforeUnload)
    485       .SetMethod("setWillSendRequestClearHeader",
    486                  &TestRunnerBindings::SetWillSendRequestClearHeader)
    487       .SetMethod("dumpResourceRequestPriorities",
    488                  &TestRunnerBindings::DumpResourceRequestPriorities)
    489       .SetMethod("setUseMockTheme", &TestRunnerBindings::SetUseMockTheme)
    490       .SetMethod("waitUntilExternalURLLoad",
    491                  &TestRunnerBindings::WaitUntilExternalURLLoad)
    492       .SetMethod("showWebInspector", &TestRunnerBindings::ShowWebInspector)
    493       .SetMethod("closeWebInspector", &TestRunnerBindings::CloseWebInspector)
    494       .SetMethod("isChooserShown", &TestRunnerBindings::IsChooserShown)
    495       .SetMethod("evaluateInWebInspector",
    496                  &TestRunnerBindings::EvaluateInWebInspector)
    497       .SetMethod("clearAllDatabases", &TestRunnerBindings::ClearAllDatabases)
    498       .SetMethod("setDatabaseQuota", &TestRunnerBindings::SetDatabaseQuota)
    499       .SetMethod("setAlwaysAcceptCookies",
    500                  &TestRunnerBindings::SetAlwaysAcceptCookies)
    501       .SetMethod("setWindowIsKey", &TestRunnerBindings::SetWindowIsKey)
    502       .SetMethod("pathToLocalResource",
    503                  &TestRunnerBindings::PathToLocalResource)
    504       .SetMethod("setBackingScaleFactor",
    505                  &TestRunnerBindings::SetBackingScaleFactor)
    506       .SetMethod("setColorProfile", &TestRunnerBindings::SetColorProfile)
    507       .SetMethod("setPOSIXLocale", &TestRunnerBindings::SetPOSIXLocale)
    508       .SetMethod("setMIDIAccessorResult",
    509                  &TestRunnerBindings::SetMIDIAccessorResult)
    510       .SetMethod("setMIDISysexPermission",
    511                  &TestRunnerBindings::SetMIDISysexPermission)
    512       .SetMethod("grantWebNotificationPermission",
    513                  &TestRunnerBindings::GrantWebNotificationPermission)
    514       .SetMethod("clearWebNotificationPermissions",
    515                  &TestRunnerBindings::ClearWebNotificationPermissions)
    516       .SetMethod("simulateWebNotificationClick",
    517                  &TestRunnerBindings::SimulateWebNotificationClick)
    518       .SetMethod("addMockSpeechRecognitionResult",
    519                  &TestRunnerBindings::AddMockSpeechRecognitionResult)
    520       .SetMethod("setMockSpeechRecognitionError",
    521                  &TestRunnerBindings::SetMockSpeechRecognitionError)
    522       .SetMethod("wasMockSpeechRecognitionAborted",
    523                  &TestRunnerBindings::WasMockSpeechRecognitionAborted)
    524       .SetMethod("addMockCredentialManagerResponse",
    525                  &TestRunnerBindings::AddMockCredentialManagerResponse)
    526       .SetMethod("addWebPageOverlay", &TestRunnerBindings::AddWebPageOverlay)
    527       .SetMethod("removeWebPageOverlay",
    528                  &TestRunnerBindings::RemoveWebPageOverlay)
    529       .SetMethod("displayAsync", &TestRunnerBindings::DisplayAsync)
    530       .SetMethod("displayAsyncThen", &TestRunnerBindings::DisplayAsyncThen)
    531       .SetMethod("getManifestThen", &TestRunnerBindings::GetManifestThen)
    532       .SetMethod("capturePixelsAsyncThen",
    533                  &TestRunnerBindings::CapturePixelsAsyncThen)
    534       .SetMethod("copyImageAtAndCapturePixelsAsyncThen",
    535                  &TestRunnerBindings::CopyImageAtAndCapturePixelsAsyncThen)
    536       .SetMethod("setCustomTextOutput",
    537                  &TestRunnerBindings::SetCustomTextOutput)
    538       .SetMethod("setViewSourceForFrame",
    539                  &TestRunnerBindings::SetViewSourceForFrame)
    540       .SetMethod("setMockPushClientSuccess",
    541                  &TestRunnerBindings::SetMockPushClientSuccess)
    542       .SetMethod("setMockPushClientError",
    543                  &TestRunnerBindings::SetMockPushClientError)
    544 
    545       // Properties.
    546       .SetProperty("platformName", &TestRunnerBindings::PlatformName)
    547       .SetProperty("tooltipText", &TestRunnerBindings::TooltipText)
    548       .SetProperty("disableNotifyDone", &TestRunnerBindings::DisableNotifyDone)
    549       // webHistoryItemCount is used by tests in LayoutTests\http\tests\history
    550       .SetProperty("webHistoryItemCount",
    551                    &TestRunnerBindings::WebHistoryItemCount)
    552       .SetProperty("interceptPostMessage",
    553                    &TestRunnerBindings::InterceptPostMessage,
    554                    &TestRunnerBindings::SetInterceptPostMessage)
    555 
    556       // The following are stubs.
    557       .SetMethod("dumpDatabaseCallbacks", &TestRunnerBindings::NotImplemented)
    558       .SetMethod("setIconDatabaseEnabled", &TestRunnerBindings::NotImplemented)
    559       .SetMethod("setScrollbarPolicy", &TestRunnerBindings::NotImplemented)
    560       .SetMethod("clearAllApplicationCaches",
    561                  &TestRunnerBindings::NotImplemented)
    562       .SetMethod("clearApplicationCacheForOrigin",
    563                  &TestRunnerBindings::NotImplemented)
    564       .SetMethod("clearBackForwardList", &TestRunnerBindings::NotImplemented)
    565       .SetMethod("keepWebHistory", &TestRunnerBindings::NotImplemented)
    566       .SetMethod("setApplicationCacheOriginQuota",
    567                  &TestRunnerBindings::NotImplemented)
    568       .SetMethod("setCallCloseOnWebViews", &TestRunnerBindings::NotImplemented)
    569       .SetMethod("setMainFrameIsFirstResponder",
    570                  &TestRunnerBindings::NotImplemented)
    571       .SetMethod("setUseDashboardCompatibilityMode",
    572                  &TestRunnerBindings::NotImplemented)
    573       .SetMethod("deleteAllLocalStorage", &TestRunnerBindings::NotImplemented)
    574       .SetMethod("localStorageDiskUsageForOrigin",
    575                  &TestRunnerBindings::NotImplemented)
    576       .SetMethod("originsWithLocalStorage", &TestRunnerBindings::NotImplemented)
    577       .SetMethod("deleteLocalStorageForOrigin",
    578                  &TestRunnerBindings::NotImplemented)
    579       .SetMethod("observeStorageTrackerNotifications",
    580                  &TestRunnerBindings::NotImplemented)
    581       .SetMethod("syncLocalStorage", &TestRunnerBindings::NotImplemented)
    582       .SetMethod("addDisallowedURL", &TestRunnerBindings::NotImplemented)
    583       .SetMethod("applicationCacheDiskUsageForOrigin",
    584                  &TestRunnerBindings::NotImplemented)
    585       .SetMethod("abortModal", &TestRunnerBindings::NotImplemented)
    586 
    587       // Aliases.
    588       // Used at fast/dom/assign-to-window-status.html
    589       .SetMethod("dumpStatusCallbacks",
    590                  &TestRunnerBindings::DumpWindowStatusChanges);
    591 }
    592 
    593 void TestRunnerBindings::LogToStderr(const std::string& output) {
    594   LOG(ERROR) << output;
    595 }
    596 
    597 void TestRunnerBindings::NotifyDone() {
    598   if (runner_)
    599     runner_->NotifyDone();
    600 }
    601 
    602 void TestRunnerBindings::WaitUntilDone() {
    603   if (runner_)
    604     runner_->WaitUntilDone();
    605 }
    606 
    607 void TestRunnerBindings::QueueBackNavigation(int how_far_back) {
    608   if (runner_)
    609     runner_->QueueBackNavigation(how_far_back);
    610 }
    611 
    612 void TestRunnerBindings::QueueForwardNavigation(int how_far_forward) {
    613   if (runner_)
    614     runner_->QueueForwardNavigation(how_far_forward);
    615 }
    616 
    617 void TestRunnerBindings::QueueReload() {
    618   if (runner_)
    619     runner_->QueueReload();
    620 }
    621 
    622 void TestRunnerBindings::QueueLoadingScript(const std::string& script) {
    623   if (runner_)
    624     runner_->QueueLoadingScript(script);
    625 }
    626 
    627 void TestRunnerBindings::QueueNonLoadingScript(const std::string& script) {
    628   if (runner_)
    629     runner_->QueueNonLoadingScript(script);
    630 }
    631 
    632 void TestRunnerBindings::QueueLoad(gin::Arguments* args) {
    633   if (runner_) {
    634     std::string url;
    635     std::string target;
    636     args->GetNext(&url);
    637     args->GetNext(&target);
    638     runner_->QueueLoad(url, target);
    639   }
    640 }
    641 
    642 void TestRunnerBindings::QueueLoadHTMLString(gin::Arguments* args) {
    643   if (runner_)
    644     runner_->QueueLoadHTMLString(args);
    645 }
    646 
    647 void TestRunnerBindings::SetCustomPolicyDelegate(gin::Arguments* args) {
    648   if (runner_)
    649     runner_->SetCustomPolicyDelegate(args);
    650 }
    651 
    652 void TestRunnerBindings::WaitForPolicyDelegate() {
    653   if (runner_)
    654     runner_->WaitForPolicyDelegate();
    655 }
    656 
    657 int TestRunnerBindings::WindowCount() {
    658   if (runner_)
    659     return runner_->WindowCount();
    660   return 0;
    661 }
    662 
    663 void TestRunnerBindings::SetCloseRemainingWindowsWhenComplete(
    664     gin::Arguments* args) {
    665   if (!runner_)
    666     return;
    667 
    668   // In the original implementation, nothing happens if the argument is
    669   // ommitted.
    670   bool close_remaining_windows = false;
    671   if (args->GetNext(&close_remaining_windows))
    672     runner_->SetCloseRemainingWindowsWhenComplete(close_remaining_windows);
    673 }
    674 
    675 void TestRunnerBindings::ResetTestHelperControllers() {
    676   if (runner_)
    677     runner_->ResetTestHelperControllers();
    678 }
    679 
    680 void TestRunnerBindings::SetTabKeyCyclesThroughElements(
    681     bool tab_key_cycles_through_elements) {
    682   if (runner_)
    683     runner_->SetTabKeyCyclesThroughElements(tab_key_cycles_through_elements);
    684 }
    685 
    686 void TestRunnerBindings::ExecCommand(gin::Arguments* args) {
    687   if (runner_)
    688     runner_->ExecCommand(args);
    689 }
    690 
    691 bool TestRunnerBindings::IsCommandEnabled(const std::string& command) {
    692   if (runner_)
    693     return runner_->IsCommandEnabled(command);
    694   return false;
    695 }
    696 
    697 bool TestRunnerBindings::CallShouldCloseOnWebView() {
    698   if (runner_)
    699     return runner_->CallShouldCloseOnWebView();
    700   return false;
    701 }
    702 
    703 void TestRunnerBindings::SetDomainRelaxationForbiddenForURLScheme(
    704     bool forbidden, const std::string& scheme) {
    705   if (runner_)
    706     runner_->SetDomainRelaxationForbiddenForURLScheme(forbidden, scheme);
    707 }
    708 
    709 v8::Handle<v8::Value>
    710 TestRunnerBindings::EvaluateScriptInIsolatedWorldAndReturnValue(
    711     int world_id, const std::string& script) {
    712   if (!runner_)
    713     return v8::Handle<v8::Value>();
    714   return runner_->EvaluateScriptInIsolatedWorldAndReturnValue(world_id,
    715                                                               script);
    716 }
    717 
    718 void TestRunnerBindings::EvaluateScriptInIsolatedWorld(
    719     int world_id, const std::string& script) {
    720   if (runner_)
    721     runner_->EvaluateScriptInIsolatedWorld(world_id, script);
    722 }
    723 
    724 void TestRunnerBindings::SetIsolatedWorldSecurityOrigin(
    725     int world_id, v8::Handle<v8::Value> origin) {
    726   if (runner_)
    727     runner_->SetIsolatedWorldSecurityOrigin(world_id, origin);
    728 }
    729 
    730 void TestRunnerBindings::SetIsolatedWorldContentSecurityPolicy(
    731     int world_id, const std::string& policy) {
    732   if (runner_)
    733     runner_->SetIsolatedWorldContentSecurityPolicy(world_id, policy);
    734 }
    735 
    736 void TestRunnerBindings::AddOriginAccessWhitelistEntry(
    737     const std::string& source_origin,
    738     const std::string& destination_protocol,
    739     const std::string& destination_host,
    740     bool allow_destination_subdomains) {
    741   if (runner_) {
    742     runner_->AddOriginAccessWhitelistEntry(source_origin,
    743                                            destination_protocol,
    744                                            destination_host,
    745                                            allow_destination_subdomains);
    746   }
    747 }
    748 
    749 void TestRunnerBindings::RemoveOriginAccessWhitelistEntry(
    750     const std::string& source_origin,
    751     const std::string& destination_protocol,
    752     const std::string& destination_host,
    753     bool allow_destination_subdomains) {
    754   if (runner_) {
    755     runner_->RemoveOriginAccessWhitelistEntry(source_origin,
    756                                               destination_protocol,
    757                                               destination_host,
    758                                               allow_destination_subdomains);
    759   }
    760 }
    761 
    762 bool TestRunnerBindings::HasCustomPageSizeStyle(int page_index) {
    763   if (runner_)
    764     return runner_->HasCustomPageSizeStyle(page_index);
    765   return false;
    766 }
    767 
    768 void TestRunnerBindings::ForceRedSelectionColors() {
    769   if (runner_)
    770     runner_->ForceRedSelectionColors();
    771 }
    772 
    773 void TestRunnerBindings::InjectStyleSheet(const std::string& source_code,
    774                                           bool all_frames) {
    775   if (runner_)
    776     runner_->InjectStyleSheet(source_code, all_frames);
    777 }
    778 
    779 bool TestRunnerBindings::FindString(
    780     const std::string& search_text,
    781     const std::vector<std::string>& options_array) {
    782   if (runner_)
    783     return runner_->FindString(search_text, options_array);
    784   return false;
    785 }
    786 
    787 std::string TestRunnerBindings::SelectionAsMarkup() {
    788   if (runner_)
    789     return runner_->SelectionAsMarkup();
    790   return std::string();
    791 }
    792 
    793 void TestRunnerBindings::SetTextSubpixelPositioning(bool value) {
    794   if (runner_)
    795     runner_->SetTextSubpixelPositioning(value);
    796 }
    797 
    798 void TestRunnerBindings::SetPageVisibility(const std::string& new_visibility) {
    799   if (runner_)
    800     runner_->SetPageVisibility(new_visibility);
    801 }
    802 
    803 void TestRunnerBindings::SetTextDirection(const std::string& direction_name) {
    804   if (runner_)
    805     runner_->SetTextDirection(direction_name);
    806 }
    807 
    808 void TestRunnerBindings::UseUnfortunateSynchronousResizeMode() {
    809   if (runner_)
    810     runner_->UseUnfortunateSynchronousResizeMode();
    811 }
    812 
    813 bool TestRunnerBindings::EnableAutoResizeMode(int min_width,
    814                                               int min_height,
    815                                               int max_width,
    816                                               int max_height) {
    817   if (runner_) {
    818     return runner_->EnableAutoResizeMode(min_width, min_height,
    819                                          max_width, max_height);
    820   }
    821   return false;
    822 }
    823 
    824 bool TestRunnerBindings::DisableAutoResizeMode(int new_width, int new_height) {
    825   if (runner_)
    826     return runner_->DisableAutoResizeMode(new_width, new_height);
    827   return false;
    828 }
    829 
    830 void TestRunnerBindings::SetMockDeviceLight(double value) {
    831   if (!runner_)
    832     return;
    833   runner_->SetMockDeviceLight(value);
    834 }
    835 
    836 void TestRunnerBindings::ResetDeviceLight() {
    837   if (runner_)
    838     runner_->ResetDeviceLight();
    839 }
    840 
    841 void TestRunnerBindings::SetMockDeviceMotion(gin::Arguments* args) {
    842   if (!runner_)
    843     return;
    844 
    845   bool has_acceleration_x;
    846   double acceleration_x;
    847   bool has_acceleration_y;
    848   double acceleration_y;
    849   bool has_acceleration_z;
    850   double acceleration_z;
    851   bool has_acceleration_including_gravity_x;
    852   double acceleration_including_gravity_x;
    853   bool has_acceleration_including_gravity_y;
    854   double acceleration_including_gravity_y;
    855   bool has_acceleration_including_gravity_z;
    856   double acceleration_including_gravity_z;
    857   bool has_rotation_rate_alpha;
    858   double rotation_rate_alpha;
    859   bool has_rotation_rate_beta;
    860   double rotation_rate_beta;
    861   bool has_rotation_rate_gamma;
    862   double rotation_rate_gamma;
    863   double interval;
    864 
    865   args->GetNext(&has_acceleration_x);
    866   args->GetNext(& acceleration_x);
    867   args->GetNext(&has_acceleration_y);
    868   args->GetNext(& acceleration_y);
    869   args->GetNext(&has_acceleration_z);
    870   args->GetNext(& acceleration_z);
    871   args->GetNext(&has_acceleration_including_gravity_x);
    872   args->GetNext(& acceleration_including_gravity_x);
    873   args->GetNext(&has_acceleration_including_gravity_y);
    874   args->GetNext(& acceleration_including_gravity_y);
    875   args->GetNext(&has_acceleration_including_gravity_z);
    876   args->GetNext(& acceleration_including_gravity_z);
    877   args->GetNext(&has_rotation_rate_alpha);
    878   args->GetNext(& rotation_rate_alpha);
    879   args->GetNext(&has_rotation_rate_beta);
    880   args->GetNext(& rotation_rate_beta);
    881   args->GetNext(&has_rotation_rate_gamma);
    882   args->GetNext(& rotation_rate_gamma);
    883   args->GetNext(& interval);
    884 
    885   runner_->SetMockDeviceMotion(has_acceleration_x, acceleration_x,
    886                                has_acceleration_y, acceleration_y,
    887                                has_acceleration_z, acceleration_z,
    888                                has_acceleration_including_gravity_x,
    889                                acceleration_including_gravity_x,
    890                                has_acceleration_including_gravity_y,
    891                                acceleration_including_gravity_y,
    892                                has_acceleration_including_gravity_z,
    893                                acceleration_including_gravity_z,
    894                                has_rotation_rate_alpha,
    895                                rotation_rate_alpha,
    896                                has_rotation_rate_beta,
    897                                rotation_rate_beta,
    898                                has_rotation_rate_gamma,
    899                                rotation_rate_gamma,
    900                                interval);
    901 }
    902 
    903 void TestRunnerBindings::SetMockDeviceOrientation(gin::Arguments* args) {
    904   if (!runner_)
    905     return;
    906 
    907   bool has_alpha;
    908   double alpha;
    909   bool has_beta;
    910   double beta;
    911   bool has_gamma;
    912   double gamma;
    913   bool has_absolute;
    914   bool absolute;
    915 
    916   args->GetNext(&has_alpha);
    917   args->GetNext(&alpha);
    918   args->GetNext(&has_beta);
    919   args->GetNext(&beta);
    920   args->GetNext(&has_gamma);
    921   args->GetNext(&gamma);
    922   args->GetNext(&has_absolute);
    923   args->GetNext(&absolute);
    924 
    925   runner_->SetMockDeviceOrientation(has_alpha, alpha,
    926                                     has_beta, beta,
    927                                     has_gamma, gamma,
    928                                     has_absolute, absolute);
    929 }
    930 
    931 void TestRunnerBindings::SetMockScreenOrientation(const std::string& orientation) {
    932   if (!runner_)
    933     return;
    934 
    935   runner_->SetMockScreenOrientation(orientation);
    936 }
    937 
    938 void TestRunnerBindings::DidChangeBatteryStatus(bool charging,
    939                                                 double chargingTime,
    940                                                 double dischargingTime,
    941                                                 double level) {
    942   if (runner_) {
    943     runner_->DidChangeBatteryStatus(charging, chargingTime,
    944                                     dischargingTime, level);
    945   }
    946 }
    947 
    948 void TestRunnerBindings::ResetBatteryStatus() {
    949   if (runner_)
    950     runner_->ResetBatteryStatus();
    951 }
    952 
    953 void TestRunnerBindings::DidAcquirePointerLock() {
    954   if (runner_)
    955     runner_->DidAcquirePointerLock();
    956 }
    957 
    958 void TestRunnerBindings::DidNotAcquirePointerLock() {
    959   if (runner_)
    960     runner_->DidNotAcquirePointerLock();
    961 }
    962 
    963 void TestRunnerBindings::DidLosePointerLock() {
    964   if (runner_)
    965     runner_->DidLosePointerLock();
    966 }
    967 
    968 void TestRunnerBindings::SetPointerLockWillFailSynchronously() {
    969   if (runner_)
    970     runner_->SetPointerLockWillFailSynchronously();
    971 }
    972 
    973 void TestRunnerBindings::SetPointerLockWillRespondAsynchronously() {
    974   if (runner_)
    975     runner_->SetPointerLockWillRespondAsynchronously();
    976 }
    977 
    978 void TestRunnerBindings::SetPopupBlockingEnabled(bool block_popups) {
    979   if (runner_)
    980     runner_->SetPopupBlockingEnabled(block_popups);
    981 }
    982 
    983 void TestRunnerBindings::SetJavaScriptCanAccessClipboard(bool can_access) {
    984   if (runner_)
    985     runner_->SetJavaScriptCanAccessClipboard(can_access);
    986 }
    987 
    988 void TestRunnerBindings::SetXSSAuditorEnabled(bool enabled) {
    989   if (runner_)
    990     runner_->SetXSSAuditorEnabled(enabled);
    991 }
    992 
    993 void TestRunnerBindings::SetAllowUniversalAccessFromFileURLs(bool allow) {
    994   if (runner_)
    995     runner_->SetAllowUniversalAccessFromFileURLs(allow);
    996 }
    997 
    998 void TestRunnerBindings::SetAllowFileAccessFromFileURLs(bool allow) {
    999   if (runner_)
   1000     runner_->SetAllowFileAccessFromFileURLs(allow);
   1001 }
   1002 
   1003 void TestRunnerBindings::OverridePreference(const std::string key,
   1004                                             v8::Handle<v8::Value> value) {
   1005   if (runner_)
   1006     runner_->OverridePreference(key, value);
   1007 }
   1008 
   1009 void TestRunnerBindings::SetAcceptLanguages(
   1010     const std::string& accept_languages) {
   1011   if (!runner_)
   1012     return;
   1013 
   1014   runner_->SetAcceptLanguages(accept_languages);
   1015 }
   1016 
   1017 void TestRunnerBindings::SetPluginsEnabled(bool enabled) {
   1018   if (runner_)
   1019     runner_->SetPluginsEnabled(enabled);
   1020 }
   1021 
   1022 void TestRunnerBindings::DumpEditingCallbacks() {
   1023   if (runner_)
   1024     runner_->DumpEditingCallbacks();
   1025 }
   1026 
   1027 void TestRunnerBindings::DumpAsMarkup() {
   1028   if (runner_)
   1029     runner_->DumpAsMarkup();
   1030 }
   1031 
   1032 void TestRunnerBindings::DumpAsText() {
   1033   if (runner_)
   1034     runner_->DumpAsText();
   1035 }
   1036 
   1037 void TestRunnerBindings::DumpAsTextWithPixelResults() {
   1038   if (runner_)
   1039     runner_->DumpAsTextWithPixelResults();
   1040 }
   1041 
   1042 void TestRunnerBindings::DumpChildFrameScrollPositions() {
   1043   if (runner_)
   1044     runner_->DumpChildFrameScrollPositions();
   1045 }
   1046 
   1047 void TestRunnerBindings::DumpChildFramesAsText() {
   1048   if (runner_)
   1049     runner_->DumpChildFramesAsText();
   1050 }
   1051 
   1052 void TestRunnerBindings::DumpChildFramesAsMarkup() {
   1053   if (runner_)
   1054     runner_->DumpChildFramesAsMarkup();
   1055 }
   1056 
   1057 void TestRunnerBindings::DumpIconChanges() {
   1058   if (runner_)
   1059     runner_->DumpIconChanges();
   1060 }
   1061 
   1062 void TestRunnerBindings::SetAudioData(const gin::ArrayBufferView& view) {
   1063   if (runner_)
   1064     runner_->SetAudioData(view);
   1065 }
   1066 
   1067 void TestRunnerBindings::DumpFrameLoadCallbacks() {
   1068   if (runner_)
   1069     runner_->DumpFrameLoadCallbacks();
   1070 }
   1071 
   1072 void TestRunnerBindings::DumpPingLoaderCallbacks() {
   1073   if (runner_)
   1074     runner_->DumpPingLoaderCallbacks();
   1075 }
   1076 
   1077 void TestRunnerBindings::DumpUserGestureInFrameLoadCallbacks() {
   1078   if (runner_)
   1079     runner_->DumpUserGestureInFrameLoadCallbacks();
   1080 }
   1081 
   1082 void TestRunnerBindings::DumpTitleChanges() {
   1083   if (runner_)
   1084     runner_->DumpTitleChanges();
   1085 }
   1086 
   1087 void TestRunnerBindings::DumpCreateView() {
   1088   if (runner_)
   1089     runner_->DumpCreateView();
   1090 }
   1091 
   1092 void TestRunnerBindings::SetCanOpenWindows() {
   1093   if (runner_)
   1094     runner_->SetCanOpenWindows();
   1095 }
   1096 
   1097 void TestRunnerBindings::DumpResourceLoadCallbacks() {
   1098   if (runner_)
   1099     runner_->DumpResourceLoadCallbacks();
   1100 }
   1101 
   1102 void TestRunnerBindings::DumpResourceRequestCallbacks() {
   1103   if (runner_)
   1104     runner_->DumpResourceRequestCallbacks();
   1105 }
   1106 
   1107 void TestRunnerBindings::DumpResourceResponseMIMETypes() {
   1108   if (runner_)
   1109     runner_->DumpResourceResponseMIMETypes();
   1110 }
   1111 
   1112 void TestRunnerBindings::SetImagesAllowed(bool allowed) {
   1113   if (runner_)
   1114     runner_->SetImagesAllowed(allowed);
   1115 }
   1116 
   1117 void TestRunnerBindings::SetMediaAllowed(bool allowed) {
   1118   if (runner_)
   1119     runner_->SetMediaAllowed(allowed);
   1120 }
   1121 
   1122 void TestRunnerBindings::SetScriptsAllowed(bool allowed) {
   1123   if (runner_)
   1124     runner_->SetScriptsAllowed(allowed);
   1125 }
   1126 
   1127 void TestRunnerBindings::SetStorageAllowed(bool allowed) {
   1128   if (runner_)
   1129     runner_->SetStorageAllowed(allowed);
   1130 }
   1131 
   1132 void TestRunnerBindings::SetPluginsAllowed(bool allowed) {
   1133   if (runner_)
   1134     runner_->SetPluginsAllowed(allowed);
   1135 }
   1136 
   1137 void TestRunnerBindings::SetAllowDisplayOfInsecureContent(bool allowed) {
   1138   if (runner_)
   1139     runner_->SetAllowDisplayOfInsecureContent(allowed);
   1140 }
   1141 
   1142 void TestRunnerBindings::SetAllowRunningOfInsecureContent(bool allowed) {
   1143   if (runner_)
   1144     runner_->SetAllowRunningOfInsecureContent(allowed);
   1145 }
   1146 
   1147 void TestRunnerBindings::DumpPermissionClientCallbacks() {
   1148   if (runner_)
   1149     runner_->DumpPermissionClientCallbacks();
   1150 }
   1151 
   1152 void TestRunnerBindings::DumpWindowStatusChanges() {
   1153   if (runner_)
   1154     runner_->DumpWindowStatusChanges();
   1155 }
   1156 
   1157 void TestRunnerBindings::DumpProgressFinishedCallback() {
   1158   if (runner_)
   1159     runner_->DumpProgressFinishedCallback();
   1160 }
   1161 
   1162 void TestRunnerBindings::DumpSpellCheckCallbacks() {
   1163   if (runner_)
   1164     runner_->DumpSpellCheckCallbacks();
   1165 }
   1166 
   1167 void TestRunnerBindings::DumpBackForwardList() {
   1168   if (runner_)
   1169     runner_->DumpBackForwardList();
   1170 }
   1171 
   1172 void TestRunnerBindings::DumpSelectionRect() {
   1173   if (runner_)
   1174     runner_->DumpSelectionRect();
   1175 }
   1176 
   1177 void TestRunnerBindings::SetPrinting() {
   1178   if (runner_)
   1179     runner_->SetPrinting();
   1180 }
   1181 
   1182 void TestRunnerBindings::ClearPrinting() {
   1183   if (runner_)
   1184     runner_->ClearPrinting();
   1185 }
   1186 
   1187 void TestRunnerBindings::SetShouldStayOnPageAfterHandlingBeforeUnload(
   1188     bool value) {
   1189   if (runner_)
   1190     runner_->SetShouldStayOnPageAfterHandlingBeforeUnload(value);
   1191 }
   1192 
   1193 void TestRunnerBindings::SetWillSendRequestClearHeader(
   1194     const std::string& header) {
   1195   if (runner_)
   1196     runner_->SetWillSendRequestClearHeader(header);
   1197 }
   1198 
   1199 void TestRunnerBindings::DumpResourceRequestPriorities() {
   1200   if (runner_)
   1201     runner_->DumpResourceRequestPriorities();
   1202 }
   1203 
   1204 void TestRunnerBindings::SetUseMockTheme(bool use) {
   1205   if (runner_)
   1206     runner_->SetUseMockTheme(use);
   1207 }
   1208 
   1209 void TestRunnerBindings::WaitUntilExternalURLLoad() {
   1210   if (runner_)
   1211     runner_->WaitUntilExternalURLLoad();
   1212 }
   1213 
   1214 void TestRunnerBindings::ShowWebInspector(gin::Arguments* args) {
   1215   if (runner_) {
   1216     std::string settings;
   1217     args->GetNext(&settings);
   1218     std::string frontend_url;
   1219     args->GetNext(&frontend_url);
   1220     runner_->ShowWebInspector(settings, frontend_url);
   1221   }
   1222 }
   1223 
   1224 void TestRunnerBindings::CloseWebInspector() {
   1225   if (runner_)
   1226     runner_->CloseWebInspector();
   1227 }
   1228 
   1229 bool TestRunnerBindings::IsChooserShown() {
   1230   if (runner_)
   1231     return runner_->IsChooserShown();
   1232   return false;
   1233 }
   1234 
   1235 void TestRunnerBindings::EvaluateInWebInspector(int call_id,
   1236                                                 const std::string& script) {
   1237   if (runner_)
   1238     runner_->EvaluateInWebInspector(call_id, script);
   1239 }
   1240 
   1241 void TestRunnerBindings::ClearAllDatabases() {
   1242   if (runner_)
   1243     runner_->ClearAllDatabases();
   1244 }
   1245 
   1246 void TestRunnerBindings::SetDatabaseQuota(int quota) {
   1247   if (runner_)
   1248     runner_->SetDatabaseQuota(quota);
   1249 }
   1250 
   1251 void TestRunnerBindings::SetAlwaysAcceptCookies(bool accept) {
   1252   if (runner_)
   1253     runner_->SetAlwaysAcceptCookies(accept);
   1254 }
   1255 
   1256 void TestRunnerBindings::SetWindowIsKey(bool value) {
   1257   if (runner_)
   1258     runner_->SetWindowIsKey(value);
   1259 }
   1260 
   1261 std::string TestRunnerBindings::PathToLocalResource(const std::string& path) {
   1262   if (runner_)
   1263     return runner_->PathToLocalResource(path);
   1264   return std::string();
   1265 }
   1266 
   1267 void TestRunnerBindings::SetBackingScaleFactor(
   1268     double value, v8::Handle<v8::Function> callback) {
   1269   if (runner_)
   1270     runner_->SetBackingScaleFactor(value, callback);
   1271 }
   1272 
   1273 void TestRunnerBindings::SetColorProfile(
   1274     const std::string& name, v8::Handle<v8::Function> callback) {
   1275   if (runner_)
   1276     runner_->SetColorProfile(name, callback);
   1277 }
   1278 
   1279 void TestRunnerBindings::SetPOSIXLocale(const std::string& locale) {
   1280   if (runner_)
   1281     runner_->SetPOSIXLocale(locale);
   1282 }
   1283 
   1284 void TestRunnerBindings::SetMIDIAccessorResult(bool result) {
   1285   if (runner_)
   1286     runner_->SetMIDIAccessorResult(result);
   1287 }
   1288 
   1289 void TestRunnerBindings::SetMIDISysexPermission(bool value) {
   1290   if (runner_)
   1291     runner_->SetMIDISysexPermission(value);
   1292 }
   1293 
   1294 void TestRunnerBindings::GrantWebNotificationPermission(gin::Arguments* args) {
   1295   if (runner_) {
   1296     std::string origin;
   1297     bool permission_granted = true;
   1298     args->GetNext(&origin);
   1299     args->GetNext(&permission_granted);
   1300     return runner_->GrantWebNotificationPermission(GURL(origin),
   1301                                                    permission_granted);
   1302   }
   1303 }
   1304 
   1305 void TestRunnerBindings::ClearWebNotificationPermissions() {
   1306   if (runner_)
   1307     runner_->ClearWebNotificationPermissions();
   1308 }
   1309 
   1310 bool TestRunnerBindings::SimulateWebNotificationClick(
   1311     const std::string& value) {
   1312   if (runner_)
   1313     return runner_->SimulateWebNotificationClick(value);
   1314   return false;
   1315 }
   1316 
   1317 void TestRunnerBindings::AddMockSpeechRecognitionResult(
   1318     const std::string& transcript, double confidence) {
   1319   if (runner_)
   1320     runner_->AddMockSpeechRecognitionResult(transcript, confidence);
   1321 }
   1322 
   1323 void TestRunnerBindings::SetMockSpeechRecognitionError(
   1324     const std::string& error, const std::string& message) {
   1325   if (runner_)
   1326     runner_->SetMockSpeechRecognitionError(error, message);
   1327 }
   1328 
   1329 bool TestRunnerBindings::WasMockSpeechRecognitionAborted() {
   1330   if (runner_)
   1331     return runner_->WasMockSpeechRecognitionAborted();
   1332   return false;
   1333 }
   1334 
   1335 void TestRunnerBindings::AddMockCredentialManagerResponse(
   1336     const std::string& id,
   1337     const std::string& name,
   1338     const std::string& avatar,
   1339     const std::string& password) {
   1340   if (runner_)
   1341     runner_->AddMockCredentialManagerResponse(id, name, avatar, password);
   1342 }
   1343 
   1344 void TestRunnerBindings::AddWebPageOverlay() {
   1345   if (runner_)
   1346     runner_->AddWebPageOverlay();
   1347 }
   1348 
   1349 void TestRunnerBindings::RemoveWebPageOverlay() {
   1350   if (runner_)
   1351     runner_->RemoveWebPageOverlay();
   1352 }
   1353 
   1354 void TestRunnerBindings::DisplayAsync() {
   1355   if (runner_)
   1356     runner_->DisplayAsync();
   1357 }
   1358 
   1359 void TestRunnerBindings::DisplayAsyncThen(v8::Handle<v8::Function> callback) {
   1360   if (runner_)
   1361     runner_->DisplayAsyncThen(callback);
   1362 }
   1363 
   1364 void TestRunnerBindings::GetManifestThen(v8::Handle<v8::Function> callback) {
   1365   if (runner_)
   1366     runner_->GetManifestThen(callback);
   1367 }
   1368 
   1369 void TestRunnerBindings::CapturePixelsAsyncThen(
   1370     v8::Handle<v8::Function> callback) {
   1371   if (runner_)
   1372     runner_->CapturePixelsAsyncThen(callback);
   1373 }
   1374 
   1375 void TestRunnerBindings::CopyImageAtAndCapturePixelsAsyncThen(
   1376     int x, int y, v8::Handle<v8::Function> callback) {
   1377   if (runner_)
   1378     runner_->CopyImageAtAndCapturePixelsAsyncThen(x, y, callback);
   1379 }
   1380 
   1381 void TestRunnerBindings::SetCustomTextOutput(std::string output) {
   1382   runner_->setCustomTextOutput(output);
   1383 }
   1384 
   1385 void TestRunnerBindings::SetViewSourceForFrame(const std::string& name,
   1386                                                bool enabled) {
   1387   if (runner_ && runner_->web_view_) {
   1388     WebFrame* target_frame =
   1389         runner_->web_view_->findFrameByName(WebString::fromUTF8(name));
   1390     if (target_frame)
   1391       target_frame->enableViewSourceMode(enabled);
   1392   }
   1393 }
   1394 
   1395 void TestRunnerBindings::SetMockPushClientSuccess(
   1396     const std::string& endpoint,
   1397     const std::string& registration_id) {
   1398   if (!runner_)
   1399     return;
   1400   runner_->SetMockPushClientSuccess(endpoint, registration_id);
   1401 }
   1402 
   1403 void TestRunnerBindings::SetMockPushClientError(const std::string& message) {
   1404   if (!runner_)
   1405     return;
   1406   runner_->SetMockPushClientError(message);
   1407 }
   1408 
   1409 std::string TestRunnerBindings::PlatformName() {
   1410   if (runner_)
   1411     return runner_->platform_name_;
   1412   return std::string();
   1413 }
   1414 
   1415 std::string TestRunnerBindings::TooltipText() {
   1416   if (runner_)
   1417     return runner_->tooltip_text_;
   1418   return std::string();
   1419 }
   1420 
   1421 bool TestRunnerBindings::DisableNotifyDone() {
   1422   if (runner_)
   1423     return runner_->disable_notify_done_;
   1424   return false;
   1425 }
   1426 
   1427 int TestRunnerBindings::WebHistoryItemCount() {
   1428   if (runner_)
   1429     return runner_->web_history_item_count_;
   1430   return false;
   1431 }
   1432 
   1433 bool TestRunnerBindings::InterceptPostMessage() {
   1434   if (runner_)
   1435     return runner_->intercept_post_message_;
   1436   return false;
   1437 }
   1438 
   1439 void TestRunnerBindings::SetInterceptPostMessage(bool value) {
   1440   if (runner_)
   1441     runner_->intercept_post_message_ = value;
   1442 }
   1443 
   1444 void TestRunnerBindings::NotImplemented(const gin::Arguments& args) {
   1445 }
   1446 
   1447 class TestPageOverlay : public WebPageOverlay {
   1448  public:
   1449   explicit TestPageOverlay(WebView* web_view)
   1450       : web_view_(web_view) {
   1451   }
   1452   virtual ~TestPageOverlay() {}
   1453 
   1454   virtual void paintPageOverlay(WebCanvas* canvas) OVERRIDE  {
   1455     SkRect rect = SkRect::MakeWH(web_view_->size().width,
   1456                                  web_view_->size().height);
   1457     SkPaint paint;
   1458     paint.setColor(SK_ColorCYAN);
   1459     paint.setStyle(SkPaint::kFill_Style);
   1460     canvas->drawRect(rect, paint);
   1461   }
   1462 
   1463  private:
   1464   WebView* web_view_;
   1465 };
   1466 
   1467 TestRunner::WorkQueue::WorkQueue(TestRunner* controller)
   1468     : frozen_(false)
   1469     , controller_(controller) {}
   1470 
   1471 TestRunner::WorkQueue::~WorkQueue() {
   1472   Reset();
   1473 }
   1474 
   1475 void TestRunner::WorkQueue::ProcessWorkSoon() {
   1476   if (controller_->topLoadingFrame())
   1477     return;
   1478 
   1479   if (!queue_.empty()) {
   1480     // We delay processing queued work to avoid recursion problems.
   1481     controller_->delegate_->PostTask(new WorkQueueTask(this));
   1482   } else if (!controller_->wait_until_done_) {
   1483     controller_->delegate_->TestFinished();
   1484   }
   1485 }
   1486 
   1487 void TestRunner::WorkQueue::Reset() {
   1488   frozen_ = false;
   1489   while (!queue_.empty()) {
   1490     delete queue_.front();
   1491     queue_.pop_front();
   1492   }
   1493 }
   1494 
   1495 void TestRunner::WorkQueue::AddWork(WorkItem* work) {
   1496   if (frozen_) {
   1497     delete work;
   1498     return;
   1499   }
   1500   queue_.push_back(work);
   1501 }
   1502 
   1503 void TestRunner::WorkQueue::ProcessWork() {
   1504   // Quit doing work once a load is in progress.
   1505   while (!queue_.empty()) {
   1506     bool startedLoad = queue_.front()->Run(controller_->delegate_,
   1507                                            controller_->web_view_);
   1508     delete queue_.front();
   1509     queue_.pop_front();
   1510     if (startedLoad)
   1511       return;
   1512   }
   1513 
   1514   if (!controller_->wait_until_done_ && !controller_->topLoadingFrame())
   1515     controller_->delegate_->TestFinished();
   1516 }
   1517 
   1518 void TestRunner::WorkQueue::WorkQueueTask::RunIfValid() {
   1519   object_->ProcessWork();
   1520 }
   1521 
   1522 TestRunner::TestRunner(TestInterfaces* interfaces)
   1523     : test_is_running_(false),
   1524       close_remaining_windows_(false),
   1525       work_queue_(this),
   1526       disable_notify_done_(false),
   1527       web_history_item_count_(0),
   1528       intercept_post_message_(false),
   1529       test_interfaces_(interfaces),
   1530       delegate_(NULL),
   1531       web_view_(NULL),
   1532       page_overlay_(NULL),
   1533       web_permissions_(new WebPermissions()),
   1534       notification_presenter_(new NotificationPresenter()),
   1535       weak_factory_(this) {}
   1536 
   1537 TestRunner::~TestRunner() {}
   1538 
   1539 void TestRunner::Install(WebFrame* frame) {
   1540   TestRunnerBindings::Install(weak_factory_.GetWeakPtr(), frame);
   1541 }
   1542 
   1543 void TestRunner::SetDelegate(WebTestDelegate* delegate) {
   1544   delegate_ = delegate;
   1545   web_permissions_->SetDelegate(delegate);
   1546   notification_presenter_->set_delegate(delegate);
   1547 }
   1548 
   1549 void TestRunner::SetWebView(WebView* webView, WebTestProxyBase* proxy) {
   1550   web_view_ = webView;
   1551   proxy_ = proxy;
   1552 }
   1553 
   1554 void TestRunner::Reset() {
   1555   if (web_view_) {
   1556     web_view_->setZoomLevel(0);
   1557     web_view_->setTextZoomFactor(1);
   1558     web_view_->setTabKeyCyclesThroughElements(true);
   1559 #if !defined(__APPLE__) && !defined(WIN32) // Actually, TOOLKIT_GTK
   1560     // (Constants copied because we can't depend on the header that defined
   1561     // them from this file.)
   1562     web_view_->setSelectionColors(
   1563         0xff1e90ff, 0xff000000, 0xffc8c8c8, 0xff323232);
   1564 #endif
   1565     web_view_->removeInjectedStyleSheets();
   1566     web_view_->setVisibilityState(WebPageVisibilityStateVisible, true);
   1567     web_view_->mainFrame()->enableViewSourceMode(false);
   1568 
   1569     if (page_overlay_) {
   1570       web_view_->removePageOverlay(page_overlay_);
   1571       delete page_overlay_;
   1572       page_overlay_ = NULL;
   1573     }
   1574   }
   1575 
   1576   top_loading_frame_ = NULL;
   1577   wait_until_done_ = false;
   1578   wait_until_external_url_load_ = false;
   1579   policy_delegate_enabled_ = false;
   1580   policy_delegate_is_permissive_ = false;
   1581   policy_delegate_should_notify_done_ = false;
   1582 
   1583   WebSecurityPolicy::resetOriginAccessWhitelists();
   1584 #if defined(__linux__) || defined(ANDROID)
   1585   WebFontRendering::setSubpixelPositioning(false);
   1586 #endif
   1587 
   1588   if (delegate_) {
   1589     // Reset the default quota for each origin to 5MB
   1590     delegate_->SetDatabaseQuota(5 * 1024 * 1024);
   1591     delegate_->SetDeviceColorProfile("reset");
   1592     delegate_->SetDeviceScaleFactor(1);
   1593     delegate_->SetAcceptAllCookies(false);
   1594     delegate_->SetLocale("");
   1595     delegate_->UseUnfortunateSynchronousResizeMode(false);
   1596     delegate_->DisableAutoResizeMode(WebSize());
   1597     delegate_->DeleteAllCookies();
   1598     delegate_->ResetScreenOrientation();
   1599     ResetBatteryStatus();
   1600     ResetDeviceLight();
   1601   }
   1602 
   1603   dump_editting_callbacks_ = false;
   1604   dump_as_text_ = false;
   1605   dump_as_markup_ = false;
   1606   generate_pixel_results_ = true;
   1607   dump_child_frame_scroll_positions_ = false;
   1608   dump_child_frames_as_markup_ = false;
   1609   dump_child_frames_as_text_ = false;
   1610   dump_icon_changes_ = false;
   1611   dump_as_audio_ = false;
   1612   dump_frame_load_callbacks_ = false;
   1613   dump_ping_loader_callbacks_ = false;
   1614   dump_user_gesture_in_frame_load_callbacks_ = false;
   1615   dump_title_changes_ = false;
   1616   dump_create_view_ = false;
   1617   can_open_windows_ = false;
   1618   dump_resource_load_callbacks_ = false;
   1619   dump_resource_request_callbacks_ = false;
   1620   dump_resource_reqponse_mime_types_ = false;
   1621   dump_window_status_changes_ = false;
   1622   dump_progress_finished_callback_ = false;
   1623   dump_spell_check_callbacks_ = false;
   1624   dump_back_forward_list_ = false;
   1625   dump_selection_rect_ = false;
   1626   test_repaint_ = false;
   1627   sweep_horizontally_ = false;
   1628   is_printing_ = false;
   1629   midi_accessor_result_ = true;
   1630   should_stay_on_page_after_handling_before_unload_ = false;
   1631   should_dump_resource_priorities_ = false;
   1632   has_custom_text_output_ = false;
   1633   custom_text_output_.clear();
   1634 
   1635   http_headers_to_clear_.clear();
   1636 
   1637   platform_name_ = "chromium";
   1638   tooltip_text_ = std::string();
   1639   disable_notify_done_ = false;
   1640   web_history_item_count_ = 0;
   1641   intercept_post_message_ = false;
   1642 
   1643   web_permissions_->Reset();
   1644 
   1645   notification_presenter_->Reset();
   1646   use_mock_theme_ = true;
   1647   pointer_locked_ = false;
   1648   pointer_lock_planned_result_ = PointerLockWillSucceed;
   1649 
   1650   task_list_.RevokeAll();
   1651   work_queue_.Reset();
   1652 
   1653   if (close_remaining_windows_ && delegate_)
   1654     delegate_->CloseRemainingWindows();
   1655   else
   1656     close_remaining_windows_ = true;
   1657 }
   1658 
   1659 void TestRunner::SetTestIsRunning(bool running) {
   1660   test_is_running_ = running;
   1661 }
   1662 
   1663 void TestRunner::InvokeCallback(scoped_ptr<InvokeCallbackTask> task) {
   1664   delegate_->PostTask(task.release());
   1665 }
   1666 
   1667 bool TestRunner::shouldDumpEditingCallbacks() const {
   1668   return dump_editting_callbacks_;
   1669 }
   1670 
   1671 bool TestRunner::shouldDumpAsText() {
   1672   CheckResponseMimeType();
   1673   return dump_as_text_;
   1674 }
   1675 
   1676 void TestRunner::setShouldDumpAsText(bool value) {
   1677   dump_as_text_ = value;
   1678 }
   1679 
   1680 bool TestRunner::shouldDumpAsMarkup() {
   1681   return dump_as_markup_;
   1682 }
   1683 
   1684 void TestRunner::setShouldDumpAsMarkup(bool value) {
   1685   dump_as_markup_ = value;
   1686 }
   1687 
   1688 bool TestRunner::shouldDumpAsCustomText() const {
   1689   return has_custom_text_output_;
   1690 }
   1691 
   1692 std::string TestRunner::customDumpText() const {
   1693   return custom_text_output_;
   1694 }
   1695 
   1696 void TestRunner::setCustomTextOutput(std::string text) {
   1697   custom_text_output_ = text;
   1698   has_custom_text_output_ = true;
   1699 }
   1700 
   1701 bool TestRunner::ShouldGeneratePixelResults() {
   1702   CheckResponseMimeType();
   1703   return generate_pixel_results_;
   1704 }
   1705 
   1706 void TestRunner::setShouldGeneratePixelResults(bool value) {
   1707   generate_pixel_results_ = value;
   1708 }
   1709 
   1710 bool TestRunner::shouldDumpChildFrameScrollPositions() const {
   1711   return dump_child_frame_scroll_positions_;
   1712 }
   1713 
   1714 bool TestRunner::shouldDumpChildFramesAsMarkup() const {
   1715   return dump_child_frames_as_markup_;
   1716 }
   1717 
   1718 bool TestRunner::shouldDumpChildFramesAsText() const {
   1719   return dump_child_frames_as_text_;
   1720 }
   1721 
   1722 bool TestRunner::ShouldDumpAsAudio() const {
   1723   return dump_as_audio_;
   1724 }
   1725 
   1726 void TestRunner::GetAudioData(std::vector<unsigned char>* buffer_view) const {
   1727   *buffer_view = audio_data_;
   1728 }
   1729 
   1730 bool TestRunner::shouldDumpFrameLoadCallbacks() const {
   1731   return test_is_running_ && dump_frame_load_callbacks_;
   1732 }
   1733 
   1734 void TestRunner::setShouldDumpFrameLoadCallbacks(bool value) {
   1735   dump_frame_load_callbacks_ = value;
   1736 }
   1737 
   1738 bool TestRunner::shouldDumpPingLoaderCallbacks() const {
   1739   return test_is_running_ && dump_ping_loader_callbacks_;
   1740 }
   1741 
   1742 void TestRunner::setShouldDumpPingLoaderCallbacks(bool value) {
   1743   dump_ping_loader_callbacks_ = value;
   1744 }
   1745 
   1746 void TestRunner::setShouldEnableViewSource(bool value) {
   1747   web_view_->mainFrame()->enableViewSourceMode(value);
   1748 }
   1749 
   1750 bool TestRunner::shouldDumpUserGestureInFrameLoadCallbacks() const {
   1751   return test_is_running_ && dump_user_gesture_in_frame_load_callbacks_;
   1752 }
   1753 
   1754 bool TestRunner::shouldDumpTitleChanges() const {
   1755   return dump_title_changes_;
   1756 }
   1757 
   1758 bool TestRunner::shouldDumpIconChanges() const {
   1759   return dump_icon_changes_;
   1760 }
   1761 
   1762 bool TestRunner::shouldDumpCreateView() const {
   1763   return dump_create_view_;
   1764 }
   1765 
   1766 bool TestRunner::canOpenWindows() const {
   1767   return can_open_windows_;
   1768 }
   1769 
   1770 bool TestRunner::shouldDumpResourceLoadCallbacks() const {
   1771   return test_is_running_ && dump_resource_load_callbacks_;
   1772 }
   1773 
   1774 bool TestRunner::shouldDumpResourceRequestCallbacks() const {
   1775   return test_is_running_ && dump_resource_request_callbacks_;
   1776 }
   1777 
   1778 bool TestRunner::shouldDumpResourceResponseMIMETypes() const {
   1779   return test_is_running_ && dump_resource_reqponse_mime_types_;
   1780 }
   1781 
   1782 WebPermissionClient* TestRunner::GetWebPermissions() const {
   1783   return web_permissions_.get();
   1784 }
   1785 
   1786 bool TestRunner::shouldDumpStatusCallbacks() const {
   1787   return dump_window_status_changes_;
   1788 }
   1789 
   1790 bool TestRunner::shouldDumpProgressFinishedCallback() const {
   1791   return dump_progress_finished_callback_;
   1792 }
   1793 
   1794 bool TestRunner::shouldDumpSpellCheckCallbacks() const {
   1795   return dump_spell_check_callbacks_;
   1796 }
   1797 
   1798 bool TestRunner::ShouldDumpBackForwardList() const {
   1799   return dump_back_forward_list_;
   1800 }
   1801 
   1802 bool TestRunner::shouldDumpSelectionRect() const {
   1803   return dump_selection_rect_;
   1804 }
   1805 
   1806 bool TestRunner::isPrinting() const {
   1807   return is_printing_;
   1808 }
   1809 
   1810 bool TestRunner::shouldStayOnPageAfterHandlingBeforeUnload() const {
   1811   return should_stay_on_page_after_handling_before_unload_;
   1812 }
   1813 
   1814 bool TestRunner::shouldWaitUntilExternalURLLoad() const {
   1815   return wait_until_external_url_load_;
   1816 }
   1817 
   1818 const std::set<std::string>* TestRunner::httpHeadersToClear() const {
   1819   return &http_headers_to_clear_;
   1820 }
   1821 
   1822 void TestRunner::setTopLoadingFrame(WebFrame* frame, bool clear) {
   1823   if (frame->top()->view() != web_view_)
   1824     return;
   1825   if (!test_is_running_)
   1826     return;
   1827   if (clear) {
   1828     top_loading_frame_ = NULL;
   1829     LocationChangeDone();
   1830   } else if (!top_loading_frame_) {
   1831     top_loading_frame_ = frame;
   1832   }
   1833 }
   1834 
   1835 WebFrame* TestRunner::topLoadingFrame() const {
   1836   return top_loading_frame_;
   1837 }
   1838 
   1839 void TestRunner::policyDelegateDone() {
   1840   DCHECK(wait_until_done_);
   1841   delegate_->TestFinished();
   1842   wait_until_done_ = false;
   1843 }
   1844 
   1845 bool TestRunner::policyDelegateEnabled() const {
   1846   return policy_delegate_enabled_;
   1847 }
   1848 
   1849 bool TestRunner::policyDelegateIsPermissive() const {
   1850   return policy_delegate_is_permissive_;
   1851 }
   1852 
   1853 bool TestRunner::policyDelegateShouldNotifyDone() const {
   1854   return policy_delegate_should_notify_done_;
   1855 }
   1856 
   1857 bool TestRunner::shouldInterceptPostMessage() const {
   1858   return intercept_post_message_;
   1859 }
   1860 
   1861 bool TestRunner::shouldDumpResourcePriorities() const {
   1862   return should_dump_resource_priorities_;
   1863 }
   1864 
   1865 WebNotificationPresenter* TestRunner::notification_presenter() const {
   1866   return notification_presenter_.get();
   1867 }
   1868 
   1869 bool TestRunner::RequestPointerLock() {
   1870   switch (pointer_lock_planned_result_) {
   1871     case PointerLockWillSucceed:
   1872       delegate_->PostDelayedTask(
   1873           new HostMethodTask(this, &TestRunner::DidAcquirePointerLockInternal),
   1874           0);
   1875       return true;
   1876     case PointerLockWillRespondAsync:
   1877       DCHECK(!pointer_locked_);
   1878       return true;
   1879     case PointerLockWillFailSync:
   1880       DCHECK(!pointer_locked_);
   1881       return false;
   1882     default:
   1883       NOTREACHED();
   1884       return false;
   1885   }
   1886 }
   1887 
   1888 void TestRunner::RequestPointerUnlock() {
   1889   delegate_->PostDelayedTask(
   1890       new HostMethodTask(this, &TestRunner::DidLosePointerLockInternal), 0);
   1891 }
   1892 
   1893 bool TestRunner::isPointerLocked() {
   1894   return pointer_locked_;
   1895 }
   1896 
   1897 void TestRunner::setToolTipText(const WebString& text) {
   1898   tooltip_text_ = text.utf8();
   1899 }
   1900 
   1901 bool TestRunner::midiAccessorResult() {
   1902   return midi_accessor_result_;
   1903 }
   1904 
   1905 void TestRunner::ClearDevToolsLocalStorage() {
   1906   delegate_->ClearDevToolsLocalStorage();
   1907 }
   1908 
   1909 void TestRunner::ShowDevTools(const std::string& settings,
   1910                               const std::string& frontend_url) {
   1911   delegate_->ShowDevTools(settings, frontend_url);
   1912 }
   1913 
   1914 class WorkItemBackForward : public TestRunner::WorkItem {
   1915  public:
   1916   WorkItemBackForward(int distance) : distance_(distance) {}
   1917 
   1918   virtual bool Run(WebTestDelegate* delegate, WebView*) OVERRIDE {
   1919     delegate->GoToOffset(distance_);
   1920     return true; // FIXME: Did it really start a navigation?
   1921   }
   1922 
   1923  private:
   1924   int distance_;
   1925 };
   1926 
   1927 void TestRunner::NotifyDone() {
   1928   if (disable_notify_done_)
   1929     return;
   1930 
   1931   // Test didn't timeout. Kill the timeout timer.
   1932   task_list_.RevokeAll();
   1933 
   1934   CompleteNotifyDone();
   1935 }
   1936 
   1937 void TestRunner::WaitUntilDone() {
   1938   wait_until_done_ = true;
   1939 }
   1940 
   1941 void TestRunner::QueueBackNavigation(int how_far_back) {
   1942   work_queue_.AddWork(new WorkItemBackForward(-how_far_back));
   1943 }
   1944 
   1945 void TestRunner::QueueForwardNavigation(int how_far_forward) {
   1946   work_queue_.AddWork(new WorkItemBackForward(how_far_forward));
   1947 }
   1948 
   1949 class WorkItemReload : public TestRunner::WorkItem {
   1950  public:
   1951   virtual bool Run(WebTestDelegate* delegate, WebView*) OVERRIDE {
   1952     delegate->Reload();
   1953     return true;
   1954   }
   1955 };
   1956 
   1957 void TestRunner::QueueReload() {
   1958   work_queue_.AddWork(new WorkItemReload());
   1959 }
   1960 
   1961 class WorkItemLoadingScript : public TestRunner::WorkItem {
   1962  public:
   1963   WorkItemLoadingScript(const std::string& script)
   1964       : script_(script) {}
   1965 
   1966   virtual bool Run(WebTestDelegate*, WebView* web_view) OVERRIDE {
   1967     web_view->mainFrame()->executeScript(
   1968         WebScriptSource(WebString::fromUTF8(script_)));
   1969     return true; // FIXME: Did it really start a navigation?
   1970   }
   1971 
   1972  private:
   1973   std::string script_;
   1974 };
   1975 
   1976 void TestRunner::QueueLoadingScript(const std::string& script) {
   1977   work_queue_.AddWork(new WorkItemLoadingScript(script));
   1978 }
   1979 
   1980 class WorkItemNonLoadingScript : public TestRunner::WorkItem {
   1981  public:
   1982   WorkItemNonLoadingScript(const std::string& script)
   1983       : script_(script) {}
   1984 
   1985   virtual bool Run(WebTestDelegate*, WebView* web_view) OVERRIDE {
   1986     web_view->mainFrame()->executeScript(
   1987         WebScriptSource(WebString::fromUTF8(script_)));
   1988     return false;
   1989   }
   1990 
   1991  private:
   1992   std::string script_;
   1993 };
   1994 
   1995 void TestRunner::QueueNonLoadingScript(const std::string& script) {
   1996   work_queue_.AddWork(new WorkItemNonLoadingScript(script));
   1997 }
   1998 
   1999 class WorkItemLoad : public TestRunner::WorkItem {
   2000  public:
   2001   WorkItemLoad(const WebURL& url, const std::string& target)
   2002       : url_(url), target_(target) {}
   2003 
   2004   virtual bool Run(WebTestDelegate* delegate, WebView*) OVERRIDE {
   2005     delegate->LoadURLForFrame(url_, target_);
   2006     return true; // FIXME: Did it really start a navigation?
   2007   }
   2008 
   2009  private:
   2010   WebURL url_;
   2011   std::string target_;
   2012 };
   2013 
   2014 void TestRunner::QueueLoad(const std::string& url, const std::string& target) {
   2015   // FIXME: Implement WebURL::resolve() and avoid GURL.
   2016   GURL current_url = web_view_->mainFrame()->document().url();
   2017   GURL full_url = current_url.Resolve(url);
   2018   work_queue_.AddWork(new WorkItemLoad(full_url, target));
   2019 }
   2020 
   2021 class WorkItemLoadHTMLString : public TestRunner::WorkItem  {
   2022  public:
   2023   WorkItemLoadHTMLString(const std::string& html, const WebURL& base_url)
   2024       : html_(html), base_url_(base_url) {}
   2025 
   2026   WorkItemLoadHTMLString(const std::string& html, const WebURL& base_url,
   2027                          const WebURL& unreachable_url)
   2028       : html_(html), base_url_(base_url), unreachable_url_(unreachable_url) {}
   2029 
   2030   virtual bool Run(WebTestDelegate*, WebView* web_view) OVERRIDE {
   2031     web_view->mainFrame()->loadHTMLString(
   2032         WebData(html_.data(), html_.length()),
   2033         base_url_, unreachable_url_);
   2034     return true;
   2035   }
   2036 
   2037  private:
   2038   std::string html_;
   2039   WebURL base_url_;
   2040   WebURL unreachable_url_;
   2041 };
   2042 
   2043 void TestRunner::QueueLoadHTMLString(gin::Arguments* args) {
   2044   std::string html;
   2045   args->GetNext(&html);
   2046 
   2047   std::string base_url_str;
   2048   args->GetNext(&base_url_str);
   2049   WebURL base_url = WebURL(GURL(base_url_str));
   2050 
   2051   if (args->PeekNext()->IsString()) {
   2052     std::string unreachable_url_str;
   2053     args->GetNext(&unreachable_url_str);
   2054     WebURL unreachable_url = WebURL(GURL(unreachable_url_str));
   2055     work_queue_.AddWork(new WorkItemLoadHTMLString(html, base_url,
   2056                                                    unreachable_url));
   2057   } else {
   2058     work_queue_.AddWork(new WorkItemLoadHTMLString(html, base_url));
   2059   }
   2060 }
   2061 
   2062 void TestRunner::SetCustomPolicyDelegate(gin::Arguments* args) {
   2063   args->GetNext(&policy_delegate_enabled_);
   2064   if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsBoolean())
   2065     args->GetNext(&policy_delegate_is_permissive_);
   2066 }
   2067 
   2068 void TestRunner::WaitForPolicyDelegate() {
   2069   policy_delegate_enabled_ = true;
   2070   policy_delegate_should_notify_done_ = true;
   2071   wait_until_done_ = true;
   2072 }
   2073 
   2074 int TestRunner::WindowCount() {
   2075   return test_interfaces_->GetWindowList().size();
   2076 }
   2077 
   2078 void TestRunner::SetCloseRemainingWindowsWhenComplete(
   2079     bool close_remaining_windows) {
   2080   close_remaining_windows_ = close_remaining_windows;
   2081 }
   2082 
   2083 void TestRunner::ResetTestHelperControllers() {
   2084   test_interfaces_->ResetTestHelperControllers();
   2085 }
   2086 
   2087 void TestRunner::SetTabKeyCyclesThroughElements(
   2088     bool tab_key_cycles_through_elements) {
   2089   web_view_->setTabKeyCyclesThroughElements(tab_key_cycles_through_elements);
   2090 }
   2091 
   2092 void TestRunner::ExecCommand(gin::Arguments* args) {
   2093   std::string command;
   2094   args->GetNext(&command);
   2095 
   2096   std::string value;
   2097   if (args->Length() >= 3) {
   2098     // Ignore the second parameter (which is userInterface)
   2099     // since this command emulates a manual action.
   2100     args->Skip();
   2101     args->GetNext(&value);
   2102   }
   2103 
   2104   // Note: webkit's version does not return the boolean, so neither do we.
   2105   web_view_->focusedFrame()->executeCommand(WebString::fromUTF8(command),
   2106                                             WebString::fromUTF8(value));
   2107 }
   2108 
   2109 bool TestRunner::IsCommandEnabled(const std::string& command) {
   2110   return web_view_->focusedFrame()->isCommandEnabled(
   2111       WebString::fromUTF8(command));
   2112 }
   2113 
   2114 bool TestRunner::CallShouldCloseOnWebView() {
   2115   return web_view_->mainFrame()->dispatchBeforeUnloadEvent();
   2116 }
   2117 
   2118 void TestRunner::SetDomainRelaxationForbiddenForURLScheme(
   2119     bool forbidden, const std::string& scheme) {
   2120   web_view_->setDomainRelaxationForbidden(forbidden,
   2121                                           WebString::fromUTF8(scheme));
   2122 }
   2123 
   2124 v8::Handle<v8::Value> TestRunner::EvaluateScriptInIsolatedWorldAndReturnValue(
   2125     int world_id,
   2126     const std::string& script) {
   2127   WebVector<v8::Local<v8::Value> > values;
   2128   WebScriptSource source(WebString::fromUTF8(script));
   2129   // This relies on the iframe focusing itself when it loads. This is a bit
   2130   // sketchy, but it seems to be what other tests do.
   2131   web_view_->focusedFrame()->executeScriptInIsolatedWorld(
   2132       world_id, &source, 1, 1, &values);
   2133   // Since only one script was added, only one result is expected
   2134   if (values.size() == 1 && !values[0].IsEmpty())
   2135     return values[0];
   2136   return v8::Handle<v8::Value>();
   2137 }
   2138 
   2139 void TestRunner::EvaluateScriptInIsolatedWorld(int world_id,
   2140                                                const std::string& script) {
   2141   WebScriptSource source(WebString::fromUTF8(script));
   2142   web_view_->focusedFrame()->executeScriptInIsolatedWorld(
   2143       world_id, &source, 1, 1);
   2144 }
   2145 
   2146 void TestRunner::SetIsolatedWorldSecurityOrigin(int world_id,
   2147                                                 v8::Handle<v8::Value> origin) {
   2148   if (!(origin->IsString() || !origin->IsNull()))
   2149     return;
   2150 
   2151   WebSecurityOrigin web_origin;
   2152   if (origin->IsString()) {
   2153     web_origin = WebSecurityOrigin::createFromString(
   2154         V8StringToWebString(origin->ToString()));
   2155   }
   2156   web_view_->focusedFrame()->setIsolatedWorldSecurityOrigin(world_id,
   2157                                                             web_origin);
   2158 }
   2159 
   2160 void TestRunner::SetIsolatedWorldContentSecurityPolicy(
   2161     int world_id,
   2162     const std::string& policy) {
   2163   web_view_->focusedFrame()->setIsolatedWorldContentSecurityPolicy(
   2164       world_id, WebString::fromUTF8(policy));
   2165 }
   2166 
   2167 void TestRunner::AddOriginAccessWhitelistEntry(
   2168     const std::string& source_origin,
   2169     const std::string& destination_protocol,
   2170     const std::string& destination_host,
   2171     bool allow_destination_subdomains) {
   2172   WebURL url((GURL(source_origin)));
   2173   if (!url.isValid())
   2174     return;
   2175 
   2176   WebSecurityPolicy::addOriginAccessWhitelistEntry(
   2177       url,
   2178       WebString::fromUTF8(destination_protocol),
   2179       WebString::fromUTF8(destination_host),
   2180       allow_destination_subdomains);
   2181 }
   2182 
   2183 void TestRunner::RemoveOriginAccessWhitelistEntry(
   2184     const std::string& source_origin,
   2185     const std::string& destination_protocol,
   2186     const std::string& destination_host,
   2187     bool allow_destination_subdomains) {
   2188   WebURL url((GURL(source_origin)));
   2189   if (!url.isValid())
   2190     return;
   2191 
   2192   WebSecurityPolicy::removeOriginAccessWhitelistEntry(
   2193       url,
   2194       WebString::fromUTF8(destination_protocol),
   2195       WebString::fromUTF8(destination_host),
   2196       allow_destination_subdomains);
   2197 }
   2198 
   2199 bool TestRunner::HasCustomPageSizeStyle(int page_index) {
   2200   WebFrame* frame = web_view_->mainFrame();
   2201   if (!frame)
   2202     return false;
   2203   return frame->hasCustomPageSizeStyle(page_index);
   2204 }
   2205 
   2206 void TestRunner::ForceRedSelectionColors() {
   2207   web_view_->setSelectionColors(0xffee0000, 0xff00ee00, 0xff000000, 0xffc0c0c0);
   2208 }
   2209 
   2210 void TestRunner::InjectStyleSheet(const std::string& source_code,
   2211                                   bool all_frames) {
   2212   WebView::injectStyleSheet(
   2213       WebString::fromUTF8(source_code),
   2214       WebVector<WebString>(),
   2215       all_frames ? WebView::InjectStyleInAllFrames
   2216                  : WebView::InjectStyleInTopFrameOnly);
   2217 }
   2218 
   2219 bool TestRunner::FindString(const std::string& search_text,
   2220                             const std::vector<std::string>& options_array) {
   2221   WebFindOptions find_options;
   2222   bool wrap_around = false;
   2223   find_options.matchCase = true;
   2224   find_options.findNext = true;
   2225 
   2226   for (size_t i = 0; i < options_array.size(); ++i) {
   2227     const std::string& option = options_array[i];
   2228     if (option == "CaseInsensitive")
   2229       find_options.matchCase = false;
   2230     else if (option == "Backwards")
   2231       find_options.forward = false;
   2232     else if (option == "StartInSelection")
   2233       find_options.findNext = false;
   2234     else if (option == "AtWordStarts")
   2235       find_options.wordStart = true;
   2236     else if (option == "TreatMedialCapitalAsWordStart")
   2237       find_options.medialCapitalAsWordStart = true;
   2238     else if (option == "WrapAround")
   2239       wrap_around = true;
   2240   }
   2241 
   2242   WebFrame* frame = web_view_->mainFrame();
   2243   const bool find_result = frame->find(0, WebString::fromUTF8(search_text),
   2244                                        find_options, wrap_around, 0);
   2245   frame->stopFinding(false);
   2246   return find_result;
   2247 }
   2248 
   2249 std::string TestRunner::SelectionAsMarkup() {
   2250   return web_view_->mainFrame()->selectionAsMarkup().utf8();
   2251 }
   2252 
   2253 void TestRunner::SetTextSubpixelPositioning(bool value) {
   2254 #if defined(__linux__) || defined(ANDROID)
   2255   // Since FontConfig doesn't provide a variable to control subpixel
   2256   // positioning, we'll fall back to setting it globally for all fonts.
   2257   WebFontRendering::setSubpixelPositioning(value);
   2258 #endif
   2259 }
   2260 
   2261 void TestRunner::SetPageVisibility(const std::string& new_visibility) {
   2262   if (new_visibility == "visible")
   2263     web_view_->setVisibilityState(WebPageVisibilityStateVisible, false);
   2264   else if (new_visibility == "hidden")
   2265     web_view_->setVisibilityState(WebPageVisibilityStateHidden, false);
   2266   else if (new_visibility == "prerender")
   2267     web_view_->setVisibilityState(WebPageVisibilityStatePrerender, false);
   2268 }
   2269 
   2270 void TestRunner::SetTextDirection(const std::string& direction_name) {
   2271   // Map a direction name to a WebTextDirection value.
   2272   WebTextDirection direction;
   2273   if (direction_name == "auto")
   2274     direction = WebTextDirectionDefault;
   2275   else if (direction_name == "rtl")
   2276     direction = WebTextDirectionRightToLeft;
   2277   else if (direction_name == "ltr")
   2278     direction = WebTextDirectionLeftToRight;
   2279   else
   2280     return;
   2281 
   2282   web_view_->setTextDirection(direction);
   2283 }
   2284 
   2285 void TestRunner::UseUnfortunateSynchronousResizeMode() {
   2286   delegate_->UseUnfortunateSynchronousResizeMode(true);
   2287 }
   2288 
   2289 bool TestRunner::EnableAutoResizeMode(int min_width,
   2290                                       int min_height,
   2291                                       int max_width,
   2292                                       int max_height) {
   2293   WebSize min_size(min_width, min_height);
   2294   WebSize max_size(max_width, max_height);
   2295   delegate_->EnableAutoResizeMode(min_size, max_size);
   2296   return true;
   2297 }
   2298 
   2299 bool TestRunner::DisableAutoResizeMode(int new_width, int new_height) {
   2300   WebSize new_size(new_width, new_height);
   2301   delegate_->DisableAutoResizeMode(new_size);
   2302   return true;
   2303 }
   2304 
   2305 void TestRunner::SetMockDeviceLight(double value) {
   2306   delegate_->SetDeviceLightData(value);
   2307 }
   2308 
   2309 void TestRunner::ResetDeviceLight() {
   2310   delegate_->SetDeviceLightData(-1);
   2311 }
   2312 
   2313 void TestRunner::SetMockDeviceMotion(
   2314     bool has_acceleration_x, double acceleration_x,
   2315     bool has_acceleration_y, double acceleration_y,
   2316     bool has_acceleration_z, double acceleration_z,
   2317     bool has_acceleration_including_gravity_x,
   2318     double acceleration_including_gravity_x,
   2319     bool has_acceleration_including_gravity_y,
   2320     double acceleration_including_gravity_y,
   2321     bool has_acceleration_including_gravity_z,
   2322     double acceleration_including_gravity_z,
   2323     bool has_rotation_rate_alpha, double rotation_rate_alpha,
   2324     bool has_rotation_rate_beta, double rotation_rate_beta,
   2325     bool has_rotation_rate_gamma, double rotation_rate_gamma,
   2326     double interval) {
   2327   WebDeviceMotionData motion;
   2328 
   2329   // acceleration
   2330   motion.hasAccelerationX = has_acceleration_x;
   2331   motion.accelerationX = acceleration_x;
   2332   motion.hasAccelerationY = has_acceleration_y;
   2333   motion.accelerationY = acceleration_y;
   2334   motion.hasAccelerationZ = has_acceleration_z;
   2335   motion.accelerationZ = acceleration_z;
   2336 
   2337   // accelerationIncludingGravity
   2338   motion.hasAccelerationIncludingGravityX =
   2339       has_acceleration_including_gravity_x;
   2340   motion.accelerationIncludingGravityX = acceleration_including_gravity_x;
   2341   motion.hasAccelerationIncludingGravityY =
   2342       has_acceleration_including_gravity_y;
   2343   motion.accelerationIncludingGravityY = acceleration_including_gravity_y;
   2344   motion.hasAccelerationIncludingGravityZ =
   2345       has_acceleration_including_gravity_z;
   2346   motion.accelerationIncludingGravityZ = acceleration_including_gravity_z;
   2347 
   2348   // rotationRate
   2349   motion.hasRotationRateAlpha = has_rotation_rate_alpha;
   2350   motion.rotationRateAlpha = rotation_rate_alpha;
   2351   motion.hasRotationRateBeta = has_rotation_rate_beta;
   2352   motion.rotationRateBeta = rotation_rate_beta;
   2353   motion.hasRotationRateGamma = has_rotation_rate_gamma;
   2354   motion.rotationRateGamma = rotation_rate_gamma;
   2355 
   2356   // interval
   2357   motion.interval = interval;
   2358 
   2359   delegate_->SetDeviceMotionData(motion);
   2360 }
   2361 
   2362 void TestRunner::SetMockDeviceOrientation(bool has_alpha, double alpha,
   2363                                           bool has_beta, double beta,
   2364                                           bool has_gamma, double gamma,
   2365                                           bool has_absolute, bool absolute) {
   2366   WebDeviceOrientationData orientation;
   2367 
   2368   // alpha
   2369   orientation.hasAlpha = has_alpha;
   2370   orientation.alpha = alpha;
   2371 
   2372   // beta
   2373   orientation.hasBeta = has_beta;
   2374   orientation.beta = beta;
   2375 
   2376   // gamma
   2377   orientation.hasGamma = has_gamma;
   2378   orientation.gamma = gamma;
   2379 
   2380   // absolute
   2381   orientation.hasAbsolute = has_absolute;
   2382   orientation.absolute = absolute;
   2383 
   2384   delegate_->SetDeviceOrientationData(orientation);
   2385 }
   2386 
   2387 void TestRunner::SetMockScreenOrientation(const std::string& orientation_str) {
   2388   blink::WebScreenOrientationType orientation;
   2389 
   2390   if (orientation_str == "portrait-primary") {
   2391     orientation = WebScreenOrientationPortraitPrimary;
   2392   } else if (orientation_str == "portrait-secondary") {
   2393     orientation = WebScreenOrientationPortraitSecondary;
   2394   } else if (orientation_str == "landscape-primary") {
   2395     orientation = WebScreenOrientationLandscapePrimary;
   2396   } else if (orientation_str == "landscape-secondary") {
   2397     orientation = WebScreenOrientationLandscapeSecondary;
   2398   }
   2399 
   2400   delegate_->SetScreenOrientation(orientation);
   2401 }
   2402 
   2403 void TestRunner::DidChangeBatteryStatus(bool charging,
   2404                                         double chargingTime,
   2405                                         double dischargingTime,
   2406                                         double level) {
   2407   blink::WebBatteryStatus status;
   2408   status.charging = charging;
   2409   status.chargingTime = chargingTime;
   2410   status.dischargingTime = dischargingTime;
   2411   status.level = level;
   2412   delegate_->DidChangeBatteryStatus(status);
   2413 }
   2414 
   2415 void TestRunner::ResetBatteryStatus() {
   2416   blink::WebBatteryStatus status;
   2417   delegate_->DidChangeBatteryStatus(status);
   2418 }
   2419 
   2420 void TestRunner::DidAcquirePointerLock() {
   2421   DidAcquirePointerLockInternal();
   2422 }
   2423 
   2424 void TestRunner::DidNotAcquirePointerLock() {
   2425   DidNotAcquirePointerLockInternal();
   2426 }
   2427 
   2428 void TestRunner::DidLosePointerLock() {
   2429   DidLosePointerLockInternal();
   2430 }
   2431 
   2432 void TestRunner::SetPointerLockWillFailSynchronously() {
   2433   pointer_lock_planned_result_ = PointerLockWillFailSync;
   2434 }
   2435 
   2436 void TestRunner::SetPointerLockWillRespondAsynchronously() {
   2437   pointer_lock_planned_result_ = PointerLockWillRespondAsync;
   2438 }
   2439 
   2440 void TestRunner::SetPopupBlockingEnabled(bool block_popups) {
   2441   delegate_->Preferences()->java_script_can_open_windows_automatically =
   2442       !block_popups;
   2443   delegate_->ApplyPreferences();
   2444 }
   2445 
   2446 void TestRunner::SetJavaScriptCanAccessClipboard(bool can_access) {
   2447   delegate_->Preferences()->java_script_can_access_clipboard = can_access;
   2448   delegate_->ApplyPreferences();
   2449 }
   2450 
   2451 void TestRunner::SetXSSAuditorEnabled(bool enabled) {
   2452   delegate_->Preferences()->xss_auditor_enabled = enabled;
   2453   delegate_->ApplyPreferences();
   2454 }
   2455 
   2456 void TestRunner::SetAllowUniversalAccessFromFileURLs(bool allow) {
   2457   delegate_->Preferences()->allow_universal_access_from_file_urls = allow;
   2458   delegate_->ApplyPreferences();
   2459 }
   2460 
   2461 void TestRunner::SetAllowFileAccessFromFileURLs(bool allow) {
   2462   delegate_->Preferences()->allow_file_access_from_file_urls = allow;
   2463   delegate_->ApplyPreferences();
   2464 }
   2465 
   2466 void TestRunner::OverridePreference(const std::string key,
   2467                                     v8::Handle<v8::Value> value) {
   2468   TestPreferences* prefs = delegate_->Preferences();
   2469   if (key == "WebKitDefaultFontSize") {
   2470     prefs->default_font_size = value->Int32Value();
   2471   } else if (key == "WebKitMinimumFontSize") {
   2472     prefs->minimum_font_size = value->Int32Value();
   2473   } else if (key == "WebKitDefaultTextEncodingName") {
   2474     prefs->default_text_encoding_name = V8StringToWebString(value->ToString());
   2475   } else if (key == "WebKitJavaScriptEnabled") {
   2476     prefs->java_script_enabled = value->BooleanValue();
   2477   } else if (key == "WebKitSupportsMultipleWindows") {
   2478     prefs->supports_multiple_windows = value->BooleanValue();
   2479   } else if (key == "WebKitDisplayImagesKey") {
   2480     prefs->loads_images_automatically = value->BooleanValue();
   2481   } else if (key == "WebKitPluginsEnabled") {
   2482     prefs->plugins_enabled = value->BooleanValue();
   2483   } else if (key == "WebKitJavaEnabled") {
   2484     prefs->java_enabled = value->BooleanValue();
   2485   } else if (key == "WebKitOfflineWebApplicationCacheEnabled") {
   2486     prefs->offline_web_application_cache_enabled = value->BooleanValue();
   2487   } else if (key == "WebKitTabToLinksPreferenceKey") {
   2488     prefs->tabs_to_links = value->BooleanValue();
   2489   } else if (key == "WebKitWebGLEnabled") {
   2490     prefs->experimental_webgl_enabled = value->BooleanValue();
   2491   } else if (key == "WebKitCSSRegionsEnabled") {
   2492     prefs->experimental_css_regions_enabled = value->BooleanValue();
   2493   } else if (key == "WebKitCSSGridLayoutEnabled") {
   2494     prefs->experimental_css_grid_layout_enabled = value->BooleanValue();
   2495   } else if (key == "WebKitHyperlinkAuditingEnabled") {
   2496     prefs->hyperlink_auditing_enabled = value->BooleanValue();
   2497   } else if (key == "WebKitEnableCaretBrowsing") {
   2498     prefs->caret_browsing_enabled = value->BooleanValue();
   2499   } else if (key == "WebKitAllowDisplayingInsecureContent") {
   2500     prefs->allow_display_of_insecure_content = value->BooleanValue();
   2501   } else if (key == "WebKitAllowRunningInsecureContent") {
   2502     prefs->allow_running_of_insecure_content = value->BooleanValue();
   2503   } else if (key == "WebKitShouldRespectImageOrientation") {
   2504     prefs->should_respect_image_orientation = value->BooleanValue();
   2505   } else if (key == "WebKitWebAudioEnabled") {
   2506     DCHECK(value->BooleanValue());
   2507   } else if (key == "WebKitWebSecurityEnabled") {
   2508     prefs->web_security_enabled = value->BooleanValue();
   2509   } else {
   2510     std::string message("Invalid name for preference: ");
   2511     message.append(key);
   2512     delegate_->PrintMessage(std::string("CONSOLE MESSAGE: ") + message + "\n");
   2513   }
   2514   delegate_->ApplyPreferences();
   2515 }
   2516 
   2517 void TestRunner::SetAcceptLanguages(const std::string& accept_languages) {
   2518   proxy_->SetAcceptLanguages(accept_languages);
   2519 }
   2520 
   2521 void TestRunner::SetPluginsEnabled(bool enabled) {
   2522   delegate_->Preferences()->plugins_enabled = enabled;
   2523   delegate_->ApplyPreferences();
   2524 }
   2525 
   2526 void TestRunner::DumpEditingCallbacks() {
   2527   dump_editting_callbacks_ = true;
   2528 }
   2529 
   2530 void TestRunner::DumpAsMarkup() {
   2531   dump_as_markup_ = true;
   2532   generate_pixel_results_ = false;
   2533 }
   2534 
   2535 void TestRunner::DumpAsText() {
   2536   dump_as_text_ = true;
   2537   generate_pixel_results_ = false;
   2538 }
   2539 
   2540 void TestRunner::DumpAsTextWithPixelResults() {
   2541   dump_as_text_ = true;
   2542   generate_pixel_results_ = true;
   2543 }
   2544 
   2545 void TestRunner::DumpChildFrameScrollPositions() {
   2546   dump_child_frame_scroll_positions_ = true;
   2547 }
   2548 
   2549 void TestRunner::DumpChildFramesAsMarkup() {
   2550   dump_child_frames_as_markup_ = true;
   2551 }
   2552 
   2553 void TestRunner::DumpChildFramesAsText() {
   2554   dump_child_frames_as_text_ = true;
   2555 }
   2556 
   2557 void TestRunner::DumpIconChanges() {
   2558   dump_icon_changes_ = true;
   2559 }
   2560 
   2561 void TestRunner::SetAudioData(const gin::ArrayBufferView& view) {
   2562   unsigned char* bytes = static_cast<unsigned char*>(view.bytes());
   2563   audio_data_.resize(view.num_bytes());
   2564   std::copy(bytes, bytes + view.num_bytes(), audio_data_.begin());
   2565   dump_as_audio_ = true;
   2566 }
   2567 
   2568 void TestRunner::DumpFrameLoadCallbacks() {
   2569   dump_frame_load_callbacks_ = true;
   2570 }
   2571 
   2572 void TestRunner::DumpPingLoaderCallbacks() {
   2573   dump_ping_loader_callbacks_ = true;
   2574 }
   2575 
   2576 void TestRunner::DumpUserGestureInFrameLoadCallbacks() {
   2577   dump_user_gesture_in_frame_load_callbacks_ = true;
   2578 }
   2579 
   2580 void TestRunner::DumpTitleChanges() {
   2581   dump_title_changes_ = true;
   2582 }
   2583 
   2584 void TestRunner::DumpCreateView() {
   2585   dump_create_view_ = true;
   2586 }
   2587 
   2588 void TestRunner::SetCanOpenWindows() {
   2589   can_open_windows_ = true;
   2590 }
   2591 
   2592 void TestRunner::DumpResourceLoadCallbacks() {
   2593   dump_resource_load_callbacks_ = true;
   2594 }
   2595 
   2596 void TestRunner::DumpResourceRequestCallbacks() {
   2597   dump_resource_request_callbacks_ = true;
   2598 }
   2599 
   2600 void TestRunner::DumpResourceResponseMIMETypes() {
   2601   dump_resource_reqponse_mime_types_ = true;
   2602 }
   2603 
   2604 void TestRunner::SetImagesAllowed(bool allowed) {
   2605   web_permissions_->SetImagesAllowed(allowed);
   2606 }
   2607 
   2608 void TestRunner::SetMediaAllowed(bool allowed) {
   2609   web_permissions_->SetMediaAllowed(allowed);
   2610 }
   2611 
   2612 void TestRunner::SetScriptsAllowed(bool allowed) {
   2613   web_permissions_->SetScriptsAllowed(allowed);
   2614 }
   2615 
   2616 void TestRunner::SetStorageAllowed(bool allowed) {
   2617   web_permissions_->SetStorageAllowed(allowed);
   2618 }
   2619 
   2620 void TestRunner::SetPluginsAllowed(bool allowed) {
   2621   web_permissions_->SetPluginsAllowed(allowed);
   2622 }
   2623 
   2624 void TestRunner::SetAllowDisplayOfInsecureContent(bool allowed) {
   2625   web_permissions_->SetDisplayingInsecureContentAllowed(allowed);
   2626 }
   2627 
   2628 void TestRunner::SetAllowRunningOfInsecureContent(bool allowed) {
   2629   web_permissions_->SetRunningInsecureContentAllowed(allowed);
   2630 }
   2631 
   2632 void TestRunner::DumpPermissionClientCallbacks() {
   2633   web_permissions_->SetDumpCallbacks(true);
   2634 }
   2635 
   2636 void TestRunner::DumpWindowStatusChanges() {
   2637   dump_window_status_changes_ = true;
   2638 }
   2639 
   2640 void TestRunner::DumpProgressFinishedCallback() {
   2641   dump_progress_finished_callback_ = true;
   2642 }
   2643 
   2644 void TestRunner::DumpSpellCheckCallbacks() {
   2645   dump_spell_check_callbacks_ = true;
   2646 }
   2647 
   2648 void TestRunner::DumpBackForwardList() {
   2649   dump_back_forward_list_ = true;
   2650 }
   2651 
   2652 void TestRunner::DumpSelectionRect() {
   2653   dump_selection_rect_ = true;
   2654 }
   2655 
   2656 void TestRunner::SetPrinting() {
   2657   is_printing_ = true;
   2658 }
   2659 
   2660 void TestRunner::ClearPrinting() {
   2661   is_printing_ = false;
   2662 }
   2663 
   2664 void TestRunner::SetShouldStayOnPageAfterHandlingBeforeUnload(bool value) {
   2665   should_stay_on_page_after_handling_before_unload_ = value;
   2666 }
   2667 
   2668 void TestRunner::SetWillSendRequestClearHeader(const std::string& header) {
   2669   if (!header.empty())
   2670     http_headers_to_clear_.insert(header);
   2671 }
   2672 
   2673 void TestRunner::DumpResourceRequestPriorities() {
   2674   should_dump_resource_priorities_ = true;
   2675 }
   2676 
   2677 void TestRunner::SetUseMockTheme(bool use) {
   2678   use_mock_theme_ = use;
   2679 }
   2680 
   2681 void TestRunner::ShowWebInspector(const std::string& str,
   2682                                   const std::string& frontend_url) {
   2683   ShowDevTools(str, frontend_url);
   2684 }
   2685 
   2686 void TestRunner::WaitUntilExternalURLLoad() {
   2687   wait_until_external_url_load_ = true;
   2688 }
   2689 
   2690 void TestRunner::CloseWebInspector() {
   2691   delegate_->CloseDevTools();
   2692 }
   2693 
   2694 bool TestRunner::IsChooserShown() {
   2695   return proxy_->IsChooserShown();
   2696 }
   2697 
   2698 void TestRunner::EvaluateInWebInspector(int call_id,
   2699                                         const std::string& script) {
   2700   delegate_->EvaluateInWebInspector(call_id, script);
   2701 }
   2702 
   2703 void TestRunner::ClearAllDatabases() {
   2704   delegate_->ClearAllDatabases();
   2705 }
   2706 
   2707 void TestRunner::SetDatabaseQuota(int quota) {
   2708   delegate_->SetDatabaseQuota(quota);
   2709 }
   2710 
   2711 void TestRunner::SetAlwaysAcceptCookies(bool accept) {
   2712   delegate_->SetAcceptAllCookies(accept);
   2713 }
   2714 
   2715 void TestRunner::SetWindowIsKey(bool value) {
   2716   delegate_->SetFocus(proxy_, value);
   2717 }
   2718 
   2719 std::string TestRunner::PathToLocalResource(const std::string& path) {
   2720   return delegate_->PathToLocalResource(path);
   2721 }
   2722 
   2723 void TestRunner::SetBackingScaleFactor(double value,
   2724                                        v8::Handle<v8::Function> callback) {
   2725   delegate_->SetDeviceScaleFactor(value);
   2726   delegate_->PostTask(new InvokeCallbackTask(this, callback));
   2727 }
   2728 
   2729 void TestRunner::SetColorProfile(const std::string& name,
   2730                                  v8::Handle<v8::Function> callback) {
   2731   delegate_->SetDeviceColorProfile(name);
   2732   delegate_->PostTask(new InvokeCallbackTask(this, callback));
   2733 }
   2734 
   2735 void TestRunner::SetPOSIXLocale(const std::string& locale) {
   2736   delegate_->SetLocale(locale);
   2737 }
   2738 
   2739 void TestRunner::SetMIDIAccessorResult(bool result) {
   2740   midi_accessor_result_ = result;
   2741 }
   2742 
   2743 void TestRunner::SetMIDISysexPermission(bool value) {
   2744   const std::vector<WebTestProxyBase*>& windowList =
   2745       test_interfaces_->GetWindowList();
   2746   for (unsigned i = 0; i < windowList.size(); ++i)
   2747     windowList.at(i)->GetMIDIClientMock()->setSysexPermission(value);
   2748 }
   2749 
   2750 void TestRunner::GrantWebNotificationPermission(const GURL& origin,
   2751                                                 bool permission_granted) {
   2752   delegate_->GrantWebNotificationPermission(origin, permission_granted);
   2753 }
   2754 
   2755 void TestRunner::ClearWebNotificationPermissions() {
   2756   delegate_->ClearWebNotificationPermissions();
   2757 }
   2758 
   2759 bool TestRunner::SimulateWebNotificationClick(const std::string& value) {
   2760   return notification_presenter_->SimulateClick(value);
   2761 }
   2762 
   2763 void TestRunner::AddMockSpeechRecognitionResult(const std::string& transcript,
   2764                                                 double confidence) {
   2765   proxy_->GetSpeechRecognizerMock()->AddMockResult(
   2766       WebString::fromUTF8(transcript), confidence);
   2767 }
   2768 
   2769 void TestRunner::SetMockSpeechRecognitionError(const std::string& error,
   2770                                                const std::string& message) {
   2771   proxy_->GetSpeechRecognizerMock()->SetError(WebString::fromUTF8(error),
   2772                                               WebString::fromUTF8(message));
   2773 }
   2774 
   2775 bool TestRunner::WasMockSpeechRecognitionAborted() {
   2776   return proxy_->GetSpeechRecognizerMock()->WasAborted();
   2777 }
   2778 
   2779 void TestRunner::AddMockCredentialManagerResponse(const std::string& id,
   2780                                                   const std::string& name,
   2781                                                   const std::string& avatar,
   2782                                                   const std::string& password) {
   2783   proxy_->GetCredentialManagerClientMock()->SetResponse(
   2784       new WebLocalCredential(WebString::fromUTF8(id),
   2785                              WebString::fromUTF8(name),
   2786                              WebURL(GURL(avatar)),
   2787                              WebString::fromUTF8(password)));
   2788 }
   2789 
   2790 void TestRunner::AddWebPageOverlay() {
   2791   if (web_view_ && !page_overlay_) {
   2792     page_overlay_ = new TestPageOverlay(web_view_);
   2793     web_view_->addPageOverlay(page_overlay_, 0);
   2794   }
   2795 }
   2796 
   2797 void TestRunner::RemoveWebPageOverlay() {
   2798   if (web_view_ && page_overlay_) {
   2799     web_view_->removePageOverlay(page_overlay_);
   2800     delete page_overlay_;
   2801     page_overlay_ = NULL;
   2802   }
   2803 }
   2804 
   2805 void TestRunner::DisplayAsync() {
   2806   proxy_->DisplayAsyncThen(base::Closure());
   2807 }
   2808 
   2809 void TestRunner::DisplayAsyncThen(v8::Handle<v8::Function> callback) {
   2810   scoped_ptr<InvokeCallbackTask> task(
   2811       new InvokeCallbackTask(this, callback));
   2812   proxy_->DisplayAsyncThen(base::Bind(&TestRunner::InvokeCallback,
   2813                                       base::Unretained(this),
   2814                                       base::Passed(&task)));
   2815 }
   2816 
   2817 void TestRunner::GetManifestThen(v8::Handle<v8::Function> callback) {
   2818   scoped_ptr<InvokeCallbackTask> task(
   2819       new InvokeCallbackTask(this, callback));
   2820 
   2821   FetchManifest(web_view_, web_view_->mainFrame()->document().manifestURL(),
   2822       base::Bind(&TestRunner::GetManifestCallback,
   2823                  base::Unretained(this),
   2824                  base::Passed(&task)));
   2825 }
   2826 
   2827 void TestRunner::CapturePixelsAsyncThen(v8::Handle<v8::Function> callback) {
   2828   scoped_ptr<InvokeCallbackTask> task(
   2829       new InvokeCallbackTask(this, callback));
   2830   proxy_->CapturePixelsAsync(base::Bind(&TestRunner::CapturePixelsCallback,
   2831                                         base::Unretained(this),
   2832                                         base::Passed(&task)));
   2833 }
   2834 
   2835 void TestRunner::CopyImageAtAndCapturePixelsAsyncThen(
   2836     int x, int y, v8::Handle<v8::Function> callback) {
   2837   scoped_ptr<InvokeCallbackTask> task(
   2838       new InvokeCallbackTask(this, callback));
   2839   proxy_->CopyImageAtAndCapturePixels(
   2840       x, y, base::Bind(&TestRunner::CapturePixelsCallback,
   2841                        base::Unretained(this),
   2842                        base::Passed(&task)));
   2843 }
   2844 
   2845 void TestRunner::GetManifestCallback(scoped_ptr<InvokeCallbackTask> task,
   2846                                      const blink::WebURLResponse& response,
   2847                                      const std::string& data) {
   2848   InvokeCallback(task.Pass());
   2849 }
   2850 
   2851 void TestRunner::CapturePixelsCallback(scoped_ptr<InvokeCallbackTask> task,
   2852                                        const SkBitmap& snapshot) {
   2853   v8::Isolate* isolate = blink::mainThreadIsolate();
   2854   v8::HandleScope handle_scope(isolate);
   2855 
   2856   v8::Handle<v8::Context> context =
   2857       web_view_->mainFrame()->mainWorldScriptContext();
   2858   if (context.IsEmpty())
   2859     return;
   2860 
   2861   v8::Context::Scope context_scope(context);
   2862   v8::Handle<v8::Value> argv[3];
   2863   SkAutoLockPixels snapshot_lock(snapshot);
   2864 
   2865   // Size can be 0 for cases where copyImageAt was called on position
   2866   // that doesn't have an image.
   2867   int width = snapshot.info().fWidth;
   2868   argv[0] = v8::Number::New(isolate, width);
   2869 
   2870   int height = snapshot.info().fHeight;
   2871   argv[1] = v8::Number::New(isolate, height);
   2872 
   2873   blink::WebArrayBuffer buffer =
   2874       blink::WebArrayBuffer::create(snapshot.getSize(), 1);
   2875   memcpy(buffer.data(), snapshot.getPixels(), buffer.byteLength());
   2876 #if (SK_R32_SHIFT == 16) && !SK_B32_SHIFT
   2877   {
   2878     // Skia's internal byte order is BGRA. Must swap the B and R channels in
   2879     // order to provide a consistent ordering to the layout tests.
   2880     unsigned char* pixels = static_cast<unsigned char*>(buffer.data());
   2881     unsigned len = buffer.byteLength();
   2882     for (unsigned i = 0; i < len; i += 4) {
   2883       std::swap(pixels[i], pixels[i + 2]);
   2884     }
   2885   }
   2886 #endif
   2887 
   2888   argv[2] = blink::WebArrayBufferConverter::toV8Value(
   2889       &buffer, context->Global(), isolate);
   2890 
   2891   task->SetArguments(3, argv);
   2892   InvokeCallback(task.Pass());
   2893 }
   2894 
   2895 void TestRunner::SetMockPushClientSuccess(const std::string& endpoint,
   2896                                           const std::string& registration_id) {
   2897   proxy_->GetPushClientMock()->SetMockSuccessValues(endpoint, registration_id);
   2898 }
   2899 
   2900 void TestRunner::SetMockPushClientError(const std::string& message) {
   2901   proxy_->GetPushClientMock()->SetMockErrorValues(message);
   2902 }
   2903 
   2904 void TestRunner::LocationChangeDone() {
   2905   web_history_item_count_ = delegate_->NavigationEntryCount();
   2906 
   2907   // No more new work after the first complete load.
   2908   work_queue_.set_frozen(true);
   2909 
   2910   if (!wait_until_done_)
   2911     work_queue_.ProcessWorkSoon();
   2912 }
   2913 
   2914 void TestRunner::CheckResponseMimeType() {
   2915   // Text output: the test page can request different types of output which we
   2916   // handle here.
   2917   if (!dump_as_text_) {
   2918     std::string mimeType =
   2919         web_view_->mainFrame()->dataSource()->response().mimeType().utf8();
   2920     if (mimeType == "text/plain") {
   2921       dump_as_text_ = true;
   2922       generate_pixel_results_ = false;
   2923     }
   2924   }
   2925 }
   2926 
   2927 void TestRunner::CompleteNotifyDone() {
   2928   if (wait_until_done_ && !topLoadingFrame() && work_queue_.is_empty())
   2929     delegate_->TestFinished();
   2930   wait_until_done_ = false;
   2931 }
   2932 
   2933 void TestRunner::DidAcquirePointerLockInternal() {
   2934   pointer_locked_ = true;
   2935   web_view_->didAcquirePointerLock();
   2936 
   2937   // Reset planned result to default.
   2938   pointer_lock_planned_result_ = PointerLockWillSucceed;
   2939 }
   2940 
   2941 void TestRunner::DidNotAcquirePointerLockInternal() {
   2942   DCHECK(!pointer_locked_);
   2943   pointer_locked_ = false;
   2944   web_view_->didNotAcquirePointerLock();
   2945 
   2946   // Reset planned result to default.
   2947   pointer_lock_planned_result_ = PointerLockWillSucceed;
   2948 }
   2949 
   2950 void TestRunner::DidLosePointerLockInternal() {
   2951   bool was_locked = pointer_locked_;
   2952   pointer_locked_ = false;
   2953   if (was_locked)
   2954     web_view_->didLosePointerLock();
   2955 }
   2956 
   2957 }  // namespace content
   2958