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