1ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block/*
2ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * Copyright (C) 2010 Apple Inc. All rights reserved.
3ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *
4ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * Redistribution and use in source and binary forms, with or without
5ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * modification, are permitted provided that the following conditions
6ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * are met:
7ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * 1. Redistributions of source code must retain the above copyright
8ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *    notice, this list of conditions and the following disclaimer.
9ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * 2. Redistributions in binary form must reproduce the above copyright
10ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *    notice, this list of conditions and the following disclaimer in the
11ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *    documentation and/or other materials provided with the distribution.
12ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *
13ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * THE POSSIBILITY OF SUCH DAMAGE.
24ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block */
25ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "config.h"
27ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "LayoutTestController.h"
28967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
29e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "InjectedBundle.h"
30e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "InjectedBundlePage.h"
31967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "JSLayoutTestController.h"
322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "PlatformWebView.h"
33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "StringFunctions.h"
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "TestController.h"
35e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <WebKit2/WKBundleBackForwardList.h>
36e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <WebKit2/WKBundleFrame.h>
370617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include <WebKit2/WKBundleFramePrivate.h>
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <WebKit2/WKBundleInspector.h>
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebKit2/WKBundleNodeHandlePrivate.h>
400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include <WebKit2/WKBundlePagePrivate.h>
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <WebKit2/WKBundlePrivate.h>
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebKit2/WKBundleScriptWorld.h>
43e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <WebKit2/WKRetainPtr.h>
44e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <WebKit2/WebKit2.h>
45ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include <wtf/HashMap.h>
46ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
47ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blocknamespace WTR {
48ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen// This is lower than DumpRenderTree's timeout, to make it easier to work through the failures
500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen// Eventually it should be changed to match.
5168513a70bcd92384395513322f1b801e7bf9c729Steve Blockconst double LayoutTestController::waitToDumpWatchdogTimerInterval = 6;
520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic JSValueRef propertyValue(JSContextRef context, JSObjectRef object, const char* propertyName)
540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!object)
560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSStringCreateWithUTF8CString(propertyName));
580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef exception;
590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return JSObjectGetProperty(context, object, propertyNameString.get(), &exception);
600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic JSObjectRef propertyObject(JSContextRef context, JSObjectRef object, const char* propertyName)
630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef value = propertyValue(context, object, propertyName);
650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!value || !JSValueIsObject(context, value))
660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return const_cast<JSObjectRef>(value);
680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic JSObjectRef getElementById(WKBundleFrameRef frame, JSStringRef elementId)
71ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSContextRef context = WKBundleFrameGetJavaScriptContext(frame);
730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSObjectRef document = propertyObject(context, JSContextGetGlobalObject(context), "document");
740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!document)
750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef getElementById = propertyObject(context, document, "getElementById");
770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!getElementById || !JSValueIsObject(context, getElementById))
780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef elementIdValue = JSValueMakeString(context, elementId);
800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef exception;
810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef element = JSObjectCallAsFunction(context, const_cast<JSObjectRef>(getElementById), document, 1, &elementIdValue, &exception);
820617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!element || !JSValueIsObject(context, element))
830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return const_cast<JSObjectRef>(element);
85ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
86ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
870617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenPassRefPtr<LayoutTestController> LayoutTestController::create()
880617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return adoptRef(new LayoutTestController);
900617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
910617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
920617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenLayoutTestController::LayoutTestController()
930617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    : m_whatToDump(RenderTree)
940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_shouldDumpAllFrameScrollPositions(false)
95e14391e94c850b8bd03680c23b38978db68687a8John Reck    , m_shouldDumpBackForwardListsForAllWindows(false)
960617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_shouldAllowEditing(true)
97db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    , m_shouldCloseExtraWindows(false)
980617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_dumpEditingCallbacks(false)
99967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    , m_dumpStatusCallbacks(false)
100dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    , m_dumpTitleChanges(false)
10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_dumpPixels(true)
1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_dumpFullScreenCallbacks(false)
103e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    , m_waitToDump(false)
104967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    , m_testRepaint(false)
105967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    , m_testRepaintSweepHorizontally(false)
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_willSendRequestReturnsNull(false)
107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block    platformInitialize();
109ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
110ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
111ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockLayoutTestController::~LayoutTestController()
112ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
113ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
114ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
115967717af5423377c967781471ee106e2bb4e11c8Ben MurdochJSClassRef LayoutTestController::wrapperClass()
116967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
117967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return JSLayoutTestController::layoutTestControllerClass();
118967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
119e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
120967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid LayoutTestController::display()
121967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
122967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // FIXME: actually implement, once we want pixel tests
123967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
124e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid LayoutTestController::dumpAsText()
12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_whatToDump = MainFrameText;
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_dumpPixels = false;
12981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
131967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid LayoutTestController::waitUntilDone()
132e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
133e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_waitToDump = true;
13468513a70bcd92384395513322f1b801e7bf9c729Steve Block    initializeWaitToDumpWatchdogTimerIfNeeded();
135e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
136e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
137e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid LayoutTestController::waitToDumpWatchdogTimerFired()
138e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
13968513a70bcd92384395513322f1b801e7bf9c729Steve Block    invalidateWaitToDumpWatchdogTimer();
140e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    const char* message = "FAIL: Timed out waiting for notifyDone to be called\n";
141e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    InjectedBundle::shared().os() << message << "\n";
142e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    InjectedBundle::shared().done();
143e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
144e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
145e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid LayoutTestController::notifyDone()
146e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
147cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!InjectedBundle::shared().isTestRunning())
148cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
149cad810f21b803229eb11403f9209855525a25d57Steve Block
150ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_waitToDump && !InjectedBundle::shared().topLoadingFrame())
151e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        InjectedBundle::shared().page()->dump();
152ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
153e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_waitToDump = false;
154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
155e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
156e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeunsigned LayoutTestController::numberOfActiveAnimations() const
157e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // FIXME: Is it OK this works only for the main frame?
1590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage?
160e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
161e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return WKBundleFrameGetNumberOfActiveAnimations(mainFrame);
162e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
163e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
164e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkebool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
165e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // FIXME: Is it OK this works only for the main frame?
1670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage?
1680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
1690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return WKBundleFramePauseAnimationOnElementWithId(mainFrame, toWK(animationName).get(), toWK(elementId).get(), time);
1700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
171e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
17228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid LayoutTestController::suspendAnimations()
17328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
17428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
17528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    WKBundleFrameSuspendAnimations(mainFrame);
17628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
17728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
17828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid LayoutTestController::resumeAnimations()
17928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
18028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
18128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    WKBundleFrameResumeAnimations(mainFrame);
18228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
18328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
184e14391e94c850b8bd03680c23b38978db68687a8John ReckJSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const
185e14391e94c850b8bd03680c23b38978db68687a8John Reck{
186e14391e94c850b8bd03680c23b38978db68687a8John Reck    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
187e14391e94c850b8bd03680c23b38978db68687a8John Reck    WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyLayerTreeAsText(mainFrame));
188e14391e94c850b8bd03680c23b38978db68687a8John Reck    return toJS(text);
189e14391e94c850b8bd03680c23b38978db68687a8John Reck}
190e14391e94c850b8bd03680c23b38978db68687a8John Reck
1915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid LayoutTestController::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
1925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    WKRetainPtr<WKStringRef> sourceWK = toWK(source);
1945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    WKRetainPtr<WKBundleScriptWorldRef> scriptWorld(AdoptWK, WKBundleScriptWorldCreateWorld());
1955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
196f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKBundleAddUserScript(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), scriptWorld.get(), sourceWK.get(), 0, 0, 0,
1975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        (runAtStart ? kWKInjectAtDocumentStart : kWKInjectAtDocumentEnd),
1985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        (allFrames ? kWKInjectInAllFrames : kWKInjectInTopFrameOnly));
1995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
2005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
2015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid LayoutTestController::addUserStyleSheet(JSStringRef source, bool allFrames)
2025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
2035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    WKRetainPtr<WKStringRef> sourceWK = toWK(source);
2045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    WKRetainPtr<WKBundleScriptWorldRef> scriptWorld(AdoptWK, WKBundleScriptWorldCreateWorld());
2055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKBundleAddUserStyleSheet(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), scriptWorld.get(), sourceWK.get(), 0, 0, 0,
2075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        (allFrames ? kWKInjectInAllFrames : kWKInjectInTopFrameOnly));
2085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
2095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
2100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid LayoutTestController::keepWebHistory()
2110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
212dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WKBundleSetShouldTrackVisitedLinks(InjectedBundle::shared().bundle(), true);
2130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2150617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenJSValueRef LayoutTestController::computedStyleIncludingVisitedInfo(JSValueRef element)
2160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
2170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // FIXME: Is it OK this works only for the main frame?
218e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
2190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
2200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!JSValueIsObject(context, element))
2210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return JSValueMakeUndefined(context);
2220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSValueRef value = WKBundleFrameGetComputedStyleIncludingVisitedInfo(mainFrame, const_cast<JSObjectRef>(element));
2230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!value)
2240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return JSValueMakeUndefined(context);
2250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return value;
2260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2280617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenJSRetainPtr<JSStringRef> LayoutTestController::counterValueForElementById(JSStringRef elementId)
2290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
2300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
2310617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSObjectRef element = getElementById(mainFrame, elementId);
2320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!element)
2330617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
2340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKRetainPtr<WKStringRef> value(AdoptWK, WKBundleFrameCopyCounterValue(mainFrame, const_cast<JSObjectRef>(element)));
2350617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return toJS(value);
2360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2370617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2380617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenJSRetainPtr<JSStringRef> LayoutTestController::markerTextForListItem(JSValueRef element)
2390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
2400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
2410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
2420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!element || !JSValueIsObject(context, element))
2430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
2440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyMarkerText(mainFrame, const_cast<JSObjectRef>(element)));
2450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (WKStringIsEmpty(text.get()))
2460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
2470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return toJS(text);
2480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid LayoutTestController::execCommand(JSStringRef name, JSStringRef argument)
2510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
2520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKBundlePageExecuteEditingCommand(InjectedBundle::shared().page()->page(), toWK(name).get(), toWK(argument).get());
2530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool LayoutTestController::findString(JSStringRef target, JSValueRef optionsArrayAsValue)
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKFindOptions options = 0;
258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
259f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
260f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length"));
262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSObjectRef optionsArray = JSValueToObject(context, optionsArrayAsValue, 0);
263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0);
264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!JSValueIsNumber(context, lengthValue))
265f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return false;
266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
267f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    size_t length = static_cast<size_t>(JSValueToNumber(context, lengthValue, 0));
268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < length; ++i) {
269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0);
270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!JSValueIsString(context, value))
271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0));
274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (JSStringIsEqualToUTF8CString(optionName.get(), "CaseInsensitive"))
276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            options |= kWKFindOptionsCaseInsensitive;
277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (JSStringIsEqualToUTF8CString(optionName.get(), "AtWordStarts"))
278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            options |= kWKFindOptionsAtWordStarts;
279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (JSStringIsEqualToUTF8CString(optionName.get(), "TreatMedialCapitalAsWordStart"))
280f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            options |= kWKFindOptionsTreatMedialCapitalAsWordStart;
281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (JSStringIsEqualToUTF8CString(optionName.get(), "Backwards"))
282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            options |= kWKFindOptionsBackwards;
283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (JSStringIsEqualToUTF8CString(optionName.get(), "WrapAround"))
284f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            options |= kWKFindOptionsWrapAround;
285f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (JSStringIsEqualToUTF8CString(optionName.get(), "StartInSelection")) {
286f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            // FIXME: No kWKFindOptionsStartInSelection.
287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return WKBundlePageFindString(InjectedBundle::shared().page()->page(), toWK(target).get(), options);
291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid LayoutTestController::clearAllDatabases()
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleClearAllDatabases(InjectedBundle::shared().bundle());
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid LayoutTestController::setDatabaseQuota(uint64_t quota)
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return WKBundleSetDatabaseQuota(InjectedBundle::shared().bundle(), quota);
3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenbool LayoutTestController::isCommandEnabled(JSStringRef name)
3040617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
3050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return WKBundlePageIsEditingCommandEnabled(InjectedBundle::shared().page()->page(), toWK(name).get());
306e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
307e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
308db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid LayoutTestController::setCanOpenWindows(bool)
309db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
310db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // It's not clear if or why any tests require opening windows be forbidden.
311db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // For now, just ignore this setting, and if we find later it's needed we can add it.
312db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
313db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
3145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid LayoutTestController::setXSSAuditorEnabled(bool enabled)
3155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
316f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKBundleOverrideXSSAuditorEnabledForTestRunner(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), true);
3175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
3185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3192bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid LayoutTestController::setAllowUniversalAccessFromFileURLs(bool enabled)
3202bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3212bde8e466a4451c7319e3a072d118917957d6554Steve Block    WKBundleOverrideAllowUniversalAccessFromFileURLsForTestRunner(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
3222bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3232bde8e466a4451c7319e3a072d118917957d6554Steve Block
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid LayoutTestController::setAllowFileAccessFromFileURLs(bool enabled)
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleSetAllowFileAccessFromFileURLs(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochint LayoutTestController::numberOfPages(double pageWidthInPixels, double pageHeightInPixels)
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return WKBundleNumberOfPages(InjectedBundle::shared().bundle(), mainFrame, pageWidthInPixels, pageHeightInPixels);
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochint LayoutTestController::pageNumberForElementById(JSStringRef id, double pageWidthInPixels, double pageHeightInPixels)
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return WKBundlePageNumberForElementById(InjectedBundle::shared().bundle(), mainFrame, toWK(id).get(), pageWidthInPixels, pageHeightInPixels);
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochJSRetainPtr<JSStringRef> LayoutTestController::pageSizeAndMarginsInPixels(int pageIndex, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft)
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return toJS(WKBundlePageSizeAndMarginsInPixels(InjectedBundle::shared().bundle(), mainFrame, pageIndex, width, height, marginTop, marginRight, marginBottom, marginLeft));
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool LayoutTestController::isPageBoxVisible(int pageIndex)
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return WKBundleIsPageBoxVisible(InjectedBundle::shared().bundle(), mainFrame, pageIndex);
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
353db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockunsigned LayoutTestController::windowCount()
354db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
355db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return InjectedBundle::shared().pageCount();
356db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
357db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochJSValueRef LayoutTestController::shadowRoot(JSValueRef element)
3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!element || !JSValueIsObject(context, element))
3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JSValueMakeNull(context);
3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKRetainPtr<WKBundleNodeHandleRef> domElement = adoptWK(WKBundleNodeHandleCreate(context, const_cast<JSObjectRef>(element)));
3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!domElement)
3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JSValueMakeNull(context);
3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKRetainPtr<WKBundleNodeHandleRef> shadowRootDOMElement = adoptWK(WKBundleNodeHandleCopyElementShadowRoot(domElement.get()));
3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!shadowRootDOMElement)
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JSValueMakeNull(context);
3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return WKBundleFrameGetJavaScriptWrapperForNodeForWorld(mainFrame, shadowRootDOMElement.get(), WKBundleScriptWorldNormalWorld());
3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
377e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid LayoutTestController::clearBackForwardList()
378e14391e94c850b8bd03680c23b38978db68687a8John Reck{
379e14391e94c850b8bd03680c23b38978db68687a8John Reck    WKBundleBackForwardListClear(WKBundlePageGetBackForwardList(InjectedBundle::shared().page()->page()));
380e14391e94c850b8bd03680c23b38978db68687a8John Reck}
381e14391e94c850b8bd03680c23b38978db68687a8John Reck
382ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block// Object Creation
383ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
384ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid LayoutTestController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception)
385ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
3860617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    setProperty(context, windowObject, "layoutTestController", this, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception);
387ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
388ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid LayoutTestController::showWebInspector()
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKBundleInspectorShow(WKBundlePageGetInspector(InjectedBundle::shared().page()->page()));
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid LayoutTestController::closeWebInspector()
3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKBundleInspectorClose(WKBundlePageGetInspector(InjectedBundle::shared().page()->page()));
3972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid LayoutTestController::evaluateInWebInspector(long callID, JSStringRef script)
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKRetainPtr<WKStringRef> scriptWK = toWK(script);
4022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKBundleInspectorEvaluateScriptForTest(WKBundlePageGetInspector(InjectedBundle::shared().page()->page()), callID, scriptWK.get());
4032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4052fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid LayoutTestController::setTimelineProfilingEnabled(bool enabled)
4062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKBundleInspectorSetPageProfilingEnabled(WKBundlePageGetInspector(InjectedBundle::shared().page()->page()), enabled);
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
410ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtypedef WTF::HashMap<unsigned, WKRetainPtr<WKBundleScriptWorldRef> > WorldMap;
411ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic WorldMap& worldMap()
412ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
413ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    static WorldMap& map = *new WorldMap;
414ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return map;
415ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
416ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
417ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochunsigned LayoutTestController::worldIDForWorld(WKBundleScriptWorldRef world)
418ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
419ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WorldMap::const_iterator end = worldMap().end();
420ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (WorldMap::const_iterator it = worldMap().begin(); it != end; ++it) {
421ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (it->second == world)
422ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return it->first;
423ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
424ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
425ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return 0;
426ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
427ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
428ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid LayoutTestController::evaluateScriptInIsolatedWorld(JSContextRef context, unsigned worldID, JSStringRef script)
429ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
430ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // A worldID of 0 always corresponds to a new world. Any other worldID corresponds to a world
431ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // that is created once and cached forever.
432ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WKRetainPtr<WKBundleScriptWorldRef> world;
433ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!worldID)
434ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        world.adopt(WKBundleScriptWorldCreateWorld());
435ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    else {
436ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WKRetainPtr<WKBundleScriptWorldRef>& worldSlot = worldMap().add(worldID, 0).first->second;
437ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (!worldSlot)
438ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            worldSlot.adopt(WKBundleScriptWorldCreateWorld());
439ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        world = worldSlot;
440ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
441ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
442ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WKBundleFrameRef frame = WKBundleFrameForJavaScriptContext(context);
443ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!frame)
444ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        frame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
445ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
446ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    JSGlobalContextRef jsContext = WKBundleFrameGetJavaScriptContextForWorld(frame, world.get());
447ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    JSEvaluateScript(jsContext, script, 0, 0, 0, 0);
448ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
449ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4502fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid LayoutTestController::setPOSIXLocale(JSStringRef locale)
4512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    char localeBuf[32];
4532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSStringGetUTF8CString(locale, localeBuf, sizeof(localeBuf));
4542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setlocale(LC_ALL, localeBuf);
4552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
457ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} // namespace WTR
458