1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Google Inc. All rights reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions are 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Redistributions of source code must retain the above copyright 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer. 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Redistributions in binary form must reproduce the above 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * copyright notice, this list of conditions and the following disclaimer 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * in the documentation and/or other materials provided with the 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * distribution. 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Neither the name of Google Inc. nor the names of its 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * contributors may be used to endorse or promote products derived from 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this software without specific prior written permission. 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebViewHost.h" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "LayoutTestController.h" 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestNavigationController.h" 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestShell.h" 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestWebWorker.h" 38a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebCString.h" 39a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebConsoleMessage.h" 40a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebContextMenuData.h" 41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebDataSource.h" 426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebDeviceOrientationClientMock.h" 43a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebDragData.h" 44a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebElement.h" 45a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebFrame.h" 46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "WebGeolocationClientMock.h" 47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebHistoryItem.h" 48a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebNode.h" 49a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebRange.h" 50a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebRect.h" 51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebScreenInfo.h" 52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebSize.h" 536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebSpeechInputControllerMock.h" 54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebStorageNamespace.h" 552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WebTextCheckingCompletion.h" 562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WebTextCheckingResult.h" 57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebURLRequest.h" 58a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebURLResponse.h" 59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebView.h" 60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebWindowFeatures.h" 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "skia/ext/platform_canvas.h" 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "webkit/support/webkit_support.h" 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Assertions.h> 64e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <wtf/PassOwnPtr.h> 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/Vector.h> 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenusing namespace WebCore; 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebKit; 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace std; 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const int screenWidth = 1920; 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const int screenHeight = 1080; 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const int screenUnavailableBorder = 8; 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// WebNavigationType debugging strings taken from PolicyDelegate.mm. 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* linkClickedString = "link clicked"; 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* formSubmittedString = "form submitted"; 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* backForwardString = "back/forward"; 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* reloadString = "reload"; 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* formResubmittedString = "form resubmitted"; 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* otherString = "other"; 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* illegalString = "illegal value"; 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic int nextPageID = 1; 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Used to write a platform neutral file:/// URL by only taking the filename 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// (e.g., converts "file:///tmp/foo.txt" to just "foo.txt"). 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic string urlSuitableForTestResult(const string& url) 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (url.empty() || string::npos == url.find("file://")) 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return url; 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t pos = url.rfind('/'); 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (pos == string::npos) { 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if OS(WINDOWS) 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pos = url.rfind('\\'); 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (pos == string::npos) 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pos = 0; 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pos = 0; 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block string filename = url.substr(pos + 1); 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (filename.empty()) 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "file:"; // A WebKit test has this in its expected output. 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return filename; 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Used to write a platform neutral file:/// URL by taking the 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// filename and its directory. (e.g., converts 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// "file:///tmp/foo/bar.txt" to just "bar.txt"). 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic string descriptionSuitableForTestResult(const string& url) 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (url.empty() || string::npos == url.find("file://")) 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return url; 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t pos = url.rfind('/'); 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (pos == string::npos || !pos) 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "ERROR:" + url; 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pos = url.rfind('/', pos - 1); 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (pos == string::npos) 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "ERROR:" + url; 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return url.substr(pos + 1); 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Adds a file called "DRTFakeFile" to |data_object| (CF_HDROP). Use to fake 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// dragging a file. 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void addDRTFakeFileToDataObject(WebDragData* dragData) 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch dragData->appendToFilenames(WebString::fromUTF8("DRTFakeFile")); 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Get a debugging string from a WebNavigationType. 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char* webNavigationTypeToString(WebNavigationType type) 136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block switch (type) { 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebNavigationTypeLinkClicked: 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return linkClickedString; 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebNavigationTypeFormSubmitted: 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return formSubmittedString; 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebNavigationTypeBackForward: 143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return backForwardString; 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebNavigationTypeReload: 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return reloadString; 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebNavigationTypeFormResubmitted: 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return formResubmittedString; 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebNavigationTypeOther: 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return otherString; 150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return illegalString; 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic string URLDescription(const GURL& url) 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (url.SchemeIs("file")) 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return url.ExtractFileName(); 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return url.possibly_invalid_spec(); 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void printResponseDescription(const WebURLResponse& response) 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (response.isNull()) { 164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("(null)", stdout); 165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block string url = response.url().spec(); 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("<NSURLResponse %s, http status code %d>", 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block descriptionSuitableForTestResult(url).c_str(), 170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block response.httpStatusCode()); 171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void printNodeDescription(const WebNode& node, int exception) 174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (exception) { 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("ERROR", stdout); 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (node.isNull()) { 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("(null)", stdout); 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(node.nodeName().utf8().data(), stdout); 184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebNode& parent = node.parentNode(); 185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!parent.isNull()) { 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" > ", stdout); 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printNodeDescription(parent, 0); 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void printRangeDescription(const WebRange& range) 192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (range.isNull()) { 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("(null)", stdout); 195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("range from %d of ", range.startOffset()); 198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int exception = 0; 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNode startNode = range.startContainer(exception); 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printNodeDescription(startNode, exception); 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" to %d of ", range.endOffset()); 202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNode endNode = range.endContainer(exception); 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printNodeDescription(endNode, exception); 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic string editingActionDescription(WebEditingAction action) 207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block switch (action) { 209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebEditingActionTyped: 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "WebViewInsertActionTyped"; 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebEditingActionPasted: 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "WebViewInsertActionPasted"; 213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebEditingActionDropped: 214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "WebViewInsertActionDropped"; 215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "(UNKNOWN ACTION)"; 217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic string textAffinityDescription(WebTextAffinity affinity) 220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block switch (affinity) { 222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebTextAffinityUpstream: 223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "NSSelectionAffinityUpstream"; 224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case WebKit::WebTextAffinityDownstream: 225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "NSSelectionAffinityDownstream"; 226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return "(UNKNOWN AFFINITY)"; 228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// WebViewClient ------------------------------------------------------------- 231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebView* WebViewHost::createView(WebFrame*, const WebURLRequest&, const WebWindowFeatures&, const WebString&) 233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!layoutTestController()->canOpenWindows()) 235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 236cad810f21b803229eb11403f9209855525a25d57Steve Block return m_shell->createNewWindow(WebURL())->webView(); 237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenWebWidget* WebViewHost::createPopupMenu(WebPopupType) 240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebWidget* WebViewHost::createPopupMenu(const WebPopupMenuInfo&) 245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenWebStorageNamespace* WebViewHost::createSessionStorageNamespace(unsigned quota) 250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 2516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return WebKit::WebStorageNamespace::createSessionStorageNamespace(quota); 252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didAddMessageToConsole(const WebConsoleMessage& message, const WebString& sourceName, unsigned sourceLine) 255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // This matches win DumpRenderTree's UIDelegate.cpp. 257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block string newMessage; 258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!message.text.isEmpty()) { 259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block newMessage = message.text.utf8(); 260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t fileProtocol = newMessage.find("file://"); 261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (fileProtocol != string::npos) { 262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block newMessage = newMessage.substr(0, fileProtocol) 263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block + urlSuitableForTestResult(newMessage.substr(fileProtocol)); 264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("CONSOLE MESSAGE: line %d: %s\n", sourceLine, newMessage.data()); 267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didStartLoading() 270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->setIsLoading(true); 272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didStopLoading() 275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->setIsLoading(false); 277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// The output from these methods in layout test mode should match that 280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// expected by the layout tests. See EditingDelegate.m in DumpRenderTree. 281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldBeginEditing(const WebRange& range) 283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: shouldBeginEditingInDOMRange:", stdout); 286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(range); 287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldEndEditing(const WebRange& range) 293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: shouldEndEditingInDOMRange:", stdout); 296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(range); 297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldInsertNode(const WebNode& node, const WebRange& range, WebEditingAction action) 303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: shouldInsertNode:", stdout); 306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printNodeDescription(node, 0); 307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" replacingDOMRange:", stdout); 308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(range); 309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" givenAction:%s\n", editingActionDescription(action).c_str()); 310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldInsertText(const WebString& text, const WebRange& range, WebEditingAction action) 315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("EDITING DELEGATE: shouldInsertText:%s replacingDOMRange:", text.utf8().data()); 318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(range); 319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" givenAction:%s\n", editingActionDescription(action).c_str()); 320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldChangeSelectedRange( 325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebRange& fromRange, const WebRange& toRange, WebTextAffinity affinity, bool stillSelecting) 326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: shouldChangeSelectedDOMRange:", stdout); 329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(fromRange); 330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" toDOMRange:", stdout); 331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(toRange); 332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" affinity:%s stillSelecting:%s\n", 333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block textAffinityDescription(affinity).c_str(), 334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (stillSelecting ? "TRUE" : "FALSE")); 335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldDeleteRange(const WebRange& range) 340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: shouldDeleteDOMRange:", stdout); 343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(range); 344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::shouldApplyStyle(const WebString& style, const WebRange& range) 350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) { 352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("EDITING DELEGATE: shouldApplyStyle:%s toElementsInDOMRange:", style.utf8().data()); 353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printRangeDescription(range); 354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return layoutTestController()->acceptsEditing(); 357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::isSmartInsertDeleteEnabled() 360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_smartInsertDeleteEnabled; 362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::isSelectTrailingWhitespaceEnabled() 365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_selectTrailingWhitespaceEnabled; 367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didBeginEditing() 370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!layoutTestController()->shouldDumpEditingCallbacks()) 372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification\n", stdout); 374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didChangeSelection(bool isEmptySelection) 377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpEditingCallbacks()) 379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification\n", stdout); 380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // No need to update clipboard with the selected text in DRT. 381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didChangeContents() 384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!layoutTestController()->shouldDumpEditingCallbacks()) 386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification\n", stdout); 388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didEndEditing() 391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!layoutTestController()->shouldDumpEditingCallbacks()) 393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("EDITING DELEGATE: webViewDidEndEditing:WebViewDidEndEditingNotification\n", stdout); 395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::handleCurrentKeyboardEvent() 398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_editCommandName.empty()) 400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebFrame* frame = webView()->focusedFrame(); 402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!frame) 403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return frame->executeCommand(WebString::fromUTF8(m_editCommandName), WebString::fromUTF8(m_editCommandValue)); 406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebViewHost::spellCheck(const WebString& text, int& misspelledOffset, int& misspelledLength, WebVector<WebString>* optionalSuggestions) 409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Check the spelling of the given text. 411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_spellcheck.spellCheckWord(text, &misspelledOffset, &misspelledLength); 412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebViewHost::requestCheckingOfText(const WebString& text, WebTextCheckingCompletion* completion) 4152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 4162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_lastRequestedTextCheckingCompletion = completion; 4172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_lastRequestedTextCheckString = text; 41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch postDelayedTask(new HostMethodTask(this, &WebViewHost::finishLastTextCheck), 0); 4192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 4202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 4212fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebViewHost::finishLastTextCheck() 4222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 4232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Vector<WebTextCheckingResult> results; 4242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // FIXME: Do the grammar check. 4252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int offset = 0; 4262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String text(m_lastRequestedTextCheckString.data(), m_lastRequestedTextCheckString.length()); 4272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block while (text.length()) { 4282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int misspelledPosition = 0; 4292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int misspelledLength = 0; 4302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_spellcheck.spellCheckWord(WebString(text.characters(), text.length()), &misspelledPosition, &misspelledLength); 4312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!misspelledLength) 4322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block break; 4332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block results.append(WebTextCheckingResult(WebTextCheckingResult::ErrorSpelling, offset + misspelledPosition, misspelledLength)); 4342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block text = text.substring(misspelledPosition + misspelledLength); 4352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block offset += misspelledPosition; 4362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 4372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 4382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_lastRequestedTextCheckingCompletion->didFinishCheckingText(results); 4392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_lastRequestedTextCheckingCompletion = 0; 4402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 4412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 4422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebString WebViewHost::autoCorrectWord(const WebString&) 444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Returns an empty string as Mac WebKit ('WebKitSupport/WebEditorClient.mm') 446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // does. (If this function returns a non-empty string, WebKit replaces the 447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // given misspelled string with the result one. This process executes some 448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // editor commands and causes layout-test failures.) 449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return WebString(); 450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::runModalAlertDialog(WebFrame*, const WebString& message) 453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("ALERT: %s\n", message.utf8().data()); 455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::runModalConfirmDialog(WebFrame*, const WebString& message) 458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("CONFIRM: %s\n", message.utf8().data()); 460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::runModalPromptDialog(WebFrame* frame, const WebString& message, 464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebString& defaultValue, WebString*) 465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("PROMPT: %s, default text: %s\n", message.utf8().data(), defaultValue.utf8().data()); 467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::runModalBeforeUnloadDialog(WebFrame*, const WebString&) 471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; // Allow window closure. 473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WebViewHost::showContextMenu(WebFrame*, const WebContextMenuData& contextMenuData) 476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 4776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_lastContextMenuData = adoptPtr(new WebContextMenuData(contextMenuData)); 478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WebViewHost::clearContextMenuData() 4816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 4826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_lastContextMenuData.clear(); 4836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 4846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 4856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerWebContextMenuData* WebViewHost::lastContextMenuData() const 4866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 4876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return m_lastContextMenuData.get(); 4886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setStatusText(const WebString& text) 491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!layoutTestController()->shouldDumpStatusCallbacks()) 493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // When running tests, write to stdout. 495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", text.utf8().data()); 496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid WebViewHost::startDragging(const WebDragData& data, WebDragOperationsMask mask, const WebImage&, const WebPoint&) 499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebDragData mutableDragData = data; 501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldAddFileToPasteboard()) { 502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Add a file called DRTFakeFile to the drag&drop clipboard. 503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block addDRTFakeFileToDataObject(&mutableDragData); 504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // When running a test, we need to fake a drag drop operation otherwise 507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Windows waits for real mouse events to know when the drag is over. 5086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_shell->eventSender()->doDragDrop(mutableDragData, mask); 509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::navigateBackForwardSoon(int offset) 512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block navigationController()->goToOffset(offset); 514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint WebViewHost::historyBackListCount() 517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return navigationController()->lastCommittedEntryIndex(); 519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint WebViewHost::historyForwardListCount() 522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int currentIndex =navigationController()->lastCommittedEntryIndex(); 524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return navigationController()->entryCount() - currentIndex - 1; 525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 52768513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid WebViewHost::postAccessibilityNotification(const WebAccessibilityObject& obj, WebAccessibilityNotification notification) 52868513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 529a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (notification == WebAccessibilityNotificationFocusedUIElementChanged) 530a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_shell->accessibilityController()->setFocusedElement(obj); 531a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 53268513a70bcd92384395513322f1b801e7bf9c729Steve Block if (m_shell->accessibilityController()->shouldDumpAccessibilityNotifications()) { 53368513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("AccessibilityNotification - "); 53468513a70bcd92384395513322f1b801e7bf9c729Steve Block 53568513a70bcd92384395513322f1b801e7bf9c729Steve Block switch (notification) { 53668513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationActiveDescendantChanged: 53768513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("ActiveDescendantChanged"); 53868513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 53968513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationCheckedStateChanged: 54068513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("CheckedStateChanged"); 54168513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 54268513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationChildrenChanged: 54368513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("ChildrenChanged"); 54468513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 54568513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationFocusedUIElementChanged: 54668513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("FocusedUIElementChanged"); 54768513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 54868513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationLayoutComplete: 54968513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("LayoutComplete"); 55068513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 55168513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationLoadComplete: 55268513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("LoadComplete"); 55368513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 55468513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationSelectedChildrenChanged: 55568513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("SelectedChildrenChanged"); 55668513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 55768513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationSelectedTextChanged: 55868513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("SelectedTextChanged"); 55968513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 56068513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationValueChanged: 56168513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("ValueChanged"); 56268513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 56368513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationScrolledToAnchor: 56468513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("ScrolledToAnchor"); 56568513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 56668513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationLiveRegionChanged: 56768513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("LiveRegionChanged"); 56868513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 56968513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationMenuListValueChanged: 57068513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("MenuListValueChanged"); 57168513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 57268513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationRowCountChanged: 57368513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("RowCountChanged"); 57468513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 57568513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationRowCollapsed: 57668513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("RowCollapsed"); 57768513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 57868513a70bcd92384395513322f1b801e7bf9c729Steve Block case WebAccessibilityNotificationRowExpanded: 57968513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("RowExpanded"); 58068513a70bcd92384395513322f1b801e7bf9c729Steve Block break; 581a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch default: 582a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 58368513a70bcd92384395513322f1b801e7bf9c729Steve Block } 58468513a70bcd92384395513322f1b801e7bf9c729Steve Block 58568513a70bcd92384395513322f1b801e7bf9c729Steve Block WebKit::WebNode node = obj.node(); 58668513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!node.isNull() && node.isElementNode()) { 58768513a70bcd92384395513322f1b801e7bf9c729Steve Block WebKit::WebElement element = node.to<WebKit::WebElement>(); 58868513a70bcd92384395513322f1b801e7bf9c729Steve Block if (element.hasAttribute("id")) 58968513a70bcd92384395513322f1b801e7bf9c729Steve Block printf(" - id:%s", element.getAttribute("id").utf8().data()); 59068513a70bcd92384395513322f1b801e7bf9c729Steve Block } 59168513a70bcd92384395513322f1b801e7bf9c729Steve Block 59268513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("\n"); 59368513a70bcd92384395513322f1b801e7bf9c729Steve Block } 5945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 5955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 5966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenWebNotificationPresenter* WebViewHost::notificationPresenter() 5976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 5986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return m_shell->notificationPresenter(); 5996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 6006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 601f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochWebKit::WebGeolocationClient* WebViewHost::geolocationClient() 602f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 603f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return geolocationClientMock(); 604f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 605f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 606f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochWebKit::WebGeolocationClientMock* WebViewHost::geolocationClientMock() 607f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 608f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!m_geolocationClientMock) 609f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_geolocationClientMock.set(WebGeolocationClientMock::create()); 610f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return m_geolocationClientMock.get(); 611f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 612e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 613dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebSpeechInputController* WebViewHost::speechInputController(WebKit::WebSpeechInputListener* listener) 614dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 6156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!m_speechInputControllerMock) 6166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_speechInputControllerMock.set(WebSpeechInputControllerMock::create(listener)); 6176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return m_speechInputControllerMock.get(); 6186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 6196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 6206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerWebDeviceOrientationClientMock* WebViewHost::deviceOrientationClientMock() 6216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 6226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!m_deviceOrientationClientMock.get()) 6236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_deviceOrientationClientMock.set(WebDeviceOrientationClientMock::create()); 6246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return m_deviceOrientationClientMock.get(); 6256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 6266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 6276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerMockSpellCheck* WebViewHost::mockSpellCheck() 6286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 6296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return &m_spellcheck; 630dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 631dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 6326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerWebDeviceOrientationClient* WebViewHost::deviceOrientationClient() 6335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 6346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return deviceOrientationClientMock(); 6355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 6365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// WebWidgetClient ----------------------------------------------------------- 638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didInvalidateRect(const WebRect& rect) 640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updatePaintRect(rect); 642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didScrollRect(int, int, const WebRect& clipRect) 645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // This is used for optimizing painting when the renderer is scrolled. We're 647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // currently not doing any optimizations so just invalidate the region. 648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block didInvalidateRect(clipRect); 649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 651a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WebViewHost::scheduleComposite() 652a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 653a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch WebSize widgetSize = webWidget()->size(); 654a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch WebRect clientRect(0, 0, widgetSize.width, widgetSize.height); 655a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch didInvalidateRect(clientRect); 656a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 657a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 658ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if ENABLE(REQUEST_ANIMATION_FRAME) 659ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WebViewHost::scheduleAnimation() 660ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 66181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch postDelayedTask(new HostMethodTask(this, &WebViewHost::scheduleComposite), 0); 662ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 663ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif 664ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFocus() 666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->setFocus(webWidget(), true); 668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didBlur() 671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->setFocus(webWidget(), false); 673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebScreenInfo WebViewHost::screenInfo() 676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // We don't need to set actual values. 678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebScreenInfo info; 679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block info.depth = 24; 680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block info.depthPerComponent = 8; 681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block info.isMonochrome = false; 682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block info.rect = WebRect(0, 0, screenWidth, screenHeight); 683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Use values different from info.rect for testing. 684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block info.availableRect = WebRect(screenUnavailableBorder, screenUnavailableBorder, 685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block screenWidth - screenUnavailableBorder * 2, 686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block screenHeight - screenUnavailableBorder * 2); 687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return info; 688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::show(WebNavigationPolicy) 691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_hasWindow = true; 693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebSize size = webWidget()->size(); 694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updatePaintRect(WebRect(0, 0, size.width, size.height)); 695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 6976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 6986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 6996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WebViewHost::closeWidget() 700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_hasWindow = false; 702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->closeWindow(this); 7036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner // No more code here, we should be deleted at this point. 7046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 7056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 7066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WebViewHost::closeWidgetSoon() 7076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 70881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch postDelayedTask(new HostMethodTask(this, &WebViewHost::closeWidget), 0); 709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didChangeCursor(const WebCursorInfo& cursorInfo) 712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!hasWindow()) 714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_currentCursor = cursorInfo; 716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebRect WebViewHost::windowRect() 719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_windowRect; 721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setWindowRect(const WebRect& rect) 724dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_windowRect = rect; 726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const int border2 = TestShell::virtualWindowBorder * 2; 727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_windowRect.width <= border2) 728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_windowRect.width = 1 + border2; 729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_windowRect.height <= border2) 730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_windowRect.height = 1 + border2; 731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int width = m_windowRect.width - border2; 732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int height = m_windowRect.height - border2; 733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardBackingStore(); 734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block webWidget()->resize(WebSize(width, height)); 735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updatePaintRect(WebRect(0, 0, width, height)); 736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebRect WebViewHost::rootWindowRect() 739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return windowRect(); 741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebRect WebViewHost::windowResizerRect() 744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Not necessary. 746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return WebRect(); 747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::runModal() 750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 751a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool oldState = webkit_support::MessageLoopNestableTasksAllowed(); 752a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch webkit_support::MessageLoopSetNestableTasksAllowed(true); 753a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_inModalLoop = true; 754a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch webkit_support::RunMessageLoop(); 755a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch webkit_support::MessageLoopSetNestableTasksAllowed(oldState); 756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// WebFrameClient ------------------------------------------------------------ 759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebPlugin* WebViewHost::createPlugin(WebFrame* frame, const WebPluginParams& params) 761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return webkit_support::CreateWebPlugin(frame, params); 763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebWorker* WebViewHost::createWorker(WebFrame*, WebWorkerClient*) 766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return new TestWebWorker(); 768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebMediaPlayer* WebViewHost::createMediaPlayer(WebFrame* frame, WebMediaPlayerClient* client) 771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return webkit_support::CreateMediaPlayer(frame, client); 773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 7756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenWebApplicationCacheHost* WebViewHost::createApplicationCacheHost(WebFrame* frame, WebApplicationCacheHostClient* client) 7766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 7776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return webkit_support::CreateApplicationCacheHost(frame, client); 7786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 7796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::allowPlugins(WebFrame* frame, bool enabledPerSettings) 781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return enabledPerSettings; 783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::allowImages(WebFrame* frame, bool enabledPerSettings) 786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return enabledPerSettings; 788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::loadURLExternally(WebFrame*, const WebURLRequest& request, WebNavigationPolicy policy) 791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(policy != WebKit::WebNavigationPolicyCurrentTab); 793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebViewHost* another = m_shell->createNewWindow(request.url()); 794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (another) 795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block another->show(policy); 796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebNavigationPolicy WebViewHost::decidePolicyForNavigation( 799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebFrame*, const WebURLRequest& request, 800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNavigationType type, const WebNode& originatingNode, 801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNavigationPolicy defaultPolicy, bool isRedirect) 802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNavigationPolicy result; 804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_policyDelegateEnabled) 805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return defaultPolicy; 806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("Policy delegate: attempt to load %s with navigation type '%s'", 808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block URLDescription(request.url()).c_str(), webNavigationTypeToString(type)); 809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!originatingNode.isNull()) { 810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" originating from ", stdout); 811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printNodeDescription(originatingNode, 0); 812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_policyDelegateIsPermissive) 815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = WebKit::WebNavigationPolicyCurrentTab; 816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else 817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result = WebKit::WebNavigationPolicyIgnore; 818dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_policyDelegateShouldNotifyDone) 820dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block layoutTestController()->policyDelegateDone(); 821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return result; 822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::canHandleRequest(WebFrame*, const WebURLRequest& request) 825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GURL url = request.url(); 827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Just reject the scheme used in 828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // LayoutTests/http/tests/misc/redirect-to-external-url.html 829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return !url.SchemeIs("spaceballs"); 830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebURLError WebViewHost::cannotHandleRequestError(WebFrame*, const WebURLRequest& request) 833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebURLError error; 835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // A WebKit layout test expects the following values. 836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // unableToImplementPolicyWithError() below prints them. 837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block error.domain = WebString::fromUTF8("WebKitErrorDomain"); 838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block error.reason = 101; 839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block error.unreachableURL = request.url(); 840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return error; 841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 843dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebURLError WebViewHost::cancelledError(WebFrame*, const WebURLRequest& request) 844dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 845dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return webkit_support::CreateCancelledError(request); 846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::unableToImplementPolicyWithError(WebFrame* frame, const WebURLError& error) 849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("Policy delegate: unable to implement policy with error domain '%s', " 851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block "error code %d, in frame '%s'\n", 852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block error.domain.utf8().data(), error.reason, frame->name().utf8().data()); 853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::willPerformClientRedirect(WebFrame* frame, const WebURL& from, const WebURL& to, 856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block double interval, double fire_time) 857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_shell->shouldDumpFrameLoadCallbacks()) 859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 860dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 861dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" - willPerformClientRedirectToURL: %s \n", to.spec().data()); 862dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 863dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didCancelClientRedirect(WebFrame* frame) 865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_shell->shouldDumpFrameLoadCallbacks()) 867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didCancelClientRedirectForFrame\n", stdout); 870dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 871dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 872dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didCreateDataSource(WebFrame*, WebDataSource* ds) 873dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 874e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke ds->setExtraData(m_pendingExtraData.leakPtr()); 87568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!layoutTestController()->deferMainResourceDataLoad()) 87668513a70bcd92384395513322f1b801e7bf9c729Steve Block ds->setDeferMainResourceDataLoad(false); 877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didStartProvisionalLoad(WebFrame* frame) 880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 881e14391e94c850b8bd03680c23b38978db68687a8John Reck if (m_shell->shouldDumpUserGestureInFrameLoadCallbacks()) 882e14391e94c850b8bd03680c23b38978db68687a8John Reck printFrameUserGestureStatus(frame, " - in didStartProvisionalLoadForFrame\n"); 883dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didStartProvisionalLoadForFrame\n", stdout); 886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_topLoadingFrame) 889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_topLoadingFrame = frame; 890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->stopProvisionalFrameLoads()) { 892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - stopping load in didStartProvisionalLoadForFrame callback\n", stdout); 894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frame->stopLoading(); 895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateAddressBar(frame->view()); 897dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didReceiveServerRedirectForProvisionalLoad(WebFrame* frame) 900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didReceiveServerRedirectForProvisionalLoadForFrame\n", stdout); 904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateAddressBar(frame->view()); 906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 907dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 908dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFailProvisionalLoad(WebFrame* frame, const WebURLError& error) 909dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 911dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 912dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didFailProvisionalLoadWithError\n", stdout); 913dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 915dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block locationChangeDone(frame); 916dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 917dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Don't display an error page if we're running layout tests, because 918dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // DumpRenderTree doesn't. 919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didCommitProvisionalLoad(WebFrame* frame, bool isNewNavigation) 922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didCommitLoadForFrame\n", stdout); 926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateForCommittedLoad(frame, isNewNavigation); 928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didClearWindowObject(WebFrame* frame) 931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->bindJSObjectsToWindow(frame); 933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 9352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebViewHost::didReceiveTitle(WebFrame* frame, const WebString& title, WebTextDirection direction) 936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebCString title8 = title.utf8(); 938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" - didReceiveTitle: %s\n", title8.data()); 942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpTitleChanges()) 945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("TITLE CHANGED: %s\n", title8.data()); 946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setPageTitle(title); 9482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch layoutTestController()->setTitleTextDirection(direction); 949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFinishDocumentLoad(WebFrame* frame) 952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 954dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didFinishDocumentLoadForFrame\n", stdout); 956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block unsigned pendingUnloadEvents = frame->unloadListenerCount(); 958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (pendingUnloadEvents) { 959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" - has %u onunload handler(s)\n", pendingUnloadEvents); 961dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 962dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 963dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 964dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 965dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didHandleOnloadEvents(WebFrame* frame) 966dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 968dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 969dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didHandleOnloadEventsForFrame\n", stdout); 970dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 971dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 972dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 973dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFailLoad(WebFrame* frame, const WebURLError& error) 974dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 976dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didFailLoadWithError\n", stdout); 978dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block locationChangeDone(frame); 980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFinishLoad(WebFrame* frame) 983dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 985dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didFinishLoadForFrame\n", stdout); 987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 988dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateAddressBar(frame->view()); 989dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block locationChangeDone(frame); 990dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 991dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 99221939df44de1705786c545cd1bf519d47250322dBen Murdochvoid WebViewHost::didNavigateWithinPage(WebFrame* frame, bool isNewNavigation) 993dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 994e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke frame->dataSource()->setExtraData(m_pendingExtraData.leakPtr()); 99521939df44de1705786c545cd1bf519d47250322dBen Murdoch 99621939df44de1705786c545cd1bf519d47250322dBen Murdoch updateForCommittedLoad(frame, isNewNavigation); 99721939df44de1705786c545cd1bf519d47250322dBen Murdoch} 99821939df44de1705786c545cd1bf519d47250322dBen Murdoch 99921939df44de1705786c545cd1bf519d47250322dBen Murdochvoid WebViewHost::didChangeLocationWithinPage(WebFrame* frame) 100021939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 1001dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) { 1002dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printFrameDescription(frame); 1003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didChangeLocationWithinPageForFrame\n", stdout); 1004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::assignIdentifierToRequest(WebFrame*, unsigned identifier, const WebURLRequest& request) 1008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 10096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!m_shell->shouldDumpResourceLoadCallbacks()) 10106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return; 101128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(!m_resourceIdentifierMap.contains(identifier)); 1012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_resourceIdentifierMap.set(identifier, descriptionSuitableForTestResult(request.url().spec())); 1013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1014dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 101528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid WebViewHost::removeIdentifierForRequest(unsigned identifier) 101628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 101728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_resourceIdentifierMap.remove(identifier); 101828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 101928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 1020dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::willSendRequest(WebFrame*, unsigned identifier, WebURLRequest& request, const WebURLResponse& redirectResponse) 1021dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1022dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Need to use GURL for host() and SchemeIs() 1023dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GURL url = request.url(); 1024dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block string requestURL = url.possibly_invalid_spec(); 1025dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1026dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (layoutTestController()->shouldDumpResourceLoadCallbacks()) { 1027dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GURL mainDocumentURL = request.firstPartyForCookies(); 1028dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printResourceDescription(identifier); 1029dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf(" - willSendRequest <NSURLRequest URL %s, main document URL %s," 103021939df44de1705786c545cd1bf519d47250322dBen Murdoch " http method %s> redirectResponse ", 1031dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block descriptionSuitableForTestResult(requestURL).c_str(), 1032dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block URLDescription(mainDocumentURL).c_str(), 1033dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request.httpMethod().utf8().data()); 1034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printResponseDescription(redirectResponse); 1035dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 1036dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1037dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!redirectResponse.isNull() && m_blocksRedirects) { 1039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("Returning null for this redirect\n", stdout); 1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // To block the request, we set its URL to an empty one. 1041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request.setURL(WebURL()); 1042dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1043dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1044dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1045dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_requestReturnNull) { 1046dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // To block the request, we set its URL to an empty one. 1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request.setURL(WebURL()); 1048dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1049dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1050dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1051dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block string host = url.host(); 1052dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // 255.255.255.255 is used in some tests that expect to get back an error. 1053dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!host.empty() && (url.SchemeIs("http") || url.SchemeIs("https")) 1054dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && host != "127.0.0.1" 1055dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && host != "255.255.255.255" 105606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen && host != "localhost" 105706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen && !m_shell->allowExternalPages()) { 1058dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("Blocked access to external URL %s\n", requestURL.c_str()); 1059dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1060dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // To block the request, we set its URL to an empty one. 1061dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request.setURL(WebURL()); 1062dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1063dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1064dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 10656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen HashSet<String>::const_iterator end = m_clearHeaders.end(); 10666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen for (HashSet<String>::const_iterator header = m_clearHeaders.begin(); header != end; ++header) 10676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen request.clearHTTPHeaderField(WebString(header->characters(), header->length())); 10686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1069dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Set the new substituted URL. 1070dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request.setURL(webkit_support::RewriteLayoutTestsURL(request.url().spec())); 1071dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1072dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1073dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didReceiveResponse(WebFrame*, unsigned identifier, const WebURLResponse& response) 1074dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 107568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (m_shell->shouldDumpResourceLoadCallbacks()) { 107668513a70bcd92384395513322f1b801e7bf9c729Steve Block printResourceDescription(identifier); 107768513a70bcd92384395513322f1b801e7bf9c729Steve Block fputs(" - didReceiveResponse ", stdout); 107868513a70bcd92384395513322f1b801e7bf9c729Steve Block printResponseDescription(response); 107968513a70bcd92384395513322f1b801e7bf9c729Steve Block fputs("\n", stdout); 108068513a70bcd92384395513322f1b801e7bf9c729Steve Block } 108168513a70bcd92384395513322f1b801e7bf9c729Steve Block if (m_shell->shouldDumpResourceResponseMIMETypes()) { 108268513a70bcd92384395513322f1b801e7bf9c729Steve Block GURL url = response.url(); 108368513a70bcd92384395513322f1b801e7bf9c729Steve Block WebString mimeType = response.mimeType(); 108468513a70bcd92384395513322f1b801e7bf9c729Steve Block printf("%s has MIME type %s\n", 108568513a70bcd92384395513322f1b801e7bf9c729Steve Block url.ExtractFileName().c_str(), 108668513a70bcd92384395513322f1b801e7bf9c729Steve Block // Simulate NSURLResponse's mapping of empty/unknown MIME types to application/octet-stream 108768513a70bcd92384395513322f1b801e7bf9c729Steve Block mimeType.isEmpty() ? "application/octet-stream" : mimeType.utf8().data()); 108868513a70bcd92384395513322f1b801e7bf9c729Steve Block } 1089dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1090dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1091dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFinishResourceLoad(WebFrame*, unsigned identifier) 1092dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1093dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpResourceLoadCallbacks()) { 1094dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printResourceDescription(identifier); 1095dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didFinishLoading\n", stdout); 1096dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 109728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu removeIdentifierForRequest(identifier); 1098dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1099dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didFailResourceLoad(WebFrame*, unsigned identifier, const WebURLError& error) 1101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpResourceLoadCallbacks()) { 1103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printResourceDescription(identifier); 1104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs(" - didFailLoadingWithError: ", stdout); 1105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch fputs(webkit_support::MakeURLErrorDescription(error).c_str(), stdout); 1106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("\n", stdout); 1107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 110828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu removeIdentifierForRequest(identifier); 1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::didDisplayInsecureContent(WebFrame*) 1112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) 1114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("didDisplayInsecureContent\n", stdout); 1115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 11172fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebViewHost::didRunInsecureContent(WebFrame*, const WebSecurityOrigin& origin, const WebURL& insecureURL) 1118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_shell->shouldDumpFrameLoadCallbacks()) 1120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("didRunInsecureContent\n", stdout); 1121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::allowScript(WebFrame*, bool enabledPerSettings) 1124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return enabledPerSettings; 1126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1128e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid WebViewHost::openFileSystem(WebFrame* frame, WebFileSystem::Type type, long long size, bool create, WebFileSystemCallbacks* callbacks) 1129e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 1130e14391e94c850b8bd03680c23b38978db68687a8John Reck webkit_support::OpenFileSystem(frame, type, size, create, callbacks); 1131e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1132e14391e94c850b8bd03680c23b38978db68687a8John Reck 1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Public functions ----------------------------------------------------------- 1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebViewHost::WebViewHost(TestShell* shell) 11366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner : m_shell(shell) 1137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch , m_webWidget(0) 11382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_lastRequestedTextCheckingCompletion(0) 1139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 11406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner reset(); 1141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebViewHost::~WebViewHost() 1144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // DevTools frontend page is supposed to be navigated only once and 1146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // loading another URL in that Page is an error. 1147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_shell->devToolsWebView() != this) { 1148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Navigate to an empty page to fire all the destruction logic for the 1149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // current page. 1150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadURLForFrame(GURL("about:blank"), WebString()); 1151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 11526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 11536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner webWidget()->close(); 11546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 11556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (m_inModalLoop) 11566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner webkit_support::QuitMessageLoop(); 1157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 11592bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebViewHost::setWebWidget(WebKit::WebWidget* widget) 11602bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 11612bde8e466a4451c7319e3a072d118917957d6554Steve Block m_webWidget = widget; 11622bde8e466a4451c7319e3a072d118917957d6554Steve Block webView()->setSpellCheckClient(this); 11632bde8e466a4451c7319e3a072d118917957d6554Steve Block} 11642bde8e466a4451c7319e3a072d118917957d6554Steve Block 1165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebView* WebViewHost::webView() const 1166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(m_webWidget); 1168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // DRT does not support popup widgets. So m_webWidget is always a WebView. 1169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return static_cast<WebView*>(m_webWidget); 1170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebWidget* WebViewHost::webWidget() const 1173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(m_webWidget); 1175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_webWidget; 1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::reset() 1179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 11806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_policyDelegateEnabled = false; 11816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_policyDelegateIsPermissive = false; 11826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_policyDelegateShouldNotifyDone = false; 11836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_topLoadingFrame = 0; 11846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_pageId = -1; 11856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_lastPageIdUpdated = -1; 11866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_hasWindow = false; 11876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_inModalLoop = false; 11886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_smartInsertDeleteEnabled = true; 11896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if OS(WINDOWS) 11906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_selectTrailingWhitespaceEnabled = true; 11916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#else 11926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_selectTrailingWhitespaceEnabled = false; 11936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif 11946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_blocksRedirects = false; 11956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_requestReturnNull = false; 11966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_isPainting = false; 11976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_canvas.clear(); 11986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 11996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_navigationController.set(new TestNavigationController(this)); 12006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 12016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_pendingExtraData.clear(); 12026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_resourceIdentifierMap.clear(); 12036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_clearHeaders.clear(); 12046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_editCommandName.clear(); 12056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_editCommandValue.clear(); 12066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1207f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_geolocationClientMock.get()) 1208f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_geolocationClientMock->resetMock(); 12096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 12106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (m_speechInputControllerMock.get()) 12116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_speechInputControllerMock->clearResults(); 12126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 12136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_currentCursor = WebCursorInfo(); 12146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_windowRect = WebRect(); 12156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_paintRect = WebRect(); 12166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 121781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_webWidget) { 12186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner webView()->mainFrame()->setName(WebString()); 121981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch webView()->settings()->setMinimumTimerInterval(webkit_support::GetForegroundTabTimerInterval()); 122081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 1221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setSelectTrailingWhitespaceEnabled(bool enabled) 1224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_selectTrailingWhitespaceEnabled = enabled; 1226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // In upstream WebKit, smart insert/delete is mutually exclusive with select 1227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // trailing whitespace, however, we allow both because Chromium on Windows 1228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // allows both. 1229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setSmartInsertDeleteEnabled(bool enabled) 1232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_smartInsertDeleteEnabled = enabled; 1234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // In upstream WebKit, smart insert/delete is mutually exclusive with select 1235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // trailing whitespace, however, we allow both because Chromium on Windows 1236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // allows both. 1237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setCustomPolicyDelegate(bool isCustom, bool isPermissive) 1240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_policyDelegateEnabled = isCustom; 1242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_policyDelegateIsPermissive = isPermissive; 1243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::waitForPolicyDelegate() 1246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_policyDelegateEnabled = true; 1248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_policyDelegateShouldNotifyDone = true; 1249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setEditCommand(const string& name, const string& value) 1252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_editCommandName = name; 1254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_editCommandValue = value; 1255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::clearEditCommand() 1258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_editCommandName.clear(); 1260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_editCommandValue.clear(); 1261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::loadURLForFrame(const WebURL& url, const WebString& frameName) 1264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!url.isValid()) 1266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block TestShell::resizeWindowForTest(this, url); 1268dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch navigationController()->loadEntry(TestNavigationEntry::create(-1, url, WebString(), frameName).get()); 1269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool WebViewHost::navigate(const TestNavigationEntry& entry, bool reload) 1272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Get the right target frame for the entry. 1274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebFrame* frame = webView()->mainFrame(); 1275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!entry.targetFrame().isEmpty()) 1276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frame = webView()->findFrameByName(entry.targetFrame()); 1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // TODO(mpcomplete): should we clear the target frame, or should 1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // back/forward navigations maintain the target frame? 1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // A navigation resulting from loading a javascript URL should not be 1282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // treated as a browser initiated event. Instead, we want it to look as if 1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // the page initiated any load resulting from JS execution. 1284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!GURL(entry.URL()).SchemeIs("javascript")) 1285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setPendingExtraData(new TestShellExtraData(entry.pageID())); 1286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If we are reloading, then WebKit will use the state of the current page. 1288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Otherwise, we give it the state to navigate to. 1289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (reload) { 1290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frame->reload(false); 1291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (!entry.contentState().isNull()) { 1292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(entry.pageID() != -1); 1293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frame->loadHistoryItem(entry.contentState()); 1294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 1295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(entry.pageID() == -1); 1296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frame->loadRequest(WebURLRequest(entry.URL())); 1297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // In case LoadRequest failed before DidCreateDataSource was called. 1300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setPendingExtraData(0); 1301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Restore focus to the main frame prior to loading new request. 1303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // This makes sure that we don't have a focused iframe. Otherwise, that 1304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // iframe would keep focus when the SetFocus called immediately after 1305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // LoadRequest, thus making some tests fail (see http://b/issue?id=845337 1306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // for more details). 1307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block webView()->setFocusedFrame(frame); 1308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_shell->setFocus(webView(), true); 1309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 1311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Private functions ---------------------------------------------------------- 1314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockLayoutTestController* WebViewHost::layoutTestController() const 1316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_shell->layoutTestController(); 1318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::updateAddressBar(WebView* webView) 1321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebFrame* mainFrame = webView->mainFrame(); 1323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebDataSource* dataSource = mainFrame->dataSource(); 1324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!dataSource) 1325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dataSource = mainFrame->provisionalDataSource(); 1326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!dataSource) 1327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 13296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen setAddressBarURL(dataSource->request().url()); 1330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::locationChangeDone(WebFrame* frame) 1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (frame != m_topLoadingFrame) 1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_topLoadingFrame = 0; 1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block layoutTestController()->locationChangeDone(); 1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::updateForCommittedLoad(WebFrame* frame, bool isNewNavigation) 1341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Code duplicated from RenderView::DidCommitLoadForFrame. 1343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block TestShellExtraData* extraData = static_cast<TestShellExtraData*>(frame->dataSource()->extraData()); 1344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (isNewNavigation) { 1346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // New navigation. 1347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateSessionHistory(frame); 1348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pageId = nextPageID++; 1349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (extraData && extraData->pendingPageID != -1 && !extraData->requestCommitted) { 1350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // This is a successful session history navigation! 1351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateSessionHistory(frame); 1352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pageId = extraData->pendingPageID; 1353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Don't update session history multiple times. 1356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (extraData) 1357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block extraData->requestCommitted = true; 1358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateURL(frame); 1360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::updateURL(WebFrame* frame) 1363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebDataSource* ds = frame->dataSource(); 1365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(ds); 1366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebURLRequest& request = ds->request(); 1367dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch RefPtr<TestNavigationEntry> entry(TestNavigationEntry::create()); 1368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // The referrer will be empty on https->http transitions. It 1370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // would be nice if we could get the real referrer from somewhere. 1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block entry->setPageID(m_pageId); 1372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (ds->hasUnreachableURL()) 1373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block entry->setURL(ds->unreachableURL()); 1374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else 1375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block entry->setURL(request.url()); 1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebHistoryItem& historyItem = frame->currentHistoryItem(); 1378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!historyItem.isNull()) 1379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block entry->setContentState(historyItem); 1380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1381dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch navigationController()->didNavigateToEntry(entry.get()); 13826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen updateAddressBar(frame->view()); 1383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_lastPageIdUpdated = max(m_lastPageIdUpdated, m_pageId); 1384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::updateSessionHistory(WebFrame* frame) 1387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If we have a valid page ID at this point, then it corresponds to the page 1389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // we are navigating away from. Otherwise, this is the first navigation, so 1390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // there is no past session history to record. 1391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_pageId == -1) 1392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1394dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch TestNavigationEntry* entry = navigationController()->entryWithPageID(m_pageId); 1395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!entry) 1396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebHistoryItem& historyItem = webView()->mainFrame()->previousHistoryItem(); 1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (historyItem.isNull()) 1400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block entry->setContentState(historyItem); 1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::printFrameDescription(WebFrame* webframe) 1406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block string name8 = webframe->name().utf8(); 1408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (webframe == webView()->mainFrame()) { 1409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!name8.length()) { 1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("main frame", stdout); 1411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("main frame \"%s\"", name8.c_str()); 1414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!name8.length()) { 1417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fputs("frame (anonymous)", stdout); 1418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("frame \"%s\"", name8.c_str()); 1421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1423e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid WebViewHost::printFrameUserGestureStatus(WebFrame* webframe, const char* msg) 1424e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 1425e14391e94c850b8bd03680c23b38978db68687a8John Reck bool isUserGesture = webframe->isProcessingUserGesture(); 1426e14391e94c850b8bd03680c23b38978db68687a8John Reck printf("Frame with user gesture \"%s\"%s", isUserGesture ? "true" : "false", msg); 1427e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1428e14391e94c850b8bd03680c23b38978db68687a8John Reck 1429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::printResourceDescription(unsigned identifier) 1430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ResourceMap::iterator it = m_resourceIdentifierMap.find(identifier); 1432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("%s", it != m_resourceIdentifierMap.end() ? it->second.c_str() : "<unknown>"); 1433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setPendingExtraData(TestShellExtraData* extraData) 1436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pendingExtraData.set(extraData); 1438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setPageTitle(const WebString&) 1441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Nothing to do in layout test. 1443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::setAddressBarURL(const WebURL&) 1446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Nothing to do in layout test. 1448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Painting functions --------------------------------------------------------- 1451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::updatePaintRect(const WebRect& rect) 1453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // m_paintRect = m_paintRect U rect 1455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (rect.isEmpty()) 1456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_paintRect.isEmpty()) { 1458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_paintRect = rect; 1459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 1460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int left = min(m_paintRect.x, rect.x); 1462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int top = min(m_paintRect.y, rect.y); 1463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int right = max(m_paintRect.x + m_paintRect.width, rect.x + rect.width); 1464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int bottom = max(m_paintRect.y + m_paintRect.height, rect.y + rect.height); 1465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_paintRect = WebRect(left, top, right - left, bottom - top); 1466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::paintRect(const WebRect& rect) 1469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(!m_isPainting); 1471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(canvas()); 1472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_isPainting = true; 14732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG) 14742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch webWidget()->paint(skia::BeginPlatformPaint(canvas()), rect); 14752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch skia::EndPlatformPaint(canvas()); 1476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else 14775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke webWidget()->paint(canvas(), rect); 1478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 1479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_isPainting = false; 1480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::paintInvalidatedRegion() 1483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1484ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if ENABLE(REQUEST_ANIMATION_FRAME) 1485ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch webWidget()->animate(); 1486ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif 1487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block webWidget()->layout(); 1488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebSize widgetSize = webWidget()->size(); 1489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebRect clientRect(0, 0, widgetSize.width, widgetSize.height); 1490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1491e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // Paint the canvas if necessary. Allow painting to generate extra rects 1492e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // for the first two calls. This is necessary because some WebCore rendering 1493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // objects update their layout only when painted. 1494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Store the total area painted in total_paint. Then tell the gdk window 1495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // to update that area after we're done painting it. 1496e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for (int i = 0; i < 3; ++i) { 1497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // m_paintRect = intersect(m_paintRect , clientRect) 1498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int left = max(m_paintRect.x, clientRect.x); 1499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int top = max(m_paintRect.y, clientRect.y); 1500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int right = min(m_paintRect.x + m_paintRect.width, clientRect.x + clientRect.width); 1501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int bottom = min(m_paintRect.y + m_paintRect.height, clientRect.y + clientRect.height); 1502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (left >= right || top >= bottom) 1503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_paintRect = WebRect(); 1504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else 1505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_paintRect = WebRect(left, top, right - left, bottom - top); 1506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_paintRect.isEmpty()) 1508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block continue; 1509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebRect rect(m_paintRect); 1510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_paintRect = WebRect(); 1511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block paintRect(rect); 1512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(m_paintRect.isEmpty()); 1514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 15162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSkCanvas* WebViewHost::canvas() 1517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_canvas) 1519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_canvas.get(); 1520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebSize widgetSize = webWidget()->size(); 1521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block resetScrollRect(); 15222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_canvas.set(skia::CreateBitmapCanvas( 15232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch widgetSize.width, widgetSize.height, true)); 1524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_canvas.get(); 1525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::resetScrollRect() 1528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::discardBackingStore() 1532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_canvas.clear(); 1534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Paints the entire canvas a semi-transparent black (grayish). This is used 1537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// by the layout tests in fast/repaint. The alpha value matches upstream. 1538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebViewHost::displayRepaintMask() 1539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block canvas()->drawARGB(167, 0, 0, 0); 1541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1542