diff options
| author | Ben Murdoch <benm@google.com> | 2011-05-05 14:36:32 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2011-05-10 15:38:30 +0100 |
| commit | f05b935882198ccf7d81675736e3aeb089c5113a (patch) | |
| tree | 4ea0ca838d9ef1b15cf17ddb3928efb427c7e5a1 /Tools/WebKitTestRunner | |
| parent | 60fbdcc62bced8db2cb1fd233cc4d1e4ea17db1b (diff) | |
| download | external_webkit-f05b935882198ccf7d81675736e3aeb089c5113a.zip external_webkit-f05b935882198ccf7d81675736e3aeb089c5113a.tar.gz external_webkit-f05b935882198ccf7d81675736e3aeb089c5113a.tar.bz2 | |
Merge WebKit at r74534: Initial merge by git.
Change-Id: I6ccd1154fa1b19c2ec2a66878eb675738735f1eb
Diffstat (limited to 'Tools/WebKitTestRunner')
83 files changed, 7610 insertions, 0 deletions
diff --git a/Tools/WebKitTestRunner/Configurations/Base.xcconfig b/Tools/WebKitTestRunner/Configurations/Base.xcconfig new file mode 100644 index 0000000..feb7c5e --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/Base.xcconfig @@ -0,0 +1,72 @@ +// Copyright (C) 2010 Apple Inc. All rights reserved. +// +// 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. +// +// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR +// 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. + +HEADER_SEARCH_PATHS = $(WEBCORE_PRIVATE_HEADERS_DIR)/ForwardingHeaders; +FRAMEWORK_SEARCH_PATHS = $(SYSTEM_LIBRARY_DIR)/Frameworks/Quartz.framework/Frameworks $(SYSTEM_LIBRARY_DIR)/Frameworks/ApplicationServices.framework/Frameworks $(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks; +GCC_PREPROCESSOR_DEFINITIONS = ENABLE_DASHBOARD_SUPPORT WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST; +DEBUG_INFORMATION_FORMAT = dwarf +PREBINDING = NO +GCC_C_LANGUAGE_STANDARD = gnu99 +GCC_PRECOMPILE_PREFIX_HEADER = YES +GCC_TREAT_WARNINGS_AS_ERRORS = YES +GCC_WARN_UNUSED_FUNCTION = YES +GCC_WARN_UNUSED_VARIABLE = YES +GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO +WARNING_CFLAGS = -Wall -W -Wno-unused-parameter +LINKER_DISPLAYS_MANGLED_NAMES = YES; +VALID_ARCHS = i386 x86_64; + + +TARGET_MAC_OS_X_VERSION_MAJOR = $(MAC_OS_X_VERSION_MAJOR); + + +// Use GCC 4.2 with Xcode 3.1, which includes GCC 4.2 but defaults to GCC 4.0. +// Note that Xcode versions as new as 3.1.2 use XCODE_VERSION_ACTUAL for the minor version +// number. Newer versions of Xcode use XCODE_VERSION_MINOR for the minor version, and +// XCODE_VERSION_ACTUAL for the full version number. +TARGET_GCC_VERSION = $(TARGET_GCC_VERSION_$(TARGET_MAC_OS_X_VERSION_MAJOR)); +TARGET_GCC_VERSION_ = $(TARGET_GCC_VERSION_1040); +TARGET_GCC_VERSION_1040 = GCC_40; +TARGET_GCC_VERSION_1050 = $(TARGET_GCC_VERSION_1050_$(XCODE_VERSION_MINOR)); +TARGET_GCC_VERSION_1050_ = $(TARGET_GCC_VERSION_1050_$(XCODE_VERSION_ACTUAL)); +TARGET_GCC_VERSION_1050_0310 = GCC_42; +TARGET_GCC_VERSION_1050_0320 = GCC_42; +TARGET_GCC_VERSION_1060 = GCC_42; +TARGET_GCC_VERSION_1070 = LLVM_GCC_42; + +GCC_VERSION = $(GCC_VERSION_$(TARGET_GCC_VERSION)); +GCC_VERSION_GCC_40 = 4.0; +GCC_VERSION_GCC_42 = 4.2; +GCC_VERSION_LLVM_GCC_42 = com.apple.compilers.llvmgcc42; + +// If the target Mac OS X version does not match the current Mac OS X version then we'll want to build using the target version's SDK. +SDKROOT = $(SDKROOT_$(MAC_OS_X_VERSION_MAJOR)_$(TARGET_MAC_OS_X_VERSION_MAJOR)); +SDKROOT_1050_1040 = macosx10.4; +SDKROOT_1060_1040 = macosx10.4; +SDKROOT_1060_1050 = macosx10.5; +SDKROOT_1070_1040 = macosx10.4; +SDKROOT_1070_1050 = macosx10.5; +SDKROOT_1070_1060 = macosx10.6; + +WEBKIT_UMBRELLA_FRAMEWORKS_DIR = $(NEXT_ROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/WebKit.framework/Versions/A/Frameworks; +WEBCORE_PRIVATE_HEADERS_DIR = $(WEBKIT_UMBRELLA_FRAMEWORKS_DIR)/WebCore.framework/PrivateHeaders; diff --git a/Tools/WebKitTestRunner/Configurations/DebugRelease.xcconfig b/Tools/WebKitTestRunner/Configurations/DebugRelease.xcconfig new file mode 100644 index 0000000..41600b1 --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/DebugRelease.xcconfig @@ -0,0 +1,42 @@ +// Copyright (C) 2010 Apple Inc. All rights reserved. +// +// 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. +// +// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR +// 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 "Base.xcconfig" + +ARCHS = $(ARCHS_$(TARGET_MAC_OS_X_VERSION_MAJOR)); +ARCHS_ = $(ARCHS_1040); +ARCHS_1040 = $(NATIVE_ARCH); +ARCHS_1050 = $(NATIVE_ARCH); +ARCHS_1060 = $(ARCHS_STANDARD_32_64_BIT); +ARCHS_1070 = $(ARCHS_STANDARD_32_64_BIT); + +ONLY_ACTIVE_ARCH = YES; + +MACOSX_DEPLOYMENT_TARGET = $(MACOSX_DEPLOYMENT_TARGET_$(TARGET_MAC_OS_X_VERSION_MAJOR)) +MACOSX_DEPLOYMENT_TARGET_ = 10.4; +MACOSX_DEPLOYMENT_TARGET_1040 = 10.4; +MACOSX_DEPLOYMENT_TARGET_1050 = 10.5; +MACOSX_DEPLOYMENT_TARGET_1060 = 10.6; +MACOSX_DEPLOYMENT_TARGET_1070 = 10.7; + +WEBKIT_UMBRELLA_FRAMEWORKS_DIR = $(BUILT_PRODUCTS_DIR); diff --git a/Tools/WebKitTestRunner/Configurations/InjectedBundle.xcconfig b/Tools/WebKitTestRunner/Configurations/InjectedBundle.xcconfig new file mode 100644 index 0000000..dcf4be0 --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/InjectedBundle.xcconfig @@ -0,0 +1,24 @@ +// Copyright (C) 2010 Apple Inc. All rights reserved. +// +// 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. +// +// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR +// 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. + +PRODUCT_NAME = WebKitTestRunnerInjectedBundle diff --git a/Tools/WebKitTestRunner/Configurations/InjectedBundleCFLite.vsprops b/Tools/WebKitTestRunner/Configurations/InjectedBundleCFLite.vsprops new file mode 100644 index 0000000..094599f --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/InjectedBundleCFLite.vsprops @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="InjectedBundleCFLite" + > + <Tool + Name="VCLinkerTool" + AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WebKit$(WebKitDLLConfigSuffix).lib CFLite$(LibraryConfigSuffix).lib" + OutputFile="$(OutDir)\$(ProjectName)$(WebKitConfigSuffix).dll" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/Configurations/InjectedBundleCommon.vsprops b/Tools/WebKitTestRunner/Configurations/InjectedBundleCommon.vsprops new file mode 100644 index 0000000..540fc7a --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/InjectedBundleCommon.vsprops @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="InjectedBundleCommon" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(ProjectDir)\..";"$(ProjectDir)\..\InjectedBundle\";"$(ProjectDir)\..\InjectedBundle\Bindings";"$(WebKitOutputDir)\Include";"$(WebKitOutputDir)\Include\private";"$(WebKitOutputDir)\Include\WebCore\ForwardingHeaders";"$(WebKitLibrariesDir)\include";"$(WebKitOutputDir)\obj\InjectedBundle\DerivedSources\"" + ForcedIncludeFiles="WebKitTestRunnerPrefix.h" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/Configurations/InjectedBundleCoreFoundation.vsprops b/Tools/WebKitTestRunner/Configurations/InjectedBundleCoreFoundation.vsprops new file mode 100644 index 0000000..d2addc6 --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/InjectedBundleCoreFoundation.vsprops @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="InjectedBundleCoreFoundation" + > + <Tool + Name="VCLinkerTool" + AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WebKit$(WebKitDLLConfigSuffix).lib CoreFoundation$(LibraryConfigSuffix).lib" + OutputFile="$(OutDir)\$(ProjectName)$(WebKitConfigSuffix).dll" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/Configurations/WebKitTestRunner.xcconfig b/Tools/WebKitTestRunner/Configurations/WebKitTestRunner.xcconfig new file mode 100644 index 0000000..e90edba --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/WebKitTestRunner.xcconfig @@ -0,0 +1,26 @@ +// Copyright (C) 2010 Apple Inc. All rights reserved. +// +// 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. +// +// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR +// 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. + +PRODUCT_NAME = WebKitTestRunner +GCC_ENABLE_OBJC_EXCEPTIONS = YES +GCC_PREFIX_HEADER = WebKitTestRunnerPrefix.h diff --git a/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCFLite.vsprops b/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCFLite.vsprops new file mode 100644 index 0000000..a739f1d --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCFLite.vsprops @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="WebKitTestRunnerCFLite" + > + <Tool + Name="VCLinkerTool" + AdditionalDependencies="CFLite$(LibraryConfigSuffix).lib" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCommon.vsprops b/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCommon.vsprops new file mode 100644 index 0000000..4233b55 --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCommon.vsprops @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="WebKitTestRunnerCommon" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(ProjectDir)\..";"$(WebKitOutputDir)\Include";"$(WebKitOutputDir)\Include\private";"$(WebKitOutputDir)\Include\WebCore\ForwardingHeaders";"$(WebKitLibrariesDir)\Include"" + PreprocessorDefinitions="__WIN32__;_CONSOLE" + DisableSpecificWarnings="4146" + ForcedIncludeFiles="WebKitTestRunnerPrefix.h" + /> + <Tool + Name="VCLinkerTool" + AdditionalOptions="/NXCOMPAT" + AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WebKit$(WebKitDLLConfigSuffix).lib shlwapi.lib" + SubSystem="1" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCoreFoundation.vsprops b/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCoreFoundation.vsprops new file mode 100644 index 0000000..11e031a --- /dev/null +++ b/Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCoreFoundation.vsprops @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="WebKitTestRunnerCoreFoundation" + > + <Tool + Name="VCLinkerTool" + AdditionalDependencies="CoreFoundation$(LibraryConfigSuffix).lib" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/DerivedSources.make b/Tools/WebKitTestRunner/DerivedSources.make new file mode 100644 index 0000000..c308a8a --- /dev/null +++ b/Tools/WebKitTestRunner/DerivedSources.make @@ -0,0 +1,51 @@ +# Copyright (C) 2010 Apple Inc. All rights reserved. +# +# 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. +# +# THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + +VPATH = \ + $(WebKitTestRunner)/InjectedBundle/Bindings \ +# + +INTERFACES = \ + EventSendingController \ + GCController \ + LayoutTestController \ +# + +SCRIPTS = \ + $(WebCoreScripts)/CodeGenerator.pm \ + $(WebKitTestRunner)/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm \ + $(WebCoreScripts)/IDLParser.pm \ + $(WebCoreScripts)/IDLStructure.pm \ + $(WebCoreScripts)/generate-bindings.pl \ +# + +.PHONY : all + +JS%.h JS%.cpp : %.idl $(SCRIPTS) + @echo Generating bindings for $*... + @perl -I $(WebCoreScripts) -I $(WebKitTestRunner)/InjectedBundle/Bindings $(WebCoreScripts)/generate-bindings.pl --defines "" --include InjectedBundle/Bindings --outputDir . --generator TestRunner $< + +all : \ + $(INTERFACES:%=JS%.h) \ + $(INTERFACES:%=JS%.cpp) \ +# diff --git a/Tools/WebKitTestRunner/DerivedSources.pro b/Tools/WebKitTestRunner/DerivedSources.pro new file mode 100644 index 0000000..96f2a90 --- /dev/null +++ b/Tools/WebKitTestRunner/DerivedSources.pro @@ -0,0 +1,57 @@ +# DerivedSources - qmake build info + +CONFIG -= debug_and_release + +TEMPLATE = lib +TARGET = dummy + +QMAKE_EXTRA_TARGETS += generated_files + +GENERATED_SOURCES_DIR = generated + +IDL_BINDINGS += \ + InjectedBundle/Bindings/EventSendingController.idl \ + InjectedBundle/Bindings/GCController.idl \ + InjectedBundle/Bindings/LayoutTestController.idl \ + +defineTest(addExtraCompiler) { + eval($${1}.CONFIG = target_predeps no_link) + eval($${1}.variable_out =) + eval($${1}.dependency_type = TYPE_C) + + wkScript = $$eval($${1}.wkScript) + eval($${1}.depends += $$wkScript) + + export($${1}.CONFIG) + export($${1}.variable_out) + export($${1}.dependency_type) + export($${1}.depends) + + QMAKE_EXTRA_COMPILERS += $$1 + generated_files.depends += compiler_$${1}_make_all + export(QMAKE_EXTRA_COMPILERS) + export(generated_files.depends) + return(true) +} + +SRC_ROOT_DIR = $$replace(PWD, /Tools/WebKitTestRunner, /) + +# Make sure forwarded headers needed by this project are present +fwheader_generator.commands = perl $${SRC_ROOT_DIR}/WebKit2/Scripts/generate-forwarding-headers.pl $${SRC_ROOT_DIR}/Tools/WebKitTestRunner $${OUTPUT_DIR}/include qt +fwheader_generator.depends = $${SRC_ROOT_DIR}/WebKit2/Scripts/generate-forwarding-headers.pl +generated_files.depends += fwheader_generator +QMAKE_EXTRA_TARGETS += fwheader_generator + +# GENERATOR 1: IDL compiler +idl.output = $${GENERATED_SOURCES_DIR}/JS${QMAKE_FILE_BASE}.cpp +idl.input = IDL_BINDINGS +idl.wkScript = $$PWD/../../WebCore/bindings/scripts/generate-bindings.pl +idl.commands = perl -I$$PWD/../../WebCore/bindings/scripts -I$$PWD/InjectedBundle/Bindings $$idl.wkScript --defines \"\" --generator TestRunner --include $$PWD/InjectedBundle/Bindings --outputDir $$GENERATED_SOURCES_DIR --preprocessor \"$${QMAKE_MOC} -E\" ${QMAKE_FILE_NAME} +idl.depends = $$PWD/../../WebCore/bindings/scripts/CodeGenerator.pm \ + $$PWD/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm \ + $$PWD/../../WebCore/bindings/scripts/IDLParser.pm \ + $$PWD/../../WebCore/bindings/scripts/IDLStructure.pm \ + $$PWD/../../WebCore/bindings/scripts/InFilesParser.pm \ + $$PWD/../../WebCore/bindings/scripts/generate-bindings.pl +addExtraCompiler(idl) + diff --git a/Tools/WebKitTestRunner/InjectedBundle-Info.plist b/Tools/WebKitTestRunner/InjectedBundle-Info.plist new file mode 100644 index 0000000..a21fbde --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle-Info.plist @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>com.apple.WebKitTestRunner.InjectedBundle</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> +</dict> +</plist> diff --git a/Tools/WebKitTestRunner/InjectedBundle/ActivateFonts.h b/Tools/WebKitTestRunner/InjectedBundle/ActivateFonts.h new file mode 100644 index 0000000..5ee1276 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/ActivateFonts.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef ActivateFonts_h +#define ActivateFonts_h + +namespace WTR { + +void activateFonts(); + +} // namespace WTR + +#endif // ActivateFonts_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm b/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm new file mode 100644 index 0000000..0de2fd0 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm @@ -0,0 +1,530 @@ +# Copyright (C) 2010 Apple Inc. All rights reserved. +# +# 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. +# +# THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + +use strict; +use warnings; +use File::Spec; + +package CodeGeneratorTestRunner; + +sub new +{ + my ($class, $codeGenerator, $outputDir) = @_; + + my $reference = { + codeGenerator => $codeGenerator, + outputDir => $outputDir, + }; + + bless($reference, $class); + return $reference; +} + +sub GenerateModule +{ +} + +sub GenerateInterface +{ + my ($self, $interface, $defines) = @_; + + foreach my $file ($self->_generateHeaderFile($interface), $self->_generateImplementationFile($interface)) { + open(FILE, ">", File::Spec->catfile($$self{outputDir}, $$file{name})) or die "Failed to open $$file{name} for writing: $!"; + print FILE @{$$file{contents}}; + close(FILE) or die "Failed to close $$file{name} after writing: $!"; + } +} + +sub finish +{ +} + +sub _className +{ + my ($idlType) = @_; + + return "JS" . _implementationClassName($idlType); +} + +sub _classRefGetter +{ + my ($self, $idlType) = @_; + return $$self{codeGenerator}->WK_lcfirst(_implementationClassName($idlType)) . "Class"; +} + +sub _fileHeaderString +{ + my ($filename) = @_; + + # FIXME: We should pull header out of the IDL file to get the copyright + # year(s) right. + return <<EOF; +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ +EOF +} + +sub _generateHeaderFile +{ + my ($self, $interface) = @_; + + my @contents = (); + + my $idlType = $interface->name; + my $className = _className($idlType); + my $implementationClassName = _implementationClassName($idlType); + my $filename = $className . ".h"; + + push(@contents, _fileHeaderString($filename)); + + my $parentClassName = _parentClassName($interface); + + push(@contents, <<EOF); + +#ifndef ${className}_h +#define ${className}_h + +#include "${parentClassName}.h" +EOF + push(@contents, <<EOF); + +namespace WTR { + +class ${implementationClassName}; + +class ${className} : public ${parentClassName} { +public: + static JSClassRef @{[$self->_classRefGetter($idlType)]}(); + +private: + static const JSStaticFunction* staticFunctions(); + static const JSStaticValue* staticValues(); +EOF + + if (my @functions = @{$interface->functions}) { + push(@contents, "\n // Functions\n\n"); + foreach my $function (@functions) { + push(@contents, " static JSValueRef @{[$function->signature->name]}(JSContextRef, JSObjectRef, JSObjectRef, size_t, const JSValueRef[], JSValueRef*);\n"); + } + } + + if (my @attributes = @{$interface->attributes}) { + push(@contents, "\n // Attributes\n\n"); + foreach my $attribute (@attributes) { + push(@contents, " static JSValueRef @{[$self->_getterName($attribute)]}(JSContextRef, JSObjectRef, JSStringRef, JSValueRef*);\n"); + push(@contents, " static bool @{[$self->_setterName($attribute)]}(JSContextRef, JSObjectRef, JSStringRef, JSValueRef, JSValueRef*);\n") unless $attribute->type =~ /^readonly/; + } + } + + push(@contents, <<EOF); +}; + +${implementationClassName}* to${implementationClassName}(JSContextRef, JSValueRef); + +} // namespace WTR + +#endif // ${className}_h +EOF + + return { name => $filename, contents => \@contents }; +} + +sub _generateImplementationFile +{ + my ($self, $interface) = @_; + + my @contentsPrefix = (); + my %contentsIncludes = (); + my @contents = (); + + my $idlType = $interface->name; + my $className = _className($idlType); + my $implementationClassName = _implementationClassName($idlType); + my $filename = $className . ".cpp"; + + push(@contentsPrefix, _fileHeaderString($filename)); + + my $classRefGetter = $self->_classRefGetter($idlType); + my $parentClassName = _parentClassName($interface); + + $contentsIncludes{"${className}.h"} = 1; + $contentsIncludes{"${implementationClassName}.h"} = 1; + + push(@contentsPrefix, <<EOF); + +EOF + + push(@contents, <<EOF); +#include <JavaScriptCore/JSRetainPtr.h> +#include <wtf/GetPtr.h> + +namespace WTR { + +${implementationClassName}* to${implementationClassName}(JSContextRef context, JSValueRef value) +{ + if (!context || !value || !${className}::${classRefGetter}() || !JSValueIsObjectOfClass(context, value, ${className}::${classRefGetter}())) + return 0; + return static_cast<${implementationClassName}*>(JSWrapper::unwrap(context, value)); +} + +JSClassRef ${className}::${classRefGetter}() +{ + static JSClassRef jsClass; + if (!jsClass) { + JSClassDefinition definition = kJSClassDefinitionEmpty; + definition.className = "${idlType}"; + definition.parentClass = @{[$self->_parentClassRefGetterExpression($interface)]}; + definition.staticValues = staticValues(); + definition.staticFunctions = staticFunctions(); +EOF + + push(@contents, " definition.initialize = initialize;\n") unless _parentInterface($interface); + push(@contents, " definition.finalize = finalize;\n") unless _parentInterface($interface); + + push(@contents, <<EOF); + jsClass = JSClassCreate(&definition); + } + return jsClass; +} + +EOF + + push(@contents, $self->_staticFunctionsGetterImplementation($interface), "\n"); + push(@contents, $self->_staticValuesGetterImplementation($interface)); + + if (my @functions = @{$interface->functions}) { + push(@contents, "\n// Functions\n"); + + foreach my $function (@functions) { + push(@contents, <<EOF); + +JSValueRef ${className}::@{[$function->signature->name]}(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + ${implementationClassName}* impl = to${implementationClassName}(context, thisObject); + if (!impl) + return JSValueMakeUndefined(context); + +EOF + my $functionCall; + if ($function->signature->extendedAttributes->{"CustomArgumentHandling"}) { + $functionCall = "impl->" . $function->signature->name . "(context, argumentCount, arguments, exception)"; + } else { + my @parameters = (); + my @specifiedParameters = @{$function->parameters}; + + $self->_includeHeaders(\%contentsIncludes, $function->signature->type, $function->signature); + + foreach my $i (0..$#specifiedParameters) { + my $parameter = $specifiedParameters[$i]; + + $self->_includeHeaders(\%contentsIncludes, $idlType, $parameter); + + push(@contents, " " . $self->_platformTypeVariableDeclaration($parameter, $parameter->name, "arguments[$i]", "argumentCount > $i") . "\n"); + + push(@parameters, $self->_parameterExpression($parameter)); + } + + $functionCall = "impl->" . $function->signature->name . "(" . join(", ", @parameters) . ")"; + } + + push(@contents, " ${functionCall};\n\n") if $function->signature->type eq "void"; + push(@contents, " return " . $self->_returnExpression($function->signature, $functionCall) . ";\n}\n"); + } + } + + if (my @attributes = @{$interface->attributes}) { + push(@contents, "\n// Attributes\n"); + foreach my $attribute (@attributes) { + $self->_includeHeaders(\%contentsIncludes, $attribute->signature->type, $attribute->signature); + + my $getterName = $self->_getterName($attribute); + my $getterExpression = "impl->${getterName}()"; + + push(@contents, <<EOF); + +JSValueRef ${className}::${getterName}(JSContextRef context, JSObjectRef object, JSStringRef, JSValueRef* exception) +{ + ${implementationClassName}* impl = to${implementationClassName}(context, object); + if (!impl) + return JSValueMakeUndefined(context); + + return @{[$self->_returnExpression($attribute->signature, $getterExpression)]}; +} +EOF + + unless ($attribute->type =~ /^readonly/) { + push(@contents, <<EOF); + +bool ${className}::@{[$self->_setterName($attribute)]}(JSContextRef context, JSObjectRef object, JSStringRef, JSValueRef value, JSValueRef* exception) +{ + ${implementationClassName}* impl = to${implementationClassName}(context, object); + if (!impl) + return false; + +EOF + + my $platformValue = $self->_platformTypeConstructor($attribute->signature, "value"); + + push(@contents, <<EOF); + impl->@{[$self->_setterName($attribute)]}(${platformValue}); + + return true; +} +EOF + } + } + } + + push(@contents, <<EOF); + +} // namespace WTR + +EOF + + unshift(@contents, map { "#include \"$_\"\n" } sort keys(%contentsIncludes)); + unshift(@contents, @contentsPrefix); + + return { name => $filename, contents => \@contents }; +} + +sub _getterName +{ + my ($self, $attribute) = @_; + + my $signature = $attribute->signature; + my $name = $signature->name; + + return $name; +} + +sub _includeHeaders +{ + my ($self, $headers, $idlType, $signature) = @_; + + return unless defined $idlType; + return if $idlType eq "boolean"; + return if $idlType eq "object"; + return if $$self{codeGenerator}->IsNonPointerType($idlType); + return if $$self{codeGenerator}->IsStringType($idlType); + + $$headers{_className($idlType) . ".h"} = 1; + $$headers{_implementationClassName($idlType) . ".h"} = 1; +} + +sub _implementationClassName +{ + my ($idlType) = @_; + + return $idlType; +} + +sub _parentClassName +{ + my ($interface) = @_; + + my $parentInterface = _parentInterface($interface); + return $parentInterface ? _className($parentInterface) : "JSWrapper"; +} + +sub _parentClassRefGetterExpression +{ + my ($self, $interface) = @_; + + my $parentInterface = _parentInterface($interface); + return $parentInterface ? $self->_classRefGetter($parentInterface) . "()" : "0"; +} + +sub _parentInterface +{ + my ($interface) = @_; + return $interface->parents->[0]; +} + +sub _platformType +{ + my ($self, $idlType, $signature) = @_; + + return undef unless defined $idlType; + + return "bool" if $idlType eq "boolean"; + return "JSValueRef" if $idlType eq "object"; + return "JSRetainPtr<JSStringRef>" if $$self{codeGenerator}->IsStringType($idlType); + return "double" if $$self{codeGenerator}->IsNonPointerType($idlType); + return _implementationClassName($idlType); +} + +sub _platformTypeConstructor +{ + my ($self, $signature, $argumentName) = @_; + + my $idlType = $signature->type; + + return "JSValueToBoolean(context, $argumentName)" if $idlType eq "boolean"; + return "$argumentName" if $idlType eq "object"; + return "JSRetainPtr<JSStringRef>(Adopt, JSValueToStringCopy(context, $argumentName, 0))" if $$self{codeGenerator}->IsStringType($idlType); + return "JSValueToNumber(context, $argumentName, 0)" if $$self{codeGenerator}->IsNonPointerType($idlType); + return "to" . _implementationClassName($idlType) . "(context, $argumentName)"; +} + +sub _platformTypeVariableDeclaration +{ + my ($self, $signature, $variableName, $argumentName, $condition) = @_; + + my $platformType = $self->_platformType($signature->type, $signature); + my $constructor = $self->_platformTypeConstructor($signature, $argumentName); + + my %nonPointerTypes = ( + "bool" => 1, + "double" => 1, + "JSRetainPtr<JSStringRef>" => 1, + "JSValueRef" => 1, + ); + + my $nullValue = "0"; + $nullValue = "$platformType()" if defined $nonPointerTypes{$platformType} && $platformType ne "double"; + + $platformType .= "*" unless defined $nonPointerTypes{$platformType}; + + return "$platformType $variableName = $condition && $constructor;" if $condition && $platformType eq "bool"; + return "$platformType $variableName = $condition ? $constructor : $nullValue;" if $condition; + return "$platformType $variableName = $constructor;"; +} + +sub _returnExpression +{ + my ($self, $signature, $expression) = @_; + + my $returnIDLType = $signature->type; + + return "JSValueMakeUndefined(context)" if $returnIDLType eq "void"; + return "JSValueMakeBoolean(context, ${expression})" if $returnIDLType eq "boolean"; + return "${expression}" if $returnIDLType eq "object"; + return "JSValueMakeNumber(context, ${expression})" if $$self{codeGenerator}->IsNonPointerType($returnIDLType); + return "JSValueMakeStringOrNull(context, ${expression}.get())" if $$self{codeGenerator}->IsStringType($returnIDLType); + return "toJS(context, WTF::getPtr(${expression}))"; +} + +sub _parameterExpression +{ + my ($self, $parameter) = @_; + + my $idlType = $parameter->type; + my $name = $parameter->name; + + return "${name}.get()" if $$self{codeGenerator}->IsStringType($idlType); + return $name; +} + +sub _setterName +{ + my ($self, $attribute) = @_; + + my $name = $attribute->signature->name; + + return "set" . $$self{codeGenerator}->WK_ucfirst($name); +} + +sub _staticFunctionsGetterImplementation +{ + my ($self, $interface) = @_; + + my $mapFunction = sub { + my $name = $_->signature->name; + my @attributes = qw(kJSPropertyAttributeDontDelete kJSPropertyAttributeReadOnly); + push(@attributes, "kJSPropertyAttributeDontEnum") if $_->signature->extendedAttributes->{"DontEnum"}; + + return "{ \"$name\", $name, " . join(" | ", @attributes) . " }"; + }; + + return $self->_staticFunctionsOrValuesGetterImplementation($interface, "function", "{ 0, 0, 0 }", $mapFunction, $interface->functions); +} + +sub _staticFunctionsOrValuesGetterImplementation +{ + my ($self, $interface, $functionOrValue, $arrayTerminator, $mapFunction, $functionsOrAttributes) = @_; + + my $className = _className($interface->name); + my $uppercaseFunctionOrValue = $$self{codeGenerator}->WK_ucfirst($functionOrValue); + + my $result = <<EOF; +const JSStatic${uppercaseFunctionOrValue}* ${className}::static${uppercaseFunctionOrValue}s() +{ +EOF + + my @initializers = map(&$mapFunction, @{$functionsOrAttributes}); + return $result . " return 0;\n}\n" unless @initializers; + + $result .= <<EOF + static const JSStatic${uppercaseFunctionOrValue} ${functionOrValue}s[] = { + @{[join(",\n ", @initializers)]}, + ${arrayTerminator} + }; + return ${functionOrValue}s; +} +EOF +} + +sub _staticValuesGetterImplementation +{ + my ($self, $interface) = @_; + + my $mapFunction = sub { + return if $_->signature->extendedAttributes->{"NoImplementation"}; + + my $attributeName = $_->signature->name; + my $attributeIsReadonly = $_->type =~ /^readonly/; + my $getterName = $self->_getterName($_); + my $setterName = $attributeIsReadonly ? "0" : $self->_setterName($_); + my @attributes = qw(kJSPropertyAttributeDontDelete); + push(@attributes, "kJSPropertyAttributeReadOnly") if $attributeIsReadonly; + push(@attributes, "kJSPropertyAttributeDontEnum") if $_->signature->extendedAttributes->{"DontEnum"}; + + return "{ \"$attributeName\", $getterName, $setterName, " . join(" | ", @attributes) . " }"; + }; + + return $self->_staticFunctionsOrValuesGetterImplementation($interface, "value", "{ 0, 0, 0, 0 }", $mapFunction, $interface->attributes); +} + +1; diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl new file mode 100644 index 0000000..1e47772 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +module WTR { + + interface EventSendingController { + [CustomArgumentHandling] void mouseDown(); + [CustomArgumentHandling] void mouseUp(); + [CustomArgumentHandling] void mouseMoveTo(); + [CustomArgumentHandling] void keyDown(); + [CustomArgumentHandling] void contextClick(); // CustomArgumentHandling only to throw exception while not implemented. + [CustomArgumentHandling] void leapForward(/*in unsigned long delay*/); // CustomArgumentHandling only to throw exception while not implemented. + + // Zoom functions. + void textZoomIn(); + void textZoomOut(); + void zoomPageIn(); + void zoomPageOut(); + }; + +} diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/GCController.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/GCController.idl new file mode 100644 index 0000000..eb3ddee --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/GCController.idl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +module WTR { + + interface GCController { + void collect(); + void collectOnAlternateThread(in boolean waitUntilDone); + unsigned long long getJSObjectCount(); + }; + +} diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrappable.h b/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrappable.h new file mode 100644 index 0000000..5ec7197 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrappable.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef JSWrappable_h +#define JSWrappable_h + +#include <JavaScriptCore/JavaScript.h> +#include <wtf/RefCounted.h> + +namespace WTR { + +class JSWrappable : public RefCounted<JSWrappable> { +public: + virtual ~JSWrappable() { } + virtual JSClassRef wrapperClass() = 0; +}; + +inline JSValueRef JSValueMakeStringOrNull(JSContextRef context, JSStringRef stringOrNull) +{ + return stringOrNull ? JSValueMakeString(context, stringOrNull) : JSValueMakeNull(context); +} + +} // namespace WTR + +#endif // JSWrappable_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.cpp b/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.cpp new file mode 100644 index 0000000..a62cb2e --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "JSWrapper.h" + +#include <JavaScriptCore/JSContextRefPrivate.h> + +namespace WTR { + +JSValueRef JSWrapper::wrap(JSContextRef context, JSWrappable* object) +{ + ASSERT_ARG(context, context); + + if (!object) + return JSValueMakeNull(context); + + JSClassRef objectClass = object->wrapperClass(); + ASSERT(objectClass); + JSObjectRef wrapperObject = JSObjectMake(context, objectClass, object); + ASSERT(wrapperObject); + + return wrapperObject; +} + +JSWrappable* JSWrapper::unwrap(JSContextRef context, JSValueRef value) +{ + ASSERT_ARG(context, context); + ASSERT_ARG(value, value); + if (!context || !value) + return 0; + return static_cast<JSWrappable*>(JSObjectGetPrivate(JSValueToObject(context, value, 0))); +} + +static JSWrappable* unwrapObject(JSObjectRef object) +{ + JSWrappable* wrappable = static_cast<JSWrappable*>(JSObjectGetPrivate(object)); + ASSERT(wrappable); + return wrappable; +} + +void JSWrapper::initialize(JSContextRef ctx, JSObjectRef object) +{ + JSWrappable* wrappable = unwrapObject(object); + if (!wrappable) + return; + wrappable->ref(); +} + +void JSWrapper::finalize(JSObjectRef object) +{ + JSWrappable* wrappable = unwrapObject(object); + if (!wrappable) + return; + wrappable->deref(); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.h b/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.h new file mode 100644 index 0000000..d885801 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef JSWrapper_h +#define JSWrapper_h + +#include "JSWrappable.h" +#include <JavaScriptCore/JSRetainPtr.h> + +namespace WTR { + +// FIXME: If necessary, we can do wrapper caching here. +class JSWrapper { +public: + static JSValueRef wrap(JSContextRef context, JSWrappable* object); + static JSWrappable* unwrap(JSContextRef context, JSValueRef value); + + static void initialize(JSContextRef, JSObjectRef); + static void finalize(JSObjectRef); +}; + +inline JSValueRef toJS(JSContextRef context, JSWrappable* impl) +{ + return JSWrapper::wrap(context, impl); +} + +inline void setProperty(JSContextRef context, JSObjectRef object, const char* propertyName, JSWrappable* value, JSPropertyAttributes attributes, JSValueRef* exception) +{ + JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSStringCreateWithUTF8CString(propertyName)); + JSObjectSetProperty(context, object, propertyNameString.get(), JSWrapper::wrap(context, value), attributes, exception); +} + +} // namespace WTR + +#endif // JSWrapper_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl new file mode 100644 index 0000000..acc2f47 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +module WTR { + + interface LayoutTestController { + // The basics. + void dumpAsText(); + void dumpChildFramesAsText(); + void waitUntilDone(); + void notifyDone(); + + // Other dumping. + void dumpBackForwardList(); + void dumpChildFrameScrollPositions(); + void dumpEditingCallbacks(); + void dumpSelectionRect(); + void dumpStatusCallbacks(); + void dumpTitleChanges(); + + // Special options. + void keepWebHistory(); + void setAcceptsEditing(in boolean value); + void setCanOpenWindows(in boolean value); + void setCloseRemainingWindowsWhenComplete(in boolean value); + void setXSSAuditorEnabled(in boolean value); + + // Special DOM functions. + void clearBackForwardList(); + object computedStyleIncludingVisitedInfo(in object element); + DOMString counterValueForElementById(in DOMString elementId); + void execCommand(in DOMString name, in DOMString argument); + boolean isCommandEnabled(in DOMString name); + DOMString markerTextForListItem(in object element); + unsigned long windowCount(); + + // Repaint testing. + void testRepaint(); + void repaintSweepHorizontally(); + void display(); + + // Animation testing. + int numberOfActiveAnimations(); + boolean pauseAnimationAtTimeOnElementWithId(in DOMString animationName, in double time, in DOMString elementId); + void suspendAnimations(); + void resumeAnimations(); + + // UserContent testing. + void addUserScript(in DOMString source, in boolean runAtStart, in boolean allFrames); + void addUserStyleSheet(in DOMString source, in boolean allFrames); + + // Compositing testing. + DOMString layerTreeAsText(); + + // Text search testing. + boolean findString(in DOMString target, in object optionsArray); + }; + +} diff --git a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp new file mode 100644 index 0000000..73de45b --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "EventSendingController.h" + +#include "InjectedBundle.h" +#include "InjectedBundlePage.h" +#include "JSEventSendingController.h" +#include <WebKit2/WKBundlePage.h> +#include <WebKit2/WKBundlePagePrivate.h> +#include <WebKit2/WKBundlePrivate.h> + +namespace WTR { + +static const float ZoomMultiplierRatio = 1.2f; + +PassRefPtr<EventSendingController> EventSendingController::create() +{ + return adoptRef(new EventSendingController); +} + +EventSendingController::EventSendingController() +{ +} + +EventSendingController::~EventSendingController() +{ +} + +JSClassRef EventSendingController::wrapperClass() +{ + return JSEventSendingController::eventSendingControllerClass(); +} + +static void setExceptionForString(JSContextRef context, JSValueRef* exception, const char* string) +{ + JSRetainPtr<JSStringRef> exceptionString(Adopt, JSStringCreateWithUTF8CString(string)); + *exception = JSValueMakeString(context, exceptionString.get()); +} + +void EventSendingController::mouseDown(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + setExceptionForString(context, exception, "EventSender.mouseDown is not yet supported."); +} + +void EventSendingController::mouseUp(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + setExceptionForString(context, exception, "EventSender.mouseUp is not yet supported."); +} + +void EventSendingController::mouseMoveTo(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + setExceptionForString(context, exception, "EventSender.mouseMoveTo is not yet supported."); +} + +void EventSendingController::keyDown(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + setExceptionForString(context, exception, "EventSender.keyDown is not yet supported."); +} + +void EventSendingController::contextClick(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + setExceptionForString(context, exception, "EventSender.contextClick is not yet supported."); +} + +void EventSendingController::leapForward(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + setExceptionForString(context, exception, "EventSender.leapForward is not yet supported."); +} + +void EventSendingController::textZoomIn() +{ + // Ensure page zoom is reset. + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetTextZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); +} + +void EventSendingController::textZoomOut() +{ + // Ensure page zoom is reset. + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetTextZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); +} + +void EventSendingController::zoomPageIn() +{ + // Ensure text zoom is reset. + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetPageZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); +} + +void EventSendingController::zoomPageOut() +{ + // Ensure text zoom is reset. + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetPageZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); +} + +// Object Creation + +void EventSendingController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception) +{ + setProperty(context, windowObject, "eventSender", this, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h new file mode 100644 index 0000000..400f60d --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef EventSendingController_h +#define EventSendingController_h + +#include "JSWrappable.h" +#include <wtf/PassRefPtr.h> + +namespace WTR { + +class EventSendingController : public JSWrappable { +public: + static PassRefPtr<EventSendingController> create(); + virtual ~EventSendingController(); + + void makeWindowObject(JSContextRef, JSObjectRef windowObject, JSValueRef* exception); + + // JSWrappable + virtual JSClassRef wrapperClass(); + + void mouseDown(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + void mouseUp(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + void mouseMoveTo(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + void keyDown(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + void contextClick(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + void leapForward(JSContextRef context, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + + // Zoom functions. + void textZoomIn(); + void textZoomOut(); + void zoomPageIn(); + void zoomPageOut(); + +private: + EventSendingController(); +}; + +} // namespace WTR + +#endif // EventSendingController_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/GCController.cpp b/Tools/WebKitTestRunner/InjectedBundle/GCController.cpp new file mode 100644 index 0000000..0eba2df --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/GCController.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "GCController.h" + +#include "InjectedBundle.h" +#include "JSGCController.h" +#include <WebKit2/WKBundlePrivate.h> + +namespace WTR { + +PassRefPtr<GCController> GCController::create() +{ + return adoptRef(new GCController); +} + +GCController::GCController() +{ +} + +GCController::~GCController() +{ +} + +JSClassRef GCController::wrapperClass() +{ + return JSGCController::gCControllerClass(); +} + +void GCController::collect() +{ + WKBundleGarbageCollectJavaScriptObjects(InjectedBundle::shared().bundle()); +} + +void GCController::collectOnAlternateThread(bool waitUntilDone) +{ + WKBundleGarbageCollectJavaScriptObjectsOnAlternateThreadForDebugging(InjectedBundle::shared().bundle(), waitUntilDone); +} + +size_t GCController::getJSObjectCount() +{ + return WKBundleGetJavaScriptObjectsCount(InjectedBundle::shared().bundle()); +} + +// Object Creation + +void GCController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception) +{ + setProperty(context, windowObject, "GCController", this, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/GCController.h b/Tools/WebKitTestRunner/InjectedBundle/GCController.h new file mode 100644 index 0000000..760fbb1 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/GCController.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef GCController_h +#define GCController_h + +#include "JSWrappable.h" +#include <wtf/PassRefPtr.h> + +namespace WTR { + +class GCController : public JSWrappable { +public: + static PassRefPtr<GCController> create(); + virtual ~GCController(); + + void makeWindowObject(JSContextRef, JSObjectRef windowObject, JSValueRef* exception); + + // JSWrappable + virtual JSClassRef wrapperClass(); + + void collect(); + void collectOnAlternateThread(bool waitUntilDone); + size_t getJSObjectCount(); + +private: + GCController(); +}; + +} // namespace WTR + +#endif // GCController_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp new file mode 100644 index 0000000..49d9db6 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "InjectedBundle.h" + +#include "ActivateFonts.h" +#include "InjectedBundlePage.h" +#include "StringFunctions.h" +#include <WebKit2/WKBundle.h> +#include <WebKit2/WKBundlePage.h> +#include <WebKit2/WKBundlePagePrivate.h> +#include <WebKit2/WKBundlePrivate.h> +#include <WebKit2/WKRetainPtr.h> +#include <WebKit2/WebKit2.h> +#include <wtf/PassOwnPtr.h> +#include <wtf/Vector.h> + +namespace WTR { + +InjectedBundle& InjectedBundle::shared() +{ + static InjectedBundle& shared = *new InjectedBundle; + return shared; +} + +InjectedBundle::InjectedBundle() + : m_bundle(0) + , m_state(Idle) +{ +} + +void InjectedBundle::didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) +{ + static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->didCreatePage(page); +} + +void InjectedBundle::willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) +{ + static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->willDestroyPage(page); +} + +void InjectedBundle::didInitializePageGroup(WKBundleRef bundle, WKBundlePageGroupRef pageGroup, const void* clientInfo) +{ + static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->didInitializePageGroup(pageGroup); +} + +void InjectedBundle::didReceiveMessage(WKBundleRef bundle, WKStringRef messageName, WKTypeRef messageBody, const void *clientInfo) +{ + static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->didReceiveMessage(messageName, messageBody); +} + +void InjectedBundle::initialize(WKBundleRef bundle) +{ + m_bundle = bundle; + + WKBundleClient client = { + 0, + this, + didCreatePage, + willDestroyPage, + didInitializePageGroup, + didReceiveMessage + }; + WKBundleSetClient(m_bundle, &client); + + activateFonts(); + WKBundleActivateMacFontAscentHack(m_bundle); +} + +void InjectedBundle::didCreatePage(WKBundlePageRef page) +{ + m_pages.append(adoptPtr(new InjectedBundlePage(page))); +} + +void InjectedBundle::willDestroyPage(WKBundlePageRef page) +{ + size_t size = m_pages.size(); + for (size_t i = 0; i < size; ++i) { + if (m_pages[i]->page() == page) { + m_pages.remove(i); + break; + } + } +} + +void InjectedBundle::didInitializePageGroup(WKBundlePageGroupRef pageGroup) +{ + m_pageGroup = pageGroup; +} + +InjectedBundlePage* InjectedBundle::page() const +{ + // It might be better to have the UI process send over a reference to the main + // page instead of just assuming it's the first one. + return m_pages[0].get(); +} + +void InjectedBundle::didReceiveMessage(WKStringRef messageName, WKTypeRef messageBody) +{ + if (WKStringIsEqualToUTF8CString(messageName, "BeginTest")) { + ASSERT(!messageBody); + + WKRetainPtr<WKStringRef> ackMessageName(AdoptWK, WKStringCreateWithUTF8CString("Ack")); + WKRetainPtr<WKStringRef> ackMessageBody(AdoptWK, WKStringCreateWithUTF8CString("BeginTest")); + WKBundlePostMessage(m_bundle, ackMessageName.get(), ackMessageBody.get()); + + beginTesting(); + return; + } + + WKRetainPtr<WKStringRef> errorMessageName(AdoptWK, WKStringCreateWithUTF8CString("Error")); + WKRetainPtr<WKStringRef> errorMessageBody(AdoptWK, WKStringCreateWithUTF8CString("Unknown")); + WKBundlePostMessage(m_bundle, errorMessageName.get(), errorMessageBody.get()); +} + +void InjectedBundle::beginTesting() +{ + m_state = Testing; + + m_outputStream.str(""); + + m_layoutTestController = LayoutTestController::create(); + m_gcController = GCController::create(); + m_eventSendingController = EventSendingController::create(); + + WKBundleSetShouldTrackVisitedLinks(m_bundle, false); + WKBundleRemoveAllVisitedLinks(m_bundle); + + WKBundleRemoveAllUserContent(m_bundle, m_pageGroup); + + page()->reset(); +} + +void InjectedBundle::done() +{ + m_state = Stopping; + + page()->stopLoading(); + + WKRetainPtr<WKStringRef> doneMessageName(AdoptWK, WKStringCreateWithUTF8CString("Done")); + WKRetainPtr<WKStringRef> doneMessageBody(AdoptWK, WKStringCreateWithUTF8CString(m_outputStream.str().c_str())); + + WKBundlePostMessage(m_bundle, doneMessageName.get(), doneMessageBody.get()); + + m_state = Idle; +} + +void InjectedBundle::closeOtherPages() +{ + Vector<WKBundlePageRef> pagesToClose; + size_t size = m_pages.size(); + for (size_t i = 1; i < size; ++i) + pagesToClose.append(m_pages[i]->page()); + size = pagesToClose.size(); + for (size_t i = 0; i < size; ++i) + WKBundlePageClose(pagesToClose[i]); +} + +void InjectedBundle::dumpBackForwardListsForAllPages() +{ + size_t size = m_pages.size(); + for (size_t i = 0; i < size; ++i) + m_pages[i]->dumpBackForwardList(); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h new file mode 100644 index 0000000..c1d8b37 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef InjectedBundle_h +#define InjectedBundle_h + +#include "EventSendingController.h" +#include "GCController.h" +#include "LayoutTestController.h" +#include <WebKit2/WKBase.h> +#include <wtf/OwnPtr.h> +#include <wtf/RefPtr.h> +#include <wtf/Vector.h> + +#include <sstream> + +namespace WTR { + +class InjectedBundlePage; + +class InjectedBundle { +public: + static InjectedBundle& shared(); + + // Initialize the InjectedBundle. + void initialize(WKBundleRef); + + WKBundleRef bundle() const { return m_bundle; } + WKBundlePageGroupRef pageGroup() const { return m_pageGroup; } + + LayoutTestController* layoutTestController() { return m_layoutTestController.get(); } + GCController* gcController() { return m_gcController.get(); } + EventSendingController* eventSendingController() { return m_eventSendingController.get(); } + + InjectedBundlePage* page() const; + size_t pageCount() const { return m_pages.size(); } + void closeOtherPages(); + + void dumpBackForwardListsForAllPages(); + + void done(); + std::ostringstream& os() { return m_outputStream; } + + bool isTestRunning() { return m_state == Testing; } + +private: + InjectedBundle(); + ~InjectedBundle(); + + static void didCreatePage(WKBundleRef, WKBundlePageRef, const void* clientInfo); + static void willDestroyPage(WKBundleRef, WKBundlePageRef, const void* clientInfo); + static void didInitializePageGroup(WKBundleRef, WKBundlePageGroupRef, const void* clientInfo); + static void didReceiveMessage(WKBundleRef, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo); + + void didCreatePage(WKBundlePageRef); + void willDestroyPage(WKBundlePageRef); + void didInitializePageGroup(WKBundlePageGroupRef); + void didReceiveMessage(WKStringRef messageName, WKTypeRef messageBody); + + void beginTesting(); + + WKBundleRef m_bundle; + WKBundlePageGroupRef m_pageGroup; + Vector<OwnPtr<InjectedBundlePage> > m_pages; + + RefPtr<LayoutTestController> m_layoutTestController; + RefPtr<GCController> m_gcController; + RefPtr<EventSendingController> m_eventSendingController; + + std::ostringstream m_outputStream; + + enum State { + Idle, + Testing, + Stopping + }; + State m_state; +}; + +} // namespace WTR + +#endif // InjectedBundle_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp new file mode 100644 index 0000000..c4cf892 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "InjectedBundle.h" +#include <WebKit2/WKBundleInitialize.h> + +#if defined(WIN32) || defined(_WIN32) +extern "C" __declspec(dllexport) +#else +extern "C" +#endif +void WKBundleInitialize(WKBundleRef bundle, WKTypeRef initializationUserData) +{ + WTR::InjectedBundle::shared().initialize(bundle); +} diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp new file mode 100644 index 0000000..da79b19 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp @@ -0,0 +1,901 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "InjectedBundlePage.h" + +#include "InjectedBundle.h" +#include "StringFunctions.h" +#include <cmath> +#include <JavaScriptCore/JSRetainPtr.h> +#include <WebKit2/WKArray.h> +#include <WebKit2/WKBundle.h> +#include <WebKit2/WKBundleBackForwardList.h> +#include <WebKit2/WKBundleBackForwardListItem.h> +#include <WebKit2/WKBundleFrame.h> +#include <WebKit2/WKBundleFramePrivate.h> +#include <WebKit2/WKBundlePagePrivate.h> + +using namespace std; + +namespace WTR { + +template<typename T> static inline WKRetainPtr<T> adoptWK(T item) +{ + return WKRetainPtr<T>(AdoptWK, item); +} + +static bool hasPrefix(const string& searchString, const string& prefix) +{ + return searchString.length() >= prefix.length() && searchString.substr(0, prefix.length()) == prefix; +} + +static JSValueRef propertyValue(JSContextRef context, JSObjectRef object, const char* propertyName) +{ + if (!object) + return 0; + JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSStringCreateWithUTF8CString(propertyName)); + return JSObjectGetProperty(context, object, propertyNameString.get(), 0); +} + +static double propertyValueDouble(JSContextRef context, JSObjectRef object, const char* propertyName) +{ + JSValueRef value = propertyValue(context, object, propertyName); + if (!value) + return 0; + return JSValueToNumber(context, value, 0); +} + +static int propertyValueInt(JSContextRef context, JSObjectRef object, const char* propertyName) +{ + return static_cast<int>(propertyValueDouble(context, object, propertyName)); +} + +static double numericWindowPropertyValue(WKBundleFrameRef frame, const char* propertyName) +{ + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); + return propertyValueDouble(context, JSContextGetGlobalObject(context), propertyName); +} + +static string dumpPath(JSGlobalContextRef context, JSObjectRef nodeValue) +{ + JSValueRef nodeNameValue = propertyValue(context, nodeValue, "nodeName"); + JSRetainPtr<JSStringRef> jsStringNodeName(Adopt, JSValueToStringCopy(context, nodeNameValue, 0)); + WKRetainPtr<WKStringRef> nodeName = toWK(jsStringNodeName); + + JSValueRef parentNode = propertyValue(context, nodeValue, "parentNode"); + + ostringstream out; + out << nodeName; + + if (parentNode && JSValueIsObject(context, parentNode)) + out << " > " << dumpPath(context, (JSObjectRef)parentNode); + + return out.str(); +} + +static string dumpPath(WKBundlePageRef page, WKBundleScriptWorldRef world, WKBundleNodeHandleRef node) +{ + if (!node) + return "(null)"; + + WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContextForWorld(frame, world); + JSValueRef nodeValue = WKBundleFrameGetJavaScriptWrapperForNodeForWorld(frame, node, world); + ASSERT(JSValueIsObject(context, nodeValue)); + JSObjectRef nodeObject = (JSObjectRef)nodeValue; + + return dumpPath(context, nodeObject); +} + +static string toStr(WKBundlePageRef page, WKBundleScriptWorldRef world, WKBundleRangeHandleRef rangeRef) +{ + if (!rangeRef) + return "(null)"; + + WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContextForWorld(frame, world); + JSValueRef rangeValue = WKBundleFrameGetJavaScriptWrapperForRangeForWorld(frame, rangeRef, world); + ASSERT(JSValueIsObject(context, rangeValue)); + JSObjectRef rangeObject = (JSObjectRef)rangeValue; + + JSValueRef startNodeValue = propertyValue(context, rangeObject, "startContainer"); + ASSERT(JSValueIsObject(context, startNodeValue)); + JSObjectRef startNodeObject = (JSObjectRef)startNodeValue; + + JSValueRef endNodeValue = propertyValue(context, rangeObject, "endContainer"); + ASSERT(JSValueIsObject(context, endNodeValue)); + JSObjectRef endNodeObject = (JSObjectRef)endNodeValue; + + int startOffset = propertyValueInt(context, rangeObject, "startOffset"); + int endOffset = propertyValueInt(context, rangeObject, "endOffset"); + + ostringstream out; + out << "range from " << startOffset << " of " << dumpPath(context, startNodeObject) << " to " << endOffset << " of " << dumpPath(context, endNodeObject); + return out.str(); +} + +static ostream& operator<<(ostream& out, WKBundleCSSStyleDeclarationRef style) +{ + // DumpRenderTree calls -[DOMCSSStyleDeclaration description], which just dumps class name and object address. + // No existing tests actually hit this code path at the time of this writing, because WebCore doesn't call + // the editing client if the styling operation source is CommandFromDOM or CommandFromDOMWithUserInterface. + out << "<DOMCSSStyleDeclaration ADDRESS>"; + return out; +} + +static ostream& operator<<(ostream& out, WKBundleFrameRef frame) +{ + WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame)); + if (WKBundleFrameIsMainFrame(frame)) { + if (!WKStringIsEmpty(name.get())) + out << "main frame \"" << name << "\""; + else + out << "main frame"; + } else { + if (!WKStringIsEmpty(name.get())) + out << "frame \"" << name << "\""; + else + out << "frame (anonymous)"; + } + + return out; +} + +InjectedBundlePage::InjectedBundlePage(WKBundlePageRef page) + : m_page(page) + , m_world(AdoptWK, WKBundleScriptWorldCreateWorld()) + , m_isLoading(false) +{ + WKBundlePageLoaderClient loaderClient = { + 0, + this, + didStartProvisionalLoadForFrame, + didReceiveServerRedirectForProvisionalLoadForFrame, + didFailProvisionalLoadWithErrorForFrame, + didCommitLoadForFrame, + didFinishDocumentLoadForFrame, + didFinishLoadForFrame, + didFailLoadWithErrorForFrame, + didSameDocumentNavigationForFrame, + didReceiveTitleForFrame, + 0, + 0, + 0, + didDisplayInsecureContentForFrame, + didRunInsecureContentForFrame, + didClearWindowForFrame, + didCancelClientRedirectForFrame, + willPerformClientRedirectForFrame, + didHandleOnloadEventsForFrame + }; + WKBundlePageSetLoaderClient(m_page, &loaderClient); + + WKBundlePageUIClient uiClient = { + 0, + this, + willAddMessageToConsole, + willSetStatusbarText, + willRunJavaScriptAlert, + willRunJavaScriptConfirm, + willRunJavaScriptPrompt, + 0, /*mouseDidMoveOverElement*/ + 0, /*pageDidScroll*/ + }; + WKBundlePageSetUIClient(m_page, &uiClient); + + WKBundlePageEditorClient editorClient = { + 0, + this, + shouldBeginEditing, + shouldEndEditing, + shouldInsertNode, + shouldInsertText, + shouldDeleteRange, + shouldChangeSelectedRange, + shouldApplyStyle, + didBeginEditing, + didEndEditing, + didChange, + didChangeSelection + }; + WKBundlePageSetEditorClient(m_page, &editorClient); +} + +InjectedBundlePage::~InjectedBundlePage() +{ +} + +void InjectedBundlePage::stopLoading() +{ + WKBundlePageStopLoading(m_page); + m_isLoading = false; +} + +void InjectedBundlePage::reset() +{ + WKBundlePageClearMainFrameName(m_page); + + WKBundlePageSetPageZoomFactor(m_page, 1); + WKBundlePageSetTextZoomFactor(m_page, 1); + + m_previousTestBackForwardListItem = adoptWK(WKBundleBackForwardListCopyItemAtIndex(WKBundlePageGetBackForwardList(m_page), 0)); +} + +// Loader Client Callbacks + +void InjectedBundlePage::didStartProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didStartProvisionalLoadForFrame(frame); +} + +void InjectedBundlePage::didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didReceiveServerRedirectForProvisionalLoadForFrame(frame); +} + +void InjectedBundlePage::didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKErrorRef error, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFailProvisionalLoadWithErrorForFrame(frame, error); +} + +void InjectedBundlePage::didCommitLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didCommitLoadForFrame(frame); +} + +void InjectedBundlePage::didFinishLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishLoadForFrame(frame); +} + +void InjectedBundlePage::didFinishDocumentLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishDocumentLoadForFrame(frame); +} + +void InjectedBundlePage::didFailLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKErrorRef error, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFailLoadWithErrorForFrame(frame, error); +} + +void InjectedBundlePage::didReceiveTitleForFrame(WKBundlePageRef page, WKStringRef title, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didReceiveTitleForFrame(title, frame); +} + +void InjectedBundlePage::didClearWindowForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKBundleScriptWorldRef world, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didClearWindowForFrame(frame, world); +} + +void InjectedBundlePage::didCancelClientRedirectForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didCancelClientRedirectForFrame(frame); +} + +void InjectedBundlePage::willPerformClientRedirectForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKURLRef url, double delay, double date, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->willPerformClientRedirectForFrame(frame, url, delay, date); +} + +void InjectedBundlePage::didSameDocumentNavigationForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef*, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didSameDocumentNavigationForFrame(frame, type); +} + +void InjectedBundlePage::didHandleOnloadEventsForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didHandleOnloadEventsForFrame(frame); +} + +void InjectedBundlePage::didDisplayInsecureContentForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didDisplayInsecureContentForFrame(frame); +} + +void InjectedBundlePage::didRunInsecureContentForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didRunInsecureContentForFrame(frame); +} + + +void InjectedBundlePage::didStartProvisionalLoadForFrame(WKBundleFrameRef frame) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (frame == WKBundlePageGetMainFrame(m_page)) + m_isLoading = true; +} + +void InjectedBundlePage::didReceiveServerRedirectForProvisionalLoadForFrame(WKBundleFrameRef frame) +{ +} + +void InjectedBundlePage::didFailProvisionalLoadWithErrorForFrame(WKBundleFrameRef frame, WKErrorRef error) +{ +} + +void InjectedBundlePage::didCommitLoadForFrame(WKBundleFrameRef frame) +{ +} + +enum FrameNamePolicy { ShouldNotIncludeFrameName, ShouldIncludeFrameName }; + +static void dumpFrameScrollPosition(WKBundleFrameRef frame, FrameNamePolicy shouldIncludeFrameName = ShouldNotIncludeFrameName) +{ + double x = numericWindowPropertyValue(frame, "pageXOffset"); + double y = numericWindowPropertyValue(frame, "pageYOffset"); + if (fabs(x) > 0.00000001 || fabs(y) > 0.00000001) { + if (shouldIncludeFrameName) { + WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame)); + InjectedBundle::shared().os() << "frame '" << name << "' "; + } + InjectedBundle::shared().os() << "scrolled to " << x << "," << y << "\n"; + } +} + +static void dumpDescendantFrameScrollPositions(WKBundleFrameRef frame) +{ + WKRetainPtr<WKArrayRef> childFrames(AdoptWK, WKBundleFrameCopyChildFrames(frame)); + size_t size = WKArrayGetSize(childFrames.get()); + for (size_t i = 0; i < size; ++i) { + WKBundleFrameRef subframe = static_cast<WKBundleFrameRef>(WKArrayGetItemAtIndex(childFrames.get(), i)); + dumpFrameScrollPosition(subframe, ShouldIncludeFrameName); + dumpDescendantFrameScrollPositions(subframe); + } +} + +void InjectedBundlePage::dumpAllFrameScrollPositions() +{ + WKBundleFrameRef frame = WKBundlePageGetMainFrame(m_page); + dumpFrameScrollPosition(frame); + dumpDescendantFrameScrollPositions(frame); +} + +static JSRetainPtr<JSStringRef> toJS(const char* string) +{ + return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithUTF8CString(string)); +} + +static bool hasDocumentElement(WKBundleFrameRef frame) +{ + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); + JSObjectRef globalObject = JSContextGetGlobalObject(context); + + JSValueRef documentValue = JSObjectGetProperty(context, globalObject, toJS("document").get(), 0); + if (!documentValue) + return false; + + ASSERT(JSValueIsObject(context, documentValue)); + JSObjectRef document = JSValueToObject(context, documentValue, 0); + + JSValueRef documentElementValue = JSObjectGetProperty(context, document, toJS("documentElement").get(), 0); + if (!documentElementValue) + return false; + + return JSValueToBoolean(context, documentElementValue); +} + +static void dumpFrameText(WKBundleFrameRef frame) +{ + // If the frame doesn't have a document element, its inner text will be an empty string, so + // we'll end up just appending a single newline below. But DumpRenderTree doesn't append + // anything in this case, so we shouldn't either. + if (!hasDocumentElement(frame)) + return; + + WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyInnerText(frame)); + InjectedBundle::shared().os() << text << "\n"; +} + +static void dumpDescendantFramesText(WKBundleFrameRef frame) +{ + WKRetainPtr<WKArrayRef> childFrames(AdoptWK, WKBundleFrameCopyChildFrames(frame)); + size_t size = WKArrayGetSize(childFrames.get()); + for (size_t i = 0; i < size; ++i) { + WKBundleFrameRef subframe = static_cast<WKBundleFrameRef>(WKArrayGetItemAtIndex(childFrames.get(), i)); + WKRetainPtr<WKStringRef> subframeName(AdoptWK, WKBundleFrameCopyName(subframe)); + InjectedBundle::shared().os() << "\n--------\nFrame: '" << subframeName << "'\n--------\n"; + dumpFrameText(subframe); + dumpDescendantFramesText(subframe); + } +} + +void InjectedBundlePage::dumpAllFramesText() +{ + WKBundleFrameRef frame = WKBundlePageGetMainFrame(m_page); + dumpFrameText(frame); + dumpDescendantFramesText(frame); +} + +void InjectedBundlePage::dump() +{ + ASSERT(InjectedBundle::shared().isTestRunning()); + + InjectedBundle::shared().layoutTestController()->invalidateWaitToDumpWatchdogTimer(); + + switch (InjectedBundle::shared().layoutTestController()->whatToDump()) { + case LayoutTestController::RenderTree: { + WKRetainPtr<WKStringRef> text(AdoptWK, WKBundlePageCopyRenderTreeExternalRepresentation(m_page)); + InjectedBundle::shared().os() << text; + break; + } + case LayoutTestController::MainFrameText: + dumpFrameText(WKBundlePageGetMainFrame(m_page)); + break; + case LayoutTestController::AllFramesText: + dumpAllFramesText(); + break; + } + + if (InjectedBundle::shared().layoutTestController()->shouldDumpAllFrameScrollPositions()) + dumpAllFrameScrollPositions(); + else if (InjectedBundle::shared().layoutTestController()->shouldDumpMainFrameScrollPosition()) + dumpFrameScrollPosition(WKBundlePageGetMainFrame(m_page)); + + if (InjectedBundle::shared().layoutTestController()->shouldDumpBackForwardListsForAllWindows()) + InjectedBundle::shared().dumpBackForwardListsForAllPages(); + + InjectedBundle::shared().done(); +} + +void InjectedBundlePage::didFinishLoadForFrame(WKBundleFrameRef frame) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (!WKBundleFrameIsMainFrame(frame)) + return; + + m_isLoading = false; + + if (this != InjectedBundle::shared().page()) + return; + + if (InjectedBundle::shared().layoutTestController()->waitToDump()) + return; + + dump(); +} + +void InjectedBundlePage::didFailLoadWithErrorForFrame(WKBundleFrameRef frame, WKErrorRef) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (!WKBundleFrameIsMainFrame(frame)) + return; + + m_isLoading = false; + + if (this != InjectedBundle::shared().page()) + return; + + InjectedBundle::shared().done(); +} + +void InjectedBundlePage::didReceiveTitleForFrame(WKStringRef title, WKBundleFrameRef frame) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (!InjectedBundle::shared().layoutTestController()->shouldDumpTitleChanges()) + return; + + InjectedBundle::shared().os() << "TITLE CHANGED: " << title << "\n"; +} + +void InjectedBundlePage::didClearWindowForFrame(WKBundleFrameRef frame, WKBundleScriptWorldRef world) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (WKBundleScriptWorldNormalWorld() != world) + return; + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContextForWorld(frame, world); + JSObjectRef window = JSContextGetGlobalObject(context); + + JSValueRef exception = 0; + InjectedBundle::shared().layoutTestController()->makeWindowObject(context, window, &exception); + InjectedBundle::shared().gcController()->makeWindowObject(context, window, &exception); + InjectedBundle::shared().eventSendingController()->makeWindowObject(context, window, &exception); +} + +void InjectedBundlePage::didCancelClientRedirectForFrame(WKBundleFrameRef frame) +{ +} + +void InjectedBundlePage::willPerformClientRedirectForFrame(WKBundleFrameRef frame, WKURLRef url, double delay, double date) +{ +} + +void InjectedBundlePage::didSameDocumentNavigationForFrame(WKBundleFrameRef frame, WKSameDocumentNavigationType type) +{ +} + +void InjectedBundlePage::didFinishDocumentLoadForFrame(WKBundleFrameRef frame) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + unsigned pendingFrameUnloadEvents = WKBundleFrameGetPendingUnloadCount(frame); + if (pendingFrameUnloadEvents) + InjectedBundle::shared().os() << frame << " - has " << pendingFrameUnloadEvents << " onunload handler(s)\n"; +} + +void InjectedBundlePage::didHandleOnloadEventsForFrame(WKBundleFrameRef frame) +{ +} + +void InjectedBundlePage::didDisplayInsecureContentForFrame(WKBundleFrameRef frame) +{ +} + +void InjectedBundlePage::didRunInsecureContentForFrame(WKBundleFrameRef frame) +{ +} + +// UI Client Callbacks + +void InjectedBundlePage::willAddMessageToConsole(WKBundlePageRef page, WKStringRef message, uint32_t lineNumber, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->willAddMessageToConsole(message, lineNumber); +} + +void InjectedBundlePage::willSetStatusbarText(WKBundlePageRef page, WKStringRef statusbarText, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->willSetStatusbarText(statusbarText); +} + +void InjectedBundlePage::willRunJavaScriptAlert(WKBundlePageRef page, WKStringRef message, WKBundleFrameRef frame, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->willRunJavaScriptAlert(message, frame); +} + +void InjectedBundlePage::willRunJavaScriptConfirm(WKBundlePageRef page, WKStringRef message, WKBundleFrameRef frame, const void *clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->willRunJavaScriptConfirm(message, frame); +} + +void InjectedBundlePage::willRunJavaScriptPrompt(WKBundlePageRef page, WKStringRef message, WKStringRef defaultValue, WKBundleFrameRef frame, const void *clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->willRunJavaScriptPrompt(message, defaultValue, frame); +} + +void InjectedBundlePage::willAddMessageToConsole(WKStringRef message, uint32_t lineNumber) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + // FIXME: Strip file: urls. + InjectedBundle::shared().os() << "CONSOLE MESSAGE: line " << lineNumber << ": " << message << "\n"; +} + +void InjectedBundlePage::willSetStatusbarText(WKStringRef statusbarText) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (!InjectedBundle::shared().layoutTestController()->shouldDumpStatusCallbacks()) + return; + + InjectedBundle::shared().os() << "UI DELEGATE STATUS CALLBACK: setStatusText:" << statusbarText << "\n"; +} + +void InjectedBundlePage::willRunJavaScriptAlert(WKStringRef message, WKBundleFrameRef) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + InjectedBundle::shared().os() << "ALERT: " << message << "\n"; +} + +void InjectedBundlePage::willRunJavaScriptConfirm(WKStringRef message, WKBundleFrameRef) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + InjectedBundle::shared().os() << "CONFIRM: " << message << "\n"; +} + +void InjectedBundlePage::willRunJavaScriptPrompt(WKStringRef message, WKStringRef defaultValue, WKBundleFrameRef) +{ + InjectedBundle::shared().os() << "PROMPT: " << message << ", default text: " << defaultValue << "\n"; +} + +// Editor Client Callbacks + +bool InjectedBundlePage::shouldBeginEditing(WKBundlePageRef page, WKBundleRangeHandleRef range, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldBeginEditing(range); +} + +bool InjectedBundlePage::shouldEndEditing(WKBundlePageRef page, WKBundleRangeHandleRef range, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldEndEditing(range); +} + +bool InjectedBundlePage::shouldInsertNode(WKBundlePageRef page, WKBundleNodeHandleRef node, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldInsertNode(node, rangeToReplace, action); +} + +bool InjectedBundlePage::shouldInsertText(WKBundlePageRef page, WKStringRef text, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldInsertText(text, rangeToReplace, action); +} + +bool InjectedBundlePage::shouldDeleteRange(WKBundlePageRef page, WKBundleRangeHandleRef range, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldDeleteRange(range); +} + +bool InjectedBundlePage::shouldChangeSelectedRange(WKBundlePageRef page, WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType affinity, bool stillSelecting, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldChangeSelectedRange(fromRange, toRange, affinity, stillSelecting); +} + +bool InjectedBundlePage::shouldApplyStyle(WKBundlePageRef page, WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range, const void* clientInfo) +{ + return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldApplyStyle(style, range); +} + +void InjectedBundlePage::didBeginEditing(WKBundlePageRef page, WKStringRef notificationName, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didBeginEditing(notificationName); +} + +void InjectedBundlePage::didEndEditing(WKBundlePageRef page, WKStringRef notificationName, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didEndEditing(notificationName); +} + +void InjectedBundlePage::didChange(WKBundlePageRef page, WKStringRef notificationName, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didChange(notificationName); +} + +void InjectedBundlePage::didChangeSelection(WKBundlePageRef page, WKStringRef notificationName, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didChangeSelection(notificationName); +} + +bool InjectedBundlePage::shouldBeginEditing(WKBundleRangeHandleRef range) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldBeginEditingInDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +bool InjectedBundlePage::shouldEndEditing(WKBundleRangeHandleRef range) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldEndEditingInDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +bool InjectedBundlePage::shouldInsertNode(WKBundleNodeHandleRef node, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + static const char* insertactionstring[] = { + "WebViewInsertActionTyped", + "WebViewInsertActionPasted", + "WebViewInsertActionDropped", + }; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldInsertNode:" << dumpPath(m_page, m_world.get(), node) << " replacingDOMRange:" << toStr(m_page, m_world.get(), rangeToReplace) << " givenAction:" << insertactionstring[action] << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +bool InjectedBundlePage::shouldInsertText(WKStringRef text, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + static const char *insertactionstring[] = { + "WebViewInsertActionTyped", + "WebViewInsertActionPasted", + "WebViewInsertActionDropped", + }; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldInsertText:" << text << " replacingDOMRange:" << toStr(m_page, m_world.get(), rangeToReplace) << " givenAction:" << insertactionstring[action] << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +bool InjectedBundlePage::shouldDeleteRange(WKBundleRangeHandleRef range) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldDeleteDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +bool InjectedBundlePage::shouldChangeSelectedRange(WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType affinity, bool stillSelecting) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + static const char *affinitystring[] = { + "NSSelectionAffinityUpstream", + "NSSelectionAffinityDownstream" + }; + static const char *boolstring[] = { + "FALSE", + "TRUE" + }; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldChangeSelectedDOMRange:" << toStr(m_page, m_world.get(), fromRange) << " toDOMRange:" << toStr(m_page, m_world.get(), toRange) << " affinity:" << affinitystring[affinity] << " stillSelecting:" << boolstring[stillSelecting] << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +bool InjectedBundlePage::shouldApplyStyle(WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range) +{ + if (!InjectedBundle::shared().isTestRunning()) + return true; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldApplyStyle:" << style << " toElementsInDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; + return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); +} + +void InjectedBundlePage::didBeginEditing(WKStringRef notificationName) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: webViewDidBeginEditing:" << notificationName << "\n"; +} + +void InjectedBundlePage::didEndEditing(WKStringRef notificationName) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: webViewDidEndEditing:" << notificationName << "\n"; +} + +void InjectedBundlePage::didChange(WKStringRef notificationName) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: webViewDidChange:" << notificationName << "\n"; +} + +void InjectedBundlePage::didChangeSelection(WKStringRef notificationName) +{ + if (!InjectedBundle::shared().isTestRunning()) + return; + + if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) + InjectedBundle::shared().os() << "EDITING DELEGATE: webViewDidChangeSelection:" << notificationName << "\n"; +} + +static bool compareByTargetName(WKBundleBackForwardListItemRef item1, WKBundleBackForwardListItemRef item2) +{ + return toSTD(adoptWK(WKBundleBackForwardListItemCopyTarget(item1))) < toSTD(adoptWK(WKBundleBackForwardListItemCopyTarget(item2))); +} + +static void dumpBackForwardListItem(WKBundleBackForwardListItemRef item, unsigned indent, bool isCurrentItem) +{ + unsigned column = 0; + if (isCurrentItem) { + InjectedBundle::shared().os() << "curr->"; + column = 6; + } + for (unsigned i = column; i < indent; i++) + InjectedBundle::shared().os() << ' '; + + string url = toSTD(adoptWK(WKURLCopyString(adoptWK(WKBundleBackForwardListItemCopyURL(item)).get()))); + if (hasPrefix(url, "file:")) { + string directoryName = "/LayoutTests/"; + size_t start = url.find(directoryName); + if (start == string::npos) + start = 0; + else + start += directoryName.size(); + InjectedBundle::shared().os() << "(file test):" << url.substr(start); + } else + InjectedBundle::shared().os() << url; + + string target = toSTD(adoptWK(WKBundleBackForwardListItemCopyTarget(item))); + if (target.length()) + InjectedBundle::shared().os() << " (in frame \"" << target << "\")"; + + // FIXME: Need WKBackForwardListItemIsTargetItem. + if (WKBundleBackForwardListItemIsTargetItem(item)) + InjectedBundle::shared().os() << " **nav target**"; + + InjectedBundle::shared().os() << '\n'; + + if (WKRetainPtr<WKArrayRef> kids = adoptWK(WKBundleBackForwardListItemCopyChildren(item))) { + // Sort to eliminate arbitrary result ordering which defeats reproducible testing. + size_t size = WKArrayGetSize(kids.get()); + Vector<WKBundleBackForwardListItemRef> sortedKids(size); + for (size_t i = 0; i < size; ++i) + sortedKids[i] = static_cast<WKBundleBackForwardListItemRef>(WKArrayGetItemAtIndex(kids.get(), i)); + stable_sort(sortedKids.begin(), sortedKids.end(), compareByTargetName); + for (size_t i = 0; i < size; ++i) + dumpBackForwardListItem(sortedKids[i], indent + 4, false); + } +} + +void InjectedBundlePage::dumpBackForwardList() +{ + InjectedBundle::shared().os() << "\n============== Back Forward List ==============\n"; + + WKBundleBackForwardListRef list = WKBundlePageGetBackForwardList(m_page); + + // Print out all items in the list after m_previousTestBackForwardListItem. + // Gather items from the end of the list, then print them out from oldest to newest. + Vector<WKRetainPtr<WKBundleBackForwardListItemRef> > itemsToPrint; + for (unsigned i = WKBundleBackForwardListGetForwardListCount(list); i; --i) { + WKRetainPtr<WKBundleBackForwardListItemRef> item = adoptWK(WKBundleBackForwardListCopyItemAtIndex(list, i)); + // Something is wrong if the item from the last test is in the forward part of the list. + ASSERT(!WKBundleBackForwardListItemIsSame(item.get(), m_previousTestBackForwardListItem.get())); + itemsToPrint.append(item); + } + + ASSERT(!WKBundleBackForwardListItemIsSame(adoptWK(WKBundleBackForwardListCopyItemAtIndex(list, 0)).get(), m_previousTestBackForwardListItem.get())); + + itemsToPrint.append(adoptWK(WKBundleBackForwardListCopyItemAtIndex(list, 0))); + + int currentItemIndex = itemsToPrint.size() - 1; + + int backListCount = WKBundleBackForwardListGetBackListCount(list); + for (int i = -1; i >= -backListCount; --i) { + WKRetainPtr<WKBundleBackForwardListItemRef> item = adoptWK(WKBundleBackForwardListCopyItemAtIndex(list, i)); + if (WKBundleBackForwardListItemIsSame(item.get(), m_previousTestBackForwardListItem.get())) + break; + itemsToPrint.append(item); + } + + for (int i = itemsToPrint.size() - 1; i >= 0; i--) + dumpBackForwardListItem(itemsToPrint[i].get(), 8, i == currentItemIndex); + + InjectedBundle::shared().os() << "===============================================\n"; +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h new file mode 100644 index 0000000..cb1c27b --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef InjectedBundlePage_h +#define InjectedBundlePage_h + +#include <WebKit2/WKBundlePage.h> +#include <WebKit2/WKBundleScriptWorld.h> +#include <WebKit2/WKRetainPtr.h> + +namespace WTR { + +class InjectedBundlePage { +public: + InjectedBundlePage(WKBundlePageRef); + ~InjectedBundlePage(); + + WKBundlePageRef page() const { return m_page; } + void dump(); + + void stopLoading(); + bool isLoading() { return m_isLoading; } + + void reset(); + + void dumpBackForwardList(); + +private: + // Loader Client + static void didStartProvisionalLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef, WKBundleFrameRef, WKErrorRef, WKTypeRef*, const void*); + static void didCommitLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFinishLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFinishDocumentLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFailLoadWithErrorForFrame(WKBundlePageRef, WKBundleFrameRef, WKErrorRef, WKTypeRef*, const void*); + static void didReceiveTitleForFrame(WKBundlePageRef, WKStringRef title, WKBundleFrameRef, WKTypeRef*, const void*); + static void didClearWindowForFrame(WKBundlePageRef, WKBundleFrameRef, WKBundleScriptWorldRef, const void*); + static void didCancelClientRedirectForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); + static void willPerformClientRedirectForFrame(WKBundlePageRef, WKBundleFrameRef, WKURLRef url, double delay, double date, const void*); + static void didSameDocumentNavigationForFrame(WKBundlePageRef, WKBundleFrameRef, WKSameDocumentNavigationType, WKTypeRef*, const void*); + static void didHandleOnloadEventsForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); + static void didDisplayInsecureContentForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didRunInsecureContentForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + void didStartProvisionalLoadForFrame(WKBundleFrameRef); + void didReceiveServerRedirectForProvisionalLoadForFrame(WKBundleFrameRef); + void didFailProvisionalLoadWithErrorForFrame(WKBundleFrameRef, WKErrorRef); + void didCommitLoadForFrame(WKBundleFrameRef); + void didFinishLoadForFrame(WKBundleFrameRef); + void didFailLoadWithErrorForFrame(WKBundleFrameRef, WKErrorRef); + void didReceiveTitleForFrame(WKStringRef title, WKBundleFrameRef); + void didClearWindowForFrame(WKBundleFrameRef, WKBundleScriptWorldRef); + void didCancelClientRedirectForFrame(WKBundleFrameRef); + void willPerformClientRedirectForFrame(WKBundleFrameRef, WKURLRef url, double delay, double date); + void didSameDocumentNavigationForFrame(WKBundleFrameRef, WKSameDocumentNavigationType); + void didFinishDocumentLoadForFrame(WKBundleFrameRef); + void didHandleOnloadEventsForFrame(WKBundleFrameRef); + void didDisplayInsecureContentForFrame(WKBundleFrameRef); + void didRunInsecureContentForFrame(WKBundleFrameRef); + + // UI Client + static void willAddMessageToConsole(WKBundlePageRef, WKStringRef message, uint32_t lineNumber, const void* clientInfo); + static void willSetStatusbarText(WKBundlePageRef, WKStringRef statusbarText, const void* clientInfo); + static void willRunJavaScriptAlert(WKBundlePageRef, WKStringRef message, WKBundleFrameRef frame, const void* clientInfo); + static void willRunJavaScriptConfirm(WKBundlePageRef, WKStringRef message, WKBundleFrameRef frame, const void* clientInfo); + static void willRunJavaScriptPrompt(WKBundlePageRef, WKStringRef message, WKStringRef defaultValue, WKBundleFrameRef frame, const void* clientInfo); + void willAddMessageToConsole(WKStringRef message, uint32_t lineNumber); + void willSetStatusbarText(WKStringRef statusbarText); + void willRunJavaScriptAlert(WKStringRef message, WKBundleFrameRef); + void willRunJavaScriptConfirm(WKStringRef message, WKBundleFrameRef); + void willRunJavaScriptPrompt(WKStringRef message, WKStringRef defaultValue, WKBundleFrameRef); + + // Editor client + static bool shouldBeginEditing(WKBundlePageRef, WKBundleRangeHandleRef, const void* clientInfo); + static bool shouldEndEditing(WKBundlePageRef, WKBundleRangeHandleRef, const void* clientInfo); + static bool shouldInsertNode(WKBundlePageRef, WKBundleNodeHandleRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType, const void* clientInfo); + static bool shouldInsertText(WKBundlePageRef, WKStringRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType, const void* clientInfo); + static bool shouldDeleteRange(WKBundlePageRef, WKBundleRangeHandleRef, const void* clientInfo); + static bool shouldChangeSelectedRange(WKBundlePageRef, WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType, bool stillSelecting, const void* clientInfo); + static bool shouldApplyStyle(WKBundlePageRef, WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range, const void* clientInfo); + static void didBeginEditing(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); + static void didEndEditing(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); + static void didChange(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); + static void didChangeSelection(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); + bool shouldBeginEditing(WKBundleRangeHandleRef); + bool shouldEndEditing(WKBundleRangeHandleRef); + bool shouldInsertNode(WKBundleNodeHandleRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType); + bool shouldInsertText(WKStringRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType); + bool shouldDeleteRange(WKBundleRangeHandleRef); + bool shouldChangeSelectedRange(WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType, bool stillSelecting); + bool shouldApplyStyle(WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range); + void didBeginEditing(WKStringRef notificationName); + void didEndEditing(WKStringRef notificationName); + void didChange(WKStringRef notificationName); + void didChangeSelection(WKStringRef notificationName); + + void dumpAllFramesText(); + void dumpAllFrameScrollPositions(); + + WKBundlePageRef m_page; + WKRetainPtr<WKBundleScriptWorldRef> m_world; + WKRetainPtr<WKBundleBackForwardListItemRef> m_previousTestBackForwardListItem; + bool m_isLoading; +}; + +} // namespace WTR + +#endif // InjectedBundlePage_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp b/Tools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp new file mode 100644 index 0000000..60e3130 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp @@ -0,0 +1,307 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "LayoutTestController.h" + +#include "InjectedBundle.h" +#include "InjectedBundlePage.h" +#include "JSLayoutTestController.h" +#include "StringFunctions.h" +#include <WebKit2/WKBundleBackForwardList.h> +#include <WebKit2/WKBundleFrame.h> +#include <WebKit2/WKBundleFramePrivate.h> +#include <WebKit2/WKBundlePagePrivate.h> +#include <WebKit2/WKBundleScriptWorld.h> +#include <WebKit2/WKBundlePrivate.h> +#include <WebKit2/WKRetainPtr.h> +#include <WebKit2/WebKit2.h> + +namespace WTR { + +// This is lower than DumpRenderTree's timeout, to make it easier to work through the failures +// Eventually it should be changed to match. +const double LayoutTestController::waitToDumpWatchdogTimerInterval = 6; + +static JSValueRef propertyValue(JSContextRef context, JSObjectRef object, const char* propertyName) +{ + if (!object) + return 0; + JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSStringCreateWithUTF8CString(propertyName)); + JSValueRef exception; + return JSObjectGetProperty(context, object, propertyNameString.get(), &exception); +} + +static JSObjectRef propertyObject(JSContextRef context, JSObjectRef object, const char* propertyName) +{ + JSValueRef value = propertyValue(context, object, propertyName); + if (!value || !JSValueIsObject(context, value)) + return 0; + return const_cast<JSObjectRef>(value); +} + +static JSObjectRef getElementById(WKBundleFrameRef frame, JSStringRef elementId) +{ + JSContextRef context = WKBundleFrameGetJavaScriptContext(frame); + JSObjectRef document = propertyObject(context, JSContextGetGlobalObject(context), "document"); + if (!document) + return 0; + JSValueRef getElementById = propertyObject(context, document, "getElementById"); + if (!getElementById || !JSValueIsObject(context, getElementById)) + return 0; + JSValueRef elementIdValue = JSValueMakeString(context, elementId); + JSValueRef exception; + JSValueRef element = JSObjectCallAsFunction(context, const_cast<JSObjectRef>(getElementById), document, 1, &elementIdValue, &exception); + if (!element || !JSValueIsObject(context, element)) + return 0; + return const_cast<JSObjectRef>(element); +} + +PassRefPtr<LayoutTestController> LayoutTestController::create() +{ + return adoptRef(new LayoutTestController); +} + +LayoutTestController::LayoutTestController() + : m_whatToDump(RenderTree) + , m_shouldDumpAllFrameScrollPositions(false) + , m_shouldDumpBackForwardListsForAllWindows(false) + , m_shouldAllowEditing(true) + , m_shouldCloseExtraWindows(false) + , m_dumpEditingCallbacks(false) + , m_dumpStatusCallbacks(false) + , m_dumpTitleChanges(false) + , m_waitToDump(false) + , m_testRepaint(false) + , m_testRepaintSweepHorizontally(false) +{ + platformInitialize(); +} + +LayoutTestController::~LayoutTestController() +{ +} + +JSClassRef LayoutTestController::wrapperClass() +{ + return JSLayoutTestController::layoutTestControllerClass(); +} + +void LayoutTestController::display() +{ + // FIXME: actually implement, once we want pixel tests +} + +void LayoutTestController::waitUntilDone() +{ + m_waitToDump = true; + initializeWaitToDumpWatchdogTimerIfNeeded(); +} + +void LayoutTestController::waitToDumpWatchdogTimerFired() +{ + invalidateWaitToDumpWatchdogTimer(); + const char* message = "FAIL: Timed out waiting for notifyDone to be called\n"; + InjectedBundle::shared().os() << message << "\n"; + InjectedBundle::shared().done(); +} + +void LayoutTestController::notifyDone() +{ + if (m_waitToDump && !InjectedBundle::shared().page()->isLoading()) + InjectedBundle::shared().page()->dump(); + m_waitToDump = false; +} + +unsigned LayoutTestController::numberOfActiveAnimations() const +{ + // FIXME: Is it OK this works only for the main frame? + // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage? + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + return WKBundleFrameGetNumberOfActiveAnimations(mainFrame); +} + +bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId) +{ + // FIXME: Is it OK this works only for the main frame? + // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage? + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + return WKBundleFramePauseAnimationOnElementWithId(mainFrame, toWK(animationName).get(), toWK(elementId).get(), time); +} + +void LayoutTestController::suspendAnimations() +{ + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + WKBundleFrameSuspendAnimations(mainFrame); +} + +void LayoutTestController::resumeAnimations() +{ + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + WKBundleFrameResumeAnimations(mainFrame); +} + +JSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const +{ + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyLayerTreeAsText(mainFrame)); + return toJS(text); +} + +void LayoutTestController::addUserScript(JSStringRef source, bool runAtStart, bool allFrames) +{ + WKRetainPtr<WKStringRef> sourceWK = toWK(source); + WKRetainPtr<WKBundleScriptWorldRef> scriptWorld(AdoptWK, WKBundleScriptWorldCreateWorld()); + + WKBundleAddUserScript(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), scriptWorld.get(), sourceWK.get(), 0, 0, 0, + (runAtStart ? kWKInjectAtDocumentStart : kWKInjectAtDocumentEnd), + (allFrames ? kWKInjectInAllFrames : kWKInjectInTopFrameOnly)); +} + +void LayoutTestController::addUserStyleSheet(JSStringRef source, bool allFrames) +{ + WKRetainPtr<WKStringRef> sourceWK = toWK(source); + WKRetainPtr<WKBundleScriptWorldRef> scriptWorld(AdoptWK, WKBundleScriptWorldCreateWorld()); + + WKBundleAddUserStyleSheet(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), scriptWorld.get(), sourceWK.get(), 0, 0, 0, + (allFrames ? kWKInjectInAllFrames : kWKInjectInTopFrameOnly)); +} + +void LayoutTestController::keepWebHistory() +{ + WKBundleSetShouldTrackVisitedLinks(InjectedBundle::shared().bundle(), true); +} + +JSValueRef LayoutTestController::computedStyleIncludingVisitedInfo(JSValueRef element) +{ + // FIXME: Is it OK this works only for the main frame? + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame); + if (!JSValueIsObject(context, element)) + return JSValueMakeUndefined(context); + JSValueRef value = WKBundleFrameGetComputedStyleIncludingVisitedInfo(mainFrame, const_cast<JSObjectRef>(element)); + if (!value) + return JSValueMakeUndefined(context); + return value; +} + +JSRetainPtr<JSStringRef> LayoutTestController::counterValueForElementById(JSStringRef elementId) +{ + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + JSObjectRef element = getElementById(mainFrame, elementId); + if (!element) + return 0; + WKRetainPtr<WKStringRef> value(AdoptWK, WKBundleFrameCopyCounterValue(mainFrame, const_cast<JSObjectRef>(element))); + return toJS(value); +} + +JSRetainPtr<JSStringRef> LayoutTestController::markerTextForListItem(JSValueRef element) +{ + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame); + if (!element || !JSValueIsObject(context, element)) + return 0; + WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyMarkerText(mainFrame, const_cast<JSObjectRef>(element))); + if (WKStringIsEmpty(text.get())) + return 0; + return toJS(text); +} + +void LayoutTestController::execCommand(JSStringRef name, JSStringRef argument) +{ + WKBundlePageExecuteEditingCommand(InjectedBundle::shared().page()->page(), toWK(name).get(), toWK(argument).get()); +} + +bool LayoutTestController::findString(JSStringRef target, JSValueRef optionsArrayAsValue) +{ + WKFindOptions options = 0; + + WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page()); + JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame); + JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length")); + JSObjectRef optionsArray = JSValueToObject(context, optionsArrayAsValue, 0); + JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0); + if (!JSValueIsNumber(context, lengthValue)) + return false; + + size_t length = static_cast<size_t>(JSValueToNumber(context, lengthValue, 0)); + for (size_t i = 0; i < length; ++i) { + JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0); + if (!JSValueIsString(context, value)) + continue; + + JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0)); + + if (JSStringIsEqualToUTF8CString(optionName.get(), "CaseInsensitive")) + options |= kWKFindOptionsCaseInsensitive; + else if (JSStringIsEqualToUTF8CString(optionName.get(), "AtWordStarts")) + options |= kWKFindOptionsAtWordStarts; + else if (JSStringIsEqualToUTF8CString(optionName.get(), "TreatMedialCapitalAsWordStart")) + options |= kWKFindOptionsTreatMedialCapitalAsWordStart; + else if (JSStringIsEqualToUTF8CString(optionName.get(), "Backwards")) + options |= kWKFindOptionsBackwards; + else if (JSStringIsEqualToUTF8CString(optionName.get(), "WrapAround")) + options |= kWKFindOptionsWrapAround; + else if (JSStringIsEqualToUTF8CString(optionName.get(), "StartInSelection")) { + // FIXME: No kWKFindOptionsStartInSelection. + } + } + + return WKBundlePageFindString(InjectedBundle::shared().page()->page(), toWK(target).get(), options); +} + +bool LayoutTestController::isCommandEnabled(JSStringRef name) +{ + return WKBundlePageIsEditingCommandEnabled(InjectedBundle::shared().page()->page(), toWK(name).get()); +} + +void LayoutTestController::setCanOpenWindows(bool) +{ + // It's not clear if or why any tests require opening windows be forbidden. + // For now, just ignore this setting, and if we find later it's needed we can add it. +} + +void LayoutTestController::setXSSAuditorEnabled(bool enabled) +{ + WKBundleOverrideXSSAuditorEnabledForTestRunner(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), true); +} + +unsigned LayoutTestController::windowCount() +{ + return InjectedBundle::shared().pageCount(); +} + +void LayoutTestController::clearBackForwardList() +{ + WKBundleBackForwardListClear(WKBundlePageGetBackForwardList(InjectedBundle::shared().page()->page())); +} + +// Object Creation + +void LayoutTestController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception) +{ + setProperty(context, windowObject, "layoutTestController", this, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/LayoutTestController.h b/Tools/WebKitTestRunner/InjectedBundle/LayoutTestController.h new file mode 100644 index 0000000..2aaad08 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/LayoutTestController.h @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef LayoutTestController_h +#define LayoutTestController_h + +#include "JSWrappable.h" +#include <JavaScriptCore/JSRetainPtr.h> +#include <string> +#include <wtf/PassRefPtr.h> + +#if PLATFORM(MAC) +#include <wtf/RetainPtr.h> +typedef RetainPtr<CFRunLoopTimerRef> PlatformTimerRef; +#elif PLATFORM(WIN) +typedef UINT_PTR PlatformTimerRef; +#elif PLATFORM(QT) +#include <QTimer> +typedef QTimer PlatformTimerRef; +#endif + +namespace WTR { + +class LayoutTestController : public JSWrappable { +public: + static PassRefPtr<LayoutTestController> create(); + virtual ~LayoutTestController(); + + // JSWrappable + virtual JSClassRef wrapperClass(); + + void makeWindowObject(JSContextRef, JSObjectRef windowObject, JSValueRef* exception); + + // The basics. + void dumpAsText() { m_whatToDump = MainFrameText; } + void dumpChildFramesAsText() { m_whatToDump = AllFramesText; } + void waitUntilDone(); + void notifyDone(); + + // Other dumping. + void dumpBackForwardList() { m_shouldDumpBackForwardListsForAllWindows = true; } + void dumpChildFrameScrollPositions() { m_shouldDumpAllFrameScrollPositions = true; } + void dumpEditingCallbacks() { m_dumpEditingCallbacks = true; } + void dumpSelectionRect() { } // Will need to do something when we support pixel tests. + void dumpStatusCallbacks() { m_dumpStatusCallbacks = true; } + void dumpTitleChanges() { m_dumpTitleChanges = true; } + + // Special options. + void keepWebHistory(); + void setAcceptsEditing(bool value) { m_shouldAllowEditing = value; } + void setCanOpenWindows(bool); + void setCloseRemainingWindowsWhenComplete(bool value) { m_shouldCloseExtraWindows = value; } + void setXSSAuditorEnabled(bool); + + // Special DOM functions. + JSValueRef computedStyleIncludingVisitedInfo(JSValueRef element); + JSRetainPtr<JSStringRef> counterValueForElementById(JSStringRef elementId); + void clearBackForwardList(); + void execCommand(JSStringRef name, JSStringRef argument); + bool isCommandEnabled(JSStringRef name); + JSRetainPtr<JSStringRef> markerTextForListItem(JSValueRef element); + unsigned windowCount(); + + // Repaint testing. + void testRepaint() { m_testRepaint = true; } + void repaintSweepHorizontally() { m_testRepaintSweepHorizontally = true; } + void display(); + + // Animation testing. + unsigned numberOfActiveAnimations() const; + bool pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId); + void suspendAnimations(); + void resumeAnimations(); + + // Compositing testing. + JSRetainPtr<JSStringRef> layerTreeAsText() const; + + // UserContent testing. + void addUserScript(JSStringRef source, bool runAtStart, bool allFrames); + void addUserStyleSheet(JSStringRef source, bool allFrames); + + // Text search testing. + bool findString(JSStringRef, JSValueRef optionsArray); + + enum WhatToDump { RenderTree, MainFrameText, AllFramesText }; + WhatToDump whatToDump() const { return m_whatToDump; } + + bool shouldDumpAllFrameScrollPositions() const { return m_shouldDumpAllFrameScrollPositions; } + bool shouldDumpBackForwardListsForAllWindows() const { return m_shouldDumpBackForwardListsForAllWindows; } + bool shouldDumpEditingCallbacks() const { return m_dumpEditingCallbacks; } + bool shouldDumpMainFrameScrollPosition() const { return m_whatToDump == RenderTree; } + bool shouldDumpStatusCallbacks() const { return m_dumpStatusCallbacks; } + bool shouldDumpTitleChanges() const { return m_dumpTitleChanges; } + + bool waitToDump() const { return m_waitToDump; } + void waitToDumpWatchdogTimerFired(); + void invalidateWaitToDumpWatchdogTimer(); + + bool shouldAllowEditing() const { return m_shouldAllowEditing; } + + bool shouldCloseExtraWindowsAfterRunningTest() const { return m_shouldCloseExtraWindows; } + +private: + static const double waitToDumpWatchdogTimerInterval; + + LayoutTestController(); + + void platformInitialize(); + void initializeWaitToDumpWatchdogTimerIfNeeded(); + + WhatToDump m_whatToDump; + bool m_shouldDumpAllFrameScrollPositions; + bool m_shouldDumpBackForwardListsForAllWindows; + + bool m_shouldAllowEditing; + bool m_shouldCloseExtraWindows; + + bool m_dumpEditingCallbacks; + bool m_dumpStatusCallbacks; + bool m_dumpTitleChanges; + bool m_waitToDump; // True if waitUntilDone() has been called, but notifyDone() has not yet been called. + bool m_testRepaint; + bool m_testRepaintSweepHorizontally; + + PlatformTimerRef m_waitToDumpWatchdogTimer; +}; + +} // namespace WTR + +#endif // LayoutTestController_h diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm new file mode 100644 index 0000000..b5bc4a1 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "ActivateFonts.h" + +#import <AppKit/AppKit.h> +#import <CoreFoundation/CoreFoundation.h> +#import <Foundation/Foundation.h> + +@interface WKTRFontActivatorDummyClass : NSObject +@end + +@implementation WKTRFontActivatorDummyClass +@end + +namespace WTR { + +void activateFonts() +{ + // Work around <rdar://problem/6698023> by activating fonts from disk + + static const char* fontFileNames[] = { + "AHEM____.TTF", + "ColorBits.ttf", + "WebKitWeightWatcher100.ttf", + "WebKitWeightWatcher200.ttf", + "WebKitWeightWatcher300.ttf", + "WebKitWeightWatcher400.ttf", + "WebKitWeightWatcher500.ttf", + "WebKitWeightWatcher600.ttf", + "WebKitWeightWatcher700.ttf", + "WebKitWeightWatcher800.ttf", + "WebKitWeightWatcher900.ttf", + 0 + }; + + NSMutableArray *fontURLs = [NSMutableArray array]; + NSURL *resourcesDirectory = [[NSBundle bundleForClass:[WKTRFontActivatorDummyClass class]] resourceURL]; + for (unsigned i = 0; fontFileNames[i]; ++i) { + NSURL *fontURL = [resourcesDirectory URLByAppendingPathComponent:[NSString stringWithUTF8String:fontFileNames[i]]]; + [fontURLs addObject:[fontURL absoluteURL]]; + } + + CFArrayRef errors = 0; + if (!CTFontManagerRegisterFontsForURLs((CFArrayRef)fontURLs, kCTFontManagerScopeProcess, &errors)) { + NSLog(@"Failed to activate fonts: %@", errors); + CFRelease(errors); + exit(1); + } +} + +} + diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm new file mode 100644 index 0000000..2eb4d5b --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "LayoutTestController.h" + +#include "InjectedBundle.h" + +namespace WTR { + +void LayoutTestController::platformInitialize() +{ +} + +void LayoutTestController::invalidateWaitToDumpWatchdogTimer() +{ + if (!m_waitToDumpWatchdogTimer) + return; + + CFRunLoopTimerInvalidate(m_waitToDumpWatchdogTimer.get()); + m_waitToDumpWatchdogTimer = 0; +} + +static void waitUntilDoneWatchdogTimerFired(CFRunLoopTimerRef timer, void* info) +{ + InjectedBundle::shared().layoutTestController()->waitToDumpWatchdogTimerFired(); +} + +void LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded() +{ + if (m_waitToDumpWatchdogTimer) + return; + + m_waitToDumpWatchdogTimer.adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + waitToDumpWatchdogTimerInterval, 0, 0, 0, WTR::waitUntilDoneWatchdogTimerFired, NULL)); + CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_waitToDumpWatchdogTimer.get(), kCFRunLoopCommonModes); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp b/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp new file mode 100644 index 0000000..d8166d0 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * 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 Computer, 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 "ActivateFonts.h" + +#include <QByteArray> +#include <QDir> + +#ifdef Q_WS_X11 +#include <fontconfig/fontconfig.h> +#endif + +#include <limits.h> + +namespace WTR { + +void activateFonts() +{ +#if defined(Q_WS_X11) + static int numFonts = -1; + + // Some test cases may add or remove application fonts (via @font-face). + // Make sure to re-initialize the font set if necessary. + FcFontSet* appFontSet = FcConfigGetFonts(0, FcSetApplication); + if (appFontSet && numFonts >= 0 && appFontSet->nfont == numFonts) + return; + + QByteArray fontDir = getenv("WEBKIT_TESTFONTS"); + if (fontDir.isEmpty() || !QDir(fontDir).exists()) { + fprintf(stderr, + "\n\n" + "----------------------------------------------------------------------\n" + "WEBKIT_TESTFONTS environment variable is not set correctly.\n" + "This variable has to point to the directory containing the fonts\n" + "you can clone from git://gitorious.org/qtwebkit/testfonts.git\n" + "----------------------------------------------------------------------\n" + ); + exit(1); + } + char currentPath[PATH_MAX+1]; + if (!getcwd(currentPath, PATH_MAX)) + qFatal("Couldn't get current working directory"); + QByteArray configFile = currentPath; + FcConfig* config = FcConfigCreate(); + configFile += "/Tools/DumpRenderTree/qt/fonts.conf"; + if (!FcConfigParseAndLoad (config, (FcChar8*) configFile.data(), true)) + qFatal("Couldn't load font configuration file"); + if (!FcConfigAppFontAddDir (config, (FcChar8*) fontDir.data())) + qFatal("Couldn't add font dir!"); + FcConfigSetCurrent(config); + + appFontSet = FcConfigGetFonts(config, FcSetApplication); + numFonts = appFontSet->nfont; +#endif +} + +} diff --git a/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundle.pro b/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundle.pro new file mode 100644 index 0000000..f7d0989 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundle.pro @@ -0,0 +1,77 @@ +TEMPLATE = lib + +isEmpty(OUTPUT_DIR): OUTPUT_DIR = ../../../.. + +CONFIG(standalone_package) { + isEmpty(WC_GENERATED_SOURCES_DIR):WC_GENERATED_SOURCES_DIR = $$PWD/../../../../WebCore/generated +} else { + isEmpty(WC_GENERATED_SOURCES_DIR):WC_GENERATED_SOURCES_DIR = ../../../../WebCore/generated +} + +GENERATED_SOURCES_DIR = ../../generated + +SOURCES += \ + ../InjectedBundle.cpp \ + ../InjectedBundle.h \ + ../InjectedBundleMain.cpp \ + ../InjectedBundlePage.cpp \ + ../InjectedBundlePage.h \ + ../EventSendingController.cpp \ + ../EventSendingController.h \ + ../GCController.cpp \ + ../GCController.h \ + ../LayoutTestController.cpp \ + ../LayoutTestController.h \ + ../Bindings/JSWrapper.cpp \ + ActivateFontsQt.cpp \ + LayoutTestControllerQt.cpp \ + $$GENERATED_SOURCES_DIR/JSEventSendingController.cpp \ + $$GENERATED_SOURCES_DIR/JSGCController.cpp \ + $$GENERATED_SOURCES_DIR/JSLayoutTestController.cpp \ + +HEADERS += \ + ../ActivateFonts.h \ + ../EventSendingController.h \ + ../GCController.h \ + ../InjectedBundle.h \ + ../InjectedBundlePage.h \ + ../LayoutTestController.h \ + +!CONFIG(release, debug|release) { + OBJECTS_DIR = obj/debug +} else { # Release + OBJECTS_DIR = obj/release +} + +include(../../../../WebKit.pri) +include(../../../../JavaScriptCore/JavaScriptCore.pri) +addJavaScriptCoreLib(../../../../JavaScriptCore) +include(../../../../WebKit2/WebKit2.pri) +addWebKit2Lib(../../../../WebKit2) + +INCLUDEPATH += \ + $$PWD \ + $$PWD/.. \ + $$PWD/../.. \ + $$PWD/../Bindings \ + $$PWD/../../../../JavaScriptCore \ + $$PWD/../../../../JavaScriptCore/wtf \ + $$PWD/../../../../WebKit2 \ + $$PWD/../../../../WebKit2/Shared \ + $$GENERATED_SOURCES_DIR + +INCLUDEPATH += \ + $$OUTPUT_DIR/include \ + $$WC_GENERATED_SOURCES_DIR + +PREFIX_HEADER = $$PWD/../../WebKitTestRunnerPrefix.h +QMAKE_CXXFLAGS += "-include $$PREFIX_HEADER" + +unix:!mac:!symbian { + CONFIG += link_pkgconfig + PKGCONFIG += fontconfig +} + +TARGET = WTRInjectedBundle +DESTDIR = $$OUTPUT_DIR/lib +!CONFIG(standalone_package): CONFIG -= app_bundle diff --git a/Tools/WebKitTestRunner/InjectedBundle/qt/LayoutTestControllerQt.cpp b/Tools/WebKitTestRunner/InjectedBundle/qt/LayoutTestControllerQt.cpp new file mode 100644 index 0000000..b515326 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/qt/LayoutTestControllerQt.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010 University of Szeged. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "LayoutTestController.h" + +#include "InjectedBundle.h" +#include <QObject> + +namespace WTR { + +class WatchdogTimerHelper : public QObject { + Q_OBJECT + +public: + static WatchdogTimerHelper* instance() + { + static WatchdogTimerHelper* theInstance = new WatchdogTimerHelper; + return theInstance; + } + +public slots: + void timerFired() + { + InjectedBundle::shared().layoutTestController()->waitToDumpWatchdogTimerFired(); + } + +private: + WatchdogTimerHelper() {} +}; + +void LayoutTestController::platformInitialize() +{ + QObject::connect(&m_waitToDumpWatchdogTimer, SIGNAL(timeout()), WatchdogTimerHelper::instance(), SLOT(timerFired())); +} + +void LayoutTestController::invalidateWaitToDumpWatchdogTimer() +{ + m_waitToDumpWatchdogTimer.stop(); +} + +void LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded() +{ + if (m_waitToDumpWatchdogTimer.isActive()) + return; + + m_waitToDumpWatchdogTimer.start(waitToDumpWatchdogTimerInterval * 1000); +} + +} // namespace WTR + +#include "LayoutTestControllerQt.moc" diff --git a/Tools/WebKitTestRunner/InjectedBundle/win/ActivateFonts.cpp b/Tools/WebKitTestRunner/InjectedBundle/win/ActivateFonts.cpp new file mode 100644 index 0000000..d9f08c9 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/win/ActivateFonts.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "ActivateFonts.h" + +#include <string> +#include <wtf/Vector.h> + +static LPCWSTR fontsEnvironmentVariable = L"WEBKIT_TESTFONTS"; + +namespace WTR { + +using namespace std; + +static const wstring& fontsPath() +{ + static wstring path; + static bool initialized; + + if (initialized) + return path; + initialized = true; + + DWORD size = ::GetEnvironmentVariableW(fontsEnvironmentVariable, 0, 0); + Vector<WCHAR> buffer(size); + if (!::GetEnvironmentVariableW(fontsEnvironmentVariable, buffer.data(), buffer.size())) + return path; + + path = buffer.data(); + if (path[path.length() - 1] != '\\') + path.append(L"\\"); + + return path; +} + + +void activateFonts() +{ + static LPCWSTR fontsToInstall[] = { + TEXT("AHEM____.ttf"), + TEXT("Apple Chancery.ttf"), + TEXT("Courier Bold.ttf"), + TEXT("Courier.ttf"), + TEXT("Helvetica Bold Oblique.ttf"), + TEXT("Helvetica Bold.ttf"), + TEXT("Helvetica Oblique.ttf"), + TEXT("Helvetica.ttf"), + TEXT("Helvetica Neue Bold Italic.ttf"), + TEXT("Helvetica Neue Bold.ttf"), + TEXT("Helvetica Neue Condensed Black.ttf"), + TEXT("Helvetica Neue Condensed Bold.ttf"), + TEXT("Helvetica Neue Italic.ttf"), + TEXT("Helvetica Neue Light Italic.ttf"), + TEXT("Helvetica Neue Light.ttf"), + TEXT("Helvetica Neue UltraLight Italic.ttf"), + TEXT("Helvetica Neue UltraLight.ttf"), + TEXT("Helvetica Neue.ttf"), + TEXT("Lucida Grande.ttf"), + TEXT("Lucida Grande Bold.ttf"), + TEXT("Monaco.ttf"), + TEXT("Papyrus.ttf"), + TEXT("Times Bold Italic.ttf"), + TEXT("Times Bold.ttf"), + TEXT("Times Italic.ttf"), + TEXT("Times Roman.ttf"), + TEXT("WebKit Layout Tests 2.ttf"), + TEXT("WebKit Layout Tests.ttf"), + TEXT("WebKitWeightWatcher100.ttf"), + TEXT("WebKitWeightWatcher200.ttf"), + TEXT("WebKitWeightWatcher300.ttf"), + TEXT("WebKitWeightWatcher400.ttf"), + TEXT("WebKitWeightWatcher500.ttf"), + TEXT("WebKitWeightWatcher600.ttf"), + TEXT("WebKitWeightWatcher700.ttf"), + TEXT("WebKitWeightWatcher800.ttf"), + TEXT("WebKitWeightWatcher900.ttf") + }; + + wstring resourcesPath = fontsPath(); + + for (unsigned i = 0; i < ARRAYSIZE(fontsToInstall); ++i) + ::AddFontResourceExW(wstring(resourcesPath + fontsToInstall[i]).c_str(), FR_PRIVATE, 0); +} + +} diff --git a/Tools/WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp b/Tools/WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp new file mode 100644 index 0000000..39cd727 --- /dev/null +++ b/Tools/WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "LayoutTestController.h" + +#include "InjectedBundle.h" + +namespace WTR { + +void LayoutTestController::platformInitialize() +{ + m_waitToDumpWatchdogTimer = 0; +} + +void LayoutTestController::invalidateWaitToDumpWatchdogTimer() +{ + if (!m_waitToDumpWatchdogTimer) + return; + + ::KillTimer(0, m_waitToDumpWatchdogTimer); + m_waitToDumpWatchdogTimer = 0; +} + +static void CALLBACK waitToDumpWatchdogTimerFired(HWND, UINT, UINT_PTR, DWORD) +{ + InjectedBundle::shared().layoutTestController()->waitToDumpWatchdogTimerFired(); +} + +static const UINT_PTR waitToDumpWatchdogTimerIdentifier = 1; + +void LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded() +{ + if (m_waitToDumpWatchdogTimer) + return; + + m_waitToDumpWatchdogTimer = ::SetTimer(0, waitToDumpWatchdogTimerIdentifier, waitToDumpWatchdogTimerInterval * 1000, WTR::waitToDumpWatchdogTimerFired); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/Makefile b/Tools/WebKitTestRunner/Makefile new file mode 100644 index 0000000..4648f98 --- /dev/null +++ b/Tools/WebKitTestRunner/Makefile @@ -0,0 +1,21 @@ +# Build WebKitTestRunner only on Snow Leopard and later. + +OSX_VERSION ?= $(shell sw_vers -productVersion | cut -d. -f 2) +BUILD_WEBKITTESTRUNNER = $(shell (( $(OSX_VERSION) >= 6 )) && echo "YES" ) + +ifeq "$(BUILD_WEBKITTESTRUNNER)" "YES" + +SCRIPTS_PATH = ../Scripts +include ../../Makefile.shared + +else + +all: ; + +debug d development dev develop: ; + +release r deployment dep deploy: ; + +clean: ; + +endif diff --git a/Tools/WebKitTestRunner/PlatformWebView.h b/Tools/WebKitTestRunner/PlatformWebView.h new file mode 100644 index 0000000..9739d42 --- /dev/null +++ b/Tools/WebKitTestRunner/PlatformWebView.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef PlatformWebView_h +#define PlatformWebView_h + +#if defined(BUILDING_QT__) +namespace WTR { +class WebView; +} +typedef WTR::WebView* PlatformWKView; +class QMainWindow; +typedef QMainWindow* PlatformWindow; +#elif defined(__APPLE__) && __APPLE__ +#if __OBJC__ +@class WKView; +@class NSWindow; +#else +class WKView; +class NSWindow; +#endif +typedef WKView* PlatformWKView; +typedef NSWindow* PlatformWindow; +#elif defined(WIN32) || defined(_WIN32) +typedef WKViewRef PlatformWKView; +typedef HWND PlatformWindow; +#endif + +namespace WTR { + +class PlatformWebView { +public: + PlatformWebView(WKContextRef, WKPageGroupRef); + ~PlatformWebView(); + + WKPageRef page(); + PlatformWKView platformView() { return m_view; } + void resizeTo(unsigned width, unsigned height); + void focus(); + + WKRect windowFrame(); + void setWindowFrame(WKRect); + +private: + PlatformWKView m_view; + PlatformWindow m_window; +}; + +} // namespace WTR + +#endif // PlatformWebView_h diff --git a/Tools/WebKitTestRunner/StringFunctions.h b/Tools/WebKitTestRunner/StringFunctions.h new file mode 100644 index 0000000..2d0ca72 --- /dev/null +++ b/Tools/WebKitTestRunner/StringFunctions.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010 University of Szeged. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef StringFunctions_h +#define StringFunctions_h + +#include <JavaScriptCore/JSRetainPtr.h> +#include <JavaScriptCore/JavaScript.h> +#include <sstream> +#include <string> +#include <WebKit2/WKRetainPtr.h> +#include <WebKit2/WKString.h> +#include <WebKit2/WKStringPrivate.h> +#include <WebKit2/WKURL.h> +#include <wtf/OwnArrayPtr.h> +#include <wtf/PassOwnArrayPtr.h> +#include <wtf/Platform.h> +#include <wtf/Vector.h> + +namespace WTR { + +// Conversion functions + +inline WKRetainPtr<WKStringRef> toWK(JSStringRef string) +{ + return WKRetainPtr<WKStringRef>(AdoptWK, WKStringCreateWithJSString(string)); +} + +inline WKRetainPtr<WKStringRef> toWK(JSRetainPtr<JSStringRef> string) +{ + return toWK(string.get()); +} + +inline JSRetainPtr<JSStringRef> toJS(WKStringRef string) +{ + return JSRetainPtr<JSStringRef>(Adopt, WKStringCopyJSString(string)); +} + +inline JSRetainPtr<JSStringRef> toJS(const WKRetainPtr<WKStringRef>& string) +{ + return toJS(string.get()); +} + +inline std::string toSTD(WKStringRef string) +{ + size_t bufferSize = WKStringGetMaximumUTF8CStringSize(string); + OwnArrayPtr<char> buffer = adoptArrayPtr(new char[bufferSize]); + size_t stringLength = WKStringGetUTF8CString(string, buffer.get(), bufferSize); + return std::string(buffer.get(), stringLength - 1); +} + +inline std::string toSTD(const WKRetainPtr<WKStringRef>& string) +{ + return toSTD(string.get()); +} + +// Streaming functions + +inline std::ostream& operator<<(std::ostream& out, WKStringRef stringRef) +{ + if (!stringRef) + return out; + + return out << toSTD(stringRef); +} + +inline std::ostream& operator<<(std::ostream& out, const WKRetainPtr<WKStringRef>& stringRef) +{ + return out << stringRef.get(); +} + +} // namespace WTR + +#endif // StringFunctions_h diff --git a/Tools/WebKitTestRunner/TestController.cpp b/Tools/WebKitTestRunner/TestController.cpp new file mode 100644 index 0000000..77213a2 --- /dev/null +++ b/Tools/WebKitTestRunner/TestController.cpp @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "TestController.h" + +#include "PlatformWebView.h" +#include "StringFunctions.h" +#include "TestInvocation.h" +#include <cstdio> +#include <WebKit2/WKPageGroup.h> +#include <WebKit2/WKContextPrivate.h> +#include <WebKit2/WKPreferencesPrivate.h> +#include <wtf/PassOwnPtr.h> + +namespace WTR { + +static const double defaultLongTimeout = 30; +static const double defaultShortTimeout = 5; + +static WKURLRef blankURL() +{ + static WKURLRef staticBlankURL = WKURLCreateWithUTF8CString("about:blank"); + return staticBlankURL; +} + +static TestController* controller; + +TestController& TestController::shared() +{ + ASSERT(controller); + return *controller; +} + +TestController::TestController(int argc, const char* argv[]) + : m_dumpPixels(false) + , m_verbose(false) + , m_printSeparators(false) + , m_usingServerMode(false) + , m_state(Initial) + , m_doneResetting(false) + , m_longTimeout(defaultLongTimeout) + , m_shortTimeout(defaultShortTimeout) +{ + initialize(argc, argv); + controller = this; + run(); + controller = 0; +} + +TestController::~TestController() +{ +} + +static WKRect getWindowFrameMainPage(WKPageRef page, const void* clientInfo) +{ + PlatformWebView* view = static_cast<TestController*>(const_cast<void*>(clientInfo))->mainWebView(); + return view->windowFrame(); +} + +static void setWindowFrameMainPage(WKPageRef page, WKRect frame, const void* clientInfo) +{ + PlatformWebView* view = static_cast<TestController*>(const_cast<void*>(clientInfo))->mainWebView(); + view->setWindowFrame(frame); +} + +static WKRect getWindowFrameOtherPage(WKPageRef page, const void* clientInfo) +{ + PlatformWebView* view = static_cast<PlatformWebView*>(const_cast<void*>(clientInfo)); + return view->windowFrame(); +} + +static void setWindowFrameOtherPage(WKPageRef page, WKRect frame, const void* clientInfo) +{ + PlatformWebView* view = static_cast<PlatformWebView*>(const_cast<void*>(clientInfo)); + view->setWindowFrame(frame); +} + +static void closeOtherPage(WKPageRef page, const void* clientInfo) +{ + WKPageClose(page); + const PlatformWebView* view = static_cast<const PlatformWebView*>(clientInfo); + delete view; +} + +static WKPageRef createOtherPage(WKPageRef oldPage, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void*) +{ + PlatformWebView* view = new PlatformWebView(WKPageGetContext(oldPage), WKPageGetPageGroup(oldPage)); + WKPageRef newPage = view->page(); + + view->resizeTo(800, 600); + + WKPageUIClient otherPageUIClient = { + 0, + view, + createOtherPage, + 0, // showPage + closeOtherPage, + 0, // runJavaScriptAlert + 0, // runJavaScriptConfirm + 0, // runJavaScriptPrompt + 0, // setStatusText + 0, // mouseDidMoveOverElement + 0, // missingPluginButtonClicked + 0, // didNotHandleKeyEvent + 0, // toolbarsAreVisible + 0, // setToolbarsAreVisible + 0, // menuBarIsVisible + 0, // setMenuBarIsVisible + 0, // statusBarIsVisible + 0, // setStatusBarIsVisible + 0, // isResizable + 0, // setIsResizable + getWindowFrameOtherPage, + setWindowFrameOtherPage, + 0, // runBeforeUnloadConfirmPanel + 0, // didDraw + 0, // pageDidScroll + 0, // exceededDatabaseQuota + 0 // runOpenPanel + }; + WKPageSetPageUIClient(newPage, &otherPageUIClient); + + WKRetain(newPage); + return newPage; +} + +void TestController::initialize(int argc, const char* argv[]) +{ + platformInitialize(); + + bool printSupportedFeatures = false; + + for (int i = 1; i < argc; ++i) { + std::string argument(argv[i]); + + if (argument == "--timeout" && i + 1 < argc) { + m_longTimeout = atoi(argv[++i]); + // Scale up the short timeout to match. + m_shortTimeout = defaultShortTimeout * m_longTimeout / defaultLongTimeout; + continue; + } + if (argument == "--pixel-tests") { + m_dumpPixels = true; + continue; + } + if (argument == "--verbose") { + m_verbose = true; + continue; + } + if (argument == "--print-supported-features") { + printSupportedFeatures = true; + break; + } + + // Skip any other arguments that begin with '--'. + if (argument.length() >= 2 && argument[0] == '-' && argument[1] == '-') + continue; + + m_paths.push_back(argument); + } + + if (printSupportedFeatures) { + // FIXME: On Windows, DumpRenderTree uses this to expose whether it supports 3d + // transforms and accelerated compositing. When we support those features, we + // should match DRT's behavior. + exit(0); + } + + m_usingServerMode = (m_paths.size() == 1 && m_paths[0] == "-"); + if (m_usingServerMode) + m_printSeparators = true; + else + m_printSeparators = m_paths.size() > 1; + + initializeInjectedBundlePath(); + initializeTestPluginDirectory(); + + WKRetainPtr<WKStringRef> pageGroupIdentifier(AdoptWK, WKStringCreateWithUTF8CString("WebKitTestRunnerPageGroup")); + m_pageGroup.adopt(WKPageGroupCreateWithIdentifier(pageGroupIdentifier.get())); + + m_context.adopt(WKContextCreateWithInjectedBundlePath(injectedBundlePath())); + platformInitializeContext(); + + WKContextInjectedBundleClient injectedBundleClient = { + 0, + this, + didReceiveMessageFromInjectedBundle, + didReceiveSynchronousMessageFromInjectedBundle + }; + WKContextSetInjectedBundleClient(m_context.get(), &injectedBundleClient); + + _WKContextSetAdditionalPluginsDirectory(m_context.get(), testPluginDirectory()); + + m_mainWebView = adoptPtr(new PlatformWebView(m_context.get(), m_pageGroup.get())); + + WKPageUIClient pageUIClient = { + 0, + this, + createOtherPage, + 0, // showPage + 0, // close + 0, // runJavaScriptAlert + 0, // runJavaScriptConfirm + 0, // runJavaScriptPrompt + 0, // setStatusText + 0, // mouseDidMoveOverElement + 0, // missingPluginButtonClicked + 0, // didNotHandleKeyEvent + 0, // toolbarsAreVisible + 0, // setToolbarsAreVisible + 0, // menuBarIsVisible + 0, // setMenuBarIsVisible + 0, // statusBarIsVisible + 0, // setStatusBarIsVisible + 0, // isResizable + 0, // setIsResizable + getWindowFrameMainPage, + setWindowFrameMainPage, + 0, // runBeforeUnloadConfirmPanel + 0, // didDraw + 0, // pageDidScroll + 0, // exceededDatabaseQuota + 0 // runOpenPanel + }; + WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient); + + WKPageLoaderClient pageLoaderClient = { + 0, + this, + 0, // didStartProvisionalLoadForFrame + 0, // didReceiveServerRedirectForProvisionalLoadForFrame + 0, // didFailProvisionalLoadWithErrorForFrame + 0, // didCommitLoadForFrame + 0, // didFinishDocumentLoadForFrame + didFinishLoadForFrame, + 0, // didFailLoadWithErrorForFrame + 0, // didSameDocumentNavigationForFrame + 0, // didReceiveTitleForFrame + 0, // didFirstLayoutForFrame + 0, // didFirstVisuallyNonEmptyLayoutForFrame + 0, // didRemoveFrameFromHierarchy + 0, // didDisplayInsecureContentForFrame + 0, // didRunInsecureContentForFrame + 0, // canAuthenticateAgainstProtectionSpaceInFrame + 0, // didReceiveAuthenticationChallengeInFrame + 0, // didStartProgress + 0, // didChangeProgress + 0, // didFinishProgress + 0, // didBecomeUnresponsive + 0, // didBecomeResponsive + 0, // processDidExit + 0 // didChangeBackForwardList + }; + WKPageSetPageLoaderClient(m_mainWebView->page(), &pageLoaderClient); +} + +bool TestController::resetStateToConsistentValues() +{ + m_state = Resetting; + + // FIXME: This function should also ensure that there is only one page open. + + // Reset preferences + WKPreferencesRef preferences = WKPageGroupGetPreferences(m_pageGroup.get()); + WKPreferencesSetOfflineWebApplicationCacheEnabled(preferences, true); + WKPreferencesSetFontSmoothingLevel(preferences, kWKFontSmoothingLevelNoSubpixelAntiAliasing); + WKPreferencesSetXSSAuditorEnabled(preferences, false); + WKPreferencesSetDeveloperExtrasEnabled(preferences, true); + WKPreferencesSetJavaScriptCanOpenWindowsAutomatically(preferences, true); + + static WKStringRef standardFontFamily = WKStringCreateWithUTF8CString("Times"); + static WKStringRef cursiveFontFamily = WKStringCreateWithUTF8CString("Apple Chancery"); + static WKStringRef fantasyFontFamily = WKStringCreateWithUTF8CString("Papyrus"); + static WKStringRef fixedFontFamily = WKStringCreateWithUTF8CString("Courier"); + static WKStringRef sansSerifFontFamily = WKStringCreateWithUTF8CString("Helvetica"); + static WKStringRef serifFontFamily = WKStringCreateWithUTF8CString("Times"); + + WKPreferencesSetStandardFontFamily(preferences, standardFontFamily); + WKPreferencesSetCursiveFontFamily(preferences, cursiveFontFamily); + WKPreferencesSetFantasyFontFamily(preferences, fantasyFontFamily); + WKPreferencesSetFixedFontFamily(preferences, fixedFontFamily); + WKPreferencesSetSansSerifFontFamily(preferences, sansSerifFontFamily); + WKPreferencesSetSerifFontFamily(preferences, serifFontFamily); + + m_mainWebView->focus(); + + // Reset main page back to about:blank + m_doneResetting = false; + + WKPageLoadURL(m_mainWebView->page(), blankURL()); + runUntil(m_doneResetting, ShortTimeout); + return m_doneResetting; +} + +bool TestController::runTest(const char* test) +{ + if (!resetStateToConsistentValues()) + return false; + + m_state = RunningTest; + m_currentInvocation.set(new TestInvocation(test)); + m_currentInvocation->invoke(); + m_currentInvocation.clear(); + + return true; +} + +void TestController::runTestingServerLoop() +{ + char filenameBuffer[2048]; + while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) { + char *newLineCharacter = strchr(filenameBuffer, '\n'); + if (newLineCharacter) + *newLineCharacter = '\0'; + + if (strlen(filenameBuffer) == 0) + continue; + + if (!runTest(filenameBuffer)) + break; + } +} + +void TestController::run() +{ + if (m_usingServerMode) + runTestingServerLoop(); + else { + for (size_t i = 0; i < m_paths.size(); ++i) { + if (!runTest(m_paths[i].c_str())) + break; + } + } +} + +void TestController::runUntil(bool& done, TimeoutDuration timeoutDuration) +{ + platformRunUntil(done, timeoutDuration == ShortTimeout ? m_shortTimeout : m_longTimeout); +} + +// WKContextInjectedBundleClient + +void TestController::didReceiveMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo) +{ + static_cast<TestController*>(const_cast<void*>(clientInfo))->didReceiveMessageFromInjectedBundle(messageName, messageBody); +} + +void TestController::didReceiveSynchronousMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void* clientInfo) +{ + *returnData = static_cast<TestController*>(const_cast<void*>(clientInfo))->didReceiveSynchronousMessageFromInjectedBundle(messageName, messageBody).leakRef(); +} + +void TestController::didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody) +{ + m_currentInvocation->didReceiveMessageFromInjectedBundle(messageName, messageBody); +} + +WKRetainPtr<WKTypeRef> TestController::didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody) +{ + return m_currentInvocation->didReceiveSynchronousMessageFromInjectedBundle(messageName, messageBody); +} + +// WKPageLoaderClient + +void TestController::didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef, const void* clientInfo) +{ + static_cast<TestController*>(const_cast<void*>(clientInfo))->didFinishLoadForFrame(page, frame); +} + +void TestController::didFinishLoadForFrame(WKPageRef page, WKFrameRef frame) +{ + if (m_state != Resetting) + return; + + if (!WKFrameIsMainFrame(frame)) + return; + + WKRetainPtr<WKURLRef> wkURL(AdoptWK, WKFrameCopyURL(frame)); + if (!WKURLIsEqual(wkURL.get(), blankURL())) + return; + + m_doneResetting = true; + shared().notifyDone(); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/TestController.h b/Tools/WebKitTestRunner/TestController.h new file mode 100644 index 0000000..ef41314 --- /dev/null +++ b/Tools/WebKitTestRunner/TestController.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef TestController_h +#define TestController_h + +#include <WebKit2/WKRetainPtr.h> +#include <string> +#include <vector> +#include <wtf/OwnPtr.h> + +namespace WTR { + +class TestInvocation; +class PlatformWebView; + +// FIXME: Rename this TestRunner? +class TestController { +public: + static TestController& shared(); + + TestController(int argc, const char* argv[]); + ~TestController(); + + bool verbose() const { return m_verbose; } + + WKStringRef injectedBundlePath() { return m_injectedBundlePath.get(); } + WKStringRef testPluginDirectory() { return m_testPluginDirectory.get(); } + + PlatformWebView* mainWebView() { return m_mainWebView.get(); } + WKContextRef context() { return m_context.get(); } + + // Runs the run loop until `done` is true or the timeout elapses. + enum TimeoutDuration { ShortTimeout, LongTimeout }; + void runUntil(bool& done, TimeoutDuration); + void notifyDone(); + +private: + void initialize(int argc, const char* argv[]); + void run(); + + void runTestingServerLoop(); + bool runTest(const char* pathOrURL); + + void platformInitialize(); + void platformInitializeContext(); + void platformRunUntil(bool& done, double timeout); + void initializeInjectedBundlePath(); + void initializeTestPluginDirectory(); + + bool resetStateToConsistentValues(); + + // WKContextInjectedBundleClient + static void didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void*); + static void didReceiveSynchronousMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void*); + void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody); + WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody); + + // WKPageLoaderClient + static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void*); + void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame); + + + OwnPtr<TestInvocation> m_currentInvocation; + + bool m_dumpPixels; + bool m_verbose; + bool m_printSeparators; + bool m_usingServerMode; + std::vector<std::string> m_paths; + WKRetainPtr<WKStringRef> m_injectedBundlePath; + WKRetainPtr<WKStringRef> m_testPluginDirectory; + + OwnPtr<PlatformWebView> m_mainWebView; + WKRetainPtr<WKContextRef> m_context; + WKRetainPtr<WKPageGroupRef> m_pageGroup; + + enum State { + Initial, + Resetting, + RunningTest + }; + State m_state; + bool m_doneResetting; + + double m_longTimeout; + double m_shortTimeout; +}; + +} // namespace WTR + +#endif // TestController_h diff --git a/Tools/WebKitTestRunner/TestInvocation.cpp b/Tools/WebKitTestRunner/TestInvocation.cpp new file mode 100644 index 0000000..26ecfc0 --- /dev/null +++ b/Tools/WebKitTestRunner/TestInvocation.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "TestInvocation.h" + +#include "PlatformWebView.h" +#include "StringFunctions.h" +#include "TestController.h" +#include <climits> +#include <cstdio> +#include <WebKit2/WKContextPrivate.h> +#include <WebKit2/WKRetainPtr.h> +#include <wtf/OwnArrayPtr.h> +#include <wtf/PassOwnArrayPtr.h> + +#if OS(WINDOWS) +#include <direct.h> // For _getcwd. +#define getcwd _getcwd // MSDN says getcwd is deprecated. +#define PATH_MAX _MAX_PATH +#endif + +using namespace WebKit; +using namespace std; + +namespace WTR { + +static WKURLRef createWKURL(const char* pathOrURL) +{ + if (strstr(pathOrURL, "http://") || strstr(pathOrURL, "https://") || strstr(pathOrURL, "file://")) + return WKURLCreateWithUTF8CString(pathOrURL); + + // Creating from filesytem path. + size_t length = strlen(pathOrURL); + if (!length) + return 0; + + const char* filePrefix = "file://"; + static const size_t prefixLength = strlen(filePrefix); +#if OS(WINDOWS) + const char separator = '\\'; + bool isAbsolutePath = length >= 3 && pathOrURL[1] == ':' && pathOrURL[2] == separator; +#else + const char separator = '/'; + bool isAbsolutePath = pathOrURL[0] == separator; +#endif + + OwnArrayPtr<char> buffer; + if (isAbsolutePath) { + buffer = adoptArrayPtr(new char[prefixLength + length + 1]); + strcpy(buffer.get(), filePrefix); + strcpy(buffer.get() + prefixLength, pathOrURL); + } else { + buffer = adoptArrayPtr(new char[prefixLength + PATH_MAX + length + 2]); // 1 for the separator + strcpy(buffer.get(), filePrefix); + if (!getcwd(buffer.get() + prefixLength, PATH_MAX)) + return 0; + size_t numCharacters = strlen(buffer.get()); + buffer[numCharacters] = separator; + strcpy(buffer.get() + numCharacters + 1, pathOrURL); + } + + return WKURLCreateWithUTF8CString(buffer.get()); +} + +TestInvocation::TestInvocation(const char* pathOrURL) + : m_url(AdoptWK, createWKURL(pathOrURL)) + , m_pathOrURL(fastStrDup(pathOrURL)) + , m_gotInitialResponse(false) + , m_gotFinalMessage(false) + , m_error(false) +{ +} + +TestInvocation::~TestInvocation() +{ + fastFree(m_pathOrURL); +} + +static const unsigned w3cSVGWidth = 480; +static const unsigned w3cSVGHeight = 360; +static const unsigned normalWidth = 800; +static const unsigned normalHeight = 600; + +static void sizeWebViewForCurrentTest(char* pathOrURL) +{ + bool isSVGW3CTest = strstr(pathOrURL, "svg/W3C-SVG-1.1") || strstr(pathOrURL, "svg\\W3C-SVG-1.1"); + + if (isSVGW3CTest) + TestController::shared().mainWebView()->resizeTo(w3cSVGWidth, w3cSVGHeight); + else + TestController::shared().mainWebView()->resizeTo(normalWidth, normalHeight); +} + +void TestInvocation::invoke() +{ + sizeWebViewForCurrentTest(m_pathOrURL); + + WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("BeginTest")); + WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), 0); + + TestController::shared().runUntil(m_gotInitialResponse, TestController::ShortTimeout); + if (!m_gotInitialResponse) { + dump("Timed out waiting for initial response from web process\n"); + return; + } + if (m_error) { + dump("FAIL\n"); + return; + } + + WKPageLoadURL(TestController::shared().mainWebView()->page(), m_url.get()); + + TestController::shared().runUntil(m_gotFinalMessage, TestController::LongTimeout); + if (!m_gotFinalMessage) { + dump("Timed out waiting for final message from web process\n"); + return; + } + if (m_error) { + dump("FAIL\n"); + return; + } +} + +void TestInvocation::dump(const char* stringToDump) +{ + printf("Content-Type: text/plain\n"); + printf("%s", stringToDump); + + fputs("#EOF\n", stdout); + fputs("#EOF\n", stdout); + fputs("#EOF\n", stderr); + + fflush(stdout); + fflush(stderr); +} + +void TestInvocation::didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody) +{ + if (WKStringIsEqualToUTF8CString(messageName, "Error")) { + // Set all states to true to stop spinning the runloop. + m_gotInitialResponse = true; + m_gotFinalMessage = true; + m_error = true; + TestController::shared().notifyDone(); + return; + } + + if (WKStringIsEqualToUTF8CString(messageName, "Ack")) { + ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID()); + WKStringRef messageBodyString = static_cast<WKStringRef>(messageBody); + if (WKStringIsEqualToUTF8CString(messageBodyString, "BeginTest")) { + m_gotInitialResponse = true; + TestController::shared().notifyDone(); + return; + } + + ASSERT_NOT_REACHED(); + } + + if (WKStringIsEqualToUTF8CString(messageName, "Done")) { + ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID()); + WKStringRef messageBodyString = static_cast<WKStringRef>(messageBody); + + dump(toSTD(messageBodyString).c_str()); + + m_gotFinalMessage = true; + TestController::shared().notifyDone(); + return; + } + + ASSERT_NOT_REACHED(); +} + +WKRetainPtr<WKTypeRef> TestInvocation::didReceiveSynchronousMessageFromInjectedBundle(WKStringRef /*messageName*/, WKTypeRef /*messageBody*/) +{ + ASSERT_NOT_REACHED(); + return 0; +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/TestInvocation.h b/Tools/WebKitTestRunner/TestInvocation.h new file mode 100644 index 0000000..fec1f7a --- /dev/null +++ b/Tools/WebKitTestRunner/TestInvocation.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifndef TestInvocation_h +#define TestInvocation_h + +#include <WebKit2/WKRetainPtr.h> +#include <wtf/Noncopyable.h> + +namespace WTR { + +class TestInvocation : public Noncopyable { +public: + TestInvocation(const char*); + ~TestInvocation(); + + void invoke(); + void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody); + WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody); + +private: + void dump(const char*); + + WKRetainPtr<WKURLRef> m_url; + char* m_pathOrURL; + + // Invocation state + bool m_gotInitialResponse; + bool m_gotFinalMessage; + bool m_error; +}; + +} // namespace WTR + +#endif // TestInvocation_h diff --git a/Tools/WebKitTestRunner/WebKitTestRunner.pro b/Tools/WebKitTestRunner/WebKitTestRunner.pro new file mode 100644 index 0000000..677abb3 --- /dev/null +++ b/Tools/WebKitTestRunner/WebKitTestRunner.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +SUBDIRS = qt/WebKitTestRunner.pro \ + InjectedBundle/qt/InjectedBundle.pro \ + diff --git a/Tools/WebKitTestRunner/WebKitTestRunner.sln b/Tools/WebKitTestRunner/WebKitTestRunner.sln new file mode 100644 index 0000000..3384503 --- /dev/null +++ b/Tools/WebKitTestRunner/WebKitTestRunner.sln @@ -0,0 +1,91 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebKitTestRunner", "win\WebKitTestRunner.vcproj", "{3B99669B-1817-443B-BCBE-835580146668}" + ProjectSection(ProjectDependencies) = postProject + {CBC3391C-F060-4BF5-A66E-81404168816B} = {CBC3391C-F060-4BF5-A66E-81404168816B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InjectedBundleGenerated", "win\InjectedBundleGenerated.vcproj", "{4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}" + ProjectSection(ProjectDependencies) = postProject + {C0737398-3565-439E-A2B8-AB2BE4D5430C} = {C0737398-3565-439E-A2B8-AB2BE4D5430C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FindSafari", "..\FindSafari\FindSafari.vcproj", "{DA31DA52-6675-48D4-89E0-333A7144397C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageDiff", "..\DumpRenderTree\win\ImageDiff.vcproj", "{59CC0547-70AC-499C-9B19-EC01C6F61137}" + ProjectSection(ProjectDependencies) = postProject + {DA31DA52-6675-48D4-89E0-333A7144397C} = {DA31DA52-6675-48D4-89E0-333A7144397C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InjectedBundle", "win\InjectedBundle.vcproj", "{CBC3391C-F060-4BF5-A66E-81404168816B}" + ProjectSection(ProjectDependencies) = postProject + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD} = {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestNetscapePlugin", "..\DumpRenderTree\TestNetscapePlugIn\win\TestNetscapePlugin.vcproj", "{C0737398-3565-439E-A2B8-AB2BE4D5430C}" + ProjectSection(ProjectDependencies) = postProject + {59CC0547-70AC-499C-9B19-EC01C6F61137} = {59CC0547-70AC-499C-9B19-EC01C6F61137} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_All|Win32 = Debug_All|Win32 + Debug|Win32 = Debug|Win32 + Release_LTCG|Win32 = Release_LTCG|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3B99669B-1817-443B-BCBE-835580146668}.Debug_All|Win32.ActiveCfg = Debug_All|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Debug_All|Win32.Build.0 = Debug_All|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Debug|Win32.Build.0 = Debug|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Release_LTCG|Win32.ActiveCfg = Release_LTCG|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Release_LTCG|Win32.Build.0 = Release_LTCG|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Release|Win32.ActiveCfg = Release|Win32 + {3B99669B-1817-443B-BCBE-835580146668}.Release|Win32.Build.0 = Release|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Debug_All|Win32.ActiveCfg = Debug_All|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Debug_All|Win32.Build.0 = Debug_All|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Debug|Win32.ActiveCfg = Debug|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Debug|Win32.Build.0 = Debug|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Release_LTCG|Win32.ActiveCfg = Release_LTCG|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Release_LTCG|Win32.Build.0 = Release_LTCG|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Release|Win32.ActiveCfg = Release|Win32 + {4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}.Release|Win32.Build.0 = Release|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Debug_All|Win32.ActiveCfg = Debug_All|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Debug_All|Win32.Build.0 = Debug_All|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Debug|Win32.Build.0 = Debug|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Release_LTCG|Win32.ActiveCfg = Release_LTCG|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Release_LTCG|Win32.Build.0 = Release_LTCG|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Release|Win32.ActiveCfg = Release|Win32 + {DA31DA52-6675-48D4-89E0-333A7144397C}.Release|Win32.Build.0 = Release|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Debug_All|Win32.ActiveCfg = Debug_All|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Debug_All|Win32.Build.0 = Debug_All|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Debug|Win32.ActiveCfg = Debug|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Debug|Win32.Build.0 = Debug|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Release_LTCG|Win32.ActiveCfg = Release_LTCG|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Release_LTCG|Win32.Build.0 = Release_LTCG|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Release|Win32.ActiveCfg = Release|Win32 + {59CC0547-70AC-499C-9B19-EC01C6F61137}.Release|Win32.Build.0 = Release|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Debug_All|Win32.ActiveCfg = Debug_All|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Debug_All|Win32.Build.0 = Debug_All|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Debug|Win32.ActiveCfg = Debug|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Debug|Win32.Build.0 = Debug|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Release_LTCG|Win32.ActiveCfg = Release_LTCG|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Release_LTCG|Win32.Build.0 = Release_LTCG|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Release|Win32.ActiveCfg = Release|Win32 + {CBC3391C-F060-4BF5-A66E-81404168816B}.Release|Win32.Build.0 = Release|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Debug_All|Win32.ActiveCfg = Debug_All|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Debug_All|Win32.Build.0 = Debug_All|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Debug|Win32.ActiveCfg = Debug|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Debug|Win32.Build.0 = Debug|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Release_LTCG|Win32.ActiveCfg = Release_LTCG|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Release_LTCG|Win32.Build.0 = Release_LTCG|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Release|Win32.ActiveCfg = Release|Win32 + {C0737398-3565-439E-A2B8-AB2BE4D5430C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj b/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a15fe41 --- /dev/null +++ b/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj @@ -0,0 +1,582 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXAggregateTarget section */ + BC952D7711F3BF5D003398B4 /* Derived Sources */ = { + isa = PBXAggregateTarget; + buildConfigurationList = BC952D7D11F3BF6A003398B4 /* Build configuration list for PBXAggregateTarget "Derived Sources" */; + buildPhases = ( + BC952D8211F3BF78003398B4 /* Generate Derived Sources */, + ); + dependencies = ( + ); + name = "Derived Sources"; + productName = "Derived Sources"; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 6510A78211EC643800410867 /* AHEM____.TTF in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77711EC643800410867 /* AHEM____.TTF */; }; + 6510A78311EC643800410867 /* ColorBits.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77811EC643800410867 /* ColorBits.ttf */; }; + 6510A78411EC643800410867 /* WebKitWeightWatcher100.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77911EC643800410867 /* WebKitWeightWatcher100.ttf */; }; + 6510A78511EC643800410867 /* WebKitWeightWatcher200.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77A11EC643800410867 /* WebKitWeightWatcher200.ttf */; }; + 6510A78611EC643800410867 /* WebKitWeightWatcher300.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77B11EC643800410867 /* WebKitWeightWatcher300.ttf */; }; + 6510A78711EC643800410867 /* WebKitWeightWatcher400.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77C11EC643800410867 /* WebKitWeightWatcher400.ttf */; }; + 6510A78811EC643800410867 /* WebKitWeightWatcher500.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77D11EC643800410867 /* WebKitWeightWatcher500.ttf */; }; + 6510A78911EC643800410867 /* WebKitWeightWatcher600.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77E11EC643800410867 /* WebKitWeightWatcher600.ttf */; }; + 6510A78A11EC643800410867 /* WebKitWeightWatcher700.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A77F11EC643800410867 /* WebKitWeightWatcher700.ttf */; }; + 6510A78B11EC643800410867 /* WebKitWeightWatcher800.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A78011EC643800410867 /* WebKitWeightWatcher800.ttf */; }; + 6510A78C11EC643800410867 /* WebKitWeightWatcher900.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A78111EC643800410867 /* WebKitWeightWatcher900.ttf */; }; + 65EB85A011EC67CC0034D300 /* ActivateFonts.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65EB859F11EC67CC0034D300 /* ActivateFonts.mm */; }; + BC14E4DB120E02D000826C0C /* GCController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC14E4D9120E02D000826C0C /* GCController.cpp */; }; + BC14E4EA120E03D800826C0C /* JSGCController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC14E4E8120E03D800826C0C /* JSGCController.cpp */; }; + BC25193E11D15D8B002EBC01 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC7934A411906584005EA8E2 /* Cocoa.framework */; }; + BC25193F11D15D8B002EBC01 /* WebKit2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC7934AB1190658C005EA8E2 /* WebKit2.framework */; }; + BC25194011D15D8B002EBC01 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */; }; + BC251A3E11D16831002EBC01 /* InjectedBundleMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC25184611D15767002EBC01 /* InjectedBundleMain.cpp */; }; + BC793400118F7C84005EA8E2 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC7933FF118F7C84005EA8E2 /* main.mm */; }; + BC793431118F7F19005EA8E2 /* TestController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC793430118F7F19005EA8E2 /* TestController.cpp */; }; + BC7934A511906584005EA8E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC7934A411906584005EA8E2 /* Cocoa.framework */; }; + BC7934AC1190658C005EA8E2 /* WebKit2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC7934AB1190658C005EA8E2 /* WebKit2.framework */; }; + BC7934E811906846005EA8E2 /* PlatformWebViewMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC7934E711906846005EA8E2 /* PlatformWebViewMac.mm */; }; + BC8C795C11D2785D004535A1 /* TestControllerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC8C795B11D2785D004535A1 /* TestControllerMac.mm */; }; + BC8FD8CA120E527F00F3E71A /* EventSendingController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC8FD8C9120E527F00F3E71A /* EventSendingController.cpp */; }; + BC8FD8D2120E545B00F3E71A /* JSEventSendingController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC8FD8D0120E545B00F3E71A /* JSEventSendingController.cpp */; }; + BC952C0D11F3B965003398B4 /* JSWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC952C0C11F3B965003398B4 /* JSWrapper.cpp */; }; + BC952F1F11F3C652003398B4 /* JSLayoutTestController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC952F1D11F3C652003398B4 /* JSLayoutTestController.cpp */; }; + BCC997A411D3C8F60017BCA2 /* InjectedBundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCC997A011D3C8F60017BCA2 /* InjectedBundle.cpp */; }; + BCC997A511D3C8F60017BCA2 /* InjectedBundlePage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCC997A211D3C8F60017BCA2 /* InjectedBundlePage.cpp */; }; + BCC9981811D3F51E0017BCA2 /* LayoutTestController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCC9981711D3F51E0017BCA2 /* LayoutTestController.cpp */; }; + BCD7D2F811921278006DB7EE /* TestInvocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCD7D2F711921278006DB7EE /* TestInvocation.cpp */; }; + BCDA2B9A1191051F00C3BC47 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */; }; + C0CE720B1247C93300BC0EC4 /* LayoutTestControllerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C0CE720A1247C93300BC0EC4 /* LayoutTestControllerMac.mm */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BC25194111D15D94002EBC01 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BC25186111D15D54002EBC01; + remoteInfo = InjectedBundle; + }; + BC952ED611F3C38B003398B4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BC952D7711F3BF5D003398B4; + remoteInfo = "Derived Sources"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6510A77711EC643800410867 /* AHEM____.TTF */ = {isa = PBXFileReference; lastKnownFileType = file; name = "AHEM____.TTF"; path = "fonts/AHEM____.TTF"; sourceTree = "<group>"; }; + 6510A77811EC643800410867 /* ColorBits.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = ColorBits.ttf; path = fonts/ColorBits.ttf; sourceTree = "<group>"; }; + 6510A77911EC643800410867 /* WebKitWeightWatcher100.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher100.ttf; path = fonts/WebKitWeightWatcher100.ttf; sourceTree = "<group>"; }; + 6510A77A11EC643800410867 /* WebKitWeightWatcher200.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher200.ttf; path = fonts/WebKitWeightWatcher200.ttf; sourceTree = "<group>"; }; + 6510A77B11EC643800410867 /* WebKitWeightWatcher300.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher300.ttf; path = fonts/WebKitWeightWatcher300.ttf; sourceTree = "<group>"; }; + 6510A77C11EC643800410867 /* WebKitWeightWatcher400.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher400.ttf; path = fonts/WebKitWeightWatcher400.ttf; sourceTree = "<group>"; }; + 6510A77D11EC643800410867 /* WebKitWeightWatcher500.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher500.ttf; path = fonts/WebKitWeightWatcher500.ttf; sourceTree = "<group>"; }; + 6510A77E11EC643800410867 /* WebKitWeightWatcher600.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher600.ttf; path = fonts/WebKitWeightWatcher600.ttf; sourceTree = "<group>"; }; + 6510A77F11EC643800410867 /* WebKitWeightWatcher700.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher700.ttf; path = fonts/WebKitWeightWatcher700.ttf; sourceTree = "<group>"; }; + 6510A78011EC643800410867 /* WebKitWeightWatcher800.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher800.ttf; path = fonts/WebKitWeightWatcher800.ttf; sourceTree = "<group>"; }; + 6510A78111EC643800410867 /* WebKitWeightWatcher900.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = WebKitWeightWatcher900.ttf; path = fonts/WebKitWeightWatcher900.ttf; sourceTree = "<group>"; }; + 65EB859D11EC67CC0034D300 /* ActivateFonts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivateFonts.h; sourceTree = "<group>"; }; + 65EB859F11EC67CC0034D300 /* ActivateFonts.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivateFonts.mm; sourceTree = "<group>"; }; + 8DD76FA10486AA7600D96B5E /* WebKitTestRunner */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = WebKitTestRunner; sourceTree = BUILT_PRODUCTS_DIR; }; + BC14E4D8120E02D000826C0C /* GCController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCController.h; sourceTree = "<group>"; }; + BC14E4D9120E02D000826C0C /* GCController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GCController.cpp; sourceTree = "<group>"; }; + BC14E4E1120E032000826C0C /* GCController.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GCController.idl; sourceTree = "<group>"; }; + BC14E4E8120E03D800826C0C /* JSGCController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSGCController.cpp; path = DerivedSources/WebKitTestRunner/JSGCController.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; + BC14E4E9120E03D800826C0C /* JSGCController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSGCController.h; path = DerivedSources/WebKitTestRunner/JSGCController.h; sourceTree = BUILT_PRODUCTS_DIR; }; + BC25184611D15767002EBC01 /* InjectedBundleMain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleMain.cpp; sourceTree = "<group>"; }; + BC25186211D15D54002EBC01 /* WebKitTestRunnerInjectedBundle.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebKitTestRunnerInjectedBundle.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + BC25186311D15D54002EBC01 /* InjectedBundle-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "InjectedBundle-Info.plist"; sourceTree = "<group>"; }; + BC25197111D15E61002EBC01 /* InjectedBundle.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = InjectedBundle.xcconfig; sourceTree = "<group>"; }; + BC251A1711D16774002EBC01 /* WebKitTestRunnerPrefix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitTestRunnerPrefix.h; sourceTree = "<group>"; }; + BC251A1811D16795002EBC01 /* WebKitTestRunner.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = WebKitTestRunner.xcconfig; sourceTree = "<group>"; }; + BC7933FF118F7C84005EA8E2 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; }; + BC793426118F7D3C005EA8E2 /* Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = "<group>"; }; + BC793427118F7DAF005EA8E2 /* DebugRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugRelease.xcconfig; sourceTree = "<group>"; }; + BC79342F118F7F19005EA8E2 /* TestController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestController.h; sourceTree = "<group>"; }; + BC793430118F7F19005EA8E2 /* TestController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestController.cpp; sourceTree = "<group>"; }; + BC7934A411906584005EA8E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + BC7934AB1190658C005EA8E2 /* WebKit2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = WebKit2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC7934DD119066EC005EA8E2 /* PlatformWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformWebView.h; sourceTree = "<group>"; }; + BC7934E711906846005EA8E2 /* PlatformWebViewMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlatformWebViewMac.mm; sourceTree = "<group>"; }; + BC8C795B11D2785D004535A1 /* TestControllerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TestControllerMac.mm; sourceTree = "<group>"; }; + BC8FD8C8120E527F00F3E71A /* EventSendingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventSendingController.h; sourceTree = "<group>"; }; + BC8FD8C9120E527F00F3E71A /* EventSendingController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventSendingController.cpp; sourceTree = "<group>"; }; + BC8FD8CB120E52B000F3E71A /* EventSendingController.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventSendingController.idl; sourceTree = "<group>"; }; + BC8FD8D0120E545B00F3E71A /* JSEventSendingController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSEventSendingController.cpp; path = DerivedSources/WebKitTestRunner/JSEventSendingController.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; + BC8FD8D1120E545B00F3E71A /* JSEventSendingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSEventSendingController.h; path = DerivedSources/WebKitTestRunner/JSEventSendingController.h; sourceTree = BUILT_PRODUCTS_DIR; }; + BC952C0B11F3B965003398B4 /* JSWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWrapper.h; sourceTree = "<group>"; }; + BC952C0C11F3B965003398B4 /* JSWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWrapper.cpp; sourceTree = "<group>"; }; + BC952C0E11F3B97B003398B4 /* JSWrappable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWrappable.h; sourceTree = "<group>"; }; + BC952EC511F3C10F003398B4 /* DerivedSources.make */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DerivedSources.make; sourceTree = "<group>"; }; + BC952ED211F3C29F003398B4 /* LayoutTestController.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LayoutTestController.idl; sourceTree = "<group>"; }; + BC952ED311F3C318003398B4 /* CodeGeneratorTestRunner.pm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = CodeGeneratorTestRunner.pm; sourceTree = "<group>"; }; + BC952F1D11F3C652003398B4 /* JSLayoutTestController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSLayoutTestController.cpp; path = DerivedSources/WebKitTestRunner/JSLayoutTestController.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; + BC952F1E11F3C652003398B4 /* JSLayoutTestController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSLayoutTestController.h; path = DerivedSources/WebKitTestRunner/JSLayoutTestController.h; sourceTree = BUILT_PRODUCTS_DIR; }; + BC99A4841208901A007E9F08 /* StringFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringFunctions.h; sourceTree = "<group>"; }; + BCC997A011D3C8F60017BCA2 /* InjectedBundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundle.cpp; sourceTree = "<group>"; }; + BCC997A111D3C8F60017BCA2 /* InjectedBundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundle.h; sourceTree = "<group>"; }; + BCC997A211D3C8F60017BCA2 /* InjectedBundlePage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePage.cpp; sourceTree = "<group>"; }; + BCC997A311D3C8F60017BCA2 /* InjectedBundlePage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePage.h; sourceTree = "<group>"; }; + BCC9981611D3F51E0017BCA2 /* LayoutTestController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LayoutTestController.h; sourceTree = "<group>"; }; + BCC9981711D3F51E0017BCA2 /* LayoutTestController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutTestController.cpp; sourceTree = "<group>"; }; + BCD7D2F611921278006DB7EE /* TestInvocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestInvocation.h; sourceTree = "<group>"; }; + BCD7D2F711921278006DB7EE /* TestInvocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestInvocation.cpp; sourceTree = "<group>"; }; + BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = JavaScriptCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C0CE720A1247C93300BC0EC4 /* LayoutTestControllerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = LayoutTestControllerMac.mm; path = mac/LayoutTestControllerMac.mm; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F9B0486AA7600D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BC7934A511906584005EA8E2 /* Cocoa.framework in Frameworks */, + BC7934AC1190658C005EA8E2 /* WebKit2.framework in Frameworks */, + BCDA2B9A1191051F00C3BC47 /* JavaScriptCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC25186011D15D54002EBC01 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BC25193E11D15D8B002EBC01 /* Cocoa.framework in Frameworks */, + BC25193F11D15D8B002EBC01 /* WebKit2.framework in Frameworks */, + BC25194011D15D8B002EBC01 /* JavaScriptCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* WebKitTestRunner */ = { + isa = PBXGroup; + children = ( + BC952EC511F3C10F003398B4 /* DerivedSources.make */, + BC99CBF11207642D00FDEE76 /* Shared */, + 08FB7795FE84155DC02AAC07 /* TestRunner */, + BC25183511D1571D002EBC01 /* InjectedBundle */, + BC793401118F7C8A005EA8E2 /* Configurations */, + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, + BC25194411D15DBE002EBC01 /* Resources */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = WebKitTestRunner; + sourceTree = "<group>"; + }; + 08FB7795FE84155DC02AAC07 /* TestRunner */ = { + isa = PBXGroup; + children = ( + BC7933FE118F7C74005EA8E2 /* mac */, + BC251A1711D16774002EBC01 /* WebKitTestRunnerPrefix.h */, + BC7934DD119066EC005EA8E2 /* PlatformWebView.h */, + BC79342F118F7F19005EA8E2 /* TestController.h */, + BC793430118F7F19005EA8E2 /* TestController.cpp */, + BCD7D2F611921278006DB7EE /* TestInvocation.h */, + BCD7D2F711921278006DB7EE /* TestInvocation.cpp */, + ); + name = TestRunner; + sourceTree = "<group>"; + }; + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + BC7934A411906584005EA8E2 /* Cocoa.framework */, + BC7934AB1190658C005EA8E2 /* WebKit2.framework */, + BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = "<group>"; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76FA10486AA7600D96B5E /* WebKitTestRunner */, + BC25186211D15D54002EBC01 /* WebKitTestRunnerInjectedBundle.bundle */, + ); + name = Products; + sourceTree = "<group>"; + }; + 65EB859E11EC67CC0034D300 /* mac */ = { + isa = PBXGroup; + children = ( + 65EB859F11EC67CC0034D300 /* ActivateFonts.mm */, + ); + path = mac; + sourceTree = "<group>"; + }; + BC14E4E0120E02F900826C0C /* Controllers */ = { + isa = PBXGroup; + children = ( + BC8FD8C9120E527F00F3E71A /* EventSendingController.cpp */, + BC8FD8C8120E527F00F3E71A /* EventSendingController.h */, + BC14E4D9120E02D000826C0C /* GCController.cpp */, + BC14E4D8120E02D000826C0C /* GCController.h */, + BCC9981711D3F51E0017BCA2 /* LayoutTestController.cpp */, + BCC9981611D3F51E0017BCA2 /* LayoutTestController.h */, + C0CE720A1247C93300BC0EC4 /* LayoutTestControllerMac.mm */, + ); + name = Controllers; + sourceTree = "<group>"; + }; + BC25183511D1571D002EBC01 /* InjectedBundle */ = { + isa = PBXGroup; + children = ( + BC952D3A11F3BF1F003398B4 /* Derived Sources */, + BC952C0A11F3B939003398B4 /* Bindings */, + BC14E4E0120E02F900826C0C /* Controllers */, + 65EB859E11EC67CC0034D300 /* mac */, + 65EB859D11EC67CC0034D300 /* ActivateFonts.h */, + BCC997A011D3C8F60017BCA2 /* InjectedBundle.cpp */, + BCC997A111D3C8F60017BCA2 /* InjectedBundle.h */, + BC25184611D15767002EBC01 /* InjectedBundleMain.cpp */, + BCC997A211D3C8F60017BCA2 /* InjectedBundlePage.cpp */, + BCC997A311D3C8F60017BCA2 /* InjectedBundlePage.h */, + ); + path = InjectedBundle; + sourceTree = "<group>"; + }; + BC25194411D15DBE002EBC01 /* Resources */ = { + isa = PBXGroup; + children = ( + BC25186311D15D54002EBC01 /* InjectedBundle-Info.plist */, + 6510A77711EC643800410867 /* AHEM____.TTF */, + 6510A77811EC643800410867 /* ColorBits.ttf */, + 6510A77911EC643800410867 /* WebKitWeightWatcher100.ttf */, + 6510A77A11EC643800410867 /* WebKitWeightWatcher200.ttf */, + 6510A77B11EC643800410867 /* WebKitWeightWatcher300.ttf */, + 6510A77C11EC643800410867 /* WebKitWeightWatcher400.ttf */, + 6510A77D11EC643800410867 /* WebKitWeightWatcher500.ttf */, + 6510A77E11EC643800410867 /* WebKitWeightWatcher600.ttf */, + 6510A77F11EC643800410867 /* WebKitWeightWatcher700.ttf */, + 6510A78011EC643800410867 /* WebKitWeightWatcher800.ttf */, + 6510A78111EC643800410867 /* WebKitWeightWatcher900.ttf */, + ); + name = Resources; + sourceTree = "<group>"; + }; + BC7933FE118F7C74005EA8E2 /* mac */ = { + isa = PBXGroup; + children = ( + BC7933FF118F7C84005EA8E2 /* main.mm */, + BC7934E711906846005EA8E2 /* PlatformWebViewMac.mm */, + BC8C795B11D2785D004535A1 /* TestControllerMac.mm */, + ); + path = mac; + sourceTree = "<group>"; + }; + BC793401118F7C8A005EA8E2 /* Configurations */ = { + isa = PBXGroup; + children = ( + BC793426118F7D3C005EA8E2 /* Base.xcconfig */, + BC793427118F7DAF005EA8E2 /* DebugRelease.xcconfig */, + BC25197111D15E61002EBC01 /* InjectedBundle.xcconfig */, + BC251A1811D16795002EBC01 /* WebKitTestRunner.xcconfig */, + ); + path = Configurations; + sourceTree = "<group>"; + }; + BC952C0A11F3B939003398B4 /* Bindings */ = { + isa = PBXGroup; + children = ( + BC952ED311F3C318003398B4 /* CodeGeneratorTestRunner.pm */, + BC952C0E11F3B97B003398B4 /* JSWrappable.h */, + BC952C0C11F3B965003398B4 /* JSWrapper.cpp */, + BC952C0B11F3B965003398B4 /* JSWrapper.h */, + BC8FD8CB120E52B000F3E71A /* EventSendingController.idl */, + BC14E4E1120E032000826C0C /* GCController.idl */, + BC952ED211F3C29F003398B4 /* LayoutTestController.idl */, + ); + path = Bindings; + sourceTree = "<group>"; + }; + BC952D3A11F3BF1F003398B4 /* Derived Sources */ = { + isa = PBXGroup; + children = ( + BC8FD8D0120E545B00F3E71A /* JSEventSendingController.cpp */, + BC8FD8D1120E545B00F3E71A /* JSEventSendingController.h */, + BC14E4E8120E03D800826C0C /* JSGCController.cpp */, + BC14E4E9120E03D800826C0C /* JSGCController.h */, + BC952F1D11F3C652003398B4 /* JSLayoutTestController.cpp */, + BC952F1E11F3C652003398B4 /* JSLayoutTestController.h */, + ); + name = "Derived Sources"; + sourceTree = "<group>"; + }; + BC99CBF11207642D00FDEE76 /* Shared */ = { + isa = PBXGroup; + children = ( + BC99A4841208901A007E9F08 /* StringFunctions.h */, + ); + name = Shared; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F960486AA7600D96B5E /* WebKitTestRunner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "WebKitTestRunner" */; + buildPhases = ( + 8DD76F990486AA7600D96B5E /* Sources */, + 8DD76F9B0486AA7600D96B5E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + BC25194211D15D94002EBC01 /* PBXTargetDependency */, + ); + name = WebKitTestRunner; + productInstallPath = "$(HOME)/bin"; + productName = WebKitTestRunner; + productReference = 8DD76FA10486AA7600D96B5E /* WebKitTestRunner */; + productType = "com.apple.product-type.tool"; + }; + BC25186111D15D54002EBC01 /* WebKitTestRunnerInjectedBundle */ = { + isa = PBXNativeTarget; + buildConfigurationList = BC25186611D15D55002EBC01 /* Build configuration list for PBXNativeTarget "WebKitTestRunnerInjectedBundle" */; + buildPhases = ( + BC25185E11D15D54002EBC01 /* Resources */, + BC25185F11D15D54002EBC01 /* Sources */, + BC25186011D15D54002EBC01 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + BC952ED711F3C38B003398B4 /* PBXTargetDependency */, + ); + name = WebKitTestRunnerInjectedBundle; + productName = InjectedBundle; + productReference = BC25186211D15D54002EBC01 /* WebKitTestRunnerInjectedBundle.bundle */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "WebKitTestRunner" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* WebKitTestRunner */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F960486AA7600D96B5E /* WebKitTestRunner */, + BC25186111D15D54002EBC01 /* WebKitTestRunnerInjectedBundle */, + BC952D7711F3BF5D003398B4 /* Derived Sources */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BC25185E11D15D54002EBC01 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6510A78211EC643800410867 /* AHEM____.TTF in Resources */, + 6510A78311EC643800410867 /* ColorBits.ttf in Resources */, + 6510A78411EC643800410867 /* WebKitWeightWatcher100.ttf in Resources */, + 6510A78511EC643800410867 /* WebKitWeightWatcher200.ttf in Resources */, + 6510A78611EC643800410867 /* WebKitWeightWatcher300.ttf in Resources */, + 6510A78711EC643800410867 /* WebKitWeightWatcher400.ttf in Resources */, + 6510A78811EC643800410867 /* WebKitWeightWatcher500.ttf in Resources */, + 6510A78911EC643800410867 /* WebKitWeightWatcher600.ttf in Resources */, + 6510A78A11EC643800410867 /* WebKitWeightWatcher700.ttf in Resources */, + 6510A78B11EC643800410867 /* WebKitWeightWatcher800.ttf in Resources */, + 6510A78C11EC643800410867 /* WebKitWeightWatcher900.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + BC952D8211F3BF78003398B4 /* Generate Derived Sources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Generate Derived Sources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "mkdir -p \"${BUILT_PRODUCTS_DIR}/DerivedSources/WebKitTestRunner\"\ncd \"${BUILT_PRODUCTS_DIR}/DerivedSources/WebKitTestRunner\"\n\nexport WebKitTestRunner=\"${SRCROOT}\"\nexport WebCoreScripts=\"${WEBCORE_PRIVATE_HEADERS_DIR}\"\n\nif [ \"${ACTION}\" = \"build\" -o \"${ACTION}\" = \"install\" -o \"${ACTION}\" = \"installhdrs\" ]; then\n make -f \"${WebKitTestRunner}/DerivedSources.make\" -j `/usr/sbin/sysctl -n hw.availcpu`\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F990486AA7600D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC793400118F7C84005EA8E2 /* main.mm in Sources */, + BC793431118F7F19005EA8E2 /* TestController.cpp in Sources */, + BC7934E811906846005EA8E2 /* PlatformWebViewMac.mm in Sources */, + BCD7D2F811921278006DB7EE /* TestInvocation.cpp in Sources */, + BC8C795C11D2785D004535A1 /* TestControllerMac.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BC25185F11D15D54002EBC01 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BC251A3E11D16831002EBC01 /* InjectedBundleMain.cpp in Sources */, + BCC997A411D3C8F60017BCA2 /* InjectedBundle.cpp in Sources */, + BCC997A511D3C8F60017BCA2 /* InjectedBundlePage.cpp in Sources */, + BCC9981811D3F51E0017BCA2 /* LayoutTestController.cpp in Sources */, + 65EB85A011EC67CC0034D300 /* ActivateFonts.mm in Sources */, + BC952C0D11F3B965003398B4 /* JSWrapper.cpp in Sources */, + BC952F1F11F3C652003398B4 /* JSLayoutTestController.cpp in Sources */, + BC14E4DB120E02D000826C0C /* GCController.cpp in Sources */, + BC14E4EA120E03D800826C0C /* JSGCController.cpp in Sources */, + BC8FD8CA120E527F00F3E71A /* EventSendingController.cpp in Sources */, + BC8FD8D2120E545B00F3E71A /* JSEventSendingController.cpp in Sources */, + C0CE720B1247C93300BC0EC4 /* LayoutTestControllerMac.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BC25194211D15D94002EBC01 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BC25186111D15D54002EBC01 /* WebKitTestRunnerInjectedBundle */; + targetProxy = BC25194111D15D94002EBC01 /* PBXContainerItemProxy */; + }; + BC952ED711F3C38B003398B4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BC952D7711F3BF5D003398B4 /* Derived Sources */; + targetProxy = BC952ED611F3C38B003398B4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1DEB927508733DD40010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC251A1811D16795002EBC01 /* WebKitTestRunner.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 1DEB927608733DD40010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC251A1811D16795002EBC01 /* WebKitTestRunner.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 1DEB927908733DD40010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC793427118F7DAF005EA8E2 /* DebugRelease.xcconfig */; + buildSettings = { + GCC_OPTIMIZATION_LEVEL = 0; + }; + name = Debug; + }; + 1DEB927A08733DD40010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC793427118F7DAF005EA8E2 /* DebugRelease.xcconfig */; + buildSettings = { + }; + name = Release; + }; + BC25186411D15D55002EBC01 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC25197111D15E61002EBC01 /* InjectedBundle.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + BC25186511D15D55002EBC01 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC25197111D15E61002EBC01 /* InjectedBundle.xcconfig */; + buildSettings = { + }; + name = Release; + }; + BC952D7811F3BF5E003398B4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = "Derived Sources"; + }; + name = Debug; + }; + BC952D7911F3BF5E003398B4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = "Derived Sources"; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "WebKitTestRunner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB927508733DD40010E9CD /* Debug */, + 1DEB927608733DD40010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "WebKitTestRunner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB927908733DD40010E9CD /* Debug */, + 1DEB927A08733DD40010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC25186611D15D55002EBC01 /* Build configuration list for PBXNativeTarget "WebKitTestRunnerInjectedBundle" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC25186411D15D55002EBC01 /* Debug */, + BC25186511D15D55002EBC01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BC952D7D11F3BF6A003398B4 /* Build configuration list for PBXAggregateTarget "Derived Sources" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC952D7811F3BF5E003398B4 /* Debug */, + BC952D7911F3BF5E003398B4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/Tools/WebKitTestRunner/WebKitTestRunnerPrefix.h b/Tools/WebKitTestRunner/WebKitTestRunnerPrefix.h new file mode 100644 index 0000000..9d508ed --- /dev/null +++ b/Tools/WebKitTestRunner/WebKitTestRunnerPrefix.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#ifdef __OBJC__ +#include <Cocoa/Cocoa.h> +#endif + +#if defined(WIN32) || defined(_WIN32) +// If we don't define these, they get defined in windef.h. +// We want to use std::min and std::max +#define max max +#define min min +#endif + +#include <WebKit2/WebKit2.h> diff --git a/Tools/WebKitTestRunner/fonts/AHEM____.TTF b/Tools/WebKitTestRunner/fonts/AHEM____.TTF Binary files differnew file mode 100644 index 0000000..ac81cb0 --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/AHEM____.TTF diff --git a/Tools/WebKitTestRunner/fonts/ColorBits-A.png b/Tools/WebKitTestRunner/fonts/ColorBits-A.png Binary files differnew file mode 100644 index 0000000..8b9319c --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/ColorBits-A.png diff --git a/Tools/WebKitTestRunner/fonts/ColorBits.ttf b/Tools/WebKitTestRunner/fonts/ColorBits.ttf Binary files differnew file mode 100644 index 0000000..cd919e8 --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/ColorBits.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKit Layout Tests 2.ttf b/Tools/WebKitTestRunner/fonts/WebKit Layout Tests 2.ttf Binary files differnew file mode 100644 index 0000000..e732fbc --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKit Layout Tests 2.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKit Layout Tests.ttf b/Tools/WebKitTestRunner/fonts/WebKit Layout Tests.ttf Binary files differnew file mode 100644 index 0000000..f9f997e --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKit Layout Tests.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher100.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher100.ttf Binary files differnew file mode 100644 index 0000000..22b00de --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher100.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher200.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher200.ttf Binary files differnew file mode 100644 index 0000000..1ccadba --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher200.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher300.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher300.ttf Binary files differnew file mode 100644 index 0000000..ab5563d --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher300.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher400.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher400.ttf Binary files differnew file mode 100644 index 0000000..56d279e --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher400.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher500.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher500.ttf Binary files differnew file mode 100644 index 0000000..d827d7d --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher500.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher600.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher600.ttf Binary files differnew file mode 100644 index 0000000..9141596 --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher600.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher700.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher700.ttf Binary files differnew file mode 100644 index 0000000..a2d0505 --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher700.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher800.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher800.ttf Binary files differnew file mode 100644 index 0000000..d0f354b --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher800.ttf diff --git a/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher900.ttf b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher900.ttf Binary files differnew file mode 100644 index 0000000..6b895ca --- /dev/null +++ b/Tools/WebKitTestRunner/fonts/WebKitWeightWatcher900.ttf diff --git a/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm b/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm new file mode 100644 index 0000000..b68f6a3 --- /dev/null +++ b/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "PlatformWebView.h" + +namespace WTR { + +PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef) +{ + NSRect rect = NSMakeRect(0, 0, 800, 600); + m_view = [[WKView alloc] initWithFrame:rect contextRef:contextRef pageGroupRef:pageGroupRef]; + + NSRect windowRect = NSOffsetRect(rect, -10000, [[[NSScreen screens] objectAtIndex:0] frame].size.height - rect.size.height + 10000); + m_window = [[NSWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; + [m_window setColorSpace:[[NSScreen mainScreen] colorSpace]]; + [[m_window contentView] addSubview:m_view]; + [m_window orderBack:nil]; + [m_window setAutodisplay:NO]; + [m_window setReleasedWhenClosed:NO]; +} + +void PlatformWebView::resizeTo(unsigned width, unsigned height) +{ + [m_view setFrame:NSMakeRect(0, 0, width, height)]; +} + +PlatformWebView::~PlatformWebView() +{ + [m_window close]; + [m_window release]; + [m_view release]; +} + +WKPageRef PlatformWebView::page() +{ + return [m_view pageRef]; +} + +void PlatformWebView::focus() +{ + // Implement. +} + +WKRect PlatformWebView::windowFrame() +{ + NSRect frame = [m_window frame]; + + WKRect wkFrame; + wkFrame.origin.x = frame.origin.x; + wkFrame.origin.y = frame.origin.y; + wkFrame.size.width = frame.size.width; + wkFrame.size.height = frame.size.height; + return wkFrame; +} + +void PlatformWebView::setWindowFrame(WKRect frame) +{ + [m_window setFrame:NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height) display:YES]; +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/mac/TestControllerMac.mm b/Tools/WebKitTestRunner/mac/TestControllerMac.mm new file mode 100644 index 0000000..fee0070 --- /dev/null +++ b/Tools/WebKitTestRunner/mac/TestControllerMac.mm @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "TestController.h" + +#include <WebKit2/WKStringCF.h> +#include <mach-o/dyld.h> + +namespace WTR { + +void TestController::notifyDone() +{ +} + +void TestController::platformInitialize() +{ +} + +void TestController::initializeInjectedBundlePath() +{ + NSString *nsBundlePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"WebKitTestRunnerInjectedBundle.bundle"]; + m_injectedBundlePath.adopt(WKStringCreateWithCFString((CFStringRef)nsBundlePath)); +} + +void TestController::initializeTestPluginDirectory() +{ + m_testPluginDirectory.adopt(WKStringCreateWithCFString((CFStringRef)[[NSBundle mainBundle] bundlePath])); +} + +void TestController::platformRunUntil(bool& done, double timeout) +{ + CFAbsoluteTime end = CFAbsoluteTimeGetCurrent() + timeout; + while (!done && CFAbsoluteTimeGetCurrent() < end) + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]; +} + +void TestController::platformInitializeContext() +{ +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/mac/main.mm b/Tools/WebKitTestRunner/mac/main.mm new file mode 100644 index 0000000..d2f26ab --- /dev/null +++ b/Tools/WebKitTestRunner/mac/main.mm @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + */ + +#import "TestController.h" + +int main(int argc, const char* argv[]) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSApplication sharedApplication]; + { + WTR::TestController controller(argc, argv); + } + [pool drain]; + return 0; +} diff --git a/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp b/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp new file mode 100644 index 0000000..18e2523 --- /dev/null +++ b/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010 University of Szeged. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT + * OWNER OR 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 "PlatformWebView.h" +#include "qgraphicswkview.h" +#include "qwkcontext.h" +#include <QtGui> + +namespace WTR { + +class WebView : public QGraphicsView { +public: + WebView(WKContextRef); + + QGraphicsWKView* wkView() const { return m_item; } + + virtual ~WebView() { delete m_item; } + +private: + QGraphicsWKView* m_item; +}; + +WebView::WebView(WKContextRef contextRef) + : QGraphicsView() + , m_item(new QGraphicsWKView(new QWKContext(contextRef, this))) +{ + setScene(new QGraphicsScene(this)); + scene()->addItem(m_item); +} + +PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef) + : m_view(new WebView(contextRef)) + , m_window(new QMainWindow()) +{ + m_view->setParent(m_window); + m_window->setCentralWidget(m_view); + m_window->setGeometry(0, 0, 800, 600); +} + +PlatformWebView::~PlatformWebView() +{ + delete m_window; +} + +void PlatformWebView::resizeTo(unsigned width, unsigned height) +{ + m_window->resize(width, height); +} + +WKPageRef PlatformWebView::page() +{ + return m_view->wkView()->page()->pageRef(); +} + +void PlatformWebView::focus() +{ + m_view->setFocus(Qt::OtherFocusReason); +} + +WKRect PlatformWebView::windowFrame() +{ + // Implement. + + WKRect wkFrame; + wkFrame.origin.x = 0; + wkFrame.origin.y = 0; + wkFrame.size.width = 0; + wkFrame.size.height = 0; + return wkFrame; +} + +void PlatformWebView::setWindowFrame(WKRect) +{ + // Implement. +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/qt/TestControllerQt.cpp b/Tools/WebKitTestRunner/qt/TestControllerQt.cpp new file mode 100644 index 0000000..ca0a00c --- /dev/null +++ b/Tools/WebKitTestRunner/qt/TestControllerQt.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010 University of Szeged. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT + * OWNER OR 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 "TestController.h" + +#include "WKStringQt.h" + +#include <cstdlib> +#include <QCoreApplication> +#include <QEventLoop> +#include <QFileInfo> +#include <QLibrary> +#include <QObject> +#include <QtGlobal> +#include <wtf/Platform.h> +#include <wtf/text/WTFString.h> + +namespace WTR { + +class TestControllerRunLoop : public QObject { + Q_OBJECT +public: + static TestControllerRunLoop* instance() + { + static TestControllerRunLoop* result = new TestControllerRunLoop; + return result; + } + + void start(int msec) + { + m_timerID = startTimer(msec); + ASSERT(m_timerID); + m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents); + } + + void stop() + { + killTimer(m_timerID); + m_eventLoop.quit(); + } +private: + TestControllerRunLoop() {} + + void timerEvent(QTimerEvent*) + { + fprintf(stderr, "FAIL: TestControllerRunLoop timed out.\n"); + stop(); + } + + QEventLoop m_eventLoop; + int m_timerID; +}; + +void TestController::notifyDone() +{ + TestControllerRunLoop::instance()->stop(); +} + +void TestController::platformInitialize() +{ +} + +void TestController::platformRunUntil(bool&, double timeout) +{ + TestControllerRunLoop::instance()->start(static_cast<int>(timeout * 1000)); +} + +static bool isExistingLibrary(const QString& path) +{ +#if OS(WINDOWS) || OS(SYMBIAN) + const char* librarySuffixes[] = { ".dll" }; +#elif OS(MAC_OS_X) + const char* librarySuffixes[] = { ".bundle", ".dylib", ".so" }; +#elif OS(UNIX) + const char* librarySuffixes[] = { ".so" }; +#else +#error Library path suffix should be specified for this platform +#endif + for (unsigned i = 0; i < sizeof(librarySuffixes) / sizeof(const char*); ++i) { + if (QLibrary::isLibrary(path + librarySuffixes[i])) + return true; + } + + return false; +} + +void TestController::initializeInjectedBundlePath() +{ + QString path = QLatin1String(getenv("WTR_INJECTEDBUNDLE_PATH")); + if (path.isEmpty()) + path = QFileInfo(QCoreApplication::applicationDirPath() + "/../lib/libWTRInjectedBundle").absoluteFilePath(); + if (!isExistingLibrary(path)) + qFatal("Cannot find the injected bundle at %s\n", qPrintable(path)); + + m_injectedBundlePath = WKStringCreateWithQString(path); +} + +void TestController::initializeTestPluginDirectory() +{ + // This is called after initializeInjectedBundlePath. + m_testPluginDirectory = m_injectedBundlePath; +} + +void TestController::platformInitializeContext() +{ +} + +#include "TestControllerQt.moc" + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/qt/WebKitTestRunner.pro b/Tools/WebKitTestRunner/qt/WebKitTestRunner.pro new file mode 100644 index 0000000..cf5d5b8 --- /dev/null +++ b/Tools/WebKitTestRunner/qt/WebKitTestRunner.pro @@ -0,0 +1,71 @@ +TARGET = WebKitTestRunner +CONFIG -= app_bundle + +BASEDIR = $$PWD/../ +isEmpty(OUTPUT_DIR): OUTPUT_DIR = ../../.. +GENERATED_SOURCES_DIR = ../generated + + +include(../../../WebKit.pri) + +!CONFIG(release, debug|release) { + OBJECTS_DIR = obj/debug +} else { # Release + OBJECTS_DIR = obj/release +} + +DEFINES += USE_SYSTEM_MALLOC + +INCLUDEPATH += \ + $$BASEDIR \ + $$BASEDIR/../../JavaScriptCore \ + $$BASEDIR/../../WebKit2 \ + $$BASEDIR/../../WebKit2/Shared \ + $$BASEDIR/../../WebKit2/UIProcess/API/qt \ + $$BASEDIR/../../WebKit2/UIProcess/API/cpp/qt \ + $$GENERATED_SOURCES_DIR + +INCLUDEPATH += \ + $$OUTPUT_DIR/include \ + + +DESTDIR = $$OUTPUT_DIR/bin + +unix:!mac:!symbian { + CONFIG += link_pkgconfig + PKGCONFIG += fontconfig +} + +QT = core gui network + +HEADERS = \ + $$BASEDIR/PlatformWebView.h \ + $$BASEDIR/StringFunctions.h \ + $$BASEDIR/TestController.h \ + $$BASEDIR/TestInvocation.h + +SOURCES = \ + main.cpp \ + PlatformWebViewQt.cpp \ + TestControllerQt.cpp \ + $$BASEDIR/TestController.cpp \ + $$BASEDIR/TestInvocation.cpp \ + +PREFIX_HEADER = $$BASEDIR/WebKitTestRunnerPrefix.h +QMAKE_CXXFLAGS += "-include $$PREFIX_HEADER" + +linux-* { + # From Creator's src/rpath.pri: + # Do the rpath by hand since it's not possible to use ORIGIN in QMAKE_RPATHDIR + # this expands to $ORIGIN (after qmake and make), it does NOT read a qmake var. + QMAKE_RPATHDIR = \$\$ORIGIN/../lib $$QMAKE_RPATHDIR + MY_RPATH = $$join(QMAKE_RPATHDIR, ":") + + QMAKE_LFLAGS += -Wl,-z,origin \'-Wl,-rpath,$${MY_RPATH}\' + QMAKE_RPATHDIR = +} else { + QMAKE_RPATHDIR = $$OUTPUT_DIR/lib $$QMAKE_RPATHDIR +} + +include(../../../JavaScriptCore/JavaScriptCore.pri) +addJavaScriptCoreLib(../../../JavaScriptCore) diff --git a/Tools/WebKitTestRunner/qt/main.cpp b/Tools/WebKitTestRunner/qt/main.cpp new file mode 100644 index 0000000..4312a05 --- /dev/null +++ b/Tools/WebKitTestRunner/qt/main.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010 University of Szeged. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "TestController.h" + +#include <QApplication> +#include <QObject> +#include <QTimer> + +class Launcher : public QObject { + Q_OBJECT + +public: + Launcher(int argc, char** argv) + : m_argc(argc) + , m_argv(argv) + { + } + + ~Launcher() + { + delete m_controller; + } + +public slots: + void launch() + { + m_controller = new WTR::TestController(m_argc, const_cast<const char**>(m_argv)); + QApplication::exit(); + } + +private: + WTR::TestController* m_controller; + int m_argc; + char** m_argv; +}; + +int main(int argc, char** argv) +{ + QApplication app(argc, argv); + Launcher launcher(argc, argv); + QTimer::singleShot(0, &launcher, SLOT(launch())); + return app.exec();; +} + +#include "main.moc" diff --git a/Tools/WebKitTestRunner/win/InjectedBundle.vcproj b/Tools/WebKitTestRunner/win/InjectedBundle.vcproj new file mode 100644 index 0000000..cdf1af3 --- /dev/null +++ b/Tools/WebKitTestRunner/win/InjectedBundle.vcproj @@ -0,0 +1,492 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="InjectedBundle" + ProjectGUID="{CBC3391C-F060-4BF5-A66E-81404168816B}" + RootNamespace="InjectedBundle" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="2" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;..\Configurations\InjectedBundleCoreFoundation.vsprops;..\Configurations\InjectedBundleCommon.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="2" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\release.vsprops;..\Configurations\InjectedBundleCoreFoundation.vsprops;..\Configurations\InjectedBundleCommon.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_All|Win32" + ConfigurationType="2" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug_all.vsprops;..\Configurations\InjectedBundleCoreFoundation.vsprops;..\Configurations\InjectedBundleCommon.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_Cairo_CFLite|Win32" + ConfigurationType="2" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug_wincairo.vsprops;..\Configurations\InjectedBundleCFLite.vsprops;..\Configurations\InjectedBundleCommon.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_Cairo_CFLite|Win32" + ConfigurationType="2" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\release.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\WinCairo.vsprops;..\Configurations\InjectedBundleCFLite.vsprops;..\Configurations\InjectedBundleCommon.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_LTCG|Win32" + ConfigurationType="2" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\release.vsprops;..\Configurations\InjectedBundleCoreFoundation.vsprops;..\Configurations\InjectedBundleCommon.vsprops" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Bindings" + > + <File + RelativePath="..\InjectedBundle\Bindings\CodeGeneratorTestRunner.pm" + > + </File> + <File + RelativePath="..\InjectedBundle\Bindings\JSWrappable.h" + > + </File> + <File + RelativePath="..\InjectedBundle\Bindings\JSWrapper.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\Bindings\JSWrapper.h" + > + </File> + </Filter> + <Filter + Name="Derived Sources" + > + <File + RelativePath="$(WebKitOutputDir)\obj\$(ProjectName)\DerivedSources\JSEventSendingController.cpp" + > + </File> + <File + RelativePath="$(WebKitOutputDir)\obj\$(ProjectName)\DerivedSources\JSEventSendingController.h" + > + </File> + <File + RelativePath="$(WebKitOutputDir)\obj\$(ProjectName)\DerivedSources\JSGCController.cpp" + > + </File> + <File + RelativePath="$(WebKitOutputDir)\obj\$(ProjectName)\DerivedSources\JSGCController.h" + > + </File> + <File + RelativePath="$(WebKitOutputDir)\obj\$(ProjectName)\DerivedSources\JSLayoutTestController.cpp" + > + </File> + <File + RelativePath="$(WebKitOutputDir)\obj\$(ProjectName)\DerivedSources\JSLayoutTestController.h" + > + </File> + </Filter> + <File + RelativePath="..\InjectedBundle\win\ActivateFonts.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\EventSendingController.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\EventSendingController.h" + > + </File> + <File + RelativePath="..\InjectedBundle\GCController.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\GCController.h" + > + </File> + <File + RelativePath="..\InjectedBundle\InjectedBundle.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\InjectedBundle.h" + > + </File> + <File + RelativePath="..\InjectedBundle\InjectedBundleMain.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\InjectedBundlePage.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\InjectedBundlePage.h" + > + </File> + <File + RelativePath="..\InjectedBundle\LayoutTestController.cpp" + > + </File> + <File + RelativePath="..\InjectedBundle\LayoutTestController.h" + > + </File> + <File + RelativePath="..\InjectedBundle\win\LayoutTestControllerWin.cpp" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/Tools/WebKitTestRunner/win/InjectedBundleGenerated.vcproj b/Tools/WebKitTestRunner/win/InjectedBundleGenerated.vcproj new file mode 100755 index 0000000..83c3868 --- /dev/null +++ b/Tools/WebKitTestRunner/win/InjectedBundleGenerated.vcproj @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="InjectedBundleGenerated" + ProjectGUID="{4343BC0B-A2E0-4B48-8277-F33CFBFA83CD}" + RootNamespace="InjectedBundleGenerated" + Keyword="MakeFileProj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="0" + InheritedPropertySheets=".\InjectedBundleGeneratedCommon.vsprops" + > + <Tool + Name="VCNMakeTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="0" + InheritedPropertySheets=".\InjectedBundleGeneratedCommon.vsprops" + > + <Tool + Name="VCNMakeTool" + /> + </Configuration> + <Configuration + Name="Debug_All|Win32" + ConfigurationType="0" + InheritedPropertySheets=".\InjectedBundleGeneratedCommon.vsprops" + > + <Tool + Name="VCNMakeTool" + /> + </Configuration> + <Configuration + Name="Release_LTCG|Win32" + ConfigurationType="0" + InheritedPropertySheets=".\InjectedBundleGeneratedCommon.vsprops" + > + <Tool + Name="VCNMakeTool" + /> + </Configuration> + <Configuration + Name="Release_Cairo_CFLite|Win32" + ConfigurationType="0" + InheritedPropertySheets=".\InjectedBundleGeneratedCommon.vsprops" + > + <Tool + Name="VCNMakeTool" + /> + </Configuration> + <Configuration + Name="Debug_Cairo_CFLite|Win32" + ConfigurationType="0" + InheritedPropertySheets=".\InjectedBundleGeneratedCommon.vsprops" + > + <Tool + Name="VCNMakeTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath=".\build-generated-files.sh" + > + </File> + <File + RelativePath="..\DerivedSources.make" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/Tools/WebKitTestRunner/win/InjectedBundleGeneratedCommon.vsprops b/Tools/WebKitTestRunner/win/InjectedBundleGeneratedCommon.vsprops new file mode 100644 index 0000000..5675aed --- /dev/null +++ b/Tools/WebKitTestRunner/win/InjectedBundleGeneratedCommon.vsprops @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="InjectedBundleGeneratedCommon" + OutputDirectory="$(WebKitOutputDir)\lib" + IntermediateDirectory="$(WebKitOutputDir)\obj\$(ProjectName)\$(ConfigurationName)" + > + <Tool + Name="VCNMakeTool" + BuildCommandLine="if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"

