1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met:
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1.  Redistributions of source code must retain the above copyright
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer.
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2.  Redistributions in binary form must reproduce the above copyright
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer in the
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     documentation and/or other materials provided with the distribution.
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     its contributors may be used to endorse or promote products derived
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     from this software without specific prior written permission.
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "config.h"
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "LayoutTestController.h"
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "DumpRenderTree.h"
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "EditingDelegate.h"
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "PolicyDelegate.h"
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueue.h"
36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueueItem.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <CoreFoundation/CoreFoundation.h>
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <JavaScriptCore/Assertions.h>
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <JavaScriptCore/JSRetainPtr.h>
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <JavaScriptCore/JSStringRefBSTR.h>
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <JavaScriptCore/JavaScriptCore.h>
42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <WebCore/COMPtr.h>
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <WebKit/WebKit.h>
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <WebKit/WebKitCOMAPI.h>
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <comutil.h>
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <shlwapi.h>
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <shlguid.h>
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <shobjidl.h>
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <string>
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/Platform.h>
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/RetainPtr.h>
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/Vector.h>
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing std::string;
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing std::wstring;
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool resolveCygwinPath(const wstring& cygwinPath, wstring& windowsPath);
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
59563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkLayoutTestController::~LayoutTestController()
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // reset webview-related states back to default values in preparation for next test
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewPrivate> viewPrivate;
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (SUCCEEDED(webView->QueryInterface(&viewPrivate)))
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        viewPrivate->setTabKeyCyclesThroughElements(TRUE);
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewEditing> viewEditing;
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewEditing)))
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebEditingDelegate> delegate;
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(viewEditing->editingDelegate(&delegate)))
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<EditingDelegate> editingDelegate(Query, viewEditing.get());
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (editingDelegate)
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        editingDelegate->setAcceptsEditing(TRUE);
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::addDisallowedURL(JSStringRef url)
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement!
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::clearBackForwardList()
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebBackForwardList> backForwardList;
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->backForwardList(&backForwardList)))
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebHistoryItem> item;
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(backForwardList->currentItem(&item)))
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // We clear the history by setting the back/forward list's capacity to 0
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // then restoring it back and adding back the current item.
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int capacity;
104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(backForwardList->capacity(&capacity)))
105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    backForwardList->setCapacity(0);
108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    backForwardList->setCapacity(capacity);
109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    backForwardList->addItem(item.get());
110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    backForwardList->goToItem(item.get());
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool LayoutTestController::callShouldCloseOnWebView()
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebView> webView;
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(frame->webView(&webView)))
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebViewPrivate> viewPrivate;
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(webView->QueryInterface(&viewPrivate)))
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BOOL result;
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    viewPrivate->shouldClose(&result);
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
128563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkJSStringRef LayoutTestController::copyDecodedHostName(JSStringRef name)
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement!
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return 0;
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
134563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkJSStringRef LayoutTestController::copyEncodedHostName(JSStringRef name)
135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement!
137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return 0;
138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid LayoutTestController::disableImageLoading()
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebView> webView;
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(frame->webView(&webView)))
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebPreferences> preferences;
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(webView->preferences(&preferences)))
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    preferences->setLoadsImagesAutomatically(FALSE);
1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid LayoutTestController::dispatchPendingLoadRequests()
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement for testing fix for 6727495
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::display()
159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    displayWebView();
161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::keepWebHistory()
164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebHistory> history;
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(history), reinterpret_cast<void**>(&history))))
167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebHistory> sharedHistory;
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(sharedHistory), reinterpret_cast<void**>(&sharedHistory))))
171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    history->setOptionalSharedHistory(sharedHistory.get());
174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValueRef LayoutTestController::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Implement this.
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return JSValueMakeUndefined(context);
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenJSValueRef LayoutTestController::nodesFromRect(JSContextRef context, JSValueRef value, int x, int y, unsigned top, unsigned right, unsigned bottom, unsigned left, bool ignoreClipping)
183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // FIXME: Implement this.
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return JSValueMakeUndefined(context);
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!framePrivate)
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BSTR textBSTR = 0;
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HRESULT hr = framePrivate->layerTreeAsText(&textBSTR);
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wstring text(textBSTR, SysStringLen(textBSTR));
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SysFreeString(textBSTR);
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSRetainPtr<JSStringRef> textValueJS(Adopt, JSStringCreateWithCharacters(text.data(), text.length()));
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return textValueJS;
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSRetainPtr<JSStringRef> LayoutTestController::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
205967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    COMPtr<IWebView> webView;
206967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (FAILED(frame->webView(&webView)))
207967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return 0;
208967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
209967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    COMPtr<IWebViewPrivate> webViewPrivate(Query, webView);
210967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!webViewPrivate)
211967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return 0;
212967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
213967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    COMPtr<IDOMElement> element;
214967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (FAILED(webViewPrivate->elementFromJS(context, nodeObject, &element)))
215967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return 0;
216967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
217967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    COMPtr<IDOMElementPrivate> elementPrivate(Query, element);
218967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!elementPrivate)
219967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return 0;
220967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
221967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    BSTR textBSTR = 0;
222967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (FAILED(elementPrivate->markerTextForListItem(&textBSTR)))
223967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return 0;
224967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
225967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithBSTR(textBSTR));
226967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SysFreeString(textBSTR);
227967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return markerText;
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid LayoutTestController::waitForPolicyDelegate()
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    COMPtr<IWebView> webView;
2334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (FAILED(frame->webView(&webView)))
2344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
2354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    setWaitToDump(true);
2374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    policyDelegate->setControllerToNotifyDone(this);
2384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    webView->setPolicyDelegate(policyDelegate);
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksize_t LayoutTestController::webHistoryItemCount()
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebHistory> history;
2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(history), reinterpret_cast<void**>(&history))))
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebHistory> sharedHistory;
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(history->optionalSharedHistory(&sharedHistory)) || !sharedHistory)
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebHistoryPrivate> sharedHistoryPrivate;
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(sharedHistory->QueryInterface(&sharedHistoryPrivate)))
253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int count;
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(sharedHistoryPrivate->allItems(&count, 0)))
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return count;
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockunsigned LayoutTestController::workerThreadCount() const
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebWorkersPrivate> workers;
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(WebKitCreateInstance(CLSID_WebWorkersPrivate, 0, __uuidof(workers), reinterpret_cast<void**>(&workers))))
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    unsigned count;
268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(workers->workerThreadCount(&count)))
269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return count;
271231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
272231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::notifyDone()
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Same as on mac.  This can be shared.
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_waitToDump && !topLoadingFrame && !WorkQueue::shared()->count())
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        dump();
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_waitToDump = false;
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
281563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkJSStringRef LayoutTestController::pathToLocalResource(JSContextRef context, JSStringRef url)
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring input(JSStringGetCharactersPtr(url), JSStringGetLength(url));
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring localPath;
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!resolveCygwinPath(input, localPath)) {
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("ERROR: Failed to resolve Cygwin path %S\n", input.c_str());
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return JSStringCreateWithCharacters(localPath.c_str(), localPath.length());
292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic wstring jsStringRefToWString(JSStringRef jsStr)
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    size_t length = JSStringGetLength(jsStr);
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Vector<WCHAR> buffer(length + 1);
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    memcpy(buffer.data(), JSStringGetCharactersPtr(jsStr), length * sizeof(WCHAR));
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    buffer[length] = '\0';
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return buffer.data();
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::queueLoad(JSStringRef url, JSStringRef target)
305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebDataSource> dataSource;
307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->dataSource(&dataSource)))
308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
310563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebURLResponse> response;
311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(dataSource->response(&response)) || !response)
312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR responseURLBSTR;
315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(response->URL(&responseURLBSTR)))
316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring responseURL(responseURLBSTR, SysStringLen(responseURLBSTR));
318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(responseURLBSTR);
319563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
320563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: We should do real relative URL resolution here.
321563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int lastSlash = responseURL.rfind('/');
322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (lastSlash != -1)
323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        responseURL = responseURL.substr(0, lastSlash);
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring wURL = jsStringRefToWString(url);
326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring wAbsoluteURL = responseURL + TEXT("/") + wURL;
327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSRetainPtr<JSStringRef> jsAbsoluteURL(Adopt, JSStringCreateWithCharacters(wAbsoluteURL.data(), wAbsoluteURL.length()));
328563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WorkQueue::shared()->queue(new LoadItem(jsAbsoluteURL.get(), target));
330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setAcceptsEditing(bool acceptsEditing)
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewEditing> viewEditing;
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewEditing)))
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebEditingDelegate> delegate;
343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(viewEditing->editingDelegate(&delegate)))
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    EditingDelegate* editingDelegate = (EditingDelegate*)(IWebEditingDelegate*)delegate.get();
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    editingDelegate->setAcceptsEditing(acceptsEditing);
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
350231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid LayoutTestController::setAlwaysAcceptCookies(bool alwaysAcceptCookies)
351231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
352231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (alwaysAcceptCookies == m_alwaysAcceptCookies)
353231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
354231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
355231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!::setAlwaysAcceptCookies(alwaysAcceptCookies))
356231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
357231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_alwaysAcceptCookies = alwaysAcceptCookies;
358231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
359231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setAuthorAndUserStylesEnabled(bool flag)
361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebPreferences> preferences;
367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->preferences(&preferences)))
368563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!prefsPrivate)
372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    prefsPrivate->setAuthorAndUserStylesEnabled(flag);
375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3772bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool autofilled)
3782bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3792bde8e466a4451c7319e3a072d118917957d6554Steve Block    COMPtr<IWebView> webView;
3802bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (FAILED(frame->webView(&webView)))
3812bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3822bde8e466a4451c7319e3a072d118917957d6554Steve Block
3832bde8e466a4451c7319e3a072d118917957d6554Steve Block    COMPtr<IWebViewPrivate> webViewPrivate(Query, webView);
3842bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!webViewPrivate)
3852bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3862bde8e466a4451c7319e3a072d118917957d6554Steve Block
3872bde8e466a4451c7319e3a072d118917957d6554Steve Block    COMPtr<IDOMElement> element;
3882bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (FAILED(webViewPrivate->elementFromJS(context, nodeObject, &element)))
3892bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3902bde8e466a4451c7319e3a072d118917957d6554Steve Block
3912bde8e466a4451c7319e3a072d118917957d6554Steve Block    COMPtr<IFormsAutoFillTransition> autofillElement(Query, element);
3922bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!autofillElement)
3932bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3942bde8e466a4451c7319e3a072d118917957d6554Steve Block
3952bde8e466a4451c7319e3a072d118917957d6554Steve Block    autofillElement->setAutofilled(autofilled);
3962bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3972bde8e466a4451c7319e3a072d118917957d6554Steve Block
398563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setCustomPolicyDelegate(bool setDelegate, bool permissive)
399563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
400563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
401563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
402563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
403563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
404563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (setDelegate) {
405563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        policyDelegate->setPermissive(permissive);
406563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        webView->setPolicyDelegate(policyDelegate);
407563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else
4080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        webView->setPolicyDelegate(0);
409563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
410563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
411db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid LayoutTestController::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
412db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
413db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // FIXME: Implement for DeviceOrientation layout tests.
414db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // See https://bugs.webkit.org/show_bug.cgi?id=30335.
415db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
416db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
417231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid LayoutTestController::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // FIXME: Implement for Geolocation layout tests.
420231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // See https://bugs.webkit.org/show_bug.cgi?id=28264.
421231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
422231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
423231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid LayoutTestController::setMockGeolocationError(int code, JSStringRef message)
424231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
425231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // FIXME: Implement for Geolocation layout tests.
426231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // See https://bugs.webkit.org/show_bug.cgi?id=28264.
427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
428231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
429dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid LayoutTestController::setGeolocationPermission(bool allow)
430dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
431dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // FIXME: Implement for Geolocation layout tests.
432dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    setGeolocationPermissionCommon(allow);
433dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
434dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
4352bde8e466a4451c7319e3a072d118917957d6554Steve Blockint LayoutTestController::numberOfPendingGeolocationPermissionRequests()
4362bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4372bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement for Geolocation layout tests.
4382bde8e466a4451c7319e3a072d118917957d6554Steve Block    return -1;
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4402bde8e466a4451c7319e3a072d118917957d6554Steve Block
4414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid LayoutTestController::addMockSpeechInputResult(JSStringRef result, double confidence, JSStringRef language)
442dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
443dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // FIXME: Implement for speech input layout tests.
444dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // See https://bugs.webkit.org/show_bug.cgi?id=39485.
445dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
446dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
447563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setIconDatabaseEnabled(bool iconDatabaseEnabled)
448563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
449563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // See also <rdar://problem/6480108>
450563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebIconDatabase> iconDatabase;
451563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebIconDatabase> tmpIconDatabase;
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(WebKitCreateInstance(CLSID_WebIconDatabase, 0, IID_IWebIconDatabase, (void**)&tmpIconDatabase)))
453563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
454563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(tmpIconDatabase->sharedIconDatabase(&iconDatabase)))
455563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
456563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
457563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    iconDatabase->setEnabled(iconDatabaseEnabled);
458563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
459563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
460563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setMainFrameIsFirstResponder(bool flag)
461563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
462563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement!
463563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
464563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
465563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setPrivateBrowsingEnabled(bool privateBrowsingEnabled)
466563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
467563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
468563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
469563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
470563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebPreferences> preferences;
472563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->preferences(&preferences)))
473563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
474563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
475563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    preferences->setPrivateBrowsingEnabled(privateBrowsingEnabled);
476563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
477563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid LayoutTestController::setXSSAuditorEnabled(bool enabled)
479563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
480563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
481563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
482563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
483563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
484563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebPreferences> preferences;
485563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->preferences(&preferences)))
486563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
487563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!prefsPrivate)
4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    prefsPrivate->setXSSAuditorEnabled(enabled);
4930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::setFrameFlatteningEnabled(bool enabled)
4968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
4978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    COMPtr<IWebView> webView;
4988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (FAILED(frame->webView(&webView)))
4998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
5008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    COMPtr<IWebPreferences> preferences;
5028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (FAILED(webView->preferences(&preferences)))
5038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
5048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
5058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
5068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!prefsPrivate)
5078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
5088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    prefsPrivate->setFrameFlatteningEnabled(enabled);
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::setSpatialNavigationEnabled(bool enabled)
513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Implement for SpatialNavigation layout tests.
5158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
5168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
517643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid LayoutTestController::setAllowUniversalAccessFromFileURLs(bool enabled)
518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
519643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebView> webView;
520643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(frame->webView(&webView)))
521643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
522643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
523643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebPreferences> preferences;
524643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(webView->preferences(&preferences)))
525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
526643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!prefsPrivate)
529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    prefsPrivate->setAllowUniversalAccessFromFileURLs(enabled);
532643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
534692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid LayoutTestController::setAllowFileAccessFromFileURLs(bool enabled)
535692e5dbf12901edacf14812a6fae25462920af42Steve Block{
536692e5dbf12901edacf14812a6fae25462920af42Steve Block    COMPtr<IWebView> webView;
537692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (FAILED(frame->webView(&webView)))
538692e5dbf12901edacf14812a6fae25462920af42Steve Block        return;
539692e5dbf12901edacf14812a6fae25462920af42Steve Block
540692e5dbf12901edacf14812a6fae25462920af42Steve Block    COMPtr<IWebPreferences> preferences;
541692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (FAILED(webView->preferences(&preferences)))
542692e5dbf12901edacf14812a6fae25462920af42Steve Block        return;
543692e5dbf12901edacf14812a6fae25462920af42Steve Block
544692e5dbf12901edacf14812a6fae25462920af42Steve Block    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
545692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!prefsPrivate)
546692e5dbf12901edacf14812a6fae25462920af42Steve Block        return;
547692e5dbf12901edacf14812a6fae25462920af42Steve Block
548692e5dbf12901edacf14812a6fae25462920af42Steve Block    prefsPrivate->setAllowFileAccessFromFileURLs(enabled);
549692e5dbf12901edacf14812a6fae25462920af42Steve Block}
550692e5dbf12901edacf14812a6fae25462920af42Steve Block
5510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid LayoutTestController::setPopupBlockingEnabled(bool enabled)
5520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebView> webView;
5540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(frame->webView(&webView)))
5550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
5560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebPreferences> preferences;
5580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(webView->preferences(&preferences)))
5590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    preferences->setJavaScriptCanOpenWindowsAutomatically(!enabled);
562563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
563563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
56421939df44de1705786c545cd1bf519d47250322dBen Murdochvoid LayoutTestController::setPluginsEnabled(bool flag)
56521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
56621939df44de1705786c545cd1bf519d47250322dBen Murdoch    // FIXME: Implement
56721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
56821939df44de1705786c545cd1bf519d47250322dBen Murdoch
56921939df44de1705786c545cd1bf519d47250322dBen Murdochvoid LayoutTestController::setJavaScriptCanAccessClipboard(bool enabled)
57021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
57121939df44de1705786c545cd1bf519d47250322dBen Murdoch    COMPtr<IWebView> webView;
57221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (FAILED(frame->webView(&webView)))
57321939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
57421939df44de1705786c545cd1bf519d47250322dBen Murdoch
57521939df44de1705786c545cd1bf519d47250322dBen Murdoch    COMPtr<IWebPreferences> preferences;
57621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (FAILED(webView->preferences(&preferences)))
57721939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
57821939df44de1705786c545cd1bf519d47250322dBen Murdoch
57921939df44de1705786c545cd1bf519d47250322dBen Murdoch    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
58021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!prefsPrivate)
58121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
58221939df44de1705786c545cd1bf519d47250322dBen Murdoch
58321939df44de1705786c545cd1bf519d47250322dBen Murdoch    prefsPrivate->setJavaScriptCanAccessClipboard(enabled);
58421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
58521939df44de1705786c545cd1bf519d47250322dBen Murdoch
586563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setTabKeyCyclesThroughElements(bool shouldCycle)
587563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
588563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
589563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
590563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
591563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
592563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewPrivate> viewPrivate;
593563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewPrivate)))
594563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
595563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
596563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    viewPrivate->setTabKeyCyclesThroughElements(shouldCycle ? TRUE : FALSE);
597563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
598563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
599643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid LayoutTestController::setTimelineProfilingEnabled(bool flag)
600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
601643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebView> webView;
602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(frame->webView(&webView)))
603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
604643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebViewPrivate> viewPrivate;
606643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(webView->QueryInterface(&viewPrivate)))
607643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
609643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebInspector> inspector;
610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(viewPrivate->inspector(&inspector)))
611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inspector->setTimelineProfilingEnabled(flag);
614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
616563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setUseDashboardCompatibilityMode(bool flag)
617563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
618563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Implement!
619563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
620563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
621563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setUserStyleSheetEnabled(bool flag)
622563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
623563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
624563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
625563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
626563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
627563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebPreferences> preferences;
628563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->preferences(&preferences)))
629563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
630563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
631563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark   preferences->setUserStyleSheetEnabled(flag);
632563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
633563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
634563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool appendComponentToPath(wstring& path, const wstring& component)
635563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
636563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WCHAR buffer[MAX_PATH];
637563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
638563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (path.size() + 1 > MAX_PATH)
639563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
640563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
641563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    memcpy(buffer, path.data(), path.size() * sizeof(WCHAR));
642563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    buffer[path.size()] = '\0';
643563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!PathAppendW(buffer, component.c_str()))
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
647563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    path = wstring(buffer);
648563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
649563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
650563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
651563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool followShortcuts(wstring& path)
652563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
653563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (PathFileExists(path.c_str()))
654563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return true;
655563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
656563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Do we have a shortcut?
657563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring linkPath = path;
658563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    linkPath.append(TEXT(".lnk"));
659563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!PathFileExists(linkPath.c_str()))
660563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark       return true;
661563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
662563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // We have a shortcut, find its target.
663563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IShellLink> shortcut(Create, CLSID_ShellLink);
664563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!shortcut)
665563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark       return false;
666563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IPersistFile> persistFile(Query, shortcut);
667563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!shortcut)
668563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
669563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(persistFile->Load(linkPath.c_str(), STGM_READ)))
670563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
671563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(shortcut->Resolve(0, 0)))
672563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
673563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WCHAR targetPath[MAX_PATH];
674563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DWORD targetPathLen = _countof(targetPath);
675563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(shortcut->GetPath(targetPath, targetPathLen, 0, 0)))
676563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
677563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!PathFileExists(targetPath))
678563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
679563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Use the target path as the result path instead.
680563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    path = wstring(targetPath);
681563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
682563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
683563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
684563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
685563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool resolveCygwinPath(const wstring& cygwinPath, wstring& windowsPath)
686563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
687563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring fileProtocol = L"file://";
688563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool isFileProtocol = cygwinPath.find(fileProtocol) != string::npos;
689563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (cygwinPath[isFileProtocol ? 7 : 0] != '/')  // ensure path is absolute
690563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
691563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
692563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Get the Root path.
693563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WCHAR rootPath[MAX_PATH];
694563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DWORD rootPathSize = _countof(rootPath);
695563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DWORD keyType;
696563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DWORD result = ::SHGetValueW(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Cygnus Solutions\\Cygwin\\mounts v2\\/"), TEXT("native"), &keyType, &rootPath, &rootPathSize);
697563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
698ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (result != ERROR_SUCCESS || keyType != REG_SZ) {
699ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // Cygwin 1.7 doesn't store Cygwin's root as a mount point anymore, because mount points are now stored in /etc/fstab.
700ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // However, /etc/fstab doesn't contain any information about where / is located as a Windows path, so we need to use Cygwin's
701ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // new registry key that has the root.
702ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        result = ::SHGetValueW(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Cygwin\\setup"), TEXT("rootdir"), &keyType, &rootPath, &rootPathSize);
703ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (result != ERROR_SUCCESS || keyType != REG_SZ)
704ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
705ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
706563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
707563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    windowsPath = wstring(rootPath, rootPathSize);
708563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
709563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int oldPos = isFileProtocol ? 8 : 1;
710563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    while (1) {
711563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        int newPos = cygwinPath.find('/', oldPos);
712563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
713563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (newPos == -1) {
714563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            wstring pathComponent = cygwinPath.substr(oldPos);
715563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
716563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!appendComponentToPath(windowsPath, pathComponent))
717563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark               return false;
718563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
719563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!followShortcuts(windowsPath))
720563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                return false;
721563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
722563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            break;
723563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
724563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
725563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        wstring pathComponent = cygwinPath.substr(oldPos, newPos - oldPos);
726563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!appendComponentToPath(windowsPath, pathComponent))
727563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return false;
728563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
729563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!followShortcuts(windowsPath))
730563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return false;
731563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
732563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        oldPos = newPos + 1;
733563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
734563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
735563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (isFileProtocol)
736563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        windowsPath = fileProtocol + windowsPath;
737563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
738563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
739563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
740563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
741563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setUserStyleSheetLocation(JSStringRef jsURL)
742563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
743563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
744563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
745563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
746563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
747563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebPreferences> preferences;
748563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->preferences(&preferences)))
749563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
750563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
751563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFStringRef> urlString(AdoptCF, JSStringCopyCFString(0, jsURL));
752563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFURLRef> url(AdoptCF, CFURLCreateWithString(0, urlString.get(), 0));
753563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!url)
754563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
755563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
756563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Now copy the file system path, POSIX style.
757563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFStringRef> pathCF(AdoptCF, CFURLCopyFileSystemPath(url.get(), kCFURLPOSIXPathStyle));
758563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!pathCF)
759563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
760563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
761563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring path = cfStringRefToWString(pathCF.get());
762563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
763563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring resultPath;
764563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!resolveCygwinPath(path, resultPath))
765563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
766563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
767563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // The path has been resolved, now convert it back to a CFURL.
768563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int result = WideCharToMultiByte(CP_UTF8, 0, resultPath.c_str(), resultPath.size() + 1, 0, 0, 0, 0);
769563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Vector<char> utf8Vector(result);
770563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    result = WideCharToMultiByte(CP_UTF8, 0, resultPath.c_str(), resultPath.size() + 1, utf8Vector.data(), result, 0, 0);
771563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!result)
772563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
773563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
774563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    url = CFURLCreateFromFileSystemRepresentation(0, (const UInt8*)utf8Vector.data(), utf8Vector.size() - 1, false);
775563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!url)
776563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
777563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
778563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    resultPath = cfStringRefToWString(CFURLGetString(url.get()));
779563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
780563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR resultPathBSTR = SysAllocStringLen(resultPath.data(), resultPath.size());
781563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    preferences->setUserStyleSheetLocation(resultPathBSTR);
782563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(resultPathBSTR);
783563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
784563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
78581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid LayoutTestController::setValueForUser(JSContextRef context, JSValueRef element, JSStringRef value)
78681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
78781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: implement
78881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
78981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
790e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid LayoutTestController::setViewModeMediaFeature(JSStringRef mode)
791e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
792e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // FIXME: implement
793e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
794e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
795563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setPersistentUserStyleSheetLocation(JSStringRef jsURL)
796563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
797563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFStringRef> urlString(AdoptCF, JSStringCopyCFString(0, jsURL));
798563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::setPersistentUserStyleSheetLocation(urlString.get());
799563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
800563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
801563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::clearPersistentUserStyleSheet()
802563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
803563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::setPersistentUserStyleSheetLocation(0);
804563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
805563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
806563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setWindowIsKey(bool flag)
807563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
808563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
809563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
810563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
811563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
812563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewPrivate> viewPrivate;
813563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewPrivate)))
814563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
815563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
816563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    HWND webViewWindow;
817563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(viewPrivate->viewWindow((OLE_HANDLE*)&webViewWindow)))
818563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
819563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
820563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::SendMessage(webViewWindow, flag ? WM_SETFOCUS : WM_KILLFOCUS, (WPARAM)::GetDesktopWindow(), 0);
821563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
822563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
823563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setSmartInsertDeleteEnabled(bool flag)
824563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
825563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
826563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
827563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
828563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
829563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewEditing> viewEditing;
830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewEditing)))
831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
832563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
833563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    viewEditing->setSmartInsertDeleteEnabled(flag ? TRUE : FALSE);
834563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
835563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
836563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setJavaScriptProfilingEnabled(bool flag)
837563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
838563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
839563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
840563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
841563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
842563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewPrivate> viewPrivate;
843563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewPrivate)))
844563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
845563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
846563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebInspector> inspector;
847563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(viewPrivate->inspector(&inspector)))
848563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
849563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    setDeveloperExtrasEnabled(flag);
851563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    inspector->setJavaScriptProfilingEnabled(flag);
852563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
853563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
854563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setSelectTrailingWhitespaceEnabled(bool flag)
855563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
856563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
857563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
858563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
859563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
860563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewEditing> viewEditing;
861563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewEditing)))
862563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
863563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
864563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    viewEditing->setSelectTrailingWhitespaceEnabled(flag ? TRUE : FALSE);
865563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
866563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const CFTimeInterval waitToDumpWatchdogInterval = 30.0;
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
869563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void CALLBACK waitUntilDoneWatchdogFired(HWND, UINT, UINT_PTR, DWORD)
870563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gLayoutTestController->waitToDumpWatchdogTimerFired();
872563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
873563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
874563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setWaitToDump(bool waitUntilDone)
875563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
876563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_waitToDump = waitUntilDone;
877563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_waitToDump && !waitToDumpWatchdog)
878563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        waitToDumpWatchdog = SetTimer(0, 0, waitToDumpWatchdogInterval * 1000, waitUntilDoneWatchdogFired);
879563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
880563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
881563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkint LayoutTestController::windowCount()
882563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
883563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return openWindows().size();
884563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
885563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
886563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool LayoutTestController::elementDoesAutoCompleteForElementWithId(JSStringRef id)
887563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
888563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IDOMDocument> document;
889563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->DOMDocument(&document)))
890563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
891563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
892563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring idWstring = jsStringRefToWString(id);
893563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR idBSTR = SysAllocStringLen((OLECHAR*)idWstring.c_str(), idWstring.length());
894563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IDOMElement> element;
895563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    HRESULT result = document->getElementById(idBSTR, &element);
896563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(idBSTR);
897563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
898563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(result))
899563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
900563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
901563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
902563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!framePrivate)
903563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
904563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
905563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BOOL autoCompletes;
906563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(framePrivate->elementDoesAutoComplete(element.get(), &autoCompletes)))
907563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
908563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
909563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return autoCompletes;
910563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
911563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
912563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::execCommand(JSStringRef name, JSStringRef value)
913563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
914563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring wName = jsStringRefToWString(name);
915563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring wValue = jsStringRefToWString(value);
916563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
917563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebView> webView;
918563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->webView(&webView)))
919563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
920563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
921563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebViewPrivate> viewPrivate;
922563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(webView->QueryInterface(&viewPrivate)))
923563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
924563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
925563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR nameBSTR = SysAllocStringLen((OLECHAR*)wName.c_str(), wName.length());
926563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR valueBSTR = SysAllocStringLen((OLECHAR*)wValue.c_str(), wValue.length());
927563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    viewPrivate->executeCoreCommandByName(nameBSTR, valueBSTR);
928563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
929563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(nameBSTR);
930563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(valueBSTR);
931563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
932563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
933f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool LayoutTestController::findString(JSContextRef /* context */, JSStringRef /* target */, JSObjectRef /* optionsArray */)
934f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
935f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: Implement
936f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
937f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
938f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
9390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid LayoutTestController::setCacheModel(int)
9400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
9420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
944563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool LayoutTestController::isCommandEnabled(JSStringRef /*name*/)
945563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
946563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    printf("ERROR: LayoutTestController::isCommandEnabled() not implemented\n");
947563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return false;
948563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
949563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
950dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid LayoutTestController::clearAllApplicationCaches()
951dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
9522bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement to support application cache quotas.
9532bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9542bde8e466a4451c7319e3a072d118917957d6554Steve Block
9552bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::clearApplicationCacheForOrigin(JSStringRef origin)
9562bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9572bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement to support deleting all application cache for an origin.
958dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
959dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
960dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid LayoutTestController::setApplicationCacheOriginQuota(unsigned long long quota)
961dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
9622bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement to support application cache quotas.
9632bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9642bde8e466a4451c7319e3a072d118917957d6554Steve Block
9652bde8e466a4451c7319e3a072d118917957d6554Steve BlockJSValueRef LayoutTestController::originsWithApplicationCache(JSContextRef context)
9662bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9672bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement to get origins that have application caches.
9682bde8e466a4451c7319e3a072d118917957d6554Steve Block    return JSValueMakeUndefined(context);
969dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
970dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
971563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::clearAllDatabases()
972563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
9730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebDatabaseManager> databaseManager;
9740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebDatabaseManager> tmpDatabaseManager;
9750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(WebKitCreateInstance(CLSID_WebDatabaseManager, 0, IID_IWebDatabaseManager, (void**)&tmpDatabaseManager)))
9760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
9770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(tmpDatabaseManager->sharedWebDatabaseManager(&databaseManager)))
9780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
9790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    databaseManager->deleteAllDatabases();
981563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
982563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
983231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid LayoutTestController::overridePreference(JSStringRef key, JSStringRef value)
984231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
985231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebView> webView;
986231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(frame->webView(&webView)))
987231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
988231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
989231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebPreferences> preferences;
990231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(webView->preferences(&preferences)))
991231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
992231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
993231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
994231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!prefsPrivate)
995231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
996231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
997231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    BSTR keyBSTR = JSStringCopyBSTR(key);
998231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    BSTR valueBSTR = JSStringCopyBSTR(value);
999231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    prefsPrivate->setPreferenceForTest(keyBSTR, valueBSTR);
1000231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    SysFreeString(keyBSTR);
1001231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    SysFreeString(valueBSTR);
1002231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1003231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1004563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid LayoutTestController::setDatabaseQuota(unsigned long long quota)
1005563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1006231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebDatabaseManager> databaseManager;
1007231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebDatabaseManager> tmpDatabaseManager;
1008231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1009231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(WebKitCreateInstance(CLSID_WebDatabaseManager, 0, IID_IWebDatabaseManager, (void**)&tmpDatabaseManager)))
1010231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1011231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(tmpDatabaseManager->sharedWebDatabaseManager(&databaseManager)))
1012231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1013231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1014231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    databaseManager->setQuota(TEXT("file:///"), quota);
1015563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1016563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1017d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid LayoutTestController::setDomainRelaxationForbiddenForURLScheme(bool forbidden, JSStringRef scheme)
1018d0825bca7fe65beaee391d30da42e937db621564Steve Block{
1019d0825bca7fe65beaee391d30da42e937db621564Steve Block    COMPtr<IWebViewPrivate> webView;
1020d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebView), 0, __uuidof(webView), reinterpret_cast<void**>(&webView))))
1021d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
1022d0825bca7fe65beaee391d30da42e937db621564Steve Block
1023d0825bca7fe65beaee391d30da42e937db621564Steve Block    BSTR schemeBSTR = JSStringCopyBSTR(scheme);
1024d0825bca7fe65beaee391d30da42e937db621564Steve Block    webView->setDomainRelaxationForbiddenForURLScheme(forbidden, schemeBSTR);
1025d0825bca7fe65beaee391d30da42e937db621564Steve Block    SysFreeString(schemeBSTR);
1026d0825bca7fe65beaee391d30da42e937db621564Steve Block}
1027d0825bca7fe65beaee391d30da42e937db621564Steve Block
1028c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescuvoid LayoutTestController::setAppCacheMaximumSize(unsigned long long size)
1029c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu{
1030c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu    printf("ERROR: LayoutTestController::setAppCacheMaximumSize() not implemented\n");
1031c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu}
1032c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu
1033563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
1034563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1035563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IDOMDocument> document;
1036563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->DOMDocument(&document)))
1037563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1038563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1039563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR idBSTR = JSStringCopyBSTR(elementId);
1040563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IDOMElement> element;
1041563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    HRESULT hr = document->getElementById(idBSTR, &element);
1042563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(idBSTR);
1043563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(hr))
1044563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1045563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1046563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1047563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!framePrivate)
1048563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1049563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1050563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR nameBSTR = JSStringCopyBSTR(animationName);
1051563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BOOL wasRunning = FALSE;
1052563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    hr = framePrivate->pauseAnimation(nameBSTR, element.get(), time, &wasRunning);
1053563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(nameBSTR);
1054563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1055563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return SUCCEEDED(hr) && wasRunning;
1056563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1057563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1058563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool LayoutTestController::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
1059563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1060563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IDOMDocument> document;
1061563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(frame->DOMDocument(&document)))
1062563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1063563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1064563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR idBSTR = JSStringCopyBSTR(elementId);
1065563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IDOMElement> element;
1066563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    HRESULT hr = document->getElementById(idBSTR, &element);
1067563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(idBSTR);
1068563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(hr))
1069563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1070563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1071563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1072563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!framePrivate)
1073563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1074563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1075563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR nameBSTR = JSStringCopyBSTR(propertyName);
1076563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BOOL wasRunning = FALSE;
1077563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    hr = framePrivate->pauseTransition(nameBSTR, element.get(), time, &wasRunning);
1078563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SysFreeString(nameBSTR);
1079563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1080563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return SUCCEEDED(hr) && wasRunning;
1081563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1082563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1083643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool LayoutTestController::sampleSVGAnimationForElementAtTime(JSStringRef animationId, double time, JSStringRef elementId)
1084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IDOMDocument> document;
1086643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(frame->DOMDocument(&document)))
1087643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
1088643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1089643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    BSTR idBSTR = JSStringCopyBSTR(animationId);
1090643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IDOMElement> element;
1091643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HRESULT hr = document->getElementById(idBSTR, &element);
1092643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    SysFreeString(idBSTR);
1093643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(hr))
1094643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
1095643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1096643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1097643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!framePrivate)
1098643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
1099643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    BSTR elementIdBSTR = JSStringCopyBSTR(elementId);
1101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    BOOL wasRunning = FALSE;
1102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    hr = framePrivate->pauseSVGAnimation(elementIdBSTR, element.get(), time, &wasRunning);
1103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    SysFreeString(elementIdBSTR);
1104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return SUCCEEDED(hr) && wasRunning;
1106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkunsigned LayoutTestController::numberOfActiveAnimations() const
1109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!framePrivate)
1112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
1113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    UINT number = 0;
1115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(framePrivate->numberOfActiveAnimations(&number)))
1116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
1117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return number;
1119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1121f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvoid LayoutTestController::suspendAnimations() const
1122f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
1123f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1124f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!framePrivate)
1125f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
1126f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1127f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    framePrivate->suspendAnimations();
1128f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
1129f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1130f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvoid LayoutTestController::resumeAnimations() const
1131f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
1132f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1133f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!framePrivate)
1134f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
1135f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1136f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    framePrivate->resumeAnimations();
1137f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
1138f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic _bstr_t bstrT(JSStringRef jsString)
1140231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The false parameter tells the _bstr_t constructor to adopt the BSTR we pass it.
1142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return _bstr_t(JSStringCopyBSTR(jsString), false);
1143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
1146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebViewPrivate> webView;
1148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebView), 0, __uuidof(webView), reinterpret_cast<void**>(&webView))))
1149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    webView->addOriginAccessWhitelistEntry(bstrT(sourceOrigin).GetBSTR(), bstrT(destinationProtocol).GetBSTR(), bstrT(destinationHost).GetBSTR(), allowDestinationSubdomains);
1152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
1155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebViewPrivate> webView;
1157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebView), 0, __uuidof(webView), reinterpret_cast<void**>(&webView))))
1158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    webView->removeOriginAccessWhitelistEntry(bstrT(sourceOrigin).GetBSTR(), bstrT(destinationProtocol).GetBSTR(), bstrT(destinationHost).GetBSTR(), allowDestinationSubdomains);
1161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::setScrollbarPolicy(JSStringRef orientation, JSStringRef policy)
1164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: implement
1166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1168e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid LayoutTestController::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
1169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebViewPrivate> webView;
1171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebView), 0, __uuidof(webView), reinterpret_cast<void**>(&webView))))
1172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebScriptWorld> world;
1175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebScriptWorld), 0, __uuidof(world), reinterpret_cast<void**>(&world))))
1176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webView->addUserScriptToGroup(_bstr_t(L"org.webkit.DumpRenderTree").GetBSTR(), world.get(), bstrT(source).GetBSTR(), 0, 0, 0, 0, 0, runAtStart ? WebInjectAtDocumentStart : WebInjectAtDocumentEnd);
1179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1182e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid LayoutTestController::addUserStyleSheet(JSStringRef source, bool allFrames)
1183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebViewPrivate> webView;
1185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebView), 0, __uuidof(webView), reinterpret_cast<void**>(&webView))))
1186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebScriptWorld> world;
1189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(WebKitCreateInstance(__uuidof(WebScriptWorld), 0, __uuidof(world), reinterpret_cast<void**>(&world))))
1190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webView->addUserStyleSheetToGroup(_bstr_t(L"org.webkit.DumpRenderTree").GetBSTR(), world.get(), bstrT(source).GetBSTR(), 0, 0, 0, 0, 0);
1193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::setDeveloperExtrasEnabled(bool enabled)
1196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebView> webView;
1198cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(frame->webView(&webView)))
1199cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1200cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1201cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebPreferences> preferences;
1202cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(webView->preferences(&preferences)))
1203cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1204cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1205cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
1206cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!prefsPrivate)
1207cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1208cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    prefsPrivate->setDeveloperExtrasEnabled(enabled);
1210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1212f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid LayoutTestController::setAsynchronousSpellCheckingEnabled(bool)
1213f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1214f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: Implement this.
1215f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1216f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::showWebInspector()
1218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebView> webView;
1220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(frame->webView(&webView)))
1221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1222cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1223cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebViewPrivate> viewPrivate(Query, webView);
1224cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!viewPrivate)
1225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebInspector> inspector;
1228cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (SUCCEEDED(viewPrivate->inspector(&inspector)))
1229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        inspector->show();
1230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1231231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid LayoutTestController::closeWebInspector()
1233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1234cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebView> webView;
1235cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(frame->webView(&webView)))
1236cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1237cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1238cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebViewPrivate> viewPrivate(Query, webView);
1239cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!viewPrivate)
1240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebInspector> inspector;
1243cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(viewPrivate->inspector(&inspector)))
1244cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1245cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1246cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    inspector->close();
1247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid LayoutTestController::evaluateInWebInspector(long callId, JSStringRef script)
1250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1251cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebView> webView;
1252cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(frame->webView(&webView)))
1253cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1254cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1255cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebViewPrivate> viewPrivate(Query, webView);
1256cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!viewPrivate)
1257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebInspector> inspector;
1260cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(viewPrivate->inspector(&inspector)))
1261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebInspectorPrivate> inspectorPrivate(Query, inspector);
1264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!inspectorPrivate)
1265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    inspectorPrivate->evaluateInFrontend(callId, bstrT(script).GetBSTR());
1268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1269cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1270643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocktypedef HashMap<unsigned, COMPtr<IWebScriptWorld> > WorldMap;
1271643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic WorldMap& worldMap()
1272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    static WorldMap& map = *new WorldMap;
1274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return map;
1275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1277643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockunsigned worldIDForWorld(IWebScriptWorld* world)
1278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WorldMap::const_iterator end = worldMap().end();
1280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (WorldMap::const_iterator it = worldMap().begin(); it != end; ++it) {
1281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (it->second == world)
1282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return it->first;
1283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return 0;
1286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1288643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid LayoutTestController::evaluateScriptInIsolatedWorld(unsigned worldID, JSObjectRef globalObject, JSStringRef script)
1289cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!framePrivate)
1292cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1293cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // A worldID of 0 always corresponds to a new world. Any other worldID corresponds to a world
1295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // that is created once and cached forever.
1296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<IWebScriptWorld> world;
1297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!worldID) {
1298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (FAILED(WebKitCreateInstance(__uuidof(WebScriptWorld), 0, __uuidof(world), reinterpret_cast<void**>(&world))))
1299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
1300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else {
1301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        COMPtr<IWebScriptWorld>& worldSlot = worldMap().add(worldID, 0).first->second;
1302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!worldSlot && FAILED(WebKitCreateInstance(__uuidof(WebScriptWorld), 0, __uuidof(worldSlot), reinterpret_cast<void**>(&worldSlot))))
1303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
1304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        world = worldSlot;
1305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1307cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    BSTR result;
1308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (FAILED(framePrivate->stringByEvaluatingJavaScriptInScriptWorld(world.get(), globalObject, bstrT(script).GetBSTR(), &result)))
1309cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1310cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SysFreeString(result);
1311cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1312cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1313cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid LayoutTestController::removeAllVisitedLinks()
1314cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1315cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebHistory> history;
1316cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(history), reinterpret_cast<void**>(&history))))
1317cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1318cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1319cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebHistory> sharedHistory;
1320cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(history->optionalSharedHistory(&sharedHistory)) || !sharedHistory)
1321cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1322cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1323cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebHistoryPrivate> sharedHistoryPrivate;
1324cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(sharedHistory->QueryInterface(&sharedHistoryPrivate)))
1325cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1326cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1327cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    sharedHistoryPrivate->removeAllVisitedLinks();
1328cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1329cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1330cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockJSRetainPtr<JSStringRef> LayoutTestController::counterValueForElementById(JSStringRef id)
1331cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1332cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1333cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!framePrivate)
1334cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return 0;
1335cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1336cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    wstring idWstring = jsStringRefToWString(id);
1337cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    BSTR idBSTR = SysAllocStringLen((OLECHAR*)idWstring.c_str(), idWstring.length());
1338cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    BSTR counterValueBSTR;
1339cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FAILED(framePrivate->counterValueForElementById(idBSTR, &counterValueBSTR)))
1340cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return 0;
1341cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1342cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    wstring counterValue(counterValueBSTR, SysStringLen(counterValueBSTR));
1343cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SysFreeString(idBSTR);
1344cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SysFreeString(counterValueBSTR);
1345cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    JSRetainPtr<JSStringRef> counterValueJS(Adopt, JSStringCreateWithCharacters(counterValue.data(), counterValue.length()));
1346cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return counterValueJS;
1347cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1348cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1349692e5dbf12901edacf14812a6fae25462920af42Steve Blockint LayoutTestController::pageNumberForElementById(JSStringRef id, float pageWidthInPixels, float pageHeightInPixels)
13505e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
1351692e5dbf12901edacf14812a6fae25462920af42Steve Block    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1352692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!framePrivate)
1353692e5dbf12901edacf14812a6fae25462920af42Steve Block        return 0;
1354692e5dbf12901edacf14812a6fae25462920af42Steve Block
1355692e5dbf12901edacf14812a6fae25462920af42Steve Block    wstring idWstring = jsStringRefToWString(id);
1356692e5dbf12901edacf14812a6fae25462920af42Steve Block    BSTR idBSTR = SysAllocStringLen((OLECHAR*)idWstring.c_str(), idWstring.length());
1357692e5dbf12901edacf14812a6fae25462920af42Steve Block    int pageNumber = -1;
1358692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (FAILED(framePrivate->pageNumberForElementById(idBSTR, pageWidthInPixels, pageHeightInPixels, &pageNumber)))
1359692e5dbf12901edacf14812a6fae25462920af42Steve Block        pageNumber = -1;
1360692e5dbf12901edacf14812a6fae25462920af42Steve Block    SysFreeString(idBSTR);
1361692e5dbf12901edacf14812a6fae25462920af42Steve Block    return pageNumber;
13625e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
13638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1364692e5dbf12901edacf14812a6fae25462920af42Steve Blockint LayoutTestController::numberOfPages(float pageWidthInPixels, float pageHeightInPixels)
13658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
1366692e5dbf12901edacf14812a6fae25462920af42Steve Block    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1367692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!framePrivate)
1368692e5dbf12901edacf14812a6fae25462920af42Steve Block        return 0;
1369692e5dbf12901edacf14812a6fae25462920af42Steve Block
1370692e5dbf12901edacf14812a6fae25462920af42Steve Block    int pageNumber = -1;
1371692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (FAILED(framePrivate->numberOfPages(pageWidthInPixels, pageHeightInPixels, &pageNumber)))
1372692e5dbf12901edacf14812a6fae25462920af42Steve Block        pageNumber = -1;
1373692e5dbf12901edacf14812a6fae25462920af42Steve Block    return pageNumber;
1374692e5dbf12901edacf14812a6fae25462920af42Steve Block}
1375692e5dbf12901edacf14812a6fae25462920af42Steve Block
137606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenJSRetainPtr<JSStringRef> LayoutTestController::pageProperty(const char* propertyName, int pageNumber) const
137706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
137806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: Implement this.
137906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return JSRetainPtr<JSStringRef>();
138006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
138106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1382692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid LayoutTestController::apiTestNewWindowDataLoadBaseURL(JSStringRef utf8Data, JSStringRef baseURL)
1383692e5dbf12901edacf14812a6fae25462920af42Steve Block{
1384692e5dbf12901edacf14812a6fae25462920af42Steve Block
13858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
1386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
138706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool LayoutTestController::isPageBoxVisible(int pageNumber) const
138806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
138906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: implement
139006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return false;
139106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
139206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1393ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockJSRetainPtr<JSStringRef> LayoutTestController::pageSizeAndMarginsInPixels(int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft) const
139406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
139506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: implement
139606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return JSRetainPtr<JSStringRef>();
139706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
139806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::apiTestGoToCurrentBackForwardItem()
1400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebView> webView;
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(frame->webView(&webView)))
1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebBackForwardList> backForwardList;
1406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(webView->backForwardList(&backForwardList)))
1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    COMPtr<IWebHistoryItem> item;
1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (FAILED(backForwardList->currentItem(&item)))
1411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BOOL success;
1414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    webView->goToBackForwardItem(item.get(), &success);
1415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::setWebViewEditable(bool)
1418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid LayoutTestController::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
1422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1424e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1425e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid LayoutTestController::setEditingBehavior(const char* editingBehavior)
1426e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
1427e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    COMPtr<IWebView> webView;
1428e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (FAILED(frame->webView(&webView)))
1429e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
1430e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1431e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    COMPtr<IWebPreferences> preferences;
1432e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (FAILED(webView->preferences(&preferences)))
1433e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
1434e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1435e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    string behaviorString(editingBehavior);
1436e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (behaviorString == "mac")
1437e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        preferences->setEditingBehavior(WebKitEditingMacBehavior);
143828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    else if (behaviorString == "win")
1439e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        preferences->setEditingBehavior(WebKitEditingWinBehavior);
144028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    else if (behaviorString == "unix")
144128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        preferences->setEditingBehavior(WebKitEditingUnixBehavior);
1442e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1443ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
14442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochJSValueRef LayoutTestController::shadowRoot(JSContextRef context, JSValueRef jsElement)
14452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
14462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: Implement this.
14472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return JSValueMakeUndefined(context);
14482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
14492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1450ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid LayoutTestController::abortModal()
1451ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
1452ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
1453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1454e14391e94c850b8bd03680c23b38978db68687a8John Reckbool LayoutTestController::hasSpellingMarker(int from, int length)
1455a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
1456e14391e94c850b8bd03680c23b38978db68687a8John Reck    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
1457e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!framePrivate)
1458e14391e94c850b8bd03680c23b38978db68687a8John Reck        return false;
1459e14391e94c850b8bd03680c23b38978db68687a8John Reck    BOOL ret = FALSE;
1460e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (FAILED(framePrivate->hasSpellingMarker(from, length, &ret)))
1461e14391e94c850b8bd03680c23b38978db68687a8John Reck        return false;
1462e14391e94c850b8bd03680c23b38978db68687a8John Reck    return ret;
1463a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1464f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
14652bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool LayoutTestController::hasGrammarMarker(int from, int length)
14662bde8e466a4451c7319e3a072d118917957d6554Steve Block{
14672bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement this.
14682bde8e466a4451c7319e3a072d118917957d6554Steve Block    return false;
14692bde8e466a4451c7319e3a072d118917957d6554Steve Block}
14702bde8e466a4451c7319e3a072d118917957d6554Steve Block
147181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid LayoutTestController::dumpConfigurationForViewport(int /*deviceDPI*/, int /*deviceWidth*/, int /*deviceHeight*/, int /*availableWidth*/, int /*availableHeight*/)
1472f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: Implement this.
1474f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1475f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid LayoutTestController::setSerializeHTTPLoads(bool)
1477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1478f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: Implement.
1479f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
148081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
14812bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::syncLocalStorage()
14822bde8e466a4451c7319e3a072d118917957d6554Steve Block{
14832bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement.
14842bde8e466a4451c7319e3a072d118917957d6554Steve Block}
14852bde8e466a4451c7319e3a072d118917957d6554Steve Block
14862bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::observeStorageTrackerNotifications(unsigned number)
14872bde8e466a4451c7319e3a072d118917957d6554Steve Block{
14882bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement.
14892bde8e466a4451c7319e3a072d118917957d6554Steve Block}
14902bde8e466a4451c7319e3a072d118917957d6554Steve Block
14912bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::deleteAllLocalStorage()
14922bde8e466a4451c7319e3a072d118917957d6554Steve Block{
14932bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement.
14942bde8e466a4451c7319e3a072d118917957d6554Steve Block}
14952bde8e466a4451c7319e3a072d118917957d6554Steve Block
14962bde8e466a4451c7319e3a072d118917957d6554Steve BlockJSValueRef LayoutTestController::originsWithLocalStorage(JSContextRef context)
14972bde8e466a4451c7319e3a072d118917957d6554Steve Block{
14982bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement.
14992bde8e466a4451c7319e3a072d118917957d6554Steve Block    return JSValueMakeUndefined(context);
15002bde8e466a4451c7319e3a072d118917957d6554Steve Block}
15012bde8e466a4451c7319e3a072d118917957d6554Steve Block
15022bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::deleteLocalStorageForOrigin(JSStringRef URL)
15032bde8e466a4451c7319e3a072d118917957d6554Steve Block{
15042bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Implement.
15052bde8e466a4451c7319e3a072d118917957d6554Steve Block}
15062bde8e466a4451c7319e3a072d118917957d6554Steve Block
150781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid LayoutTestController::setMinimumTimerInterval(double minimumTimerInterval)
150881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
150981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    COMPtr<IWebView> webView;
151081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (FAILED(frame->webView(&webView)))
151181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
151281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
151381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    COMPtr<IWebViewPrivate> viewPrivate(Query, webView);
151481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!viewPrivate)
151581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
151681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
151781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    viewPrivate->setMinimumTimerInterval(minimumTimerInterval);
151881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
15192bde8e466a4451c7319e3a072d118917957d6554Steve Block
15202bde8e466a4451c7319e3a072d118917957d6554Steve Block
1521