summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2020-04-14 01:51:51 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2020-04-14 02:16:23 +0300
commit10cd6a106e1c461c774ca166a67b8c835c755ef7 (patch)
tree560966ea1a78303e17b89daa5de5bfc49b118fa5
parent7b528379f143c791a42f73f9d70e432d796e440b (diff)
Import QtWebKit commit 5da2323bd009bfd234e86c2552b7d9d4138652fe
Change-Id: Ib6d3119a4cb7900becb66bd40160b1d8e442e792 Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
-rw-r--r--Source/JavaScriptCore/jsc.cpp2
-rw-r--r--Source/cmake/OptionsQt.cmake12
-rwxr-xr-xTools/qt/build-qtwebkit-conan.py122
-rw-r--r--Tools/qt/conanfile.py118
-rwxr-xr-xTools/qt/merge-helper.py186
-rw-r--r--Tools/qt/merge.conf18
-rw-r--r--tests/webkitwidgets/qwebpage/tst_qwebpage.cpp43
7 files changed, 468 insertions, 33 deletions
diff --git a/Source/JavaScriptCore/jsc.cpp b/Source/JavaScriptCore/jsc.cpp
index 2bdb953e2..da97b8e1d 100644
--- a/Source/JavaScriptCore/jsc.cpp
+++ b/Source/JavaScriptCore/jsc.cpp
@@ -189,7 +189,7 @@ private:
class ElementHandleOwner : public WeakHandleOwner {
public:
- bool isReachableFromOpaqueRoots(Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) override
+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) override
{
Element* element = jsCast<Element*>(handle.slot()->asCell());
return visitor.containsOpaqueRoot(element->root());
diff --git a/Source/cmake/OptionsQt.cmake b/Source/cmake/OptionsQt.cmake
index ad775b11b..39fb23b2a 100644
--- a/Source/cmake/OptionsQt.cmake
+++ b/Source/cmake/OptionsQt.cmake
@@ -29,18 +29,23 @@ if (QT_CONAN_DIR)
set(_conan_imports_dest \"\${_absolute_destdir}\${_conan_imports_dest}\")
endif ()
- message(\"Importing dependencies from conan to \${_conan_imports_dest}\")
+ message(STATUS \"Importing dependencies from conan to \${_conan_imports_dest}\")
execute_process(
COMMAND \"${CONAN_COMMAND}\" imports --import-folder \${_conan_imports_dest} \"${QT_CONAN_DIR}/conanfile.txt\"
WORKING_DIRECTORY \"${QT_CONAN_DIR}\"
RESULT_VARIABLE _conan_imports_result
)
- message(\"conan imports result: \${_conan_imports_result}\")
+
+ if (NOT _conan_imports_result EQUAL 0)
+ message(FATAL_ERROR \"conan imports failed with code \${_conan_imports_result}\")
+ else ()
+ message(STATUS \"conan imports result: \${_conan_imports_result}\")
+ endif ()
set(_conan_imports_manifest \"\${_conan_imports_dest}/conan_imports_manifest.txt\")
if (EXISTS \${_conan_imports_manifest})
file(REMOVE \${_conan_imports_manifest})
- message(\"Removed conan install manifest: \${_conan_imports_manifest}\")
+ message(STATUS \"Removed conan install manifest: \${_conan_imports_manifest}\")
endif ()
")
endif ()
@@ -171,6 +176,7 @@ add_definitions(-DQT_NO_EXCEPTIONS)
add_definitions(-DQT_USE_QSTRINGBUILDER)
add_definitions(-DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS)
add_definitions(-DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000)
+add_definitions(-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT)
# We use -fno-rtti with GCC and Clang, see OptionsCommon.cmake
if (COMPILER_IS_GCC_OR_CLANG)
diff --git a/Tools/qt/build-qtwebkit-conan.py b/Tools/qt/build-qtwebkit-conan.py
new file mode 100755
index 000000000..4c1297832
--- /dev/null
+++ b/Tools/qt/build-qtwebkit-conan.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python3
+# Copyright (C) 2020 Konstantin Tokarev <annulen@yandex.ru>
+# Copyright (C) 2020 Rajagopalan Gangadharan <g.raju2000@gmail.com>
+#
+# 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 os
+import argparse
+import pathlib
+import platform
+import sys
+
+
+def parse_qt(qt):
+ if qt:
+ os.environ['QTDIR'] = qt
+
+
+def parse_cmake(cmake):
+ if cmake:
+ os.environ["CMAKEFLAGS"] = cmake
+
+
+def parse_ninja(ninja):
+ if ninja:
+ os.environ["NINJAFLAGS"] = ninja
+
+
+def parse_compiler(compiler):
+ if not compiler and not ("CC" in os.environ and "CXX" in os.environ):
+ if platform.system() == "Windows":
+ compiler = "msvc"
+ elif platform.system() == "Darwin":
+ compiler = "clang"
+
+ if compiler == "msvc":
+ os.environ["CC"] = "cl"
+ os.environ["CXX"] = "cl"
+ elif compiler == "clang":
+ os.environ["CC"] = "clang"
+ os.environ["CXX"] = "clang++"
+ elif compiler == "gcc":
+ os.environ["CC"] = "gcc"
+ os.environ["CXX"] = "g++"
+
+
+def run_command(command):
+ print("Executing:", command)
+ exit_code = os.system(command)
+ print("Exit code:", exit_code)
+ if exit_code:
+ sys.exit(1)
+
+
+parser = argparse.ArgumentParser(description='Build QtWebKit with Conan. For installation of build product into Qt, use --install option')
+
+parser.add_argument("--qt", help="Root directory of Qt Installation", type=str, metavar="QTDIR")
+parser.add_argument(
+ "--cmakeargs", help="Space separated values that should be passed as CMake arguments", default="", type=str)
+parser.add_argument("--ninjaargs", help="Ninja arguments",
+ default="", type=str)
+parser.add_argument(
+ "--build_directory", help="Name of build dirtectory (defaults to build)", default="build", type=str)
+parser.add_argument("--compiler", help="Specify compiler for build (msvc, gcc, clang)", type=str)
+parser.add_argument("--configure", help="Execute the configuration step. When specified, build won't run unless --build is specified", action="store_true")
+parser.add_argument("--build", help="Execute the build step. When specified, configure won't run unless --configure is specified", action="store_true")
+parser.add_argument("--install", help="Execute the install step. When specified, configure and build steps WILL run without changes", action="store_true")
+
+args = parser.parse_args()
+
+src_directory = str(pathlib.Path(__file__).resolve().parents[2])
+
+if os.path.isabs(args.build_directory):
+ build_directory = args.build_directory
+else:
+ build_directory = os.path.join(src_directory, args.build_directory)
+
+conanfile_path = os.path.join(src_directory, "Tools", "qt", "conanfile.py")
+
+print("Path of build directory:" + build_directory)
+
+run_command("conan remote add -f bincrafters https://api.bintray.com/conan/bincrafters/public-conan")
+run_command("conan remote add -f qtproject https://api.bintray.com/conan/qtproject/conan")
+
+script = 'conan install {0} -if "{1}" --build=missing'.format(conanfile_path, build_directory)
+run_command(script)
+
+parse_qt(args.qt)
+parse_cmake(args.cmakeargs)
+parse_ninja(args.ninjaargs)
+parse_compiler(args.compiler)
+
+if not args.configure and not args.build:
+ # If we have neither --configure nor --build, we should do both configure and build (but install only if requested)
+ args.configure = True
+ args.build = True
+
+configure_flag = "--configure" if args.configure else ""
+build_flag = "--build" if args.build else ""
+install_flag = "--install" if args.install else ""
+
+script = 'conan build {0} {1} {2} -sf "{3}" -bf "{4}" "{5}"'.format(configure_flag, build_flag, install_flag, src_directory, build_directory, conanfile_path)
+run_command(script)
diff --git a/Tools/qt/conanfile.py b/Tools/qt/conanfile.py
index 6baa4610a..5a3d0cfca 100644
--- a/Tools/qt/conanfile.py
+++ b/Tools/qt/conanfile.py
@@ -19,6 +19,9 @@
# THE SOFTWARE.
from conans import ConanFile, CMake, tools
+import os
+import shlex
+import argparse
class QtWebKitConan(ConanFile):
@@ -27,20 +30,15 @@ class QtWebKitConan(ConanFile):
license = "LGPL-2.0-or-later, LGPL-2.1-or-later, BSD-2-Clause"
url = "https://github.com/qtwebkit/qtwebkit"
description = "Qt port of WebKit"
- topics = ( "qt", "browser-engine", "webkit", "qt5", "qml", "qtwebkit" )
+ topics = ("qt", "browser-engine", "webkit", "qt5", "qml", "qtwebkit")
settings = "os", "compiler", "build_type", "arch"
- generators = "cmake", "virtualenv"
+ generators = "cmake", "virtualenv", "txt"
exports_sources = "../../*"
no_copy_source = True
requires = (
- "icu/65.1@qtproject/stable",
- "libxml2/2.9.10@qtproject/stable",
- "libxslt/1.1.34@qtproject/stable",
"libjpeg-turbo/2.0.3@qtproject/stable",
- "zlib/1.2.11",
-
"libpng/1.6.37",
- "sqlite3/3.31.1"
+ "libwebp/1.1.0"
)
default_options = {
"icu:shared": True,
@@ -53,22 +51,18 @@ class QtWebKitConan(ConanFile):
"libxslt:shared": True,
- "libjpeg-turbo:shared": False
+ "libjpeg-turbo:shared": False,
+ "zlib:shared": False,
+ "libpng:shared": False,
+ "sqlite3:shared": False,
+ "libwebp:shared": False
}
-# For building with conan
-# options = {
-# "use_ccache": [True, False],
-# "qt5_dir": "ANY"
-# }
-# build_requires = (
-# "ninja/1.9.0",
-# "cmake/3.16.4"
-# )
def build_requirements(self):
if self.settings.os == 'Linux':
if not tools.which('pkg-config'):
- self.build_requires('pkg-config_installer/0.29.2@bincrafters/stable')
+ self.build_requires(
+ 'pkg-config_installer/0.29.2@bincrafters/stable')
# gperf python perl bison ruby flex
if not tools.which("gperf"):
@@ -81,25 +75,91 @@ class QtWebKitConan(ConanFile):
self.build_requires("bison_installer/3.3.2@bincrafters/stable")
if not tools.which("flex"):
self.build_requires("flex_installer/2.6.4@bincrafters/stable")
+ if not tools.which("ninja"):
+ self.build_requires("ninja/1.9.0")
+ if not tools.which("cmake"):
+ self.build_requires("cmake/3.16.4")
+
+ def requirements(self):
+ # TODO: Handle case when custom ICU is needed (AppStore etc., MACOS_USE_SYSTEM_ICU=OFF in CMake)
+ if self.settings.os != 'Macos':
+ self.requires("icu/65.1@qtproject/stable")
+ self.requires("libxml2/2.9.10@qtproject/stable")
+ self.requires("libxslt/1.1.34@qtproject/stable")
+ self.requires("zlib/1.2.11")
+ self.requires("sqlite3/3.31.1")
def build(self):
- cmake = CMake(self)
+ cmake = CMake(self, set_cmake_flags=True)
cmake.generator = "Ninja"
- cmake.verbose = True
+ cmake.verbose = False
cmake.definitions["QT_CONAN_DIR"] = self.build_folder
-
- if self.options.use_ccache:
- cmake.definitions["CMAKE_C_COMPILER_LAUNCHER"] = "ccache"
- cmake.definitions["CMAKE_CXX_COMPILER_LAUNCHER"] = "ccache"
-
- if self.options.qt5_dir:
- cmake.definitions["Qt5_DIR"] = self.options.qt5_dir
+ # QtWebKit installation requires conanfile.txt in build directory
+ self.write_imports()
+
+ # if self.options.use_ccache:
+ # cmake.definitions["CMAKE_C_COMPILER_LAUNCHER"] = "ccache"
+ # cmake.definitions["CMAKE_CXX_COMPILER_LAUNCHER"] = "ccache"
+
+ if "QTDIR" in os.environ:
+ cmake.definitions["Qt5_DIR"] = os.path.join(
+ os.environ["QTDIR"], "lib", "cmake", "Qt5")
+ print("Qt5 directory:" + cmake.definitions["Qt5_DIR"])
+
+ if "CMAKEFLAGS" in os.environ:
+ cmake_flags = shlex.split(os.environ["CMAKEFLAGS"])
+ else:
+ cmake_flags = None
+
+ if "NINJAFLAGS" in os.environ:
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-j', default=None, type=int)
+ jarg, ninja_flags = parser.parse_known_args(
+ shlex.split(os.environ["NINJAFLAGS"]))
+ if jarg.j:
+ os.environ['CONAN_CPU_COUNT'] = str(jarg.j)
+ ninja_flags.insert(0, '--')
+ else:
+ ninja_flags = None
print(self.source_folder)
print()
print(self.build_folder)
- cmake.configure()
+ cmake.configure(args=cmake_flags)
+ cmake.build(args=ninja_flags)
+ cmake.install()
+
+ # QtWebKit installation requires conanfile.txt in build directory, so we generate it here
+ # Should be kept in sync with imports()
+ def write_imports(self):
+ conanfile = open(os.path.join(self.build_folder, "conanfile.txt"), "w")
+ conanfile.write("[imports]\n")
+
+ if self.settings.os == 'Windows':
+ conanfile.write("bin, icudt65.dll -> ./bin\n")
+ conanfile.write("bin, icuin65.dll -> ./bin\n")
+ conanfile.write("bin, icuuc65.dll -> ./bin\n")
+ # Visual Studio
+ conanfile.write("bin, libxml2.dll -> ./bin\n")
+ conanfile.write("bin, libxslt.dll -> ./bin\n")
+ # MinGW
+ conanfile.write("bin, libxml2-2.dll -> ./bin\n")
+ conanfile.write("bin, libxslt-1.dll -> ./bin\n")
+
+ conanfile.close()
+
+ def imports(self):
+ if self.settings.os == 'Windows':
+ self.copy("icudt65.dll", "./bin", "bin")
+ self.copy("icuin65.dll", "./bin", "bin")
+ self.copy("icuuc65.dll", "./bin", "bin")
+ # Visual Studio
+ self.copy("libxml2.dll", "./bin", "bin")
+ self.copy("libxslt.dll", "./bin", "bin")
+ # MinGW
+ self.copy("libxml2-2.dll", "./bin", "bin")
+ self.copy("libxml2-2.dll", "./bin", "bin")
def package(self):
pass
diff --git a/Tools/qt/merge-helper.py b/Tools/qt/merge-helper.py
new file mode 100755
index 000000000..f89ffc433
--- /dev/null
+++ b/Tools/qt/merge-helper.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+# Copyright (C) 2020 Sergey Lapin <slapinid@gmail.com>
+#
+# 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 subprocess
+import os
+import sys
+from ConfigParser import ConfigParser
+from exceptions import Exception
+
+config = {}
+
+conflict_message = """
+Merge ended up having conflicts.
+
+Use "git status" command to find-out which conflicts require resolution.
+
+Resove them by editing files, adding and removing files, then commit the
+result.
+"""
+
+
+def configure():
+ global config
+ conf = ConfigParser()
+ conf_name = os.path.join(os.path.dirname(
+ os.path.abspath(sys.argv[0])), "merge.conf")
+ print "config: " + conf_name
+ conf.read([conf_name])
+ config["src_branch"] = conf.get("merge", "src_branch")
+ config["dst_branch"] = conf.get("merge", "dst_branch")
+ config["tmp_branch"] = conf.get("merge", "tmp_branch")
+ config["pre_merge"] = conf.get("scripts", "pre_merge")
+ config["post_merge"] = conf.get("scripts", "post_merge")
+ config["keep_tmp"] = False
+ config["reuse_tmp"] = False
+ for p in sys.argv[1:]:
+ if p == "--keep-tmp":
+ config["keep_tmp"] = True
+ elif p == "--reuse-tmp":
+ config["reuse_tmp"] = True
+
+
+def git_new_branch(branch, commit):
+ result = subprocess.call(["git", "checkout", "-b", branch, commit])
+ return result
+
+
+def try_merge():
+ result = subprocess.call(["git", "merge", config["src_branch"]])
+ if result != 0:
+ subprocess.call(["git", "merge", "--abort"])
+ return result
+
+
+def try_merge_with_fix():
+ result = subprocess.call(["git", "merge", config["src_branch"]])
+ if result != 0:
+ print conflict_message
+ unmerged = git_get_unmerged_files()
+ while len(unmerged) > 0:
+ print "Found " + str(len(unmerged)) + " unmerged files."
+ for f in unmerged:
+ print f
+ print "Please fix conflicts and commit result."
+ os.environ["PS1"] = "git conflicts(^D to exit)\n> "
+ os.system("bash --norc --noprofile -i")
+ unmerged = git_get_unmerged_files()
+ return result
+
+
+def pre_merge():
+ result = os.system(config["pre_merge"])
+ return result
+
+
+def post_merge():
+ result = os.system(config["post_merge"])
+ return result
+
+
+def git_switch_branch(branch):
+ result = subprocess.call(["git", "checkout", branch])
+ return result
+
+
+def git_checkout_branch_files(branch):
+ result = subprocess.call(["git", "checkout", branch, "--", "*"])
+ return result
+
+
+def git_remove_branch(branch):
+ result = subprocess.call(["git", "branch", "-D", branch])
+ return result
+
+
+def git_write_tree():
+ result = subprocess.check_output(["git", "write-tree"])
+ return result.strip()
+
+
+def git_get_unmerged_files():
+ result = subprocess.check_output(["git", "ls-files", "-u"])
+ data = result.strip()
+ ret = []
+ if data.find("\n") >= 0:
+ for l in data.split("\n"):
+ data = l.split()
+ if len(data) == 4:
+ if not data[3] in ret:
+ ret.append(data[3])
+
+ return ret
+
+
+def git_commit_tree(branch, tree):
+ result = subprocess.check_output(["git",
+ "commit-tree", "-p", "HEAD", "-p",
+ branch, "-m", "Merge from %s " % (branch), tree])
+ return result.strip()
+
+
+def git_update_ref(commit):
+ result = subprocess.call(["git", "update-ref",
+ "-m", "commit: Merge from %s" % (config["src_branch"]), "HEAD", commit])
+ return result
+
+
+configure()
+print config
+
+if not config["reuse_tmp"]:
+ result = git_new_branch(config["tmp_branch"], config["dst_branch"])
+ if result != 0:
+ raise Exception("Can't create branch " + config["tmp_branch"])
+else:
+ result = git_switch_branch(config["tmp_branch"])
+ if result != 0:
+ raise Exception("Can't switch to branch " + config["tmp_branch"])
+if not config["reuse_tmp"] or try_merge() != 0:
+ result = pre_merge()
+ if result != 0:
+ raise Exception("pre_merge section failed")
+
+ result = try_merge_with_fix()
+
+ result = post_merge()
+ if result != 0:
+ raise Exception("post_merge section failed")
+
+print "Checking out destination branch..."
+git_switch_branch(config["dst_branch"])
+print "Checking out temporary branch files..."
+git_checkout_branch_files(config["tmp_branch"])
+print "Finishing merge..."
+tree = git_write_tree()
+commit = git_commit_tree(config["src_branch"], tree)
+result = git_update_ref(commit)
+if result != 0:
+ raise Exception("Could not commit merge")
+print "Merge done..."
+if not config["keep_tmp"]:
+ print "Removing temporary branch"
+ git_remove_branch(config["tmp_branch"])
+else:
+ print "Temporary branch " + config["tmp_branch"] + " was kept"
diff --git a/Tools/qt/merge.conf b/Tools/qt/merge.conf
new file mode 100644
index 000000000..db3469c3f
--- /dev/null
+++ b/Tools/qt/merge.conf
@@ -0,0 +1,18 @@
+[merge]
+src_branch: qtwebkit-stable
+dst_branch: qtwebkit-dev
+tmp_branch: tmp-%(src_branch)s-%(dst_branch)s
+
+[scripts]
+pre_merge:
+ echo "pre-merge "
+ git mv Source/WebKit Source/WebKit2
+ git mv Source/WebKitLegacy/ Source/WebKit
+ git commit -m 'tmp mv'
+
+post_merge:
+ echo "post-merge "
+ git mv Source/WebKit Source/WebKitLegacy
+ git mv Source/WebKit2 Source/WebKit
+ git commit -m 'undo tmp mv'
+
diff --git a/tests/webkitwidgets/qwebpage/tst_qwebpage.cpp b/tests/webkitwidgets/qwebpage/tst_qwebpage.cpp
index eb50384e7..69bb035e0 100644
--- a/tests/webkitwidgets/qwebpage/tst_qwebpage.cpp
+++ b/tests/webkitwidgets/qwebpage/tst_qwebpage.cpp
@@ -105,6 +105,7 @@ class tst_QWebPage : public QObject
public:
tst_QWebPage();
virtual ~tst_QWebPage();
+ void createRendererTreeInWebPage();
public Q_SLOTS:
void init();
@@ -198,6 +199,8 @@ private Q_SLOTS:
void showModalDialog();
void testStopScheduledPageRefresh();
void findText();
+ void findTextScroll();
+ void javascriptScroll();
void supportedContentType();
// [Qt] tst_QWebPage::infiniteLoopJS() timeouts with DFG JIT
// https://bugs.webkit.org/show_bug.cgi?id=79040
@@ -3072,6 +3075,46 @@ void tst_QWebPage::findText()
}
}
+void tst_QWebPage::createRendererTreeInWebPage()
+{
+ QImage image(m_page->viewportSize(), QImage::Format_ARGB32);
+ QPainter painter(&image);
+ m_page->mainFrame()->render(&painter);
+ painter.end();
+}
+
+void tst_QWebPage::findTextScroll()
+{
+ m_view->setHtml(QString("<html><head></head><body style=\"padding:250px;\"><div>foo bar</div></body></html>"));
+ m_page->setViewportSize(QSize(200, 200));
+ QSignalSpy scrollRequestedSpy(m_page, SIGNAL(scrollRequested(int,int,QRect)));
+
+ QCOMPARE(m_page->mainFrame()->scrollPosition().y(), 0);
+
+ createRendererTreeInWebPage();
+
+ m_page->findText("bar");
+
+ QTRY_COMPARE(scrollRequestedSpy.count(), 1);
+ QVERIFY(m_page->mainFrame()->scrollPosition().y() > 40);
+}
+
+void tst_QWebPage::javascriptScroll()
+{
+ m_view->setHtml(QString("<html><head></head><body style=\"padding:250px;\"><div>foo bar</div></body></html>"));
+ m_page->setViewportSize(QSize(200, 200));
+ QSignalSpy scrollRequestedSpy(m_page, SIGNAL(scrollRequested(int,int,QRect)));
+
+ QCOMPARE(m_page->mainFrame()->scrollPosition().y(), 0);
+
+ createRendererTreeInWebPage();
+
+ m_page->mainFrame()->evaluateJavaScript("document.getElementsByTagName('div')[0].scrollIntoView()");
+
+ QTRY_COMPARE(scrollRequestedSpy.count(), 1);
+ QVERIFY(m_page->mainFrame()->scrollPosition().y() > 40);
+}
+
void tst_QWebPage::supportedContentType()
{
QStringList contentTypes;