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