web_test_proxy.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/debug/trace_event.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/MockColorChooser.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/MockWebSpeechRecognizer.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/SpellCheckClient.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/TestCommon.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/TestInterfaces.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/TestPlugin.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/WebTestDelegate.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/WebTestInterfaces.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/WebUserMediaClientMock.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/accessibility_controller.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/event_sender.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/test_runner.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/web_test_runner.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// FIXME: Including platform_canvas.h here is a layering violation.
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCString.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebAXEnums.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebAXObject.h"
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCachedURLRequest.h"
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebConsoleMessage.h"
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDataSource.h"
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHistoryItem.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebLocalFrame.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMIDIClientMock.h"
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h"
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginParams.h"
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h"
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRange.h"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class HostMethodTask : public WebMethodTask<WebTestProxyBase> {
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef void (WebTestProxyBase::*CallbackMethodType)();
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HostMethodTask(WebTestProxyBase* object, CallbackMethodType callback)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : WebMethodTask<WebTestProxyBase>(object), callback_(callback) {}
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void runIfValid() OVERRIDE { (m_object->*callback_)(); }
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallbackMethodType callback_;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrintFrameDescription(WebTestDelegate* delegate, blink::WebFrame* frame) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string name8 = frame->uniqueName().utf8();
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame == frame->view()->mainFrame()) {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!name8.length()) {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate->printMessage("main frame");
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate->printMessage(std::string("main frame \"") + name8 + "\"");
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!name8.length()) {
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate->printMessage("frame (anonymous)");
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate->printMessage(std::string("frame \"") + name8 + "\"");
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrintFrameuserGestureStatus(WebTestDelegate* delegate,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 blink::WebFrame* frame,
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const char* msg) {
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_user_gesture =
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      blink::WebUserGestureIndicator::isProcessingUserGesture();
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate->printMessage(std::string("Frame with user gesture \"") +
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         (is_user_gesture ? "true" : "false") + "\"" + msg);
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Used to write a platform neutral file:/// URL by taking the
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// filename and its directory. (e.g., converts
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// "file:///tmp/foo/bar.txt" to just "bar.txt").
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DescriptionSuitableForTestResult(const std::string& url) {
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (url.empty() || std::string::npos == url.find("file://"))
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t pos = url.rfind('/');
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pos == std::string::npos || !pos)
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "ERROR:" + url;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  pos = url.rfind('/', pos - 1);
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pos == std::string::npos)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "ERROR:" + url;
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return url.substr(pos + 1);
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrintResponseDescription(WebTestDelegate* delegate,
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              const blink::WebURLResponse& response) {
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (response.isNull()) {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate->printMessage("(null)");
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string url = response.url().spec();
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  char data[100];
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  snprintf(data, sizeof(data), "%d", response.httpStatusCode());
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate->printMessage(std::string("<NSURLResponse ") +
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         DescriptionSuitableForTestResult(url) +
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ", http status code " + data + ">");
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string URLDescription(const GURL& url) {
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (url.SchemeIs("file"))
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url.ExtractFileName();
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return url.possibly_invalid_spec();
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string PriorityDescription(
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest::Priority& priority) {
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (priority) {
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityVeryLow:
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "VeryLow";
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityLow:
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "Low";
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityMedium:
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "Medium";
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityHigh:
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "High";
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityVeryHigh:
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "VeryHigh";
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebURLRequest::PriorityUnresolved:
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "Unresolved";
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BlockRequest(blink::WebURLRequest& request) {
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request.setURL(GURL("255.255.255.255"));
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsLocalHost(const std::string& host) {
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return host == "127.0.0.1" || host == "localhost";
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HostIsUsedBySomeTestsToGenerateError(const std::string& host) {
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return host == "255.255.255.255";
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Used to write a platform neutral file:/// URL by only taking the filename
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// (e.g., converts "file:///tmp/foo.txt" to just "foo.txt").
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string URLSuitableForTestResult(const std::string& url) {
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (url.empty() || std::string::npos == url.find("file://"))
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url;
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t pos = url.rfind('/');
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pos == std::string::npos) {
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef WIN32
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pos = url.rfind('\\');
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (pos == std::string::npos)
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pos = 0;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pos = 0;
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string filename = url.substr(pos + 1);
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (filename.empty())
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "file:";  // A WebKit test has this in its expected output.
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return filename;
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// WebNavigationType debugging strings taken from PolicyDelegate.mm.
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kLinkClickedString = "link clicked";
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kFormSubmittedString = "form submitted";
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kBackForwardString = "back/forward";
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kReloadString = "reload";
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kFormResubmittedString = "form resubmitted";
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kOtherString = "other";
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* kIllegalString = "illegal value";
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Get a debugging string from a WebNavigationType.
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* WebNavigationTypeToString(blink::WebNavigationType type) {
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type) {
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeLinkClicked:
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kLinkClickedString;
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeFormSubmitted:
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kFormSubmittedString;
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeBackForward:
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kBackForwardString;
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeReload:
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kReloadString;
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeFormResubmitted:
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kFormResubmittedString;
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebNavigationTypeOther:
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kOtherString;
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return kIllegalString;
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpDocumentText(blink::WebFrame* frame) {
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We use the document element's text instead of the body text here because
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // not all documents have a body, such as XML documents.
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebElement document_element = frame->document().documentElement();
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (document_element.isNull())
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return std::string();
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return document_element.innerText().utf8();
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpFramesAsText(blink::WebFrame* frame, bool recursive) {
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string result;
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Add header for all but the main frame. Skip empty frames.
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame->parent() && !frame->document().documentElement().isNull()) {
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append("\n--------\nFrame: '");
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append(frame->uniqueName().utf8().data());
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append("'\n--------\n");
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append(DumpDocumentText(frame));
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append("\n");
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (recursive) {
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (blink::WebFrame* child = frame->firstChild(); child;
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         child = child->nextSibling())
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result.append(DumpFramesAsText(child, recursive));
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpFramesAsPrintedText(blink::WebFrame* frame, bool recursive) {
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string result;
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Cannot do printed format for anything other than HTML
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!frame->document().isHTMLDocument())
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return std::string();
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Add header for all but the main frame. Skip empty frames.
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame->parent() && !frame->document().documentElement().isNull()) {
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append("\n--------\nFrame: '");
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append(frame->uniqueName().utf8().data());
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append("'\n--------\n");
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append(
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      frame->renderTreeAsText(blink::WebFrame::RenderAsTextPrinting).utf8());
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result.append("\n");
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (recursive) {
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (blink::WebFrame* child = frame->firstChild(); child;
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         child = child->nextSibling())
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result.append(DumpFramesAsPrintedText(child, recursive));
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpFrameScrollPosition(blink::WebFrame* frame, bool recursive) {
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string result;
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebSize offset = frame->scrollOffset();
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (offset.width > 0 || offset.height > 0) {
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (frame->parent()) {
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result =
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::string("frame '") + frame->uniqueName().utf8().data() + "' ";
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    char data[100];
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    snprintf(
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        data, sizeof(data), "scrolled to %d,%d\n", offset.width, offset.height);
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result += data;
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!recursive)
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return result;
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (blink::WebFrame* child = frame->firstChild(); child;
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       child = child->nextSibling())
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result += DumpFrameScrollPosition(child, recursive);
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string DumpAllBackForwardLists(TestInterfaces* interfaces,
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    WebTestDelegate* delegate) {
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string result;
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<WebTestProxyBase*>& window_list = interfaces->windowList();
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < window_list.size(); ++i)
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result.append(delegate->dumpHistoryForWindow(window_list.at(i)));
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)WebTestProxyBase::WebTestProxyBase()
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : test_interfaces_(NULL),
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_(NULL),
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_widget_(NULL),
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      spellcheck_(new SpellCheckClient(this)),
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chooser_count_(0) {
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Reset();
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)WebTestProxyBase::~WebTestProxyBase() {
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->windowClosed(this);
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetInterfaces(WebTestInterfaces* interfaces) {
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_ = interfaces->testInterfaces();
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->windowOpened(this);
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetDelegate(WebTestDelegate* delegate) {
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_ = delegate;
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  spellcheck_->setDelegate(delegate);
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (speech_recognizer_.get())
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    speech_recognizer_->setDelegate(delegate);
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebView* WebTestProxyBase::GetWebView() const {
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(web_widget_);
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TestRunner does not support popup widgets. So |web_widget|_ is always a
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // WebView.
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return static_cast<blink::WebView*>(web_widget_);
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::Reset() {
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  animate_scheduled_ = false;
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_identifier_map_.clear();
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  log_console_output_ = true;
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (midi_client_.get())
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    midi_client_->resetMock();
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  accept_languages_ = "";
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebSpellCheckClient* WebTestProxyBase::GetSpellCheckClient() const {
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return spellcheck_.get();
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebColorChooser* WebTestProxyBase::CreateColorChooser(
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebColorChooserClient* client,
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebColor& color,
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebVector<blink::WebColorSuggestion>& suggestions) {
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This instance is deleted by WebCore::ColorInputType
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new MockColorChooser(client, delegate_, this);
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::RunFileChooser(
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebFileChooserParams& params,
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebFileChooserCompletion* completion) {
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->printMessage("Mock: Opening a file chooser.\n");
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // FIXME: Add ability to set file names to a file upload control.
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ShowValidationMessage(
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebRect& anchor_in_root_view,
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& message,
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& sub_message,
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebTextDirection hint) {
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->printMessage(
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string("ValidationMessageClient: main-message=") +
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string(message.utf8()) + " sub-message=" +
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string(sub_message.utf8()) + "\n");
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string WebTestProxyBase::CaptureTree(bool debug_render_tree) {
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool should_dump_custom_text =
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      test_interfaces_->testRunner()->shouldDumpAsCustomText();
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool should_dump_as_text = test_interfaces_->testRunner()->shouldDumpAsText();
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool should_dump_as_markup =
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      test_interfaces_->testRunner()->shouldDumpAsMarkup();
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool should_dump_as_printed = test_interfaces_->testRunner()->isPrinting();
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebFrame* frame = GetWebView()->mainFrame();
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string data_utf8;
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (should_dump_custom_text) {
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Append a newline for the test driver.
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 = test_interfaces_->testRunner()->customDumpText() + "\n";
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (should_dump_as_text) {
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool recursive =
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        test_interfaces_->testRunner()->shouldDumpChildFramesAsText();
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 = should_dump_as_printed
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    ? DumpFramesAsPrintedText(frame, recursive)
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    : DumpFramesAsText(frame, recursive);
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (should_dump_as_markup) {
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Append a newline for the test driver.
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 = frame->contentAsMarkup().utf8() + "\n";
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool recursive =
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        test_interfaces_->testRunner()->shouldDumpChildFrameScrollPositions();
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebFrame::RenderAsTextControls render_text_behavior =
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        blink::WebFrame::RenderAsTextNormal;
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (should_dump_as_printed)
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_text_behavior |= blink::WebFrame::RenderAsTextPrinting;
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (debug_render_tree)
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_text_behavior |= blink::WebFrame::RenderAsTextDebug;
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 = frame->renderTreeAsText(render_text_behavior).utf8();
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 += DumpFrameScrollPosition(frame, recursive);
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->ShouldDumpBackForwardList())
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data_utf8 += DumpAllBackForwardLists(test_interfaces_, delegate_);
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return data_utf8;
408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DrawSelectionRect(SkCanvas* canvas) {
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // See if we need to draw the selection bounds rect. Selection bounds
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // rect is the rect enclosing the (possibly transformed) selection.
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The rect should be drawn after everything is laid out and painted.
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->shouldDumpSelectionRect())
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If there is a selection rect - draw a red 1px border enclosing rect
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebRect wr = GetWebView()->mainFrame()->selectionBoundsRect();
418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (wr.isEmpty())
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Render a red rectangle bounding selection rect
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkPaint paint;
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setColor(0xFFFF0000);  // Fully opaque red
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setStyle(SkPaint::kStroke_Style);
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setFlags(SkPaint::kAntiAlias_Flag);
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  paint.setStrokeWidth(1.0f);
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkIRect rect;  // Bounding rect
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height);
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  canvas->drawIRect(rect, paint);
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::didCompositeAndReadback(const SkBitmap& bitmap) {
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT2("shell",
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               "WebTestProxyBase::didCompositeAndReadback",
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               "x",
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               bitmap.info().fWidth,
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               "y",
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               bitmap.info().fHeight);
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkCanvas canvas(bitmap);
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DrawSelectionRect(&canvas);
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!composite_and_readback_callbacks_.empty());
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  composite_and_readback_callbacks_.front().Run(bitmap);
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  composite_and_readback_callbacks_.pop_front();
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetAcceptLanguages(const std::string& accept_languages) {
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool notify = accept_languages_ != accept_languages;
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  accept_languages_ = accept_languages;
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (notify)
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetWebView()->acceptLanguagesChanged();
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::CapturePixelsForPrinting(
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Callback<void(const SkBitmap&)>& callback) {
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_widget_->layout();
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebSize page_size_in_pixels = web_widget_->size();
458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebFrame* web_frame = GetWebView()->mainFrame();
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int page_count = web_frame->printBegin(page_size_in_pixels);
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int totalHeight = page_count * (page_size_in_pixels.height + 1) - 1;
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_opaque = false;
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  skia::RefPtr<SkCanvas> canvas(skia::AdoptRef(skia::TryCreateBitmapCanvas(
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      page_size_in_pixels.width, totalHeight, is_opaque)));
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (canvas)
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_frame->printPagesWithBoundaries(canvas.get(), page_size_in_pixels);
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_frame->printEnd();
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DrawSelectionRect(canvas.get());
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SkBaseDevice* device = skia::GetTopDevice(*canvas);
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const SkBitmap& bitmap = device->accessBitmap(false);
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run(bitmap);
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::CapturePixelsAsync(
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Callback<void(const SkBitmap&)>& callback) {
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync");
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(web_widget_->isAcceleratedCompositingActive());
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!callback.is_null());
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->isPrinting()) {
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopProxy::current()->PostTask(
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        FROM_HERE,
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(&WebTestProxyBase::CapturePixelsForPrinting,
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   base::Unretained(this),
488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   callback));
489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  composite_and_readback_callbacks_.push_back(callback);
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_widget_->compositeAndReadbackAsync(this);
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetLogConsoleOutput(bool enabled) {
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  log_console_output_ = enabled;
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback,
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       const SkBitmap& bitmap) {
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Verify we actually composited.
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK_NE(0, bitmap.info().fWidth);
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK_NE(0, bitmap.info().fHeight);
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!callback.is_null())
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run();
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DisplayAsyncThen(const base::Closure& callback) {
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT0("shell", "WebTestProxyBase::DisplayAsyncThen");
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(web_widget_->isAcceleratedCompositingActive());
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CapturePixelsAsync(base::Bind(
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &WebTestProxyBase::DidDisplayAsync, base::Unretained(this), callback));
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebMIDIClientMock* WebTestProxyBase::GetMIDIClientMock() {
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!midi_client_.get())
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    midi_client_.reset(new blink::WebMIDIClientMock);
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return midi_client_.get();
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MockWebSpeechRecognizer* WebTestProxyBase::GetSpeechRecognizerMock() {
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!speech_recognizer_.get()) {
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    speech_recognizer_.reset(new MockWebSpeechRecognizer());
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    speech_recognizer_->setDelegate(delegate_);
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return speech_recognizer_.get();
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ScheduleAnimation() {
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->TestIsRunning())
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!animate_scheduled_) {
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    animate_scheduled_ = true;
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->postDelayedTask(
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new HostMethodTask(this, &WebTestProxyBase::AnimateNow), 1);
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::AnimateNow() {
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (animate_scheduled_) {
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    animate_scheduled_ = false;
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_widget_->animate(0.0);
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_widget_->layout();
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::PostAccessibilityEvent(const blink::WebAXObject& obj,
551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              blink::WebAXEvent event) {
552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only hook the accessibility events occured during the test run.
553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This check prevents false positives in WebLeakDetector.
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The pending tasks in browser/renderer message queue may trigger
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // accessibility events,
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and AccessibilityController will hold on to their target nodes if we don't
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ignore them here.
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->TestIsRunning())
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (event == blink::WebAXEventFocus)
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_interfaces_->accessibilityController()->SetFocusedElement(obj);
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char* event_name = NULL;
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (event) {
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventActiveDescendantChanged:
567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ActiveDescendantChanged";
568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventAlert:
570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Alert";
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventAriaAttributeChanged:
573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "AriaAttributeChanged";
574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventAutocorrectionOccured:
576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "AutocorrectionOccured";
577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventBlur:
579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Blur";
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventCheckedStateChanged:
582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "CheckedStateChanged";
583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventChildrenChanged:
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ChildrenChanged";
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventFocus:
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Focus";
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventHide:
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Hide";
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventInvalidStatusChanged:
594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "InvalidStatusChanged";
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLayoutComplete:
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LayoutComplete";
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLiveRegionChanged:
600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LiveRegionChanged";
601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLoadComplete:
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LoadComplete";
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventLocationChanged:
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "LocationChanged";
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventMenuListItemSelected:
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "MenuListItemSelected";
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventMenuListValueChanged:
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "MenuListValueChanged";
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventRowCollapsed:
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "RowCollapsed";
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventRowCountChanged:
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "RowCountChanged";
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventRowExpanded:
621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "RowExpanded";
622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventScrollPositionChanged:
624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ScrollPositionChanged";
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventScrolledToAnchor:
627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ScrolledToAnchor";
628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventSelectedChildrenChanged:
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "SelectedChildrenChanged";
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventSelectedTextChanged:
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "SelectedTextChanged";
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventShow:
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Show";
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventTextChanged:
639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "TextChanged";
640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventTextInserted:
642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "TextInserted";
643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventTextRemoved:
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "TextRemoved";
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebAXEventValueChanged:
648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "ValueChanged";
649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event_name = "Unknown";
652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->accessibilityController()->NotificationReceived(obj,
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                                    event_name);
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->accessibilityController()
659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ->ShouldLogAccessibilityEvents()) {
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string message("AccessibilityNotification - ");
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    message += event_name;
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebNode node = obj.node();
664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!node.isNull() && node.isElementNode()) {
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      blink::WebElement element = node.to<blink::WebElement>();
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (element.hasAttribute("id")) {
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        message += " - id:";
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        message += element.getAttribute("id").utf8().data();
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(message + "\n");
673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::StartDragging(blink::WebLocalFrame* frame,
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebDragData& data,
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     blink::WebDragOperationsMask mask,
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebImage& image,
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebPoint& point) {
681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // When running a test, we need to fake a drag drop operation otherwise
682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Windows waits for real mouse events to know when the drag is over.
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->eventSender()->DoDragDrop(data, mask);
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The output from these methods in layout test mode should match that
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// expected by the layout tests. See EditingDelegate.m in DumpRenderTree.
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeSelection(bool is_empty_callback) {
690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpEditingCallbacks())
691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(
692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "EDITING DELEGATE: "
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "webViewDidChangeSelection:WebViewDidChangeSelectionNotification\n");
694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeContents() {
697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpEditingCallbacks())
698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(
699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification\n");
700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::CreateView(blink::WebLocalFrame* frame,
703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const blink::WebURLRequest& request,
704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const blink::WebWindowFeatures& features,
705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const blink::WebString& frame_name,
706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  blink::WebNavigationPolicy policy,
707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  bool suppress_opener) {
708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->canOpenWindows())
709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpCreateView())
711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string("createView(") +
712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            URLDescription(request.url()) + ")\n");
713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebPlugin* WebTestProxyBase::CreatePlugin(
717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebPluginParams& params) {
719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (TestPlugin::isSupportedMimeType(params.mimeType))
720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return TestPlugin::create(frame, params, delegate_);
721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return 0;
722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetStatusText(const blink::WebString& text) {
725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->shouldDumpStatusCallbacks())
726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->printMessage(
728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string("UI DELEGATE STATUS CALLBACK: setStatusText:") +
729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      text.utf8().data() + "\n");
730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidStopLoading() {
733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpProgressFinishedCallback())
734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("postProgressFinishedNotification\n");
735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ShowContextMenu(
738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebContextMenuData& context_menu_data) {
740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->eventSender()->SetContextMenuData(context_menu_data);
741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebUserMediaClient* WebTestProxyBase::GetUserMediaClient() {
744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!user_media_client_.get())
745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    user_media_client_.reset(new WebUserMediaClientMock(delegate_));
746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return user_media_client_.get();
747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Simulate a print by going into print mode and then exit straight away.
750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::PrintPage(blink::WebLocalFrame* frame) {
751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebSize page_size_in_pixels = web_widget_->size();
752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (page_size_in_pixels.isEmpty())
753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebPrintParams printParams(page_size_in_pixels);
755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame->printBegin(printParams);
756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame->printEnd();
757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebNotificationPresenter* WebTestProxyBase::GetNotificationPresenter() {
760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return test_interfaces_->testRunner()->notification_presenter();
761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebMIDIClient* WebTestProxyBase::GetWebMIDIClient() {
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetMIDIClientMock();
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebSpeechRecognizer* WebTestProxyBase::GetSpeechRecognizer() {
768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetSpeechRecognizerMock();
769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::RequestPointerLock() {
772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return test_interfaces_->testRunner()->RequestPointerLock();
773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::RequestPointerUnlock() {
776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->testRunner()->RequestPointerUnlock();
777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::IsPointerLocked() {
780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return test_interfaces_->testRunner()->isPointerLocked();
781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFocus() {
784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->setFocus(this, true);
785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidBlur() {
788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->setFocus(this, false);
789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
790cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::SetToolTipText(const blink::WebString& text,
792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      blink::WebTextDirection direction) {
793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->testRunner()->setToolTipText(text);
794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidOpenChooser() {
797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chooser_count_++;
798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidCloseChooser() {
801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chooser_count_--;
802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::IsChooserShown() {
805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return 0 < chooser_count_;
806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::LoadURLExternally(
809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest& request,
811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebNavigationPolicy policy,
812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& suggested_name) {
813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldWaitUntilExternalURLLoad()) {
814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (policy == blink::WebNavigationPolicyDownload) {
815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(
816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::string("Downloading URL with suggested filename \"") +
817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          suggested_name.utf8() + "\"\n");
818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } else {
819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(std::string("Loading URL externally - \"") +
820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              URLDescription(request.url()) + "\"\n");
821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->testFinished();
823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidStartProvisionalLoad(blink::WebLocalFrame* frame) {
827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->topLoadingFrame())
828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_interfaces_->testRunner()->setTopLoadingFrame(frame, false);
829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didStartProvisionalLoadForFrame\n");
833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()
836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ->shouldDumpUserGestureInFrameLoadCallbacks()) {
837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameuserGestureStatus(
838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        delegate_, frame, " - in didStartProvisionalLoadForFrame\n");
839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidReceiveServerRedirectForProvisionalLoad(
843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame) {
844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(
847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        " - didReceiveServerRedirectForProvisionalLoadForFrame\n");
848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::DidFailProvisionalLoad(blink::WebLocalFrame* frame,
852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              const blink::WebURLError& error) {
853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
854cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didFailProvisionalLoadWithError\n");
856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LocationChangeDone(frame);
858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return !frame->provisionalDataSource();
859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidCommitProvisionalLoad(
862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
863cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebHistoryItem& history_item,
864cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebHistoryCommitType history_type) {
865cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didCommitLoadForFrame\n");
868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidReceiveTitle(blink::WebLocalFrame* frame,
872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       const blink::WebString& title,
873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       blink::WebTextDirection direction) {
874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebCString title8 = title.utf8();
875cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
877cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
878cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string(" - didReceiveTitle: ") +
879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            title8.data() + "\n");
880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpTitleChanges())
883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string("TITLE CHANGED: '") + title8.data() +
884cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            "'\n");
885cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeIcon(blink::WebLocalFrame* frame,
888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     blink::WebIconURL::Type icon_type) {
889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpIconChanges()) {
890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string(" - didChangeIcons\n"));
892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFinishDocumentLoad(blink::WebLocalFrame* frame) {
896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didFinishDocumentLoadForFrame\n");
899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned pendingUnloadEvents = frame->unloadListenerCount();
901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (pendingUnloadEvents) {
902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PrintFrameDescription(delegate_, frame);
903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      char buffer[100];
904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      snprintf(buffer,
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               sizeof(buffer),
906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               " - has %u onunload handler(s)\n",
907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               pendingUnloadEvents);
908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(buffer);
909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidHandleOnloadEvents(blink::WebLocalFrame* frame) {
914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didHandleOnloadEventsForFrame\n");
917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFailLoad(blink::WebLocalFrame* frame,
921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   const blink::WebURLError& error) {
922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didFailLoadWithError\n");
925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LocationChangeDone(frame);
927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFinishLoad(blink::WebLocalFrame* frame) {
930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks()) {
931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didFinishLoadForFrame\n");
933cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LocationChangeDone(frame);
935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidDetectXSS(blink::WebLocalFrame* frame,
938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const blink::WebURL& insecure_url,
939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    bool did_block_entire_page) {
940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpFrameLoadCallbacks())
941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("didDetectXSS\n");
942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidDispatchPingLoader(blink::WebLocalFrame* frame,
945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             const blink::WebURL& url) {
946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpPingLoaderCallbacks())
947cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string("PingLoader dispatched to '") +
948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            URLDescription(url).c_str() + "'.\n");
949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::WillRequestResource(
952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebCachedURLRequest& request) {
954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourceRequestCallbacks()) {
955cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintFrameDescription(delegate_, frame);
956cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string(" - ") +
957cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            request.initiatorName().utf8().data());
958cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string(" requested '") +
959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            URLDescription(request.urlRequest().url()).c_str() +
960cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            "'\n");
961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
963cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
964cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::WillSendRequest(
965cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
966cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned identifier,
967cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebURLRequest& request,
968cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLResponse& redirect_response) {
969cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Need to use GURL for host() and SchemeIs()
970cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL url = request.url();
971cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string request_url = url.possibly_invalid_spec();
972cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
973cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL main_document_url = request.firstPartyForCookies();
974cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
975cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (redirect_response.isNull() &&
976cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (test_interfaces_->testRunner()->shouldDumpResourceLoadCallbacks() ||
977cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       test_interfaces_->testRunner()->shouldDumpResourcePriorities())) {
978cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(resource_identifier_map_.find(identifier) ==
979cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           resource_identifier_map_.end());
980cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    resource_identifier_map_[identifier] =
981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DescriptionSuitableForTestResult(request_url);
982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
983cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourceLoadCallbacks()) {
985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage("<unknown>");
988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(resource_identifier_map_[identifier]);
990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - willSendRequest <NSURLRequest URL ");
991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(
992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DescriptionSuitableForTestResult(request_url).c_str());
993cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(", main document URL ");
994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(URLDescription(main_document_url).c_str());
995cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(", http method ");
996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(request.httpMethod().utf8().data());
997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("> redirectResponse ");
998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintResponseDescription(delegate_, redirect_response);
999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("\n");
1000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourcePriorities()) {
1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(
1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DescriptionSuitableForTestResult(request_url).c_str());
1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" has priority ");
1006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(PriorityDescription(request.priority()));
1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("\n");
1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->httpHeadersToClear()) {
1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::set<std::string>* clearHeaders =
1012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        test_interfaces_->testRunner()->httpHeadersToClear();
1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (std::set<std::string>::const_iterator header = clearHeaders->begin();
1014cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         header != clearHeaders->end();
1015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         ++header)
1016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      request.clearHTTPHeaderField(blink::WebString::fromUTF8(*header));
1017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string host = url.host();
1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!host.empty() && (url.SchemeIs("http") || url.SchemeIs("https"))) {
1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!IsLocalHost(host) && !HostIsUsedBySomeTestsToGenerateError(host) &&
1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ((!main_document_url.SchemeIs("http") &&
1023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          !main_document_url.SchemeIs("https")) ||
1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         IsLocalHost(main_document_url.host())) &&
1025cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        !delegate_->allowExternalPages()) {
1026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(std::string("Blocked access to external URL ") +
1027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              request_url + "\n");
1028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BlockRequest(request);
1029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
1030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set the new substituted URL.
1034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request.setURL(delegate_->rewriteLayoutTestsURL(request.url().spec()));
1035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1036cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidReceiveResponse(
1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned identifier,
1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLResponse& response) {
1041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourceLoadCallbacks()) {
1042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1043cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
1044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage("<unknown>");
1045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
1046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(resource_identifier_map_[identifier]);
1047cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didReceiveResponse ");
1048cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrintResponseDescription(delegate_, response);
1049cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("\n");
1050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourceResponseMIMETypes()) {
1052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GURL url = response.url();
1053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebString mime_type = response.mimeType();
1054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(url.ExtractFileName());
1055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" has MIME type ");
1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Simulate NSURLResponse's mapping of empty/unknown MIME types to
1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // application/octet-stream
1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(mime_type.isEmpty() ? "application/octet-stream"
1059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                : mime_type.utf8().data());
1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("\n");
1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidChangeResourcePriority(
1065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned identifier,
1067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest::Priority& priority,
1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int intra_priority_value) {
1069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourcePriorities()) {
1070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1071cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
1072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage("<unknown>");
1073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
1074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(resource_identifier_map_[identifier]);
1075cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" changed priority to ");
1076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(PriorityDescription(priority));
1077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    char buffer[64];
1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    snprintf(
1079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        buffer, sizeof(buffer), ", intra_priority %d", intra_priority_value);
1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(buffer);
1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("\n");
1082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidFinishResourceLoad(blink::WebLocalFrame* frame,
1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             unsigned identifier) {
1087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpResourceLoadCallbacks()) {
1088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (resource_identifier_map_.find(identifier) ==
1089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_identifier_map_.end())
1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage("<unknown>");
1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else
1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate_->printMessage(resource_identifier_map_[identifier]);
1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(" - didFinishLoading\n");
1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_identifier_map_.erase(identifier);
1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::DidAddMessageToConsole(
1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebConsoleMessage& message,
1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& source_name,
1101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unsigned source_line) {
1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This matches win DumpRenderTree's UIDelegate.cpp.
1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!log_console_output_)
1104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string level;
1106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (message.level) {
1107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelDebug:
1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "DEBUG";
1109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelLog:
1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "MESSAGE";
1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelInfo:
1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "INFO";
1115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelWarning:
1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "WARNING";
1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case blink::WebConsoleMessage::LevelError:
1120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      level = "ERROR";
1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->printMessage(std::string("CONSOLE ") + level + ": ");
1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (source_line) {
1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    char buffer[40];
1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    snprintf(buffer, sizeof(buffer), "line %d: ", source_line);
1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(buffer);
1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!message.text.isEmpty()) {
1130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string new_message;
1131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    new_message = message.text.utf8();
1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size_t file_protocol = new_message.find("file://");
1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (file_protocol != std::string::npos) {
1134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new_message = new_message.substr(0, file_protocol) +
1135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    URLSuitableForTestResult(new_message.substr(file_protocol));
1136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(new_message);
1138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->printMessage(std::string("\n"));
1140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::LocationChangeDone(blink::WebFrame* frame) {
1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (frame != test_interfaces_->testRunner()->topLoadingFrame())
1144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_interfaces_->testRunner()->setTopLoadingFrame(frame, true);
1146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebNavigationPolicy WebTestProxyBase::DecidePolicyForNavigation(
1149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* frame,
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebDataSource::ExtraData* data,
1151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebURLRequest& request,
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebNavigationType type,
1153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebNavigationPolicy default_policy,
1154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool is_redirect) {
1155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebNavigationPolicy result;
1156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!test_interfaces_->testRunner()->policyDelegateEnabled())
1157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return default_policy;
1158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->printMessage(std::string("Policy delegate: attempt to load ") +
1160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          URLDescription(request.url()) +
1161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          " with navigation type '" +
1162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          WebNavigationTypeToString(type) + "'\n");
1163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->policyDelegateIsPermissive())
1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result = blink::WebNavigationPolicyCurrentTab;
1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result = blink::WebNavigationPolicyIgnore;
1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->policyDelegateShouldNotifyDone())
1169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_interfaces_->testRunner()->policyDelegateDone();
1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebTestProxyBase::WillCheckAndDispatchMessageEvent(
1174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebLocalFrame* source_frame,
1175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebFrame* target_frame,
1176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebSecurityOrigin target,
1177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    blink::WebDOMMessageEvent event) {
1178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldInterceptPostMessage()) {
1179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage("intercepted postMessage\n");
1180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
1181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
1184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::PostSpellCheckEvent(const blink::WebString& event_name) {
1187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_interfaces_->testRunner()->shouldDumpSpellCheckCallbacks()) {
1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delegate_->printMessage(std::string("SpellCheckEvent: ") +
1189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            event_name.utf8().data() + "\n");
1190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebTestProxyBase::ResetInputMethod() {
1194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If a composition text exists, then we need to let the browser process
1195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to cancel the input method's ongoing composition session.
1196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (web_widget_)
1197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    web_widget_->confirmComposition();
1198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebString WebTestProxyBase::acceptLanguages() {
1201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return blink::WebString::fromUTF8(accept_languages_);
1202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace content
1205