diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2020-04-14 01:51:51 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2020-04-14 02:16:23 +0300 |
commit | 10cd6a106e1c461c774ca166a67b8c835c755ef7 (patch) | |
tree | 560966ea1a78303e17b89daa5de5bfc49b118fa5 | |
parent | 7b528379f143c791a42f73f9d70e432d796e440b (diff) |
Import QtWebKit commit 5da2323bd009bfd234e86c2552b7d9d4138652fe
Change-Id: Ib6d3119a4cb7900becb66bd40160b1d8e442e792
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
-rw-r--r-- | Source/JavaScriptCore/jsc.cpp | 2 | ||||
-rw-r--r-- | Source/cmake/OptionsQt.cmake | 12 | ||||
-rwxr-xr-x | Tools/qt/build-qtwebkit-conan.py | 122 | ||||
-rw-r--r-- | Tools/qt/conanfile.py | 118 | ||||
-rwxr-xr-x | Tools/qt/merge-helper.py | 186 | ||||
-rw-r--r-- | Tools/qt/merge.conf | 18 | ||||
-rw-r--r-- | tests/webkitwidgets/qwebpage/tst_qwebpage.cpp | 43 |
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; |