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