| /* |
| * Copyright (C) 2007-2016 Apple Inc. All rights reserved. |
| * Copyright (C) 2010 Joone Hur <joone@kldp.org> |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. Neither the name of Apple Inc. ("Apple") nor the names of |
| * its contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "config.h" |
| #include "TestRunner.h" |
| |
| #include "WebCoreTestSupport.h" |
| #include "WorkQueue.h" |
| #include "WorkQueueItem.h" |
| #include <JavaScriptCore/APICast.h> |
| #include <JavaScriptCore/ArrayBufferView.h> |
| #include <JavaScriptCore/HeapInlines.h> |
| #include <JavaScriptCore/JSArrayBufferView.h> |
| #include <JavaScriptCore/JSCTestRunnerUtils.h> |
| #include <JavaScriptCore/JSContextRef.h> |
| #include <JavaScriptCore/JSGlobalObjectInlines.h> |
| #include <JavaScriptCore/JSObjectRef.h> |
| #include <JavaScriptCore/JSRetainPtr.h> |
| #include <JavaScriptCore/TypedArrayInlines.h> |
| #include <JavaScriptCore/VMInlines.h> |
| #include <WebCore/LogInitialization.h> |
| #include <cstring> |
| #include <locale.h> |
| #include <stdio.h> |
| #include <wtf/Assertions.h> |
| #include <wtf/LoggingAccumulator.h> |
| #include <wtf/MathExtras.h> |
| #include <wtf/RefPtr.h> |
| #include <wtf/RunLoop.h> |
| #include <wtf/StdLibExtras.h> |
| #include <wtf/UniqueArray.h> |
| #include <wtf/WallTime.h> |
| #include <wtf/text/WTFString.h> |
| |
| #if PLATFORM(IOS_FAMILY) |
| #include <WebCore/WebCoreThreadRun.h> |
| #include <wtf/BlockPtr.h> |
| #endif |
| |
| #if PLATFORM(MAC) && !PLATFORM(IOS_FAMILY) |
| #include <Carbon/Carbon.h> |
| #endif |
| |
| FILE* testResult = stdout; |
| |
| const unsigned TestRunner::viewWidth = 800; |
| const unsigned TestRunner::viewHeight = 600; |
| |
| const unsigned TestRunner::w3cSVGViewWidth = 480; |
| const unsigned TestRunner::w3cSVGViewHeight = 360; |
| |
| TestRunner::TestRunner(const std::string& testURL, const std::string& expectedPixelHash) |
| : m_testURL(testURL) |
| , m_expectedPixelHash(expectedPixelHash) |
| , m_titleTextDirection("ltr") |
| { |
| } |
| |
| Ref<TestRunner> TestRunner::create(const std::string& testURL, const std::string& expectedPixelHash) |
| { |
| return adoptRef(*new TestRunner(testURL, expectedPixelHash)); |
| } |
| |
| // Static Functions |
| |
| static JSValueRef disallowIncreaseForApplicationCacheQuotaCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDisallowIncreaseForApplicationCacheQuota(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpApplicationCacheDelegateCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpApplicationCacheDelegateCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpAsPDFCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpAsPDF(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setRenderTreeDumpOptionsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| double options = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| |
| controller->setRenderTreeDumpOptions(static_cast<unsigned>(options)); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpAsText(true); |
| |
| // Optional paramater, describing whether it's allowed to dump pixel results in dumpAsText mode. |
| controller->setGeneratePixelResults(argumentCount > 0 ? JSValueToBoolean(context, arguments[0]) : false); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpBackForwardList(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpChildFramesAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpChildFramesAsText(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpChildFrameScrollPositionsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpChildFrameScrollPositions(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpDatabaseCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpDatabaseCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpDOMAsWebArchiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpDOMAsWebArchive(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpEditingCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpEditingCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpFrameLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpFrameLoadCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpProgressFinishedCallbackCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpProgressFinishedCallback(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpUserGestureInFrameLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpUserGestureInFrameLoadCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpResourceLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpResourceLoadCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpResourceResponseMIMETypesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpResourceResponseMIMETypes(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpSelectionRectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpSelectionRect(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpSourceAsWebArchiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpSourceAsWebArchive(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpStatusCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpStatusCallbacks(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpTitleChangesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpTitleChanges(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef dumpWillCacheResponseCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpWillCacheResponse(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef pathToLocalResourceCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto localPath = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| auto convertedPath = controller->pathToLocalResource(context, localPath.get()); |
| if (!convertedPath) |
| return JSValueMakeUndefined(context); |
| |
| return JSValueMakeString(context, convertedPath.get()); |
| } |
| |
| static JSValueRef removeAllVisitedLinksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDumpVisitedLinksCallback(true); |
| controller->removeAllVisitedLinks(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef repaintSweepHorizontallyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setTestRepaintSweepHorizontally(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setCallCloseOnWebViewsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setCallCloseOnWebViews(JSValueToBoolean(context, arguments[0])); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setCanOpenWindowsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setCanOpenWindows(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setCloseRemainingWindowsWhenCompleteCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setCloseRemainingWindowsWhenComplete(JSValueToBoolean(context, arguments[0])); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAudioResultCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| // FIXME (123058): Use a JSC API to get buffer contents once such is exposed. |
| JSC::VM& vm = toJS(context)->vm(); |
| JSC::JSLockHolder lock(vm); |
| |
| JSC::JSArrayBufferView* jsBufferView = JSC::jsDynamicCast<JSC::JSArrayBufferView*>(vm, toJS(toJS(context), arguments[0])); |
| ASSERT(jsBufferView); |
| RefPtr<JSC::ArrayBufferView> bufferView = jsBufferView->unsharedImpl(); |
| const char* buffer = static_cast<const char*>(bufferView->baseAddress()); |
| std::vector<char> audioData(buffer, buffer + bufferView->byteLength()); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAudioResult(audioData); |
| controller->setDumpAsAudio(true); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef testOnscreenCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setTestOnscreen(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef testRepaintCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setTestRepaint(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef addDisallowedURLCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto url = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->addDisallowedURL(url.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef addURLToRedirectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 2) |
| return JSValueMakeUndefined(context); |
| |
| auto origin = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| auto destination = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| size_t maxLength = JSStringGetMaximumUTF8CStringSize(origin.get()); |
| auto originBuffer = makeUniqueArray<char>(maxLength + 1); |
| JSStringGetUTF8CString(origin.get(), originBuffer.get(), maxLength + 1); |
| |
| maxLength = JSStringGetMaximumUTF8CStringSize(destination.get()); |
| auto destinationBuffer = makeUniqueArray<char>(maxLength + 1); |
| JSStringGetUTF8CString(destination.get(), destinationBuffer.get(), maxLength + 1); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->addURLToRedirect(originBuffer.get(), destinationBuffer.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef callShouldCloseOnWebViewCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| return JSValueMakeBoolean(context, controller->callShouldCloseOnWebView()); |
| } |
| |
| static JSValueRef clearAllApplicationCachesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->clearAllApplicationCaches(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef clearApplicationCacheForOriginCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto originURL = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->clearApplicationCacheForOrigin(originURL.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef applicationCacheDiskUsageForOriginCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto originURL = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| return JSValueMakeNumber(context, controller->applicationCacheDiskUsageForOrigin(originURL.get())); |
| } |
| |
| static JSValueRef originsWithApplicationCacheCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return controller->originsWithApplicationCache(context); |
| } |
| |
| static JSValueRef clearAllDatabasesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->clearAllDatabases(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef clearBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->clearBackForwardList(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef clearPersistentUserStyleSheetCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->clearPersistentUserStyleSheet(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef decodeHostNameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto name = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto decodedHostName = controller->copyDecodedHostName(name.get()); |
| return JSValueMakeString(context, decodedHostName.get()); |
| } |
| |
| static JSValueRef dispatchPendingLoadRequestsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation, needs windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->dispatchPendingLoadRequests(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef displayCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->display(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef displayAndTrackRepaintsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->displayAndTrackRepaints(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef encodeHostNameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto name = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto encodedHostName = controller->copyEncodedHostName(name.get()); |
| return JSValueMakeString(context, encodedHostName.get()); |
| } |
| |
| static JSValueRef execCommandCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac & Windows implementations. |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto name = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| // Ignoring the second parameter (userInterface), as this command emulates a manual action. |
| |
| JSRetainPtr<JSStringRef> value; |
| if (argumentCount >= 3) { |
| value = adopt(JSValueToStringCopy(context, arguments[2], exception)); |
| ASSERT(!*exception); |
| } else |
| value = adopt(JSStringCreateWithUTF8CString("")); |
| |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->execCommand(name.get(), value.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef findStringCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac implementation. |
| if (argumentCount < 2) |
| return JSValueMakeUndefined(context); |
| |
| auto target = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| JSObjectRef options = JSValueToObject(context, arguments[1], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeBoolean(context, controller->findString(context, target.get(), options)); |
| } |
| |
| static JSValueRef goBackCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->goBack(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef isCommandEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac implementation. |
| |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto name = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| return JSValueMakeBoolean(context, controller->isCommandEnabled(name.get())); |
| } |
| |
| static JSValueRef overridePreferenceCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 2) |
| return JSValueMakeUndefined(context); |
| |
| auto key = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| auto value = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| // Should use `<!-- webkit-test-runner [ enableBackForwardCache=true ] -->` instead. |
| RELEASE_ASSERT(!JSStringIsEqualToUTF8CString(key.get(), "WebKitUsesBackForwardCachePreferenceKey")); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->overridePreference(key.get(), value.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef keepWebHistoryCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->keepWebHistory(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef notifyDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->notifyDone(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef numberOfPendingGeolocationPermissionRequestsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeNumber(context, controller->numberOfPendingGeolocationPermissionRequests()); |
| } |
| |
| static JSValueRef isGeolocationProviderActiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeBoolean(context, controller->isGeolocationProviderActive()); |
| } |
| |
| static JSValueRef queueBackNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| double howFarBackDouble = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->queueBackNavigation(static_cast<int>(howFarBackDouble)); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef queueForwardNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| double howFarForwardDouble = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->queueForwardNavigation(static_cast<int>(howFarForwardDouble)); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef queueLoadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto url = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| JSRetainPtr<JSStringRef> target; |
| if (argumentCount >= 2) { |
| target = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| } else |
| target = adopt(JSStringCreateWithUTF8CString("")); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->queueLoad(url.get(), target.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef queueLoadHTMLStringCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac & Windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto content = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| JSRetainPtr<JSStringRef> baseURL; |
| if (argumentCount >= 2) { |
| baseURL = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| } else |
| baseURL = adopt(JSStringCreateWithUTF8CString("")); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| if (argumentCount >= 3) { |
| auto unreachableURL = adopt(JSValueToStringCopy(context, arguments[2], exception)); |
| ASSERT(!*exception); |
| controller->queueLoadAlternateHTMLString(content.get(), baseURL.get(), unreachableURL.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| controller->queueLoadHTMLString(content.get(), baseURL.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef queueReloadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->queueReload(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef queueLoadingScriptCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto script = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->queueLoadingScript(script.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef queueNonLoadingScriptCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| // May be able to be made platform independant by using shared WorkQueue |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto script = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->queueNonLoadingScript(script.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAcceptsEditingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAcceptsEditing(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAlwaysAcceptCookiesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAlwaysAcceptCookies(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setOnlyAcceptFirstPartyCookiesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setOnlyAcceptFirstPartyCookies(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAppCacheMaximumSizeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| double size = JSValueToNumber(context, arguments[0], NULL); |
| if (!std::isnan(size)) |
| controller->setAppCacheMaximumSize(static_cast<unsigned long long>(size)); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAuthenticationPasswordCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto password = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| size_t maxLength = JSStringGetMaximumUTF8CStringSize(password.get()); |
| char* passwordBuffer = new char[maxLength + 1]; |
| JSStringGetUTF8CString(password.get(), passwordBuffer, maxLength + 1); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAuthenticationPassword(passwordBuffer); |
| delete[] passwordBuffer; |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAuthenticationUsernameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto username = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| size_t maxLength = JSStringGetMaximumUTF8CStringSize(username.get()); |
| char* usernameBuffer = new char[maxLength + 1]; |
| JSStringGetUTF8CString(username.get(), usernameBuffer, maxLength + 1); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAuthenticationUsername(usernameBuffer); |
| delete[] usernameBuffer; |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAuthorAndUserStylesEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAuthorAndUserStylesEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setCacheModelCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac implementation. |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| int cacheModel = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setCacheModel(cacheModel); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setCustomPolicyDelegateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| bool permissive = false; |
| if (argumentCount >= 2) |
| permissive = JSValueToBoolean(context, arguments[1]); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setCustomPolicyDelegate(JSValueToBoolean(context, arguments[0]), permissive); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setDatabaseQuotaCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| double quota = JSValueToNumber(context, arguments[0], NULL); |
| if (!std::isnan(quota)) |
| controller->setDatabaseQuota(static_cast<unsigned long long>(quota)); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setDefersLoadingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDefersLoading(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setUseDeferredFrameLoadingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setUseDeferredFrameLoading(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setDomainRelaxationForbiddenForURLSchemeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac and Windows implementation |
| if (argumentCount < 2) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| bool forbidden = JSValueToBoolean(context, arguments[0]); |
| auto scheme = adopt(JSValueToStringCopy(context, arguments[1], 0)); |
| controller->setDomainRelaxationForbiddenForURLScheme(forbidden, scheme.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setMockDeviceOrientationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 6) |
| return JSValueMakeUndefined(context); |
| |
| bool canProvideAlpha = JSValueToBoolean(context, arguments[0]); |
| double alpha = JSValueToNumber(context, arguments[1], exception); |
| ASSERT(!*exception); |
| bool canProvideBeta = JSValueToBoolean(context, arguments[2]); |
| double beta = JSValueToNumber(context, arguments[3], exception); |
| ASSERT(!*exception); |
| bool canProvideGamma = JSValueToBoolean(context, arguments[4]); |
| double gamma = JSValueToNumber(context, arguments[5], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = reinterpret_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setMockDeviceOrientation(canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setMockGeolocationPositionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 3) |
| return JSValueMakeUndefined(context); |
| |
| double latitude = JSValueToNumber(context, arguments[0], 0); |
| double longitude = JSValueToNumber(context, arguments[1], 0); |
| double accuracy = JSValueToNumber(context, arguments[2], 0); |
| |
| bool canProvideAltitude = false; |
| double altitude = 0.; |
| if (argumentCount > 3 && !JSValueIsUndefined(context, arguments[3])) { |
| canProvideAltitude = true; |
| altitude = JSValueToNumber(context, arguments[3], 0); |
| } |
| |
| bool canProvideAltitudeAccuracy = false; |
| double altitudeAccuracy = 0.; |
| if (argumentCount > 4 && !JSValueIsUndefined(context, arguments[4])) { |
| canProvideAltitudeAccuracy = true; |
| altitudeAccuracy = JSValueToNumber(context, arguments[4], 0); |
| } |
| |
| bool canProvideHeading = false; |
| double heading = 0.; |
| if (argumentCount > 5 && !JSValueIsUndefined(context, arguments[5])) { |
| canProvideHeading = true; |
| heading = JSValueToNumber(context, arguments[5], 0); |
| } |
| |
| bool canProvideSpeed = false; |
| double speed = 0.; |
| if (argumentCount > 6 && !JSValueIsUndefined(context, arguments[6])) { |
| canProvideSpeed = true; |
| speed = JSValueToNumber(context, arguments[6], 0); |
| } |
| |
| bool canProvideFloorLevel = false; |
| double floorLevel = 0.; |
| if (argumentCount > 7 && !JSValueIsUndefined(context, arguments[7])) { |
| canProvideFloorLevel = true; |
| floorLevel = JSValueToNumber(context, arguments[7], 0); |
| } |
| |
| TestRunner* controller = reinterpret_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setMockGeolocationPosition(latitude, longitude, accuracy, canProvideAltitude, altitude, canProvideAltitudeAccuracy, altitudeAccuracy, canProvideHeading, heading, canProvideSpeed, speed, canProvideFloorLevel, floorLevel); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setMockGeolocationPositionUnavailableErrorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 1) |
| return JSValueMakeUndefined(context); |
| |
| auto message = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = reinterpret_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setMockGeolocationPositionUnavailableError(message.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setNewWindowsCopyBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setNewWindowsCopyBackForwardList(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setGeolocationPermissionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setGeolocationPermission(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setRejectsProtectionSpaceAndContinueForAuthenticationChallengesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setRejectsProtectionSpaceAndContinueForAuthenticationChallenges(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setHandlesAuthenticationChallengesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setHandlesAuthenticationChallenges(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPOSIXLocaleCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto locale = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| controller->setPOSIXLocale(locale.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setIconDatabaseEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setIconDatabaseEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setMainFrameIsFirstResponderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setMainFrameIsFirstResponder(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPersistentUserStyleSheetLocationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto path = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setPersistentUserStyleSheetLocation(path.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPrivateBrowsingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setPrivateBrowsingEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setShouldSwapToEphemeralSessionOnNextNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setShouldSwapToEphemeralSessionOnNextNavigation(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setShouldSwapToDefaultSessionOnNextNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setShouldSwapToDefaultSessionOnNextNavigation(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setJavaScriptCanAccessClipboardCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setJavaScriptCanAccessClipboard(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setXSSAuditorEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setXSSAuditorEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setSpatialNavigationEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation. |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setSpatialNavigationEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPrintingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setIsPrinting(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAllowsAnySSLCertificateCallback(JSContextRef context, JSObjectRef, JSObjectRef, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| bool allowAnyCertificate = false; |
| if (argumentCount == 1) |
| allowAnyCertificate = JSValueToBoolean(context, arguments[0]); |
| |
| TestRunner::setAllowsAnySSLCertificate(allowAnyCertificate); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAllowUniversalAccessFromFileURLsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAllowUniversalAccessFromFileURLs(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAllowFileAccessFromFileURLsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAllowFileAccessFromFileURLs(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setNeedsStorageAccessFromFileURLsQuirkCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setNeedsStorageAccessFromFileURLsQuirk(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setTabKeyCyclesThroughElementsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setTabKeyCyclesThroughElements(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| #if PLATFORM(IOS_FAMILY) |
| static JSValueRef setTelephoneNumberParsingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setTelephoneNumberParsingEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPagePausedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setPagePaused(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| #endif |
| |
| static JSValueRef setUserStyleSheetEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setUserStyleSheetEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setUserStyleSheetLocationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto path = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setUserStyleSheetLocation(path.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setValueForUserCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount != 2) |
| return JSValueMakeUndefined(context); |
| |
| auto value = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setValueForUser(context, arguments[0], value.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setWillSendRequestClearHeaderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto header = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| size_t maxLength = JSStringGetMaximumUTF8CStringSize(header.get()); |
| auto headerBuffer = makeUniqueArray<char>(maxLength + 1); |
| JSStringGetUTF8CString(header.get(), headerBuffer.get(), maxLength + 1); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setWillSendRequestClearHeader(headerBuffer.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setWillSendRequestReturnsNullCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has cross-platform implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setWillSendRequestReturnsNull(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setWillSendRequestReturnsNullOnRedirectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has cross-platform implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setWillSendRequestReturnsNullOnRedirect(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setWindowIsKeyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setWindowIsKey(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setViewSizeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 2) |
| return JSValueMakeUndefined(context); |
| |
| double width = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| double height = JSValueToNumber(context, arguments[1], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setViewSize(width, height); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef waitUntilDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setWaitToDump(true); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef windowCountCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| int windows = controller->windowCount(); |
| return JSValueMakeNumber(context, windows); |
| } |
| |
| static JSValueRef setPopupBlockingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setPopupBlockingEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPluginsEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setPluginsEnabled(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setPageVisibilityCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto visibility = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| size_t maxLength = JSStringGetMaximumUTF8CStringSize(visibility.get()); |
| char* visibilityBuffer = new char[maxLength + 1]; |
| JSStringGetUTF8CString(visibility.get(), visibilityBuffer, maxLength + 1); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setPageVisibility(visibilityBuffer); |
| delete[] visibilityBuffer; |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef resetPageVisibilityCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->resetPageVisibility(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setAutomaticLinkDetectionEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAutomaticLinkDetectionEnabled(JSValueToBoolean(context, arguments[0])); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setStopProvisionalFrameLoadsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setStopProvisionalFrameLoads(true); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef showWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->showWebInspector(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef closeWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->closeWebInspector(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef evaluateInWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto script = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| controller->evaluateInWebInspector(script.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef evaluateScriptInIsolatedWorldCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| double worldID = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| auto script = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| controller->evaluateScriptInIsolatedWorld(static_cast<unsigned>(worldID), JSContextGetGlobalObject(context), script.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef evaluateScriptInIsolatedWorldAndReturnValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| double worldID = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| auto script = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| controller->evaluateScriptInIsolatedWorldAndReturnValue(static_cast<unsigned>(worldID), JSContextGetGlobalObject(context), script.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef waitForPolicyDelegateCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->waitForPolicyDelegate(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef addOriginAccessWhitelistEntryCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 4) |
| return JSValueMakeUndefined(context); |
| |
| auto sourceOrigin = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| auto destinationProtocol = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| auto destinationHost = adopt(JSValueToStringCopy(context, arguments[2], exception)); |
| ASSERT(!*exception); |
| bool allowDestinationSubdomains = JSValueToBoolean(context, arguments[3]); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->addOriginAccessWhitelistEntry(sourceOrigin.get(), destinationProtocol.get(), destinationHost.get(), allowDestinationSubdomains); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef removeOriginAccessWhitelistEntryCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 4) |
| return JSValueMakeUndefined(context); |
| |
| auto sourceOrigin = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| auto destinationProtocol = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| auto destinationHost = adopt(JSValueToStringCopy(context, arguments[2], exception)); |
| ASSERT(!*exception); |
| bool allowDestinationSubdomains = JSValueToBoolean(context, arguments[3]); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->removeOriginAccessWhitelistEntry(sourceOrigin.get(), destinationProtocol.get(), destinationHost.get(), allowDestinationSubdomains); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setScrollbarPolicyCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 2) |
| return JSValueMakeUndefined(context); |
| |
| auto orientation = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| auto policy = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setScrollbarPolicy(orientation.get(), policy.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef addUserScriptCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 3) |
| return JSValueMakeUndefined(context); |
| |
| auto source = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| bool runAtStart = JSValueToBoolean(context, arguments[1]); |
| bool allFrames = JSValueToBoolean(context, arguments[2]); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->addUserScript(source.get(), runAtStart, allFrames); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef addUserStyleSheetCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 2) |
| return JSValueMakeUndefined(context); |
| |
| auto source = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| bool allFrames = JSValueToBoolean(context, arguments[1]); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->addUserStyleSheet(source.get(), allFrames); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setShouldPaintBrokenImageCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setShouldPaintBrokenImage(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef apiTestNewWindowDataLoadBaseURLCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 2) |
| return JSValueMakeUndefined(context); |
| |
| auto utf8Data = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| auto baseURL = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->apiTestNewWindowDataLoadBaseURL(utf8Data.get(), baseURL.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef apiTestGoToCurrentBackForwardItemCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->apiTestGoToCurrentBackForwardItem(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setWebViewEditableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Mac implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setWebViewEditable(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef abortModalCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->abortModal(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef authenticateSessionCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // authenticateSession(url, username, password) |
| if (argumentCount != 3) |
| return JSValueMakeUndefined(context); |
| |
| auto url = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| auto username = adopt(JSValueToStringCopy(context, arguments[1], exception)); |
| ASSERT(!*exception); |
| auto password = adopt(JSValueToStringCopy(context, arguments[2], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->authenticateSession(url.get(), username.get(), password.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setSerializeHTTPLoadsCallback(JSContextRef context, JSObjectRef, JSObjectRef, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| bool serialize = true; |
| if (argumentCount == 1) |
| serialize = JSValueToBoolean(context, arguments[0]); |
| |
| TestRunner::setSerializeHTTPLoads(serialize); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setShouldStayOnPageAfterHandlingBeforeUnloadCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| if (argumentCount == 1) |
| controller->setShouldStayOnPageAfterHandlingBeforeUnload(JSValueToBoolean(context, arguments[0])); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef addChromeInputFieldCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->addChromeInputField(); |
| // the first argument is a callback that is called once the input field has been added |
| if (argumentCount == 1) |
| JSObjectCallAsFunction(context, JSValueToObject(context, arguments[0], 0), thisObject, 0, 0, 0); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef removeChromeInputFieldCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->removeChromeInputField(); |
| // the first argument is a callback that is called once the input field has been added |
| if (argumentCount == 1) |
| JSObjectCallAsFunction(context, JSValueToObject(context, arguments[0], 0), thisObject, 0, 0, 0); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef focusWebViewCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->focusWebView(); |
| // the first argument is a callback that is called once the input field has been added |
| if (argumentCount == 1) |
| JSObjectCallAsFunction(context, JSValueToObject(context, arguments[0], 0), thisObject, 0, 0, 0); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setBackingScaleFactorCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 2) |
| return JSValueMakeUndefined(context); |
| |
| double backingScaleFactor = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setBackingScaleFactor(backingScaleFactor); |
| |
| // The second argument is a callback that is called once the backing scale factor has been set. |
| JSObjectCallAsFunction(context, JSValueToObject(context, arguments[1], 0), thisObject, 0, 0, 0); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef preciseTimeCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| return JSValueMakeNumber(context, WallTime::now().secondsSinceEpoch().seconds()); |
| } |
| |
| static JSValueRef imageCountInGeneralPasteboardCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has mac & windows implementation |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| return JSValueMakeNumber(context, controller->imageCountInGeneralPasteboard()); |
| } |
| |
| static JSValueRef setSpellCheckerLoggingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setSpellCheckerLoggingEnabled(JSValueToBoolean(context, arguments[0])); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setSpellCheckerResultsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto* runner = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| runner->setSpellCheckerResults(context, JSValueToObject(context, arguments[0], nullptr)); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setOpenPanelFilesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount == 1) |
| static_cast<TestRunner*>(JSObjectGetPrivate(thisObject))->setOpenPanelFiles(context, arguments[0]); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef SetOpenPanelFilesMediaIconCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| #if PLATFORM(IOS_FAMILY) |
| if (argumentCount == 1) |
| static_cast<TestRunner*>(JSObjectGetPrivate(thisObject))->setOpenPanelFilesMediaIcon(context, arguments[0]); |
| #endif |
| return JSValueMakeUndefined(context); |
| } |
| |
| // Static Values |
| |
| static JSValueRef getTimeoutCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeNumber(context, controller->timeout()); |
| } |
| |
| static JSValueRef getGlobalFlagCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeBoolean(context, controller->globalFlag()); |
| } |
| |
| static JSValueRef getDidCancelClientRedirect(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeBoolean(context, controller->didCancelClientRedirect()); |
| } |
| |
| static JSValueRef getDatabaseDefaultQuotaCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeNumber(context, controller->databaseDefaultQuota()); |
| } |
| |
| static JSValueRef getDatabaseMaxQuotaCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeNumber(context, controller->databaseMaxQuota()); |
| } |
| |
| static JSValueRef getWebHistoryItemCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| return JSValueMakeNumber(context, controller->webHistoryItemCount()); |
| } |
| |
| static JSValueRef getSecureEventInputIsEnabledCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| #if PLATFORM(MAC) && !PLATFORM(IOS_FAMILY) |
| return JSValueMakeBoolean(context, IsSecureEventInputEnabled()); |
| #else |
| return JSValueMakeBoolean(context, false); |
| #endif |
| } |
| |
| static JSValueRef getTitleTextDirectionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto titleDirection = adopt(JSStringCreateWithUTF8CString(controller->titleTextDirection().c_str())); |
| return JSValueMakeString(context, titleDirection.get()); |
| } |
| |
| static JSValueRef getInspectorTestStubURLCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto url = controller->inspectorTestStubURL(); |
| return JSValueMakeString(context, url.get()); |
| } |
| |
| static bool setGlobalFlagCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setGlobalFlag(JSValueToBoolean(context, value)); |
| return true; |
| } |
| |
| static bool setDatabaseDefaultQuotaCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDatabaseDefaultQuota(JSValueToNumber(context, value, exception)); |
| ASSERT(!*exception); |
| return true; |
| } |
| |
| static bool setDatabaseMaxQuotaCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setDatabaseMaxQuota(JSValueToNumber(context, value, exception)); |
| ASSERT(!*exception); |
| return true; |
| } |
| |
| static JSValueRef ignoreLegacyWebNotificationPermissionRequestsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->ignoreLegacyWebNotificationPermissionRequests(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef simulateLegacyWebNotificationClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| auto title = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| controller->simulateLegacyWebNotificationClick(title.get()); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setTextDirectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount == 1) { |
| auto direction = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setTextDirection(direction.get()); |
| } |
| |
| return JSValueMakeUndefined(context); |
| |
| } |
| |
| static JSValueRef setHasCustomFullScreenBehaviorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount == 1) { |
| bool hasCustomBehavior = JSValueToBoolean(context, arguments[0]); |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setHasCustomFullScreenBehavior(hasCustomBehavior); |
| } |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef setStorageDatabaseIdleIntervalCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount != 1) |
| return JSValueMakeUndefined(context); |
| |
| double interval = JSValueToNumber(context, arguments[0], exception); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setStorageDatabaseIdleInterval(interval); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef closeIdleLocalStorageDatabasesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->closeIdleLocalStorageDatabases(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef grantWebNotificationPermissionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| auto origin = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| controller->grantWebNotificationPermission(origin.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| |
| static JSValueRef denyWebNotificationPermissionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| auto origin = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| controller->denyWebNotificationPermission(origin.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| |
| static JSValueRef removeAllWebNotificationPermissionsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| controller->removeAllWebNotificationPermissions(); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| |
| static JSValueRef simulateWebNotificationClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| // Has Windows implementation |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| |
| controller->simulateWebNotificationClick(arguments[0]); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef forceImmediateCompletionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->forceImmediateCompletion(); |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef failNextNewCodeBlock(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| return JSC::failNextNewCodeBlock(context); |
| } |
| |
| static JSValueRef numberOfDFGCompiles(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| return JSC::numberOfDFGCompiles(context, arguments[0]); |
| } |
| |
| static JSValueRef neverInlineFunction(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| return JSC::setNeverInline(context, arguments[0]); |
| } |
| |
| static JSValueRef accummulateLogsForChannel(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto channel = adopt(JSValueToStringCopy(context, arguments[0], exception)); |
| ASSERT(!*exception); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->setAccummulateLogsForChannel(channel.get()); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static JSValueRef runUIScriptCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
| { |
| if (argumentCount < 1) |
| return JSValueMakeUndefined(context); |
| |
| auto script = argumentCount > 0 ? adopt(JSValueToStringCopy(context, arguments[0], 0)) : JSRetainPtr<JSStringRef>(); |
| JSValueRef callback = argumentCount > 1 ? arguments[1] : JSValueMakeUndefined(context); |
| |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject)); |
| controller->runUIScript(context, script.get(), callback); |
| |
| return JSValueMakeUndefined(context); |
| } |
| |
| static void testRunnerObjectFinalize(JSObjectRef object) |
| { |
| TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(object)); |
| controller->deref(); |
| } |
| |
| // Object Creation |
| |
| void TestRunner::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception) |
| { |
| auto testRunnerStr = adopt(JSStringCreateWithUTF8CString("testRunner")); |
| ref(); |
| |
| JSClassRef classRef = getJSClass(); |
| JSValueRef layoutTestContollerObject = JSObjectMake(context, classRef, this); |
| JSClassRelease(classRef); |
| |
| JSObjectSetProperty(context, windowObject, testRunnerStr.get(), layoutTestContollerObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception); |
| } |
| |
| JSClassRef TestRunner::getJSClass() |
| { |
| static JSStaticValue* staticValues = TestRunner::staticValues(); |
| static JSStaticFunction* staticFunctions = TestRunner::staticFunctions(); |
| static JSClassDefinition classDefinition = { |
| 0, kJSClassAttributeNone, "TestRunner", 0, staticValues, staticFunctions, |
| 0, testRunnerObjectFinalize, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| return JSClassCreate(&classDefinition); |
| } |
| |
| // Constants |
| |
| static JSValueRef getRENDER_TREE_SHOW_ALL_LAYERS(JSContextRef context, JSObjectRef, JSStringRef, JSValueRef*) |
| { |
| return JSValueMakeNumber(context, 1); |
| } |
| |
| static JSValueRef getRENDER_TREE_SHOW_LAYER_NESTING(JSContextRef context, JSObjectRef, JSStringRef, JSValueRef*) |
| { |
| return JSValueMakeNumber(context, 2); |
| } |
| |
| static JSValueRef getRENDER_TREE_SHOW_COMPOSITED_LAYERS(JSContextRef context, JSObjectRef, JSStringRef, JSValueRef*) |
| { |
| return JSValueMakeNumber(context, 4); |
| } |
| |
| static JSValueRef getRENDER_TREE_SHOW_OVERFLOW(JSContextRef context, JSObjectRef, JSStringRef, JSValueRef*) |
| { |
| return JSValueMakeNumber(context, 8); |
| } |
| |
| static JSValueRef getRENDER_TREE_SHOW_SVG_GEOMETRY(JSContextRef context, JSObjectRef, JSStringRef, JSValueRef*) |
| { |
| return JSValueMakeNumber(context, 16); |
| } |
| |
| static JSValueRef getRENDER_TREE_SHOW_LAYER_FRAGMENTS(JSContextRef context, JSObjectRef, JSStringRef, JSValueRef*) |
| { |
| return JSValueMakeNumber(context, 32); |
| } |
| |
| JSStaticValue* TestRunner::staticValues() |
| { |
| static JSStaticValue staticValues[] = { |
| { "didCancelClientRedirect", getDidCancelClientRedirect, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "timeout", getTimeoutCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "globalFlag", getGlobalFlagCallback, setGlobalFlagCallback, kJSPropertyAttributeNone }, |
| { "webHistoryItemCount", getWebHistoryItemCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "secureEventInputIsEnabled", getSecureEventInputIsEnabledCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "titleTextDirection", getTitleTextDirectionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "databaseDefaultQuota", getDatabaseDefaultQuotaCallback, setDatabaseDefaultQuotaCallback, kJSPropertyAttributeNone }, |
| { "databaseMaxQuota", getDatabaseMaxQuotaCallback, setDatabaseMaxQuotaCallback, kJSPropertyAttributeNone }, |
| { "inspectorTestStubURL", getInspectorTestStubURLCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "RENDER_TREE_SHOW_ALL_LAYERS", getRENDER_TREE_SHOW_ALL_LAYERS, 0, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly }, |
| { "RENDER_TREE_SHOW_LAYER_NESTING", getRENDER_TREE_SHOW_LAYER_NESTING, 0, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly }, |
| { "RENDER_TREE_SHOW_COMPOSITED_LAYERS", getRENDER_TREE_SHOW_COMPOSITED_LAYERS, 0, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly }, |
| { "RENDER_TREE_SHOW_OVERFLOW", getRENDER_TREE_SHOW_OVERFLOW, 0, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly }, |
| { "RENDER_TREE_SHOW_SVG_GEOMETRY", getRENDER_TREE_SHOW_SVG_GEOMETRY, 0, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly }, |
| { "RENDER_TREE_SHOW_LAYER_FRAGMENTS", getRENDER_TREE_SHOW_LAYER_FRAGMENTS, 0, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly }, |
| { 0, 0, 0, 0 } |
| }; |
| return staticValues; |
| } |
| |
| JSStaticFunction* TestRunner::staticFunctions() |
| { |
| static JSStaticFunction staticFunctions[] = { |
| { "abortModal", abortModalCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "addDisallowedURL", addDisallowedURLCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "addURLToRedirect", addURLToRedirectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "addUserScript", addUserScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "addUserStyleSheet", addUserStyleSheetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "apiTestNewWindowDataLoadBaseURL", apiTestNewWindowDataLoadBaseURLCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "apiTestGoToCurrentBackForwardItem", apiTestGoToCurrentBackForwardItemCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "applicationCacheDiskUsageForOrigin", applicationCacheDiskUsageForOriginCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "callShouldCloseOnWebView", callShouldCloseOnWebViewCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "clearAllApplicationCaches", clearAllApplicationCachesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "clearAllDatabases", clearAllDatabasesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "clearApplicationCacheForOrigin", clearApplicationCacheForOriginCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "clearBackForwardList", clearBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "clearPersistentUserStyleSheet", clearPersistentUserStyleSheetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "closeWebInspector", closeWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "decodeHostName", decodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "disallowIncreaseForApplicationCacheQuota", disallowIncreaseForApplicationCacheQuotaCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dispatchPendingLoadRequests", dispatchPendingLoadRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "display", displayCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "displayAndTrackRepaints", displayAndTrackRepaintsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpApplicationCacheDelegateCallbacks", dumpApplicationCacheDelegateCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setRenderTreeDumpOptions", setRenderTreeDumpOptionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpAsText", dumpAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpBackForwardList", dumpBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpChildFrameScrollPositions", dumpChildFrameScrollPositionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpChildFramesAsText", dumpChildFramesAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpDOMAsWebArchive", dumpDOMAsWebArchiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpDatabaseCallbacks", dumpDatabaseCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpEditingCallbacks", dumpEditingCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpFrameLoadCallbacks", dumpFrameLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpProgressFinishedCallback", dumpProgressFinishedCallbackCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpUserGestureInFrameLoadCallbacks", dumpUserGestureInFrameLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpResourceLoadCallbacks", dumpResourceLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpResourceResponseMIMETypes", dumpResourceResponseMIMETypesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpSelectionRect", dumpSelectionRectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpSourceAsWebArchive", dumpSourceAsWebArchiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpStatusCallbacks", dumpStatusCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpTitleChanges", dumpTitleChangesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "dumpWillCacheResponse", dumpWillCacheResponseCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "encodeHostName", encodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "evaluateInWebInspector", evaluateInWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "evaluateScriptInIsolatedWorldAndReturnValue", evaluateScriptInIsolatedWorldAndReturnValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "evaluateScriptInIsolatedWorld", evaluateScriptInIsolatedWorldCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "execCommand", execCommandCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "findString", findStringCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "originsWithApplicationCache", originsWithApplicationCacheCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "goBack", goBackCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "ignoreLegacyWebNotificationPermissionRequests", ignoreLegacyWebNotificationPermissionRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "isGeolocationProviderActive", isGeolocationProviderActiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "isCommandEnabled", isCommandEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "keepWebHistory", keepWebHistoryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "numberOfPendingGeolocationPermissionRequests", numberOfPendingGeolocationPermissionRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "notifyDone", notifyDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "overridePreference", overridePreferenceCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "pathToLocalResource", pathToLocalResourceCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "printToPDF", dumpAsPDFCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueBackNavigation", queueBackNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueForwardNavigation", queueForwardNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueLoad", queueLoadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueLoadHTMLString", queueLoadHTMLStringCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueLoadingScript", queueLoadingScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueNonLoadingScript", queueNonLoadingScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "queueReload", queueReloadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "removeAllVisitedLinks", removeAllVisitedLinksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "removeOriginAccessWhitelistEntry", removeOriginAccessWhitelistEntryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "repaintSweepHorizontally", repaintSweepHorizontallyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "resetPageVisibility", resetPageVisibilityCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAcceptsEditing", setAcceptsEditingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAllowUniversalAccessFromFileURLs", setAllowUniversalAccessFromFileURLsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAllowFileAccessFromFileURLs", setAllowFileAccessFromFileURLsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setNeedsStorageAccessFromFileURLsQuirk", setNeedsStorageAccessFromFileURLsQuirkCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAllowsAnySSLCertificate", setAllowsAnySSLCertificateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAlwaysAcceptCookies", setAlwaysAcceptCookiesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setOnlyAcceptFirstPartyCookies", setOnlyAcceptFirstPartyCookiesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAppCacheMaximumSize", setAppCacheMaximumSizeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAudioResult", setAudioResultCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAuthenticationPassword", setAuthenticationPasswordCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAuthenticationUsername", setAuthenticationUsernameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAuthorAndUserStylesEnabled", setAuthorAndUserStylesEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setCacheModel", setCacheModelCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setCallCloseOnWebViews", setCallCloseOnWebViewsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setCanOpenWindows", setCanOpenWindowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setCloseRemainingWindowsWhenComplete", setCloseRemainingWindowsWhenCompleteCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setCustomPolicyDelegate", setCustomPolicyDelegateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setDatabaseQuota", setDatabaseQuotaCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setDefersLoading", setDefersLoadingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setUseDeferredFrameLoading", setUseDeferredFrameLoadingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setDomainRelaxationForbiddenForURLScheme", setDomainRelaxationForbiddenForURLSchemeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setGeolocationPermission", setGeolocationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setRejectsProtectionSpaceAndContinueForAuthenticationChallenges", setRejectsProtectionSpaceAndContinueForAuthenticationChallengesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setHandlesAuthenticationChallenges", setHandlesAuthenticationChallengesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setIconDatabaseEnabled", setIconDatabaseEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setAutomaticLinkDetectionEnabled", setAutomaticLinkDetectionEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setMainFrameIsFirstResponder", setMainFrameIsFirstResponderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setMockDeviceOrientation", setMockDeviceOrientationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setMockGeolocationPositionUnavailableError", setMockGeolocationPositionUnavailableErrorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setMockGeolocationPosition", setMockGeolocationPositionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setNewWindowsCopyBackForwardList", setNewWindowsCopyBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPageVisibility", setPageVisibilityCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPOSIXLocale", setPOSIXLocaleCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPersistentUserStyleSheetLocation", setPersistentUserStyleSheetLocationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPopupBlockingEnabled", setPopupBlockingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPluginsEnabled", setPluginsEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPrinting", setPrintingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPrivateBrowsingEnabled_DEPRECATED", setPrivateBrowsingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setShouldSwapToEphemeralSessionOnNextNavigation", setShouldSwapToEphemeralSessionOnNextNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setShouldSwapToDefaultSessionOnNextNavigation", setShouldSwapToDefaultSessionOnNextNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setSerializeHTTPLoads", setSerializeHTTPLoadsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setSpatialNavigationEnabled", setSpatialNavigationEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setStopProvisionalFrameLoads", setStopProvisionalFrameLoadsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setTabKeyCyclesThroughElements", setTabKeyCyclesThroughElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| #if PLATFORM(IOS_FAMILY) |
| { "setTelephoneNumberParsingEnabled", setTelephoneNumberParsingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setPagePaused", setPagePausedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| #endif |
| { "setUserStyleSheetEnabled", setUserStyleSheetEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setUserStyleSheetLocation", setUserStyleSheetLocationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setValueForUser", setValueForUserCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setWebViewEditable", setWebViewEditableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setWillSendRequestClearHeader", setWillSendRequestClearHeaderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setWillSendRequestReturnsNull", setWillSendRequestReturnsNullCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setWillSendRequestReturnsNullOnRedirect", setWillSendRequestReturnsNullOnRedirectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setWindowIsKey", setWindowIsKeyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setViewSize", setViewSizeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setJavaScriptCanAccessClipboard", setJavaScriptCanAccessClipboardCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setXSSAuditorEnabled", setXSSAuditorEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "showWebInspector", showWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "simulateLegacyWebNotificationClick", simulateLegacyWebNotificationClickCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "testOnscreen", testOnscreenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "testRepaint", testRepaintCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "waitForPolicyDelegate", waitForPolicyDelegateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "waitUntilDone", waitUntilDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "windowCount", windowCountCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "addOriginAccessWhitelistEntry", addOriginAccessWhitelistEntryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setScrollbarPolicy", setScrollbarPolicyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "authenticateSession", authenticateSessionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setShouldPaintBrokenImage", setShouldPaintBrokenImageCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setTextDirection", setTextDirectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setShouldStayOnPageAfterHandlingBeforeUnload", setShouldStayOnPageAfterHandlingBeforeUnloadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "addChromeInputField", addChromeInputFieldCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "removeChromeInputField", removeChromeInputFieldCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "focusWebView", focusWebViewCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setBackingScaleFactor", setBackingScaleFactorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "preciseTime", preciseTimeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setHasCustomFullScreenBehavior", setHasCustomFullScreenBehaviorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setStorageDatabaseIdleInterval", setStorageDatabaseIdleIntervalCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "closeIdleLocalStorageDatabases", closeIdleLocalStorageDatabasesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "grantWebNotificationPermission", grantWebNotificationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "denyWebNotificationPermission", denyWebNotificationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "removeAllWebNotificationPermissions", removeAllWebNotificationPermissionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "simulateWebNotificationClick", simulateWebNotificationClickCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "failNextNewCodeBlock", failNextNewCodeBlock, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "numberOfDFGCompiles", numberOfDFGCompiles, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "neverInlineFunction", neverInlineFunction, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "accummulateLogsForChannel", accummulateLogsForChannel, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "runUIScript", runUIScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "imageCountInGeneralPasteboard", imageCountInGeneralPasteboardCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setSpellCheckerLoggingEnabled", setSpellCheckerLoggingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setSpellCheckerResults", setSpellCheckerResultsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setOpenPanelFiles", setOpenPanelFilesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "setOpenPanelFilesMediaIcon", SetOpenPanelFilesMediaIconCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { "forceImmediateCompletion", forceImmediateCompletionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, |
| { 0, 0, 0 } |
| }; |
| |
| return staticFunctions; |
| } |
| |
| void TestRunner::queueLoadHTMLString(JSStringRef content, JSStringRef baseURL) |
| { |
| DRT::WorkQueue::singleton().queue(new LoadHTMLStringItem(content, baseURL)); |
| } |
| |
| void TestRunner::queueLoadAlternateHTMLString(JSStringRef content, JSStringRef baseURL, JSStringRef unreachableURL) |
| { |
| DRT::WorkQueue::singleton().queue(new LoadHTMLStringItem(content, baseURL, unreachableURL)); |
| } |
| |
| void TestRunner::queueBackNavigation(int howFarBack) |
| { |
| DRT::WorkQueue::singleton().queue(new BackItem(howFarBack)); |
| } |
| |
| void TestRunner::queueForwardNavigation(int howFarForward) |
| { |
| DRT::WorkQueue::singleton().queue(new ForwardItem(howFarForward)); |
| } |
| |
| void TestRunner::queueLoadingScript(JSStringRef script) |
| { |
| DRT::WorkQueue::singleton().queue(new LoadingScriptItem(script)); |
| } |
| |
| void TestRunner::queueNonLoadingScript(JSStringRef script) |
| { |
| DRT::WorkQueue::singleton().queue(new NonLoadingScriptItem(script)); |
| } |
| |
| void TestRunner::queueReload() |
| { |
| DRT::WorkQueue::singleton().queue(new ReloadItem); |
| } |
| |
| void TestRunner::ignoreLegacyWebNotificationPermissionRequests() |
| { |
| m_areLegacyWebNotificationPermissionRequestsIgnored = false; |
| } |
| |
| void TestRunner::waitToDumpWatchdogTimerFired() |
| { |
| const char* message = "FAIL: Timed out waiting for notifyDone to be called\n"; |
| fprintf(testResult, "%s", message); |
| |
| auto accumulatedLogs = getAndResetAccumulatedLogs(); |
| if (!accumulatedLogs.isEmpty()) { |
| const char* message = "Logs accumulated during test run:\n"; |
| fprintf(testResult, "%s%s\n", message, accumulatedLogs.utf8().data()); |
| } |
| |
| notifyDone(); |
| } |
| |
| void TestRunner::setGeolocationPermissionCommon(bool allow) |
| { |
| m_isGeolocationPermissionSet = true; |
| m_geolocationPermission = allow; |
| } |
| |
| void TestRunner::setPOSIXLocale(JSStringRef locale) |
| { |
| char localeBuf[32]; |
| JSStringGetUTF8CString(locale, localeBuf, sizeof(localeBuf)); |
| setlocale(LC_ALL, localeBuf); |
| } |
| |
| void TestRunner::addURLToRedirect(std::string origin, std::string destination) |
| { |
| m_URLsToRedirect[origin] = destination; |
| } |
| |
| const char* TestRunner::redirectionDestinationForURL(const char* origin) |
| { |
| if (!origin) |
| return nullptr; |
| |
| auto iterator = m_URLsToRedirect.find(origin); |
| if (iterator == m_URLsToRedirect.end()) |
| return nullptr; |
| |
| return iterator->second.data(); |
| } |
| |
| void TestRunner::setRenderTreeDumpOptions(unsigned options) |
| { |
| m_renderTreeDumpOptions = options; |
| } |
| |
| void TestRunner::setShouldPaintBrokenImage(bool shouldPaintBrokenImage) |
| { |
| m_shouldPaintBrokenImage = shouldPaintBrokenImage; |
| } |
| |
| void TestRunner::setAccummulateLogsForChannel(JSStringRef channel) |
| { |
| size_t maxLength = JSStringGetMaximumUTF8CStringSize(channel); |
| auto buffer = makeUniqueArray<char>(maxLength + 1); |
| JSStringGetUTF8CString(channel, buffer.get(), maxLength + 1); |
| |
| WebCoreTestSupport::setLogChannelToAccumulate({ buffer.get() }); |
| } |
| |
| typedef WTF::HashMap<unsigned, JSValueRef> CallbackMap; |
| static CallbackMap& callbackMap() |
| { |
| static CallbackMap& map = *new CallbackMap; |
| return map; |
| } |
| |
| void TestRunner::cacheTestRunnerCallback(unsigned index, JSValueRef callback) |
| { |
| if (!callback) |
| return; |
| |
| if (callbackMap().contains(index)) { |
| fprintf(stderr, "FAIL: Tried to install a second TestRunner callback for the same event (id %d)\n", index); |
| return; |
| } |
| |
| JSContextRef context = mainFrameJSContext(); |
| JSValueProtect(context, callback); |
| callbackMap().add(index, callback); |
| } |
| |
| void TestRunner::callTestRunnerCallback(unsigned index, size_t argumentCount, const JSValueRef arguments[]) |
| { |
| if (!callbackMap().contains(index)) |
| return; |
| |
| JSContextRef context = mainFrameJSContext(); |
| if (JSObjectRef callback = JSValueToObject(context, callbackMap().take(index), 0)) { |
| JSObjectCallAsFunction(context, callback, JSContextGetGlobalObject(context), argumentCount, arguments, 0); |
| JSValueUnprotect(context, callback); |
| } |
| } |
| |
| void TestRunner::clearTestRunnerCallbacks() |
| { |
| JSContextRef context = mainFrameJSContext(); |
| |
| for (auto& iter : callbackMap()) { |
| if (JSObjectRef callback = JSValueToObject(context, iter.value, 0)) |
| JSValueUnprotect(context, callback); |
| } |
| |
| callbackMap().clear(); |
| } |
| |
| enum { |
| FirstUIScriptCallbackID = 100 |
| }; |
| |
| static unsigned nextUIScriptCallbackID() |
| { |
| static unsigned callbackID = FirstUIScriptCallbackID; |
| return callbackID++; |
| } |
| |
| void TestRunner::runUIScript(JSContextRef context, JSStringRef script, JSValueRef callback) |
| { |
| m_pendingUIScriptInvocationData = nullptr; |
| |
| unsigned callbackID = nextUIScriptCallbackID(); |
| cacheTestRunnerCallback(callbackID, callback); |
| |
| if (!m_UIScriptContext) |
| m_UIScriptContext = makeUniqueWithoutFastMallocCheck<WTR::UIScriptContext>(*this); |
| |
| String scriptString(reinterpret_cast<const UChar*>(JSStringGetCharactersPtr(script)), JSStringGetLength(script)); |
| m_UIScriptContext->runUIScript(scriptString, callbackID); |
| } |
| |
| void TestRunner::callUIScriptCallback(unsigned callbackID, JSStringRef result) |
| { |
| JSRetainPtr<JSStringRef> protectedResult(result); |
| #if !PLATFORM(IOS_FAMILY) |
| RunLoop::main().dispatch([protectedThis = makeRef(*this), callbackID, protectedResult]() mutable { |
| JSContextRef context = protectedThis->mainFrameJSContext(); |
| JSValueRef resultValue = JSValueMakeString(context, protectedResult.get()); |
| protectedThis->callTestRunnerCallback(callbackID, 1, &resultValue); |
| }); |
| #else |
| WebThreadRun( |
| makeBlockPtr([protectedThis = makeRef(*this), callbackID, protectedResult] { |
| JSContextRef context = protectedThis->mainFrameJSContext(); |
| JSValueRef resultValue = JSValueMakeString(context, protectedResult.get()); |
| protectedThis->callTestRunnerCallback(callbackID, 1, &resultValue); |
| }).get() |
| ); |
| #endif |
| } |
| |
| void TestRunner::uiScriptDidComplete(const String& result, unsigned callbackID) |
| { |
| auto stringRef = adopt(JSStringCreateWithUTF8CString(result.utf8().data())); |
| callUIScriptCallback(callbackID, stringRef.get()); |
| } |
| |
| void TestRunner::setAllowsAnySSLCertificate(bool allowsAnySSLCertificate) |
| { |
| WebCoreTestSupport::setAllowsAnySSLCertificate(allowsAnySSLCertificate); |
| } |
| |
| void TestRunner::setOpenPanelFiles(JSContextRef context, JSValueRef filesValue) |
| { |
| if (!JSValueIsArray(context, filesValue)) |
| return; |
| |
| JSObjectRef files = JSValueToObject(context, filesValue, nullptr); |
| static auto lengthProperty = adopt(JSStringCreateWithUTF8CString("length")); |
| JSValueRef filesLengthValue = JSObjectGetProperty(context, files, lengthProperty.get(), nullptr); |
| if (!JSValueIsNumber(context, filesLengthValue)) |
| return; |
| |
| m_openPanelFiles.clear(); |
| auto filesLength = static_cast<size_t>(JSValueToNumber(context, filesLengthValue, nullptr)); |
| for (size_t i = 0; i < filesLength; ++i) { |
| JSValueRef fileValue = JSObjectGetPropertyAtIndex(context, files, i, nullptr); |
| if (!JSValueIsString(context, fileValue)) |
| continue; |
| |
| auto file = adopt(JSValueToStringCopy(context, fileValue, nullptr)); |
| size_t fileBufferSize = JSStringGetMaximumUTF8CStringSize(file.get()) + 1; |
| auto fileBuffer = makeUniqueArray<char>(fileBufferSize); |
| JSStringGetUTF8CString(file.get(), fileBuffer.get(), fileBufferSize); |
| |
| m_openPanelFiles.push_back(fileBuffer.get()); |
| } |
| } |
| |
| #if PLATFORM(IOS_FAMILY) |
| void TestRunner::setOpenPanelFilesMediaIcon(JSContextRef context, JSValueRef mediaIcon) |
| { |
| // FIXME (123058): Use a JSC API to get buffer contents once such is exposed. |
| JSC::VM& vm = toJS(context)->vm(); |
| JSC::JSLockHolder lock(vm); |
| |
| JSC::JSArrayBufferView* jsBufferView = JSC::jsDynamicCast<JSC::JSArrayBufferView*>(vm, toJS(toJS(context), mediaIcon)); |
| ASSERT(jsBufferView); |
| RefPtr<JSC::ArrayBufferView> bufferView = jsBufferView->unsharedImpl(); |
| const char* buffer = static_cast<const char*>(bufferView->baseAddress()); |
| std::vector<char> mediaIconData(buffer, buffer + bufferView->byteLength()); |
| |
| m_openPanelFilesMediaIcon = mediaIconData; |
| } |
| #endif |
| |
| void TestRunner::cleanup() |
| { |
| clearTestRunnerCallbacks(); |
| } |
| |
| void TestRunner::willNavigate() |
| { |
| if (m_shouldSwapToEphemeralSessionOnNextNavigation || m_shouldSwapToDefaultSessionOnNextNavigation) { |
| ASSERT(m_shouldSwapToEphemeralSessionOnNextNavigation != m_shouldSwapToDefaultSessionOnNextNavigation); |
| setPrivateBrowsingEnabled(m_shouldSwapToEphemeralSessionOnNextNavigation); |
| m_shouldSwapToEphemeralSessionOnNextNavigation = false; |
| m_shouldSwapToDefaultSessionOnNextNavigation = false; |
| } |
| } |