1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/web_test_proxy.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <cctype>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback_helpers.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/command_line.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/debug/trace_event.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/stringprintf.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/utf_string_conversions.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/content_switches.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/accessibility_controller.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/event_sender.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/renderer/test_runner/mock_color_chooser.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/shell/renderer/test_runner/mock_credential_manager_client.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/shell/renderer/test_runner/mock_screen_orientation_client.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/shell/renderer/test_runner/mock_web_push_client.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/renderer/test_runner/mock_web_speech_recognizer.h"
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/shell/renderer/test_runner/mock_web_user_media_client.h"
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/renderer/test_runner/spell_check_client.h"
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/test_interfaces.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/shell/renderer/test_runner/test_plugin.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/test_runner.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/shell/renderer/test_runner/web_test_delegate.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/shell/renderer/test_runner/web_test_interfaces.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/web_test_runner.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// FIXME: Including platform_canvas.h here is a layering violation.
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/WebKit/public/platform/Platform.h"
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCString.h"
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebClipboard.h"
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallback.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h"
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebAXEnums.h"
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebAXObject.h"
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCachedURLRequest.h"
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebConsoleMessage.h"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDataSource.h"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHistoryItem.h"
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebLocalFrame.h"
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMIDIClientMock.h"
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h"
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebPagePopup.h"
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginParams.h"
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h"
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRange.h"
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebWidgetClient.h"
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content {
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CaptureCallback : public blink::WebCompositeAndReadbackAsyncCallback {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CaptureCallback(const base::Callback<void(const SkBitmap&)>& callback);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~CaptureCallback();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_wait_for_popup(bool wait) { wait_for_popup_ = wait; }
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_popup_position(const gfx::Point& position) {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    popup_position_ = position;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // WebCompositeAndReadbackAsyncCallback implementation.
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void didCompositeAndReadback(const SkBitmap& bitmap);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Callback<void(const SkBitmap&)> callback_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkBitmap main_bitmap_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool wait_for_popup_;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Point popup_position_;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class HostMethodTask : public WebMethodTask<WebTestProxyBase> {
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef void (WebTestProxyBase::*CallbackMethodType)();
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HostMethodTask(WebTestProxyBase* object, CallbackMethodType callback)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : WebMethodTask<WebTestProxyBase>(object), callback_(callback) {}
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RunIfValid() OVERRIDE { (object_->*callback_)(); }
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallbackMethodType callback_;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrintFrameDescription(WebTestDelegate* delegate, blink::WebFrame* frame) {
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string name8 = frame->uniqueName().utf8();
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame == frame->view()->mainFrame()) {
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!name8.length()) {
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate->PrintMessage("main frame");
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate->PrintMessage(std::string("main frame \"") + name8 + "\"");
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!name8.length()) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate->PrintMessage("frame (anonymous)");
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate->PrintMessage(std::string("frame \"") + name8 + "\"");
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrintFrameuserGestureStatus(WebTestDelegate* delegate,
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 blink::WebFrame* frame,
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const char* msg) {
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_user_gesture =
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      blink::WebUserGestureIndicator::isProcessingUserGesture();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate->PrintMessage(std::string("Frame with user gesture \"") +
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         (is_user_gesture ? "true" : "false") + "\"" + msg);
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Used to write a platform neutral file:/// URL by taking the
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// filename and its directory. (e.g., converts
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// "file:///tmp/foo/bar.txt" to just "bar.txt").
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DescriptionSuitableForTestResult(const std::string& url) {
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (url.empty() || std::string::npos == url.find("file://"))
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url;
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t pos = url.rfind('/');
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pos == std::string::npos || !pos)
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "ERROR:" + url;
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  pos = url.rfind('/', pos - 1);
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pos == std::string::npos)
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "ERROR:" + url;
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return url.substr(pos + 1);
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrintResponseDescription(WebTestDelegate* delegate,
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              const blink::WebURLResponse& response) {
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (response.isNull()) {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate->PrintMessage("(null)");
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate->PrintMessage(base::StringPrintf(
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "<NSURLResponse %s, http status code %d>",
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      DescriptionSuitableForTestResult(response.url().spec()).c_str(),
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      response.httpStatusCode()));
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string URLDescription(const GURL& url) {
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (url.SchemeIs(url::kFileScheme))
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url.ExtractFileName();
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return url.possibly_invalid_spec();
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string PriorityDescription(
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest::Priority& priority) {
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (priority) {
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityVeryLow:
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "VeryLow";
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityLow:
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "Low";
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityMedium:
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "Medium";
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityHigh:
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "High";
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityVeryHigh:
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "VeryHigh";
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityUnresolved:
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "Unresolved";
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BlockRequest(blink::WebURLRequest& request) {
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request.setURL(GURL("255.255.255.255"));
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsLocalHost(const std::string& host) {
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return host == "127.0.0.1" || host == "localhost";
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool IsTestHost(const std::string& host) {
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return EndsWith(host, ".test", false);
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HostIsUsedBySomeTestsToGenerateError(const std::string& host) {
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return host == "255.255.255.255";
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Used to write a platform neutral file:/// URL by only taking the filename
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// (e.g., converts "file:///tmp/foo.txt" to just "foo.txt").
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string URLSuitableForTestResult(const std::string& url) {
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (url.empty() || std::string::npos == url.find("file://"))
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url;
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t pos = url.rfind('/');
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pos == std::string::npos) {
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef WIN32
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pos = url.rfind('\\');
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (pos == std::string::npos)
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pos = 0;
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pos = 0;
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string filename = url.substr(pos + 1);
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (filename.empty())
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "file:";  // A WebKit test has this in its expected output.
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return filename;
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// WebNavigationType debugging strings taken from PolicyDelegate.mm.
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kLinkClickedString = "link clicked";
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kFormSubmittedString = "form submitted";
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kBackForwardString = "back/forward";
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kReloadString = "reload";
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kFormResubmittedString = "form resubmitted";
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kOtherString = "other";
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kIllegalString = "illegal value";
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Get a debugging string from a WebNavigationType.
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* WebNavigationTypeToString(blink::WebNavigationType type) {
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type) {
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeLinkClicked:
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kLinkClickedString;
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeFormSubmitted:
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kFormSubmittedString;
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeBackForward:
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kBackForwardString;
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeReload:
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kReloadString;
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeFormResubmitted:
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kFormResubmittedString;
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeOther:
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kOtherString;
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return kIllegalString;
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DumpFrameHeaderIfNeeded(blink::WebFrame* frame) {
24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string result;
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Add header for all but the main frame. Skip empty frames.
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (frame->parent() && !frame->document().documentElement().isNull()) {
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    result.append("\n--------\nFrame: '");
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    result.append(frame->uniqueName().utf8().data());
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    result.append("'\n--------\n");
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return result;
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DumpFramesAsMarkup(blink::WebFrame* frame, bool recursive) {
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string result = DumpFrameHeaderIfNeeded(frame);
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  result.append(frame->contentAsMarkup().utf8());
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  result.append("\n");
25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (recursive) {
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (blink::WebFrame* child = frame->firstChild(); child;
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         child = child->nextSibling())
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      result.append(DumpFramesAsMarkup(child, recursive));
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return result;
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpDocumentText(blink::WebFrame* frame) {
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We use the document element's text instead of the body text here because
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // not all documents have a body, such as XML documents.
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebElement document_element = frame->document().documentElement();
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (document_element.isNull())
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return std::string();
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return document_element.innerText().utf8();
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpFramesAsText(blink::WebFrame* frame, bool recursive) {
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string result = DumpFrameHeaderIfNeeded(frame);
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append(DumpDocumentText(frame));
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append("\n");
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (recursive) {
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (blink::WebFrame* child = frame->firstChild(); child;
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         child = child->nextSibling())
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result.append(DumpFramesAsText(child, recursive));
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpFramesAsPrintedText(blink::WebFrame* frame, bool recursive) {
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Cannot do printed format for anything other than HTML
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!frame->document().isHTMLDocument())
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return std::string();
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string result = DumpFrameHeaderIfNeeded(frame);
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append(
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      frame->renderTreeAsText(blink::WebFrame::RenderAsTextPrinting).utf8());
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append("\n");
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (recursive) {
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (blink::WebFrame* child = frame->firstChild(); child;
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         child = child->nextSibling())
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result.append(DumpFramesAsPrintedText(child, recursive));
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpFrameScrollPosition(blink::WebFrame* frame, bool recursive) {
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string result;
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebSize offset = frame->scrollOffset();
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (offset.width > 0 || offset.height > 0) {
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (frame->parent()) {
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result =
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::string("frame '") + frame->uniqueName().utf8().data() + "' ";
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::StringAppendF(
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &result, "scrolled to %d,%d\n", offset.width, offset.height);
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!recursive)
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return result;
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (blink::WebFrame* child = frame->firstChild(); child;
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       child = child->nextSibling())
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result += DumpFrameScrollPosition(child, recursive);
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpAllBackForwardLists(TestInterfaces* interfaces,
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    WebTestDelegate* delegate) {
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string result;
3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const std::vector<WebTestProxyBase*>& window_list =
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      interfaces->GetWindowList();
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < window_list.size(); ++i)
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result.append(delegate->DumpHistoryForWindow(window_list.at(i)));
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)WebTestProxyBase::WebTestProxyBase()
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : test_interfaces_(NULL),
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_(NULL),
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_widget_(NULL),
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      spellcheck_(new SpellCheckClient(this)),
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chooser_count_(0) {
34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(enne): using the scheduler introduces additional composite steps
34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // that create flakiness.  This should go away eventually.
35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::CommandLine::ForCurrentProcess()->AppendSwitch(
35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      switches::kDisableSingleThreadProxyScheduler);
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Reset();
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)WebTestProxyBase::~WebTestProxyBase() {
3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->WindowClosed(this);
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetInterfaces(WebTestInterfaces* interfaces) {
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_interfaces_ = interfaces->GetTestInterfaces();
3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->WindowOpened(this);
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetDelegate(WebTestDelegate* delegate) {
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_ = delegate;
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  spellcheck_->SetDelegate(delegate);
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (speech_recognizer_.get())
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    speech_recognizer_->SetDelegate(delegate);
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebView* WebTestProxyBase::GetWebView() const {
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(web_widget_);
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TestRunner does not support popup widgets. So |web_widget|_ is always a
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // WebView.
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return static_cast<blink::WebView*>(web_widget_);
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::Reset() {
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  animate_scheduled_ = false;
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_identifier_map_.clear();
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  log_console_output_ = true;
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (midi_client_.get())
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    midi_client_->resetMock();
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  accept_languages_ = "";
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebSpellCheckClient* WebTestProxyBase::GetSpellCheckClient() const {
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return spellcheck_.get();
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebColorChooser* WebTestProxyBase::CreateColorChooser(
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebColorChooserClient* client,
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebColor& color,
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebVector<blink::WebColorSuggestion>& suggestions) {
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This instance is deleted by WebCore::ColorInputType
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new MockColorChooser(client, delegate_, this);
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::RunFileChooser(
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebFileChooserParams& params,
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebFileChooserCompletion* completion) {
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PrintMessage("Mock: Opening a file chooser.\n");
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // FIXME: Add ability to set file names to a file upload control.
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ShowValidationMessage(
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::string16& message,
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::string16& sub_message) {
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PrintMessage("ValidationMessageClient: main-message=" +
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::UTF16ToUTF8(message) + " sub-message=" +
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::UTF16ToUTF8(sub_message) + "\n");
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string WebTestProxyBase::CaptureTree(bool debug_render_tree) {
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool should_dump_custom_text =
4176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test_interfaces_->GetTestRunner()->shouldDumpAsCustomText();
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool should_dump_as_text =
4196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test_interfaces_->GetTestRunner()->shouldDumpAsText();
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool should_dump_as_markup =
4216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test_interfaces_->GetTestRunner()->shouldDumpAsMarkup();
4226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool should_dump_as_printed = test_interfaces_->GetTestRunner()->isPrinting();
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebFrame* frame = GetWebView()->mainFrame();
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string data_utf8;
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (should_dump_custom_text) {
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Append a newline for the test driver.
4276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    data_utf8 = test_interfaces_->GetTestRunner()->customDumpText() + "\n";
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (should_dump_as_text) {
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool recursive =
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test_interfaces_->GetTestRunner()->shouldDumpChildFramesAsText();
43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    data_utf8 = should_dump_as_printed ?
43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        DumpFramesAsPrintedText(frame, recursive) :
43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        DumpFramesAsText(frame, recursive);
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (should_dump_as_markup) {
43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool recursive =
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test_interfaces_->GetTestRunner()->shouldDumpChildFramesAsMarkup();
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Append a newline for the test driver.
43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    data_utf8 = DumpFramesAsMarkup(frame, recursive);
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool recursive = test_interfaces_->GetTestRunner()
4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                         ->shouldDumpChildFrameScrollPositions();
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebFrame::RenderAsTextControls render_text_behavior =
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        blink::WebFrame::RenderAsTextNormal;
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (should_dump_as_printed)
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_text_behavior |= blink::WebFrame::RenderAsTextPrinting;
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (debug_render_tree)
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_text_behavior |= blink::WebFrame::RenderAsTextDebug;
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 = frame->renderTreeAsText(render_text_behavior).utf8();
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 += DumpFrameScrollPosition(frame, recursive);
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->ShouldDumpBackForwardList())
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 += DumpAllBackForwardLists(test_interfaces_, delegate_);
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return data_utf8;
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DrawSelectionRect(SkCanvas* canvas) {
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // See if we need to draw the selection bounds rect. Selection bounds
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // rect is the rect enclosing the (possibly transformed) selection.
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The rect should be drawn after everything is laid out and painted.
4626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->shouldDumpSelectionRect())
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If there is a selection rect - draw a red 1px border enclosing rect
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebRect wr = GetWebView()->mainFrame()->selectionBoundsRect();
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (wr.isEmpty())
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Render a red rectangle bounding selection rect
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkPaint paint;
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setColor(0xFFFF0000);  // Fully opaque red
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setStyle(SkPaint::kStroke_Style);
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setFlags(SkPaint::kAntiAlias_Flag);
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setStrokeWidth(1.0f);
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkIRect rect;  // Bounding rect
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height);
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  canvas->drawIRect(rect, paint);
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetAcceptLanguages(const std::string& accept_languages) {
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool notify = accept_languages_ != accept_languages;
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  accept_languages_ = accept_languages;
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (notify)
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetWebView()->acceptLanguagesChanged();
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebTestProxyBase::CopyImageAtAndCapturePixels(
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int x, int y, const base::Callback<void(const SkBitmap&)>& callback) {
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // It may happen that there is a scheduled animation and
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // no rootGraphicsLayer yet. If so we would run it right now. Otherwise
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // isAcceleratedCompositingActive will return false;
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(enne): remove this: http://crbug.com/397321
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AnimateNow();
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!callback.is_null());
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  uint64_t sequence_number =  blink::Platform::current()->clipboard()->
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      sequenceNumber(blink::WebClipboard::Buffer());
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetWebView()->copyImageAt(blink::WebPoint(x, y));
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (sequence_number == blink::Platform::current()->clipboard()->
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      sequenceNumber(blink::WebClipboard::Buffer())) {
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SkBitmap emptyBitmap;
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(emptyBitmap);
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  blink::WebData data = blink::Platform::current()->clipboard()->readImage(
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      blink::WebClipboard::Buffer());
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  blink::WebImage image = blink::WebImage::fromData(data, blink::WebSize());
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const SkBitmap& bitmap = image.getSkBitmap();
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SkAutoLockPixels autoLock(bitmap);
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  callback.Run(bitmap);
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::CapturePixelsForPrinting(
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Callback<void(const SkBitmap&)>& callback) {
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_widget_->layout();
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebSize page_size_in_pixels = web_widget_->size();
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebFrame* web_frame = GetWebView()->mainFrame();
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int page_count = web_frame->printBegin(page_size_in_pixels);
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int totalHeight = page_count * (page_size_in_pixels.height + 1) - 1;
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_opaque = false;
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  skia::RefPtr<SkCanvas> canvas(skia::AdoptRef(skia::TryCreateBitmapCanvas(
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      page_size_in_pixels.width, totalHeight, is_opaque)));
527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!canvas) {
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(SkBitmap());
529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_frame->printPagesWithBoundaries(canvas.get(), page_size_in_pixels);
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_frame->printEnd();
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DrawSelectionRect(canvas.get());
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkBaseDevice* device = skia::GetTopDevice(*canvas);
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const SkBitmap& bitmap = device->accessBitmap(false);
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run(bitmap);
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCaptureCallback::CaptureCallback(
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::Callback<void(const SkBitmap&)>& callback)
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : callback_(callback), wait_for_popup_(false) {
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCaptureCallback::~CaptureCallback() {
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CaptureCallback::didCompositeAndReadback(const SkBitmap& bitmap) {
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TRACE_EVENT2("shell",
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "CaptureCallback::didCompositeAndReadback",
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "x",
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               bitmap.info().fWidth,
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               "y",
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               bitmap.info().fHeight);
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!wait_for_popup_) {
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback_.Run(bitmap);
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delete this;
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (main_bitmap_.isNull()) {
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bitmap.deepCopyTo(&main_bitmap_);
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkCanvas canvas(main_bitmap_);
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  canvas.drawBitmap(bitmap, popup_position_.x(), popup_position_.y());
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback_.Run(main_bitmap_);
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delete this;
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::CapturePixelsAsync(
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Callback<void(const SkBitmap&)>& callback) {
572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync");
573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // It may happen that there is a scheduled animation and
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // no rootGraphicsLayer yet. If so we would run it right now. Otherwise
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // isAcceleratedCompositingActive will return false;
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(enne): remove this: http://crbug.com/397321
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AnimateNow();
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!callback.is_null());
581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->isPrinting()) {
583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopProxy::current()->PostTask(
584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_HERE,
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(&WebTestProxyBase::CapturePixelsForPrinting,
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   base::Unretained(this),
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   callback));
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CaptureCallback* capture_callback = new CaptureCallback(base::Bind(
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &WebTestProxyBase::DidCapturePixelsAsync, base::Unretained(this),
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      callback));
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_widget_->compositeAndReadbackAsync(capture_callback);
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (blink::WebPagePopup* popup = web_widget_->pagePopup()) {
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    capture_callback->set_wait_for_popup(true);
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    capture_callback->set_popup_position(popup->positionRelativeToOwner());
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    popup->compositeAndReadbackAsync(capture_callback);
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebTestProxyBase::DidCapturePixelsAsync(const base::Callback<void(const SkBitmap&)>& callback,
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             const SkBitmap& bitmap) {
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkCanvas canvas(bitmap);
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DrawSelectionRect(&canvas);
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!callback.is_null())
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(bitmap);
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetLogConsoleOutput(bool enabled) {
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  log_console_output_ = enabled;
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback,
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       const SkBitmap& bitmap) {
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Verify we actually composited.
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK_NE(0, bitmap.info().fWidth);
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK_NE(0, bitmap.info().fHeight);
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!callback.is_null())
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run();
621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DisplayAsyncThen(const base::Closure& callback) {
624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT0("shell", "WebTestProxyBase::DisplayAsyncThen");
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // It may happen that there is a scheduled animation and
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // no rootGraphicsLayer yet. If so we would run it right now. Otherwise
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // isAcceleratedCompositingActive will return false;
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(enne): remove this: http://crbug.com/397321
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AnimateNow();
6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CapturePixelsAsync(base::Bind(
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &WebTestProxyBase::DidDisplayAsync, base::Unretained(this), callback));
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebTestProxyBase::GetScreenOrientationForTesting(
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    blink::WebScreenInfo& screen_info) {
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!screen_orientation_client_)
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Override screen orientation information with mock data.
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  screen_info.orientationType =
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      screen_orientation_client_->CurrentOrientationType();
643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  screen_info.orientationAngle =
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      screen_orientation_client_->CurrentOrientationAngle();
645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
647116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMockScreenOrientationClient*
648116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebTestProxyBase::GetScreenOrientationClientMock() {
649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!screen_orientation_client_.get()) {
650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    screen_orientation_client_.reset(new MockScreenOrientationClient);
651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return screen_orientation_client_.get();
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebMIDIClientMock* WebTestProxyBase::GetMIDIClientMock() {
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!midi_client_.get())
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    midi_client_.reset(new blink::WebMIDIClientMock);
658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return midi_client_.get();
659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MockWebSpeechRecognizer* WebTestProxyBase::GetSpeechRecognizerMock() {
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!speech_recognizer_.get()) {
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    speech_recognizer_.reset(new MockWebSpeechRecognizer());
6645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    speech_recognizer_->SetDelegate(delegate_);
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return speech_recognizer_.get();
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMockCredentialManagerClient*
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWebTestProxyBase::GetCredentialManagerClientMock() {
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!credential_manager_client_.get())
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    credential_manager_client_.reset(new MockCredentialManagerClient());
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return credential_manager_client_.get();
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ScheduleAnimation() {
6776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->TestIsRunning())
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!animate_scheduled_) {
681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    animate_scheduled_ = true;
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PostDelayedTask(
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new HostMethodTask(this, &WebTestProxyBase::AnimateNow), 1);
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::AnimateNow() {
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (animate_scheduled_) {
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    animate_scheduled_ = false;
690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_widget_->animate(0.0);
691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_widget_->layout();
692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::PostAccessibilityEvent(const blink::WebAXObject& obj,
696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              blink::WebAXEvent event) {
697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only hook the accessibility events occured during the test run.
698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This check prevents false positives in WebLeakDetector.
699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The pending tasks in browser/renderer message queue may trigger
700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // accessibility events,
701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and AccessibilityController will hold on to their target nodes if we don't
702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ignore them here.
7036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->TestIsRunning())
704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (event == blink::WebAXEventFocus)
7076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_interfaces_->GetAccessibilityController()->SetFocusedElement(obj);
708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char* event_name = NULL;
710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (event) {
711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventActiveDescendantChanged:
712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ActiveDescendantChanged";
713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventAlert:
715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Alert";
716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventAriaAttributeChanged:
718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "AriaAttributeChanged";
719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventAutocorrectionOccured:
721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "AutocorrectionOccured";
722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventBlur:
724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Blur";
725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventCheckedStateChanged:
727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "CheckedStateChanged";
728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventChildrenChanged:
730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ChildrenChanged";
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventFocus:
733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Focus";
734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventHide:
736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Hide";
737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventInvalidStatusChanged:
739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "InvalidStatusChanged";
740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLayoutComplete:
742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LayoutComplete";
743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLiveRegionChanged:
745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LiveRegionChanged";
746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLoadComplete:
748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LoadComplete";
749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLocationChanged:
751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LocationChanged";
752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventMenuListItemSelected:
754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "MenuListItemSelected";
755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventMenuListValueChanged:
757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "MenuListValueChanged";
758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventRowCollapsed:
760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "RowCollapsed";
761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventRowCountChanged:
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "RowCountChanged";
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventRowExpanded:
766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "RowExpanded";
767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventScrollPositionChanged:
769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ScrollPositionChanged";
770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventScrolledToAnchor:
772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ScrolledToAnchor";
773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventSelectedChildrenChanged:
775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "SelectedChildrenChanged";
776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventSelectedTextChanged:
778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "SelectedTextChanged";
779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventShow:
781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Show";
782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventTextChanged:
784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "TextChanged";
785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventTextInserted:
787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "TextInserted";
788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventTextRemoved:
790cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "TextRemoved";
791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventValueChanged:
793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ValueChanged";
794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Unknown";
797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->GetAccessibilityController()->NotificationReceived(
8016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      obj, event_name);
802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetAccessibilityController()
804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ->ShouldLogAccessibilityEvents()) {
805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string message("AccessibilityNotification - ");
806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    message += event_name;
807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebNode node = obj.node();
809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!node.isNull() && node.isElementNode()) {
810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      blink::WebElement element = node.to<blink::WebElement>();
811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (element.hasAttribute("id")) {
812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        message += " - id:";
813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        message += element.getAttribute("id").utf8().data();
814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(message + "\n");
818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::StartDragging(blink::WebLocalFrame* frame,
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebDragData& data,
823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     blink::WebDragOperationsMask mask,
824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebImage& image,
825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebPoint& point) {
826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // When running a test, we need to fake a drag drop operation otherwise
827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Windows waits for real mouse events to know when the drag is over.
8286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->GetEventSender()->DoDragDrop(data, mask);
829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The output from these methods in layout test mode should match that
832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// expected by the layout tests. See EditingDelegate.m in DumpRenderTree.
833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeSelection(bool is_empty_callback) {
8356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpEditingCallbacks())
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(
837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "EDITING DELEGATE: "
838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "webViewDidChangeSelection:WebViewDidChangeSelectionNotification\n");
839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeContents() {
8426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpEditingCallbacks())
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(
844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification\n");
845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::CreateView(blink::WebLocalFrame* frame,
848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const blink::WebURLRequest& request,
849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const blink::WebWindowFeatures& features,
850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const blink::WebString& frame_name,
851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  blink::WebNavigationPolicy policy,
852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  bool suppress_opener) {
8536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->canOpenWindows())
854cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
8556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpCreateView())
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string("createView(") +
857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            URLDescription(request.url()) + ")\n");
858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebPlugin* WebTestProxyBase::CreatePlugin(
862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
863cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebPluginParams& params) {
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (TestPlugin::IsSupportedMimeType(params.mimeType))
865cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return TestPlugin::create(frame, params, delegate_);
866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return 0;
867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetStatusText(const blink::WebString& text) {
8706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->shouldDumpStatusCallbacks())
871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PrintMessage(
873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string("UI DELEGATE STATUS CALLBACK: setStatusText:") +
874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      text.utf8().data() + "\n");
875cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
877cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidStopLoading() {
8786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpProgressFinishedCallback())
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("postProgressFinishedNotification\n");
880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ShowContextMenu(
883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
884cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebContextMenuData& context_menu_data) {
8856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->GetEventSender()->SetContextMenuData(context_menu_data);
886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebUserMediaClient* WebTestProxyBase::GetUserMediaClient() {
889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!user_media_client_.get())
89046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    user_media_client_.reset(new MockWebUserMediaClient(delegate_));
891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return user_media_client_.get();
892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Simulate a print by going into print mode and then exit straight away.
895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::PrintPage(blink::WebLocalFrame* frame) {
896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebSize page_size_in_pixels = web_widget_->size();
897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (page_size_in_pixels.isEmpty())
898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebPrintParams printParams(page_size_in_pixels);
900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame->printBegin(printParams);
901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame->printEnd();
902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebNotificationPresenter* WebTestProxyBase::GetNotificationPresenter() {
9056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return test_interfaces_->GetTestRunner()->notification_presenter();
906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebMIDIClient* WebTestProxyBase::GetWebMIDIClient() {
909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetMIDIClientMock();
910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebSpeechRecognizer* WebTestProxyBase::GetSpeechRecognizer() {
913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetSpeechRecognizerMock();
914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::RequestPointerLock() {
9176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return test_interfaces_->GetTestRunner()->RequestPointerLock();
918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::RequestPointerUnlock() {
9216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->GetTestRunner()->RequestPointerUnlock();
922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::IsPointerLocked() {
9256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return test_interfaces_->GetTestRunner()->isPointerLocked();
926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFocus() {
9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->SetFocus(this, true);
930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidBlur() {
9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->SetFocus(this, false);
934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetToolTipText(const blink::WebString& text,
937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      blink::WebTextDirection direction) {
9386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->GetTestRunner()->setToolTipText(text);
939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidOpenChooser() {
942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chooser_count_++;
943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidCloseChooser() {
946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chooser_count_--;
947cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::IsChooserShown() {
950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return 0 < chooser_count_;
951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::LoadURLExternally(
954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
955cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest& request,
956cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebNavigationPolicy policy,
957cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& suggested_name) {
9586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldWaitUntilExternalURLLoad()) {
959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (policy == blink::WebNavigationPolicyDownload) {
9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(
961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::string("Downloading URL with suggested filename \"") +
962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          suggested_name.utf8() + "\"\n");
963cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } else {
9641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(std::string("Loading URL externally - \"") +
965cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              URLDescription(request.url()) + "\"\n");
966cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
9671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->TestFinished();
968cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
969cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
970cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
971cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidStartProvisionalLoad(blink::WebLocalFrame* frame) {
9726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->topLoadingFrame())
9736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_interfaces_->GetTestRunner()->setTopLoadingFrame(frame, false);
974cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
976cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
9771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didStartProvisionalLoadForFrame\n");
978cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
979cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()
981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ->shouldDumpUserGestureInFrameLoadCallbacks()) {
982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameuserGestureStatus(
983cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        delegate_, frame, " - in didStartProvisionalLoadForFrame\n");
984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidReceiveServerRedirectForProvisionalLoad(
988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame) {
9896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(
992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        " - didReceiveServerRedirectForProvisionalLoadForFrame\n");
993cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
995cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::DidFailProvisionalLoad(blink::WebLocalFrame* frame,
997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              const blink::WebURLError& error) {
9986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didFailProvisionalLoadWithError\n");
1001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckDone(frame, MainResourceLoadFailed);
1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !frame->provisionalDataSource();
1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidCommitProvisionalLoad(
1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebHistoryItem& history_item,
1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebHistoryCommitType history_type) {
10106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didCommitLoadForFrame\n");
1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1014cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidReceiveTitle(blink::WebLocalFrame* frame,
1017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       const blink::WebString& title,
1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       blink::WebTextDirection direction) {
1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebCString title8 = title.utf8();
1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string(" - didReceiveTitle: ") +
1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            title8.data() + "\n");
1025cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpTitleChanges())
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string("TITLE CHANGED: '") + title8.data() +
1029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            "'\n");
1030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeIcon(blink::WebLocalFrame* frame,
1033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     blink::WebIconURL::Type icon_type) {
10346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpIconChanges()) {
1035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string(" - didChangeIcons\n"));
1037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFinishDocumentLoad(blink::WebLocalFrame* frame) {
10416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
1042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didFinishDocumentLoadForFrame\n");
1044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
1045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned pendingUnloadEvents = frame->unloadListenerCount();
1046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (pendingUnloadEvents) {
1047cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PrintFrameDescription(delegate_, frame);
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(base::StringPrintf(
10495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          " - has %u onunload handler(s)\n", pendingUnloadEvents));
1050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidHandleOnloadEvents(blink::WebLocalFrame* frame) {
10556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didHandleOnloadEventsForFrame\n");
1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFailLoad(blink::WebLocalFrame* frame,
1062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   const blink::WebURLError& error) {
10636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
1064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didFailLoadWithError\n");
1066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckDone(frame, MainResourceLoadFailed);
1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFinishLoad(blink::WebLocalFrame* frame) {
10716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks()) {
1072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didFinishLoadForFrame\n");
1074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
10751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckDone(frame, LoadFinished);
1076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidDetectXSS(blink::WebLocalFrame* frame,
1079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const blink::WebURL& insecure_url,
1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    bool did_block_entire_page) {
10816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpFrameLoadCallbacks())
10821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("didDetectXSS\n");
1083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidDispatchPingLoader(blink::WebLocalFrame* frame,
1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             const blink::WebURL& url) {
10876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpPingLoaderCallbacks())
10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string("PingLoader dispatched to '") +
1089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            URLDescription(url).c_str() + "'.\n");
1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::WillRequestResource(
1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebCachedURLRequest& request) {
10956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpResourceRequestCallbacks()) {
1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string(" - ") +
1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            request.initiatorName().utf8().data());
10991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string(" requested '") +
1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            URLDescription(request.urlRequest().url()).c_str() +
1101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            "'\n");
1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::WillSendRequest(
1106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned identifier,
1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebURLRequest& request,
1109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLResponse& redirect_response) {
1110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Need to use GURL for host() and SchemeIs()
1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL url = request.url();
1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string request_url = url.possibly_invalid_spec();
1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL main_document_url = request.firstPartyForCookies();
1115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (redirect_response.isNull() &&
11176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (test_interfaces_->GetTestRunner()->shouldDumpResourceLoadCallbacks() ||
11186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       test_interfaces_->GetTestRunner()->shouldDumpResourcePriorities())) {
1119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(resource_identifier_map_.find(identifier) ==
1120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           resource_identifier_map_.end());
1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    resource_identifier_map_[identifier] =
1122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DescriptionSuitableForTestResult(request_url);
1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpResourceLoadCallbacks()) {
1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage("<unknown>");
1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
11301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(resource_identifier_map_[identifier]);
11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - willSendRequest <NSURLRequest URL ");
11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(
1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DescriptionSuitableForTestResult(request_url).c_str());
11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(", main document URL ");
11351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(URLDescription(main_document_url).c_str());
11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(", http method ");
11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(request.httpMethod().utf8().data());
11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("> redirectResponse ");
1139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintResponseDescription(delegate_, redirect_response);
11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("\n");
1141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpResourcePriorities()) {
11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(
1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DescriptionSuitableForTestResult(request_url).c_str());
11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" has priority ");
11471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(PriorityDescription(request.priority()));
11481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("\n");
1149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->httpHeadersToClear()) {
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::set<std::string>* clearHeaders =
11536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test_interfaces_->GetTestRunner()->httpHeadersToClear();
1154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (std::set<std::string>::const_iterator header = clearHeaders->begin();
1155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         header != clearHeaders->end();
1156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         ++header)
1157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      request.clearHTTPHeaderField(blink::WebString::fromUTF8(*header));
1158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string host = url.host();
11611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!host.empty() &&
11621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (url.SchemeIs(url::kHttpScheme) || url.SchemeIs(url::kHttpsScheme))) {
11631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!IsLocalHost(host) && !IsTestHost(host) &&
11641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !HostIsUsedBySomeTestsToGenerateError(host) &&
11651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ((!main_document_url.SchemeIs(url::kHttpScheme) &&
11661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          !main_document_url.SchemeIs(url::kHttpsScheme)) ||
1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         IsLocalHost(main_document_url.host())) &&
11681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !delegate_->AllowExternalPages()) {
11691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(std::string("Blocked access to external URL ") +
1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              request_url + "\n");
1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BlockRequest(request);
1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
1173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set the new substituted URL.
11771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  request.setURL(delegate_->RewriteLayoutTestsURL(request.url().spec()));
1178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidReceiveResponse(
1181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned identifier,
1183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLResponse& response) {
11846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpResourceLoadCallbacks()) {
1185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage("<unknown>");
1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
11891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(resource_identifier_map_[identifier]);
11901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didReceiveResponse ");
1191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintResponseDescription(delegate_, response);
11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("\n");
1193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
11946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()
11956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ->shouldDumpResourceResponseMIMETypes()) {
1196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GURL url = response.url();
1197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebString mime_type = response.mimeType();
11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(url.ExtractFileName());
11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" has MIME type ");
1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Simulate NSURLResponse's mapping of empty/unknown MIME types to
1201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // application/octet-stream
12021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(mime_type.isEmpty() ? "application/octet-stream"
1203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                : mime_type.utf8().data());
12041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("\n");
1205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeResourcePriority(
1209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned identifier,
1211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest::Priority& priority,
1212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int intra_priority_value) {
12136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpResourcePriorities()) {
1214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage("<unknown>");
1217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
12181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(resource_identifier_map_[identifier]);
12191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(
12205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::StringPrintf(" changed priority to %s, intra_priority %d\n",
12215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           PriorityDescription(priority).c_str(),
12225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           intra_priority_value));
1223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFinishResourceLoad(blink::WebLocalFrame* frame,
1227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             unsigned identifier) {
12286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpResourceLoadCallbacks()) {
1229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
12311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage("<unknown>");
1232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
12331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PrintMessage(resource_identifier_map_[identifier]);
12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(" - didFinishLoading\n");
1235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_identifier_map_.erase(identifier);
12371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(ENABLE_LOAD_COMPLETION_HACKS)
12381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckDone(frame, ResourceLoadCompleted);
12391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidAddMessageToConsole(
1243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebConsoleMessage& message,
1244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& source_name,
1245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned source_line) {
1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This matches win DumpRenderTree's UIDelegate.cpp.
1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!log_console_output_)
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string level;
1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (message.level) {
1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelDebug:
1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "DEBUG";
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelLog:
1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "MESSAGE";
1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelInfo:
1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "INFO";
1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelWarning:
1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "WARNING";
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelError:
1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "ERROR";
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
12671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PrintMessage(std::string("CONSOLE ") + level + ": ");
1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (source_line) {
12691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(base::StringPrintf("line %d: ", source_line));
1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!message.text.isEmpty()) {
1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string new_message;
1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    new_message = message.text.utf8();
1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size_t file_protocol = new_message.find("file://");
1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (file_protocol != std::string::npos) {
1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new_message = new_message.substr(0, file_protocol) +
1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    URLSuitableForTestResult(new_message.substr(file_protocol));
1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
12791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(new_message);
1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PrintMessage(std::string("\n"));
1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebTestProxyBase::CheckDone(blink::WebLocalFrame* frame,
12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 CheckDoneReason reason) {
12866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (frame != test_interfaces_->GetTestRunner()->topLoadingFrame())
1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
12881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(ENABLE_LOAD_COMPLETION_HACKS)
12901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Quirk for MHTML prematurely completing on resource load completion.
12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string mime_type = frame->dataSource()->response().mimeType().utf8();
12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (reason == ResourceLoadCompleted && mime_type == "multipart/related")
12931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
12941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (reason != MainResourceLoadFailed &&
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (frame->isResourceLoadInProgress() || frame->isLoading()))
12971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
12996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_interfaces_->GetTestRunner()->setTopLoadingFrame(frame, true);
1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebNavigationPolicy WebTestProxyBase::DecidePolicyForNavigation(
13035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const blink::WebFrameClient::NavigationPolicyInfo& info) {
1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebNavigationPolicy result;
13056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_interfaces_->GetTestRunner()->policyDelegateEnabled())
13065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return info.defaultPolicy;
1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PrintMessage(
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::string("Policy delegate: attempt to load ") +
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      URLDescription(info.urlRequest.url()) + " with navigation type '" +
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebNavigationTypeToString(info.navigationType) + "'\n");
13126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->policyDelegateIsPermissive())
1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result = blink::WebNavigationPolicyCurrentTab;
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result = blink::WebNavigationPolicyIgnore;
1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->policyDelegateShouldNotifyDone())
13186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_interfaces_->GetTestRunner()->policyDelegateDone();
1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::WillCheckAndDispatchMessageEvent(
1323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* source_frame,
1324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebFrame* target_frame,
1325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebSecurityOrigin target,
1326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebDOMMessageEvent event) {
13276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldInterceptPostMessage()) {
13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage("intercepted postMessage\n");
1329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
1330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
1333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::PostSpellCheckEvent(const blink::WebString& event_name) {
13366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_interfaces_->GetTestRunner()->shouldDumpSpellCheckCallbacks()) {
13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PrintMessage(std::string("SpellCheckEvent: ") +
1338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            event_name.utf8().data() + "\n");
1339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ResetInputMethod() {
1343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If a composition text exists, then we need to let the browser process
1344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to cancel the input method's ongoing composition session.
1345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (web_widget_)
1346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_widget_->confirmComposition();
1347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebString WebTestProxyBase::acceptLanguages() {
1350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return blink::WebString::fromUTF8(accept_languages_);
1351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MockWebPushClient* WebTestProxyBase::GetPushClientMock() {
1354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!push_client_.get())
1355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    push_client_.reset(new MockWebPushClient);
1356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return push_client_.get();
1357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)blink::WebPushClient* WebTestProxyBase::GetWebPushClient() {
1360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return GetPushClientMock();
1361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace content
1364