set PATH=%SystemDrive%\cygwin\bin;%PATH%
bash build-generated-files.sh "$(WebKitOutputDir)" "$(WebKitLibrariesDir)"
if errorlevel 1 exit 1

if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"
" + ReBuildCommandLine="echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"

del /s /q "$(WebKitOutputDir)\obj\InjectedBundle\DerivedSources"
set PATH=%SystemDrive%\cygwin\bin;%PATH%
bash build-generated-files.sh "$(WebKitOutputDir)" "$(WebKitLibrariesDir)"
if errorlevel 1 exit 1

if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"
" + CleanCommandLine="del /s /q "$(WebKitOutputDir)\obj\InjectedBundle\DerivedSources"
if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"
" + /> +</VisualStudioPropertySheet> diff --git a/Tools/WebKitTestRunner/win/InjectedBundlePostBuild.cmd b/Tools/WebKitTestRunner/win/InjectedBundlePostBuild.cmd new file mode 100644 index 0000000..f011495 --- /dev/null +++ b/Tools/WebKitTestRunner/win/InjectedBundlePostBuild.cmd @@ -0,0 +1 @@ +if exist "%WEBKITOUTPUTDIR%\buildfailed" del "%WEBKITOUTPUTDIR%\buildfailed" diff --git a/Tools/WebKitTestRunner/win/InjectedBundlePreBuild.cmd b/Tools/WebKitTestRunner/win/InjectedBundlePreBuild.cmd new file mode 100644 index 0000000..3a84c26 --- /dev/null +++ b/Tools/WebKitTestRunner/win/InjectedBundlePreBuild.cmd @@ -0,0 +1,6 @@ +%SystemDrive%\cygwin\bin\which.exe bash +if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH% +cmd /c +if exist "%WEBKITOUTPUTDIR%\buildfailed" grep XX%PROJECTNAME%XX "%WEBKITOUTPUTDIR%\buildfailed" +if errorlevel 1 exit 1 +echo XX%PROJECTNAME%XX > "%WEBKITOUTPUTDIR%\buildfailed" diff --git a/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp b/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp new file mode 100644 index 0000000..c132275 --- /dev/null +++ b/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "PlatformWebView.h" + +namespace WTR { + +static LPCWSTR hostWindowClassName = L"WTRWebViewHostWindow"; + +static void registerWindowClass() +{ + static bool initialized; + if (initialized) + return; + initialized = true; + + WNDCLASSEXW wndClass = {0}; + wndClass.cbSize = sizeof(wndClass); + wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = DefWindowProcW; + wndClass.hCursor = LoadCursor(0, IDC_ARROW); + wndClass.hInstance = GetModuleHandle(0); + wndClass.lpszClassName = hostWindowClassName; + + RegisterClassExW(&wndClass); +} + +PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef) +{ + registerWindowClass(); + + RECT viewRect = {0, 0, 800, 600}; + m_window = CreateWindowExW(0, hostWindowClassName, L"WebKitTestRunner", WS_OVERLAPPEDWINDOW, 0 /*XOFFSET*/, 0 /*YOFFSET*/, viewRect.right, viewRect.bottom, 0, 0, GetModuleHandle(0), 0); + m_view = WKViewCreate(viewRect, contextRef, pageGroupRef, m_window); +} + +PlatformWebView::~PlatformWebView() +{ + if (::IsWindow(m_window)) + ::DestroyWindow(m_window); + WKRelease(m_view); +} + +void PlatformWebView::resizeTo(unsigned width, unsigned height) +{ + ::SetWindowPos(WKViewGetWindow(m_view), 0, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS); +} + +WKPageRef PlatformWebView::page() +{ + return WKViewGetPage(m_view); +} + +void PlatformWebView::focus() +{ + ::SetFocus(::WKViewGetWindow(m_view)); +} + +WKRect PlatformWebView::windowFrame() +{ + // Implement. + + WKRect wkFrame; + wkFrame.origin.x = 0; + wkFrame.origin.y = 0; + wkFrame.size.width = 0; + wkFrame.size.height = 0; + return wkFrame; +} + +void PlatformWebView::setWindowFrame(WKRect) +{ + // Implement. +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/win/TestControllerWin.cpp b/Tools/WebKitTestRunner/win/TestControllerWin.cpp new file mode 100644 index 0000000..e562ada --- /dev/null +++ b/Tools/WebKitTestRunner/win/TestControllerWin.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "TestController.h" + +#include <fcntl.h> +#include <io.h> +#include <shlwapi.h> +#include <string> +#include <WebKit2/WKContextPrivateWin.h> +#include <WebKit2/WKStringCF.h> +#include <wtf/RetainPtr.h> +#include <wtf/Vector.h> + +using namespace std; + +namespace WTR { + +#ifdef DEBUG_ALL +const LPWSTR testPluginDirectoryName = L"TestNetscapePlugin_Debug"; +const char* injectedBundleDLL = "\\InjectedBundle_debug.dll"; +#else +const LPWSTR testPluginDirectoryName = L"TestNetscapePlugin"; +const char* injectedBundleDLL = "\\InjectedBundle.dll"; +#endif + +static void addQTDirToPATH() +{ + static LPCWSTR pathEnvironmentVariable = L"PATH"; + static LPCWSTR quickTimeKeyName = L"Software\\Apple Computer, Inc.\\QuickTime"; + static LPCWSTR quickTimeSysDir = L"QTSysDir"; + static bool initialized; + + if (initialized) + return; + initialized = true; + + // Get the QuickTime dll directory from the registry. The key can be in either HKLM or HKCU. + WCHAR qtPath[MAX_PATH]; + DWORD qtPathBufferLen = sizeof(qtPath); + DWORD keyType; + HRESULT result = ::SHGetValueW(HKEY_LOCAL_MACHINE, quickTimeKeyName, quickTimeSysDir, &keyType, (LPVOID)qtPath, &qtPathBufferLen); + if (result != ERROR_SUCCESS || !qtPathBufferLen || keyType != REG_SZ) { + qtPathBufferLen = sizeof(qtPath); + result = ::SHGetValueW(HKEY_CURRENT_USER, quickTimeKeyName, quickTimeSysDir, &keyType, (LPVOID)qtPath, &qtPathBufferLen); + if (result != ERROR_SUCCESS || !qtPathBufferLen || keyType != REG_SZ) + return; + } + + // Read the current PATH. + DWORD pathSize = ::GetEnvironmentVariableW(pathEnvironmentVariable, 0, 0); + Vector<WCHAR> oldPath(pathSize); + if (!::GetEnvironmentVariableW(pathEnvironmentVariable, oldPath.data(), oldPath.size())) + return; + + // And add the QuickTime dll. + wstring newPath; + newPath.append(qtPath); + newPath.append(L";"); + newPath.append(oldPath.data(), oldPath.size()); + ::SetEnvironmentVariableW(pathEnvironmentVariable, newPath.data()); +} + +static LONG WINAPI exceptionFilter(EXCEPTION_POINTERS*) +{ + fputs("#CRASHED\n", stderr); + fflush(stderr); + return EXCEPTION_CONTINUE_SEARCH; +} + +void TestController::notifyDone() +{ +} + +void TestController::platformInitialize() +{ + ::SetUnhandledExceptionFilter(exceptionFilter); + + _setmode(1, _O_BINARY); + _setmode(2, _O_BINARY); + + // Add the QuickTime dll directory to PATH or QT 7.6 will fail to initialize on systems + // linked with older versions of qtmlclientlib.dll. + addQTDirToPATH(); +} + +void TestController::initializeInjectedBundlePath() +{ + CFStringRef exeContainerPath = CFURLCopyFileSystemPath(CFURLCreateCopyDeletingLastPathComponent(0, CFBundleCopyExecutableURL(CFBundleGetMainBundle())), kCFURLWindowsPathStyle); + CFMutableStringRef bundlePath = CFStringCreateMutableCopy(0, 0, exeContainerPath); + CFStringAppendCString(bundlePath, injectedBundleDLL, kCFStringEncodingWindowsLatin1); + m_injectedBundlePath.adopt(WKStringCreateWithCFString(bundlePath)); +} + +void TestController::initializeTestPluginDirectory() +{ + RetainPtr<CFURLRef> bundleURL(AdoptCF, CFBundleCopyExecutableURL(CFBundleGetMainBundle())); + RetainPtr<CFURLRef> bundleDirectoryURL(AdoptCF, CFURLCreateCopyDeletingLastPathComponent(0, bundleURL.get())); + RetainPtr<CFStringRef> testPluginDirectoryNameString(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<const UniChar*>(testPluginDirectoryName), wcslen(testPluginDirectoryName))); + RetainPtr<CFURLRef> testPluginDirectoryURL(AdoptCF, CFURLCreateCopyAppendingPathComponent(0, bundleDirectoryURL.get(), testPluginDirectoryNameString.get(), true)); + RetainPtr<CFStringRef> testPluginDirectoryPath(AdoptCF, CFURLCopyFileSystemPath(testPluginDirectoryURL.get(), kCFURLWindowsPathStyle)); + m_testPluginDirectory.adopt(WKStringCreateWithCFString(testPluginDirectoryPath.get())); +} + +void TestController::platformRunUntil(bool& done, double timeout) +{ + DWORD end = ::GetTickCount() + timeout * 1000; + while (!done) { + DWORD now = ::GetTickCount(); + if (now > end) + return; + + DWORD result = ::MsgWaitForMultipleObjectsEx(0, 0, end - now, QS_ALLINPUT, 0); + if (result == WAIT_TIMEOUT) + return; + + ASSERT(result == WAIT_OBJECT_0); + // There are messages in the queue. Process them. + MSG msg; + while (::PeekMessageW(&msg, 0, 0, 0, PM_REMOVE)) { + ::TranslateMessage(&msg); + ::DispatchMessageW(&msg); + } + } +} + +void TestController::platformInitializeContext() +{ + // FIXME: Make DRT pass with Windows native controls. <http://webkit.org/b/25592> + WKContextSetShouldPaintNativeControls(m_context.get(), false); +} + +} // namespace WTR diff --git a/Tools/WebKitTestRunner/win/WebKitTestRunner.vcproj b/Tools/WebKitTestRunner/win/WebKitTestRunner.vcproj new file mode 100644 index 0000000..09dea95 --- /dev/null +++ b/Tools/WebKitTestRunner/win/WebKitTestRunner.vcproj @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="WebKitTestRunner" + ProjectGUID="{3B99669B-1817-443B-BCBE-835580146668}" + RootNamespace="WebKitTestRunner" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="1" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;..\Configurations\WebKitTestRunnerCommon.vsprops;..\Configurations\WebKitTestRunnerCoreFoundation.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="1" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\release.vsprops;..\Configurations\WebKitTestRunnerCommon.vsprops;..\Configurations\WebKitTestRunnerCoreFoundation.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_All|Win32" + ConfigurationType="1" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug_all.vsprops;..\Configurations\WebKitTestRunnerCommon.vsprops;..\Configurations\WebKitTestRunnerCoreFoundation.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_Cairo_CFLite|Win32" + ConfigurationType="1" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug_wincairo.vsprops;..\Configurations\WebKitTestRunnerCommon.vsprops;..\Configurations\WebKitTestRunnerCFLite.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_Cairo_CFLite|Win32" + ConfigurationType="1" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\release.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\WinCairo.vsprops;..\Configurations\WebKitTestRunnerCommon.vsprops;..\Configurations\WebKitTestRunnerCFLite.vsprops" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_LTCG|Win32" + ConfigurationType="1" + InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\release.vsprops;..\Configurations\WebKitTestRunnerCommon.vsprops;..\Configurations\WebKitTestRunnerCoreFoundation.vsprops" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="win" + > + <File + RelativePath=".\main.cpp" + > + </File> + <File + RelativePath=".\PlatformWebViewWin.cpp" + > + </File> + <File + RelativePath=".\TestControllerWin.cpp" + > + </File> + </Filter> + <File + RelativePath="..\PlatformWebView.h" + > + </File> + <File + RelativePath="..\TestController.cpp" + > + </File> + <File + RelativePath="..\TestController.h" + > + </File> + <File + RelativePath="..\TestInvocation.cpp" + > + </File> + <File + RelativePath="..\TestInvocation.h" + > + </File> + <File + RelativePath="..\WebKitTestRunnerPrefix.h" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/Tools/WebKitTestRunner/win/WebKitTestRunnerPostBuild.cmd b/Tools/WebKitTestRunner/win/WebKitTestRunnerPostBuild.cmd new file mode 100644 index 0000000..5d8b6a3 --- /dev/null +++ b/Tools/WebKitTestRunner/win/WebKitTestRunnerPostBuild.cmd @@ -0,0 +1,38 @@ +if exist "%WEBKITOUTPUTDIR%\buildfailed" del "%WEBKITOUTPUTDIR%\buildfailed" + +if not defined ARCHIVE_BUILD (if defined PRODUCTION exit /b) + +mkdir 2>NUL "%WEBKITOUTPUTDIR%\bin" + +if not exist "%WEBKITLIBRARIESDIR%\bin\CoreFoundation%LIBRARYCONFIGSUFFIX%.dll" exit /b + +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\CoreFoundation%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\CoreFoundation%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\CFNetwork%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\CFNetwork%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d /e /i "%WEBKITLIBRARIESDIR%\bin\CFNetwork.resources" "%WEBKITOUTPUTDIR%\bin\CFNetwork.resources" +xcopy /y /d /e /i "%WEBKITLIBRARIESDIR%\bin\CoreFoundation.resources" "%WEBKITOUTPUTDIR%\bin\CoreFoundation.resources" +xcopy /y /d /e /i "%WEBKITLIBRARIESDIR%\bin\CharacterSets" "%WEBKITOUTPUTDIR%\bin\CharacterSets" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\CoreGraphics%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\CoreGraphics%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\dnssd.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icudt40.dll" xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icudt40.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icudt40%LIBRARYCONFIGSUFFIX%.dll"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icudt40%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuin40%LIBRARYCONFIGSUFFIX%.dll"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuin40%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuin40%LIBRARYCONFIGSUFFIX%.pdb"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuin40%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuuc40%LIBRARYCONFIGSUFFIX%.dll"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuuc40%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuuc40%LIBRARYCONFIGSUFFIX%.pdb"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuuc40%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icudt42.dll" xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icudt42.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icudt42%LIBRARYCONFIGSUFFIX%.dll"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icudt42%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuin42%LIBRARYCONFIGSUFFIX%.dll"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuin42%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuin42%LIBRARYCONFIGSUFFIX%.pdb"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuin42%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuuc42%LIBRARYCONFIGSUFFIX%.dll"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuuc42%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +if exist "%WEBKITLIBRARIESDIR%\bin\icuuc42%LIBRARYCONFIGSUFFIX%.pdb"xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\icuuc42%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\libxml2%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\libxslt%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\pthreadVC2%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\pthreadVC2%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\SQLite3%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\SQLite3%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\zlib1%LIBRARYCONFIGSUFFIX%.dll" "%WEBKITOUTPUTDIR%\bin" +xcopy /y /d "%WEBKITLIBRARIESDIR%\bin\zlib1%LIBRARYCONFIGSUFFIX%.pdb" "%WEBKITOUTPUTDIR%\bin" diff --git a/Tools/WebKitTestRunner/win/WebKitTestRunnerPreBuild.cmd b/Tools/WebKitTestRunner/win/WebKitTestRunnerPreBuild.cmd new file mode 100644 index 0000000..3a84c26 --- /dev/null +++ b/Tools/WebKitTestRunner/win/WebKitTestRunnerPreBuild.cmd @@ -0,0 +1,6 @@ +%SystemDrive%\cygwin\bin\which.exe bash +if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH% +cmd /c +if exist "%WEBKITOUTPUTDIR%\buildfailed" grep XX%PROJECTNAME%XX "%WEBKITOUTPUTDIR%\buildfailed" +if errorlevel 1 exit 1 +echo XX%PROJECTNAME%XX > "%WEBKITOUTPUTDIR%\buildfailed" diff --git a/Tools/WebKitTestRunner/win/build-generated-files.sh b/Tools/WebKitTestRunner/win/build-generated-files.sh new file mode 100644 index 0000000..8c599c1 --- /dev/null +++ b/Tools/WebKitTestRunner/win/build-generated-files.sh @@ -0,0 +1,42 @@ +# Copyright (C) 2010 Apple Inc. All rights reserved. +# +# 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. +# +# THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. + +# Calls to `cygpath -ms` below are needed to remove spaces from paths, which +# confuse GNU make. See <http://webkit.org/b/8173>. + +WebKitOutputDir=$(cygpath -u "$(cygpath -ms "${1}")") +WebKitLibrariesDir=$(cygpath -u "$(cygpath -ms "${2}")") +DerivedSources="${WebKitOutputDir}/obj/InjectedBundle/DerivedSources" + +export WebKitTestRunner=$(cygpath -u "$(cygpath -ms "$(realpath ..)")") + +if [ -e "${WebKitOutputDir}/obj/WebCore/scripts" ]; then + export WebCoreScripts="${WebKitOutputDir}/obj/WebCore/scripts" +else + export WebCoreScripts="${WebKitLibrariesDir}/tools/scripts" +fi + +mkdir -p "${DerivedSources}" +cd "${DerivedSources}" + +make -f "${WebKitTestRunner}/DerivedSources.make" diff --git a/Tools/WebKitTestRunner/win/main.cpp b/Tools/WebKitTestRunner/win/main.cpp new file mode 100644 index 0000000..6ef0f66 --- /dev/null +++ b/Tools/WebKitTestRunner/win/main.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "TestController.h" + +int main(int argc, const char* argv[]) +{ + { + WTR::TestController controller(argc, argv); + } + + return 0; +} |
