summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-02-01 20:50:41 +0100
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-02-01 20:58:12 +0100
commitb5d7ec9226eee41d9c3516bf51dc48c283e8b13e (patch)
tree994d2f09fd2106efed07e007becffed6e56a584c /src/core
parent3c4c080e46a8fa229d7e1fdaee82f750b3558aa0 (diff)
parent2313a580c0e3f0636a12697ba4b872bfdccbcf7f (diff)
Merge dev into 5.9
Diffstat (limited to 'src/core')
-rw-r--r--src/core/config/common.pri100
-rw-r--r--src/core/config/desktop_linux.pri36
-rw-r--r--src/core/config/embedded_linux.pri1
-rw-r--r--src/core/config/linux.pri38
-rw-r--r--src/core/config/mac_osx.pri55
-rw-r--r--src/core/content_browser_client_qt.cpp2
-rw-r--r--src/core/core.pro29
-rw-r--r--src/core/core_generator.pro10
-rw-r--r--src/core/core_gn_config.pri6
-rw-r--r--src/core/core_module.pro39
-rw-r--r--src/core/gn_run.pro34
-rw-r--r--src/core/gyp_run.pro2
-rw-r--r--src/core/qtwebengine.gni47
-rw-r--r--src/core/qtwebengine.gypi5
-rw-r--r--src/core/qtwebengine_resources.gni86
-rw-r--r--src/core/qtwebengine_sources.gni128
-rw-r--r--src/core/render_widget_host_view_qt.cpp66
-rw-r--r--src/core/render_widget_host_view_qt.h2
-rw-r--r--src/core/render_widget_host_view_qt_delegate.h1
-rw-r--r--src/core/web_contents_adapter.cpp98
-rw-r--r--src/core/web_contents_adapter.h2
-rw-r--r--src/core/web_contents_adapter_p.h6
-rw-r--r--src/core/web_contents_view_qt.cpp13
-rw-r--r--src/core/web_event_factory.cpp9
24 files changed, 684 insertions, 131 deletions
diff --git a/src/core/config/common.pri b/src/core/config/common.pri
index f822ab7cc..7307c4a46 100644
--- a/src/core/config/common.pri
+++ b/src/core/config/common.pri
@@ -1,33 +1,79 @@
# Shared configuration for all our supported platforms
-# Trigger Qt-specific build conditions.
-GYP_CONFIG += use_qt=1
-# We do not want to ship more external binary blobs, so let v8 embed its startup data.
-GYP_CONFIG += v8_use_external_startup_data=0
-# WebSpeech requires Google API keys and adds dependencies on speex and flac.
-GYP_CONFIG += enable_web_speech=0
-# We do not use or even include the extensions
-GYP_CONFIG += enable_extensions=0
-
-sanitize_address: GYP_CONFIG += asan=1
-sanitize_thread: GYP_CONFIG += tsan=1
-sanitize_memory: GYP_CONFIG += msan=1
-sanitize_undefined: GYP_CONFIG += ubsan=1
-
-use?(printing) {
- GYP_CONFIG += enable_basic_printing=1 enable_print_preview=1
-} else {
- GYP_CONFIG += enable_basic_printing=0 enable_print_preview=0
-}
+use?(gn) {
+ gn_args += \
+ use_qt=true \
+ is_component_build=false \
+ enable_remoting=false \
+ enable_nacl=false \
+ use_experimental_allocator_shim=false \
+ use_allocator=\"none\" \
+ v8_use_external_startup_data=false \
+ treat_warnings_as_errors=false
-use?(pdf) {
- GYP_CONFIG += enable_pdf=1
-} else {
- GYP_CONFIG += enable_pdf=0
-}
+ use?(printing) {
+ gn_args += enable_basic_printing=true enable_print_preview=true
+ } else {
+ gn_args += enable_basic_printing=false enable_print_preview=false
+ }
+
+ use?(pdf) {
+ gn_args += enable_pdf=true
+ } else {
+ gn_args += enable_pdf=false
+ }
+
+ use?(pepper_plugins) {
+ gn_args += enable_plugins=true enable_widevine=true
+ } else {
+ gn_args += enable_plugins=false enable_widevine=false
+ }
+
+ use?(spellchecker) {
+ gn_args += enable_spellcheck=true
+ } else {
+ gn_args += enable_spellcheck=false
+ }
+
+ use?(webrtc) {
+ gn_args += enable_webrtc=true
+ } else {
+ gn_args += enable_webrtc=false
+ }
-use?(pepper_plugins) {
- GYP_CONFIG += enable_plugins=1 enable_widevine=1
} else {
- GYP_CONFIG += enable_plugins=0 enable_widevine=0
+ # Trigger Qt-specific build conditions.
+ GYP_CONFIG += use_qt=1
+ # We do not want to ship more external binary blobs, so let v8 embed its startup data.
+ GYP_CONFIG += v8_use_external_startup_data=0
+ # WebSpeech requires Google API keys and adds dependencies on speex and flac.
+ GYP_CONFIG += enable_web_speech=0
+ # We do not use or even include the extensions
+ GYP_CONFIG += enable_extensions=0
+
+ sanitize_address: GYP_CONFIG += asan=1
+ sanitize_thread: GYP_CONFIG += tsan=1
+ sanitize_memory: GYP_CONFIG += msan=1
+ sanitize_undefined: GYP_CONFIG += ubsan=1
+
+ use?(printing) {
+ GYP_CONFIG += enable_basic_printing=1 enable_print_preview=1
+ } else {
+ GYP_CONFIG += enable_basic_printing=0 enable_print_preview=0
+ }
+
+ use?(pdf) {
+ GYP_CONFIG += enable_pdf=1
+ } else {
+ GYP_CONFIG += enable_pdf=0
+ }
+
+ use?(pepper_plugins) {
+ GYP_CONFIG += enable_plugins=1 enable_widevine=1
+ } else {
+ GYP_CONFIG += enable_plugins=0 enable_widevine=0
+ }
}
+
+use?(webrtc): GYP_CONFIG += enable_webrtc=1
+else: GYP_CONFIG += enable_webrtc=0
diff --git a/src/core/config/desktop_linux.pri b/src/core/config/desktop_linux.pri
index 92491fc1c..e8db4248f 100644
--- a/src/core/config/desktop_linux.pri
+++ b/src/core/config/desktop_linux.pri
@@ -1,17 +1,29 @@
-GYP_ARGS += "-D qt_os=\"desktop_linux\""
-
include(linux.pri)
-GYP_CONFIG += \
- desktop_linux=1
+use?(gn) {
+ gn_args += \
+ is_clang=false \
+ use_sysroot=false
+
+ use?(icecc) {
+ gn_args += use_debug_fission=false
+ }
-clang {
- GYP_CONFIG += werror=
- clang_full_path = $$which($${QMAKE_CXX})
- # Remove the "/bin/clang++" part.
- clang_prefix = $$section(clang_full_path, /, 0, -3)
- GYP_CONFIG += clang=1 host_clang=1 clang_use_chrome_plugins=0 make_clang_dir=$${clang_prefix}
- linux-clang-libc++: GYP_CONFIG += use_system_libcxx=1
} else {
- GYP_CONFIG += clang=0 host_clang=0
+
+ GYP_ARGS += "-D qt_os=\"desktop_linux\""
+
+ GYP_CONFIG += \
+ desktop_linux=1
+
+ clang {
+ GYP_CONFIG += werror=
+ clang_full_path = $$which($${QMAKE_CXX})
+ # Remove the "/bin/clang++" part.
+ clang_prefix = $$section(clang_full_path, /, 0, -3)
+ GYP_CONFIG += clang=1 host_clang=1 clang_use_chrome_plugins=0 make_clang_dir=$${clang_prefix}
+ linux-clang-libc++: GYP_CONFIG += use_system_libcxx=1
+ } else {
+ GYP_CONFIG += clang=0 host_clang=0
+ }
}
diff --git a/src/core/config/embedded_linux.pri b/src/core/config/embedded_linux.pri
index 08c8c1661..c9de47562 100644
--- a/src/core/config/embedded_linux.pri
+++ b/src/core/config/embedded_linux.pri
@@ -18,7 +18,6 @@ GYP_CONFIG += \
enable_session_service=0 \
enable_task_manager=0 \
enable_themes=0 \
- enable_webrtc=0 \
gtest_target_type=none \
host_clang=0 \
notifications=0 \
diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri
index b91e795ca..8509c0c8e 100644
--- a/src/core/config/linux.pri
+++ b/src/core/config/linux.pri
@@ -2,6 +2,44 @@ include(common.pri)
include($$QTWEBENGINE_OUT_ROOT/qtwebengine-config.pri)
QT_FOR_CONFIG += gui-private webengine-private
+use?(gn) {
+ gn_args += \
+ use_gconf=false \
+ use_gio=false \
+ use_kerberos=false \
+ linux_use_bundled_binutils=false
+
+ #qtConfig(system-zlib): use?(system_minizip): gn_args += use_system_zlib=true use_system_minizip=true
+ #qtConfig(system-png): gn_args += use_system_libpng=true
+ qtConfig(system-jpeg): gn_args += use_system_libjpeg=true
+ qtConfig(system-harfbuzz): use?(system_harfbuzz): gn_args += use_system_harfbuzz=true
+ !qtConfig(glib): gn_args += use_glib=false
+ qtConfig(pulseaudio) {
+ gn_args += use_pulseaudio=true
+ } else {
+ gn_args += use_pulseaudio=false
+ }
+ qtConfig(alsa) {
+ gn_args += use_alsa=true
+ } else {
+ gn_args += use_alsa=false
+ }
+
+ #use?(system_libevent): gn_args += use_system_libevent=true
+ #use?(system_libwebp): gn_args += use_system_libwebp=true
+ #use?(system_libsrtp): gn_args += use_system_libsrtp=true
+ #use?(system_libxslt): gn_args += use_system_libxml=true use_system_libxslt=true
+ #use?(system_jsoncpp): gn_args += use_system_jsoncpp=true
+ #use?(system_opus): gn_args += use_system_opus=true
+ #use?(system_snappy): gn_args += use_system_snappy=true
+ #use?(system_vpx): gn_args += use_system_libvpx=true
+ #use?(system_icu): gn_args += use_system_icu=true icu_use_data_file_flag=false
+ #use?(system_ffmpeg): gn_args += use_system_ffmpeg=true
+ #use?(system_protobuf): gn_args += use_system_protobuf=true
+
+ #gcc:!clang: greaterThan(QT_GCC_MAJOR_VERSION, 5): gn_args += no_delete_null_pointer_checks=true
+}
+
# linux_use_bundled_gold currently relies on a hardcoded relative path from chromium/src/out/(Release|Debug)
# Disable it along with the -Wl,--threads flag just in case gold isn't installed on the system.
GYP_CONFIG += \
diff --git a/src/core/config/mac_osx.pri b/src/core/config/mac_osx.pri
index dfc8d840b..e52051b0c 100644
--- a/src/core/config/mac_osx.pri
+++ b/src/core/config/mac_osx.pri
@@ -19,21 +19,42 @@ QMAKE_CLANG_PATH = $$eval(QMAKE_MAC_SDK.macx-clang.$${QMAKE_MAC_SDK}.QMAKE_CXX)
QMAKE_CLANG_PATH = "$${QMAKE_CLANG_DIR}/bin/clang++"
message("Using clang++ from $${QMAKE_CLANG_PATH}")
system("$${QMAKE_CLANG_PATH} --version")
-GYP_CONFIG += \
- qt_os=\"mac\" \
- mac_sdk_min=\"$${QMAKE_MAC_SDK_VERSION}\" \
- mac_deployment_target=\"$${QMAKE_MACOSX_DEPLOYMENT_TARGET}\" \
- make_clang_dir=\"$${QMAKE_CLANG_DIR}\" \
- clang_use_chrome_plugins=0
-
-# Force touch API is used in 49-based Chromium, which is included starting with 10.10.3 SDK, so we
-# disable the API usage if the SDK version is lower.
-!isMinOSXSDKVersion(10, 10, 3): GYP_CONFIG += disable_force_touch=1
-
-# Pass a supported -fstack-protect flag depending on Xcode version.
-lessThan(QMAKE_XCODE_VERSION, 6.3) {
- GYP_CONFIG += use_xcode_stack_protector_strong=0
-}
-QMAKE_MAC_SDK_PATH = "$$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path)"
-exists($$QMAKE_MAC_SDK_PATH): GYP_CONFIG += mac_sdk_path=\"$${QMAKE_MAC_SDK_PATH}\"
+
+use?(gn) {
+ gn_args += \
+ is_clang=true \
+ use_sysroot=false \
+ use_kerberos=false \
+ clang_base_path=\"$${QMAKE_CLANG_DIR}\" \
+ clang_use_chrome_plugins=false \
+ mac_deployment_target=\"$${QMAKE_MACOSX_DEPLOYMENT_TARGET}\" \
+ mac_sdk_min=\"$${QMAKE_MAC_SDK_VERSION}\"
+
+ use?(spellchecker) {
+ use?(native_spellchecker): gn_args += use_browser_spellchecker=true
+ else: gn_args += use_browser_spellchecker=false
+ } else {
+ macos: gn_args += use_browser_spellchecker=false
+ }
+
+} else {
+ GYP_CONFIG += \
+ qt_os=\"mac\" \
+ mac_sdk_min=\"$${QMAKE_MAC_SDK_VERSION}\" \
+ mac_deployment_target=\"$${QMAKE_MACOSX_DEPLOYMENT_TARGET}\" \
+ make_clang_dir=\"$${QMAKE_CLANG_DIR}\" \
+ clang_use_chrome_plugins=0
+
+ # Force touch API is used in 49-based Chromium, which is included starting with 10.10.3 SDK, so we
+ # disable the API usage if the SDK version is lower.
+ !isMinOSXSDKVersion(10, 10, 3): GYP_CONFIG += disable_force_touch=1
+
+ # Pass a supported -fstack-protect flag depending on Xcode version.
+ lessThan(QMAKE_XCODE_VERSION, 6.3) {
+ GYP_CONFIG += use_xcode_stack_protector_strong=0
+ }
+
+ QMAKE_MAC_SDK_PATH = "$$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path)"
+ exists($$QMAKE_MAC_SDK_PATH): GYP_CONFIG += mac_sdk_path=\"$${QMAKE_MAC_SDK_PATH}\"
+}
diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
index 787586540..f9b6f31d8 100644
--- a/src/core/content_browser_client_qt.cpp
+++ b/src/core/content_browser_client_qt.cpp
@@ -386,7 +386,7 @@ void ContentBrowserClientQt::RenderProcessWillLaunch(content::RenderProcessHost*
// SpellCheckMessageFilter is required for both Hunspell and Native configurations.
host->AddFilter(new SpellCheckMessageFilter(id));
#endif
-#if defined(Q_OS_MACOS) && defined(USE_BROWSER_SPELLCHECKER)
+#if defined(Q_OS_MACOS) && defined(ENABLE_SPELLCHECK) && defined(USE_BROWSER_SPELLCHECKER)
host->AddFilter(new SpellCheckMessageFilterPlatform(id));
#endif
#if defined(ENABLE_BASIC_PRINTING)
diff --git a/src/core/core.pro b/src/core/core.pro
index cda885921..a2f3c3753 100644
--- a/src/core/core.pro
+++ b/src/core/core.pro
@@ -14,15 +14,38 @@ core_module.depends = core_api
core_generator.file = core_generator.pro
core_generator.depends = core_headers
-
use?(gn) {
+ # core_gn_generator.pro is a dummy .pro file that is used by qmake
+ # to generate our main BUILD.gn file
+
+ core_icu.files = $$OUT_PWD/$$getConfigDir()/icudtl.dat
+ core_icu.path = $$[QT_INSTALL_DATA]/resources
+ core_icu.CONFIG += no_check_exist
+
+ core_locales.files = $$OUT_PWD/$$getConfigDir()/qtwebengine_locales/*.pak
+ core_locales.path = $$[QT_INSTALL_TRANSLATIONS]/qtwebengine_locales
+ core_locales.CONFIG += no_check_exist
+
+ core_resources.files = \
+ $$OUT_PWD/$$getConfigDir()/qtwebengine_resources.pak \
+ $$OUT_PWD/$$getConfigDir()/qtwebengine_resources_100p.pak \
+ $$OUT_PWD/$$getConfigDir()/qtwebengine_resources_200p.pak \
+ $$OUT_PWD/$$getConfigDir()/qtwebengine_devtools_resources.pak
+ core_resources.path = $$[QT_INSTALL_DATA]/resources
+ core_resources.CONFIG += no_check_exist
+ INSTALLS += core_resources core_locales core_icu
gn_run.file = gn_run.pro
gn_run.depends = core_generator
- SUBDIRS += core_headers \
+ core_api.depends = gn_run
+
+ SUBDIRS += \
+ core_headers \
core_generator \
- gn_run
+ gn_run \
+ core_api \
+ core_module
} else {
# gyp_run.pro calls gyp through gyp_qtwebengine on the qmake step, and ninja on the make step.
diff --git a/src/core/core_generator.pro b/src/core/core_generator.pro
index e1e7ab1d9..ed47a47e9 100644
--- a/src/core/core_generator.pro
+++ b/src/core/core_generator.pro
@@ -12,7 +12,15 @@ include(core_common.pri)
macos {
# This fixes namespace builds on macOS. Specifically namespace ambiguity issues between Qt and
# Chromium forward declarations of NSString.
- forward_declaration_macro = $$shell_quote(\"Q_FORWARD_DECLARE_OBJC_CLASS(name)=class name;\")
+ contains(WEBENGINE_CONFIG, use_gn) {
+ # The single quotes are present so that qmake iteration does not interpret the space as
+ # delimiting a new value, they are removed before writing to the GN file, and the final shell
+ # quoting is done by GN itself.
+ forward_declaration_macro = "'Q_FORWARD_DECLARE_OBJC_CLASS(name)=class name;'"
+ } else {
+ # For GYP, quoting should be done by qmake itself.
+ forward_declaration_macro = $$shell_quote(\"Q_FORWARD_DECLARE_OBJC_CLASS(name)=class name;\")
+ }
} else {
forward_declaration_macro = "Q_FORWARD_DECLARE_OBJC_CLASS=QT_FORWARD_DECLARE_CLASS"
}
diff --git a/src/core/core_gn_config.pri b/src/core/core_gn_config.pri
index ea45977f5..fb671ddb2 100644
--- a/src/core/core_gn_config.pri
+++ b/src/core/core_gn_config.pri
@@ -1,6 +1,10 @@
CONFIG = gn_generator $$CONFIG
GN_SRC_DIR = $$PWD
-GN_FILE = $$OUT_PWD/BUILD.gn
+GN_FILE = $$OUT_PWD/$$getConfigDir()/BUILD.gn
GN_FIND_MOCABLES_SCRIPT = $$shell_path($$QTWEBENGINE_ROOT/tools/scripts/gn_find_mocables.py)
GN_RUN_BINARY_SCRIPT = $$shell_path($$QTWEBENGINE_ROOT/tools/scripts/gn_run_binary.py)
+GN_IMPORTS = $$PWD/qtwebengine.gni
+GN_INCLUDES = $$PWD/qtwebengine_sources.gni $$PWD/qtwebengine_resources.gni
+GN_CREATE_PRI = true
+QMAKE_INTERNAL_INCLUDED_FILES = $$GN_IMPORTS $$GN_INCLUDES $$GN_FILE
diff --git a/src/core/core_module.pro b/src/core/core_module.pro
index 596993457..a7853e524 100644
--- a/src/core/core_module.pro
+++ b/src/core/core_module.pro
@@ -4,9 +4,11 @@ include(core_common.pri)
# Needed to set a CFBundleIdentifier
QMAKE_INFO_PLIST = Info_mac.plist
-# Look for linking information produced by gyp for our target according to core_generated.gyp
-!include($$OUT_PWD/$$getConfigDir()/$${TARGET}_linking.pri) {
- error("Could not find the linking information that gyp should have generated.")
+use?(gn): linking_pri = $$OUT_PWD/$$getConfigDir()/$${TARGET}.pri
+else: linking_pri = $$OUT_PWD/$$getConfigDir()/$${TARGET}_linking.pri
+
+!include($$linking_pri) {
+ error("Could not find the linking information that gyp/gn should have generated.")
}
load(qt_module)
@@ -17,6 +19,30 @@ api_library_path = $$OUT_PWD/api/$$getConfigDir()
# Do not precompile any headers. We are only interested in the linker step.
PRECOMPILED_HEADER =
+use?(gn){
+ isEmpty(NINJA_OBJECTS): error("Missing object files from QtWebEngineCore linking pri.")
+ isEmpty(NINJA_LFLAGS): error("Missing linker flags from QtWebEngineCore linking pri")
+ isEmpty(NINJA_ARCHIVES): error("Missing archive files from QtWebEngineCore linking pri")
+ isEmpty(NINJA_LIBS): error("Missing library files from QtWebEngineCore linking pri")
+ NINJA_OBJECTS = $$eval($$list($$NINJA_OBJECTS))
+ # Do manual response file linking for macOS and Linux
+ unix {
+ RSP_FILE = $$OUT_PWD/$$getConfigDir()/$${TARGET}.rsp
+ for(object, NINJA_OBJECTS): RSP_CONTENT += $$object
+ write_file($$RSP_FILE, RSP_CONTENT)
+ macos:LIBS_PRIVATE += -Wl,-filelist,$$shell_quote($$RSP_FILE)
+ linux:LIBS_PRIVATE += @$$RSP_FILE
+ } else {
+ OBJECTS = $$NINJA_OBJECTS
+ }
+ linux: LIBS_PRIVATE += -Wl,--start-group $$NINJA_ARCHIVES -Wl,--end-group
+ else: LIBS_PRIVATE += $$NINJA_ARCHIVES
+ LIBS_PRIVATE += $$NINJA_LIB_DIRS $$NINJA_LIBS
+ QMAKE_LFLAGS += $$NINJA_LFLAGS
+ POST_TARGETDEPS += $$NINJA_TARGETDEPS
+}
+
+
LIBS_PRIVATE += -L$$api_library_path
CONFIG *= no_smart_library_merge
osx {
@@ -44,7 +70,12 @@ qtConfig(egl): CONFIG += egl
linux:qtConfig(separate_debug_info): QMAKE_POST_LINK="cd $(DESTDIR) && $(STRIP) --strip-unneeded $(TARGET)"
-REPACK_DIR = $$OUT_PWD/$$getConfigDir()/gen/repack
+use?(gn) {
+ REPACK_DIR = $$OUT_PWD/$$getConfigDir()
+} else {
+ REPACK_DIR = $$OUT_PWD/$$getConfigDir()/gen/repack
+}
+
# Duplicated from resources/resources.gyp
LOCALE_LIST = am ar bg bn ca cs da de el en-GB en-US es-419 es et fa fi fil fr gu he hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr sv sw ta te th tr uk vi zh-CN zh-TW
for(LOC, LOCALE_LIST) {
diff --git a/src/core/gn_run.pro b/src/core/gn_run.pro
index c379f9510..534f0c7b3 100644
--- a/src/core/gn_run.pro
+++ b/src/core/gn_run.pro
@@ -7,8 +7,15 @@ TEMPLATE = aux
build_pass|!debug_and_release {
+ macos: include(config/mac_osx.pri)
+ linux: include(config/desktop_linux.pri)
+ isEmpty(gn_args): error(No gn_args found please make sure you have valid configuration.)
+
ninja_binary = ninja
+ gn_binary = gn
+
runninja.target = run_ninja
+ rungn.target = run_gn
!qtConfig(system-ninja) {
ninja_binary = $$shell_quote($$shell_path($$ninjaPath()))
@@ -18,18 +25,35 @@ build_pass|!debug_and_release {
runninja.depends = buildninja
}
+ CONFIG(release, debug|release):
+ gn_args += is_debug=false
+
+ gn_args += "qtwebengine_target=\"$$shell_path($$OUT_PWD/$$getConfigDir()):QtWebEngineCore\""
+
!qtConfig(system-gn) {
+ gn_binary = $$shell_quote($$shell_path($$gnPath()))
buildgn.target = build_gn
- buildgn.commands = $$buildGn()
- !qtConfig(system-ninja): buildgn.depends = buildninja
+ buildgn.commands = $$buildGn($$gn_args)
+ !qtConfig(system-ninja) {
+ buildgn.depends = buildninja
+ rungn.depends = buildninja
+ }
QMAKE_EXTRA_TARGETS += buildgn
- runninja.depends = buildgn
}
- runninja.commands = $$ninja_binary \$\(NINJAFLAGS\) -C $$shell_quote($$OUT_PWD/$$getConfigDir())
+ gn_args = $$shell_quote($$gn_args)
+ gn_src_root = $$shell_quote($$shell_path($$QTWEBENGINE_ROOT/$$getChromiumSrcDir()))
+ gn_build_root = $$shell_quote($$shell_path($$OUT_PWD/$$getConfigDir()))
+ rungn.commands = $$gn_binary gen $$gn_build_root --args=$$gn_args --root=$$gn_src_root
+ QMAKE_EXTRA_TARGETS += rungn
+
+ runninja.commands = $$ninja_binary \$\(NINJAFLAGS\) -v -C $$shell_quote($$OUT_PWD/$$getConfigDir()) QtWebEngineCore
+ runninja.depends += rungn
QMAKE_EXTRA_TARGETS += runninja
- default_target.depends = buildgn
+ build_pass:build_all: default_target.target = all
+ else: default_target.target = first
+ default_target.depends = runninja
QMAKE_EXTRA_TARGETS += default_target
} else {
diff --git a/src/core/gyp_run.pro b/src/core/gyp_run.pro
index c583845e9..fa8f73de4 100644
--- a/src/core/gyp_run.pro
+++ b/src/core/gyp_run.pro
@@ -9,7 +9,7 @@ isQtMinimum(5, 8) {
TEMPLATE = aux
-cross_compile {
+contains(WEBENGINE_CONFIG, embedded_build) {
GYP_ARGS = "-D qt_cross_compile=1"
posix: GYP_ARGS += "-D os_posix=1"
qnx: include(config/embedded_qnx.pri)
diff --git a/src/core/qtwebengine.gni b/src/core/qtwebengine.gni
new file mode 100644
index 000000000..4e561e7a9
--- /dev/null
+++ b/src/core/qtwebengine.gni
@@ -0,0 +1,47 @@
+chromium_version = exec_script("//build/util/version.py", [ "-f", rebase_path("//chrome/VERSION"),
+ "-t", "@MAJOR@.@MINOR@.@BUILD@.@PATCH@"],
+ "list lines")
+
+declare_args() {
+ use_qt = true
+}
+
+include_dirs = [
+ "//skia/config",
+ "//third_party/skia/include/core"
+]
+
+deps = [
+ "//base",
+ "//components/cdm/renderer",
+ "//components/devtools_http_handler",
+ "//components/error_page/common",
+ "//components/keyed_service/content",
+ "//components/visitedlink/browser",
+ "//components/visitedlink/renderer",
+ "//components/web_cache/browser",
+ "//components/web_cache/public/interfaces",
+ "//components/web_cache/renderer",
+ "//content/public/app:browser",
+ "//content/public/browser",
+ "//content/public/common",
+ "//net:net_browser_services",
+ "//services/shell/public/cpp",
+ "//skia",
+ "//third_party/WebKit/public:blink",
+ "//third_party/widevine/cdm:version_h",
+ "//ui/accessibility",
+ "//third_party/mesa:mesa_headers",
+ ":qtwebengine_sources",
+ ":qtwebengine_resources"
+]
+
+if (enable_widevine) {
+ deps += [ "//components/cdm/renderer"]
+}
+
+# fixme:
+defines = [
+ "QTWEBENGINEPROCESS_NAME=\"QtWebEngineProcess\"",
+ "CHROMIUM_VERSION=\"" + chromium_version[0] + "\""
+]
diff --git a/src/core/qtwebengine.gypi b/src/core/qtwebengine.gypi
index 5131ce8cc..b83b1cbfa 100644
--- a/src/core/qtwebengine.gypi
+++ b/src/core/qtwebengine.gypi
@@ -5,6 +5,11 @@
'variables': {
'version_script_location%': '<(chromium_src_dir)/build/util/version.py',
},
+ 'configurations': {
+ 'Release': {
+ 'defines': [ 'QT_NO_DEBUG' ],
+ },
+ },
'dependencies': [
'<(chromium_src_dir)/base/base.gyp:base',
'<(chromium_src_dir)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
diff --git a/src/core/qtwebengine_resources.gni b/src/core/qtwebengine_resources.gni
new file mode 100644
index 000000000..e3cd42169
--- /dev/null
+++ b/src/core/qtwebengine_resources.gni
@@ -0,0 +1,86 @@
+import("//tools/grit/repack.gni")
+import("//build/config/locales.gni")
+import("//chrome/chrome_repack_locales.gni")
+
+group("qtwebengine_resources") {
+ deps = [
+ "//chrome/app:generated_resources",
+ "//components/resources:components_resources",
+ ":qtwebengine_repack_resources",
+ ":qtwebengine_repack_resources_100",
+ ":qtwebengine_repack_resources_200",
+ ":qtwebengine_repack_resources_devtools",
+ ":qtwebengine_repack_locales_pack"
+ ]
+}
+
+repack("qtwebengine_repack_resources") {
+ sources = [
+ "$root_gen_dir/blink/public/resources/blink_resources.pak",
+ "$root_gen_dir/components/components_resources.pak",
+ "$root_gen_dir/content/content_resources.pak",
+ "$root_gen_dir/net/net_resources.pak",
+ "$root_gen_dir/ui/resources/webui_resources.pak",
+ ]
+ output = "$root_out_dir/qtwebengine_resources.pak"
+ deps = [
+ "//components/resources:components_resources_grit",
+ "//content:resources_grit",
+ "//net:net_resources_grit",
+ "//third_party/WebKit/public:resources_grit",
+ "//ui/resources:webui_resources_grd_grit",
+ ]
+}
+
+repack("qtwebengine_repack_resources_100") {
+ sources = [
+ "$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
+ "$root_gen_dir/components/components_resources_100_percent.pak",
+ "$root_gen_dir/content/app/resources/content_resources_100_percent.pak",
+ "$root_gen_dir/chrome/renderer_resources_100_percent.pak",
+ "$root_gen_dir/blink/public/resources/blink_image_resources_100_percent.pak",
+ ]
+ output = "$root_out_dir/qtwebengine_resources_100p.pak"
+ deps = [
+ "//third_party/WebKit/public:image_resources_grit",
+ "//chrome/renderer:resources_grit",
+ "//components/resources:components_scaled_resources_grit",
+ "//content/app/resources:resources_grit",
+ "//ui/resources:ui_resources_grd_grit"
+ ]
+}
+
+repack("qtwebengine_repack_resources_200") {
+ sources = [
+ "$root_gen_dir/ui/resources/ui_resources_200_percent.pak",
+ "$root_gen_dir/components/components_resources_200_percent.pak",
+ "$root_gen_dir/content/app/resources/content_resources_200_percent.pak",
+ "$root_gen_dir/chrome/renderer_resources_200_percent.pak",
+ "$root_gen_dir/blink/public/resources/blink_image_resources_200_percent.pak",
+ ]
+ output = "$root_out_dir/qtwebengine_resources_200p.pak"
+ deps = [
+ "//third_party/WebKit/public:image_resources_grit",
+ "//chrome/renderer:resources_grit",
+ "//components/resources:components_scaled_resources_grit",
+ "//content/app/resources:resources_grit",
+ "//ui/resources:ui_resources_grd_grit"
+ ]
+}
+
+repack("qtwebengine_repack_resources_devtools") {
+ sources = [
+ "$root_gen_dir/blink/devtools_resources.pak",
+ ]
+ output = "$root_out_dir/qtwebengine_devtools_resources.pak"
+ deps = [
+ "//content/browser/devtools:devtools_resources_grit"
+ ]
+}
+
+chrome_repack_locales("qtwebengine_repack_locales_pack") {
+ input_locales = locales
+ output_dir_name = "qtwebengine_locales"
+ output_locales = locales
+}
+
diff --git a/src/core/qtwebengine_sources.gni b/src/core/qtwebengine_sources.gni
new file mode 100644
index 000000000..2d3503e98
--- /dev/null
+++ b/src/core/qtwebengine_sources.gni
@@ -0,0 +1,128 @@
+source_set("qtwebengine_sources") {
+ include_dirs = [
+ "//skia/config",
+ "//third_party/skia/include/core"
+ ]
+ deps = []
+ sources = [
+ "//chrome/browser/media/desktop_media_list.h",
+ "//chrome/browser/media/desktop_streams_registry.cc",
+ "//chrome/browser/media/desktop_streams_registry.h",
+ "//chrome/common/chrome_switches.cc",
+ "//chrome/common/chrome_switches.h",
+ "//components/prefs/testing_pref_store.cc",
+ "//components/prefs/testing_pref_store.h",
+ "//extensions/common/constants.cc",
+ "//extensions/common/constants.h",
+ "//extensions/common/url_pattern.cc",
+ "//extensions/common/url_pattern.h",
+ ]
+
+ if (enable_plugins) {
+ sources += [
+ "//chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc",
+ "//chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.h",
+ "//chrome/renderer/pepper/pepper_flash_font_file_host.cc",
+ "//chrome/renderer/pepper/pepper_flash_font_file_host.h",
+ "//chrome/renderer/pepper/pepper_shared_memory_message_filter.cc",
+ "//chrome/renderer/pepper/pepper_shared_memory_message_filter.h",
+ ]
+
+ deps += [
+ # Need to depend on //content/ppapi_plugin, which is private, thus depending on parent.
+ "//content",
+ ]
+ }
+
+ if (enable_spellcheck) {
+ sources += [
+ "//chrome/browser/spellchecker/feedback.cc",
+ "//chrome/browser/spellchecker/feedback.h",
+ "//chrome/browser/spellchecker/feedback_sender.cc",
+ "//chrome/browser/spellchecker/feedback_sender.h",
+ "//chrome/browser/spellchecker/misspelling.cc",
+ "//chrome/browser/spellchecker/misspelling.h",
+ "//chrome/browser/spellchecker/spellcheck_action.cc",
+ "//chrome/browser/spellchecker/spellcheck_action.h",
+ "//chrome/browser/spellchecker/spellcheck_custom_dictionary.cc",
+ "//chrome/browser/spellchecker/spellcheck_custom_dictionary.h",
+ "//chrome/browser/spellchecker/spellcheck_factory.cc",
+ "//chrome/browser/spellchecker/spellcheck_factory.h",
+ "//chrome/browser/spellchecker/spellcheck_host_metrics.cc",
+ "//chrome/browser/spellchecker/spellcheck_host_metrics.h",
+ "//chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc",
+ "//chrome/browser/spellchecker/spellcheck_hunspell_dictionary.h",
+ "//chrome/browser/spellchecker/spellcheck_message_filter.cc",
+ "//chrome/browser/spellchecker/spellcheck_message_filter.h",
+ "//chrome/browser/spellchecker/spellcheck_platform_mac.mm",
+ "//chrome/browser/spellchecker/spellcheck_service.cc",
+ "//chrome/browser/spellchecker/spellcheck_service.h",
+ "//chrome/browser/spellchecker/spelling_service_client.cc",
+ "//chrome/browser/spellchecker/spelling_service_client.h",
+ "//chrome/browser/spellchecker/word_trimmer.cc",
+ "//chrome/browser/spellchecker/word_trimmer.h",
+ "//chrome/common/common_message_generator.cc",
+ "//chrome/common/pref_names.cc",
+ "//chrome/common/pref_names.h",
+ "//chrome/common/spellcheck_bdict_language.h",
+ "//chrome/common/spellcheck_common.cc",
+ "//chrome/common/spellcheck_common.h",
+ "//chrome/common/spellcheck_marker.h",
+ "//chrome/common/spellcheck_messages.h",
+ "//chrome/common/spellcheck_result.h",
+ "//chrome/renderer/spellchecker/custom_dictionary_engine.cc",
+ "//chrome/renderer/spellchecker/custom_dictionary_engine.h",
+ "//chrome/renderer/spellchecker/hunspell_engine.cc",
+ "//chrome/renderer/spellchecker/hunspell_engine.h",
+ "//chrome/renderer/spellchecker/spellcheck.cc",
+ "//chrome/renderer/spellchecker/spellcheck.h",
+ "//chrome/renderer/spellchecker/spellcheck_language.cc",
+ "//chrome/renderer/spellchecker/spellcheck_language.h",
+ "//chrome/renderer/spellchecker/spellcheck_provider.cc",
+ "//chrome/renderer/spellchecker/spellcheck_provider.h",
+ "//chrome/renderer/spellchecker/spellcheck_worditerator.cc",
+ "//chrome/renderer/spellchecker/spellcheck_worditerator.h",
+ "//chrome/renderer/spellchecker/spelling_engine.h",
+ ]
+ include_dirs += [
+ "//third_party/WebKit"
+ ]
+ deps += [
+ "//third_party/icu",
+ "//third_party/hunspell",
+ "//chrome/tools/convert_dict"
+ ]
+
+ if (is_mac && use_browser_spellchecker) {
+ sources += [
+ "//chrome/browser/spellchecker/spellcheck_message_filter_platform.h",
+ "//chrome/browser/spellchecker/spellcheck_message_filter_platform_mac.cc",
+ ]
+ }
+ }
+
+ if (enable_basic_printing || enable_print_preview) {
+ sources += [
+ "//chrome/browser/printing/printer_query.cc",
+ "//chrome/browser/printing/printer_query.h",
+ "//chrome/browser/printing/print_job.cc",
+ "//chrome/browser/printing/print_job.h",
+ "//chrome/browser/printing/print_job_manager.cc",
+ "//chrome/browser/printing/print_job_manager.h",
+ "//chrome/browser/printing/print_job_worker.cc",
+ "//chrome/browser/printing/print_job_worker.h",
+ "//chrome/browser/printing/print_job_worker_owner.cc",
+ "//chrome/browser/printing/print_job_worker_owner.h",
+ ]
+ }
+
+ if (enable_pdf) {
+ deps += [
+ "//pdf",
+ "//components/printing/browser",
+ "//components/printing/renderer",
+ ]
+ }
+
+}
+
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index fef3831e3..280a0475d 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -116,7 +116,7 @@ static inline Qt::InputMethodHints toQtInputMethodHints(ui::TextInputType inputT
case ui::TEXT_INPUT_TYPE_SEARCH:
return Qt::ImhPreferLowercase | Qt::ImhNoAutoUppercase;
case ui::TEXT_INPUT_TYPE_PASSWORD:
- return Qt::ImhSensitiveData | Qt::ImhNoPredictiveText | Qt::ImhNoAutoUppercase;
+ return Qt::ImhSensitiveData | Qt::ImhNoPredictiveText | Qt::ImhNoAutoUppercase | Qt::ImhHiddenText;
case ui::TEXT_INPUT_TYPE_EMAIL:
return Qt::ImhEmailCharactersOnly;
case ui::TEXT_INPUT_TYPE_NUMBER:
@@ -575,6 +575,9 @@ void RenderWidgetHostViewQt::TextInputStateChanged(const content::TextInputState
{
m_currentInputType = params.type;
m_delegate->inputMethodStateChanged(params.type != ui::TEXT_INPUT_TYPE_NONE);
+ m_delegate->setInputMethodHints(toQtInputMethodHints(params.type));
+
+ m_surroundingText = QString::fromStdString(params.value);
}
void RenderWidgetHostViewQt::ImeCancelComposition()
@@ -838,7 +841,7 @@ QVariant RenderWidgetHostViewQt::inputMethodQuery(Qt::InputMethodQuery query) co
case Qt::ImAnchorPosition:
return static_cast<uint>(m_anchorPositionWithinSelection);
case Qt::ImSurroundingText:
- return toQt(selection_text_);
+ return m_surroundingText;
case Qt::ImCurrentSelection:
return toQt(GetSelectedText());
case Qt::ImMaximumTextLength:
@@ -971,7 +974,13 @@ void RenderWidgetHostViewQt::handleKeyEvent(QKeyEvent *ev)
} else {
if (ev->type() == QEvent::KeyRelease) {
m_receivedEmptyImeText = false;
- m_host->ImeConfirmComposition(toString16(ev->text()), gfx::Range::InvalidRange(),
+ m_host->ImeSetComposition(toString16(ev->text()),
+ std::vector<blink::WebCompositionUnderline>(),
+ gfx::Range::InvalidRange(),
+ gfx::Range::InvalidRange().start(),
+ gfx::Range::InvalidRange().end());
+ m_host->ImeConfirmComposition(base::string16(),
+ gfx::Range::InvalidRange(),
false);
m_imeInProgress = false;
}
@@ -980,17 +989,16 @@ void RenderWidgetHostViewQt::handleKeyEvent(QKeyEvent *ev)
}
content::NativeWebKeyboardEvent webEvent = WebEventFactory::toWebKeyboardEvent(ev);
- if (webEvent.type == blink::WebInputEvent::RawKeyDown && !ev->text().isEmpty()) {
+ bool keyDownTextInsertion = webEvent.type == blink::WebInputEvent::RawKeyDown && webEvent.text[0];
+ webEvent.skip_in_browser = keyDownTextInsertion;
+ m_host->ForwardKeyboardEvent(webEvent);
+
+ if (keyDownTextInsertion) {
// Blink won't consume the RawKeyDown, but rather the Char event in this case.
// Make sure to skip the former on the way back. The same os_event will be set on both of them.
webEvent.skip_in_browser = true;
- m_host->ForwardKeyboardEvent(webEvent);
-
- webEvent.skip_in_browser = false;
webEvent.type = blink::WebInputEvent::Char;
m_host->ForwardKeyboardEvent(webEvent);
- } else {
- m_host->ForwardKeyboardEvent(webEvent);
}
}
@@ -1002,9 +1010,6 @@ void RenderWidgetHostViewQt::handleInputMethodEvent(QInputMethodEvent *ev)
QString commitString = ev->commitString();
QString preeditString = ev->preeditString();
- int replacementStart = ev->replacementStart();
- int replacementLength = ev->replacementLength();
-
int cursorPositionInPreeditString = -1;
gfx::Range selectionRange = gfx::Range::InvalidRange();
@@ -1067,33 +1072,45 @@ void RenderWidgetHostViewQt::handleInputMethodEvent(QInputMethodEvent *ev)
}
}
- gfx::Range replacementRange = (replacementLength > 0) ? gfx::Range(replacementStart, replacementStart + replacementLength)
- : gfx::Range::InvalidRange();
+ int replacementLength = ev->replacementLength();
+ gfx::Range replacementRange = gfx::Range::InvalidRange();
- auto setCompositionForPreEditString = [&](){
+ if (replacementLength > 0)
+ {
+ int start = ev->replacementStart();
+
+ if (start >= 0)
+ replacementRange = gfx::Range(start, start + replacementLength);
+ else if (m_surroundingText.length() + start >= 0) {
+ start = m_surroundingText.length() + start;
+ replacementRange = gfx::Range(start, start + replacementLength);
+ }
+ }
+
+ auto setCompositionString = [&](const QString &compositionString){
ensureValidSelectionRange();
- m_host->ImeSetComposition(toString16(preeditString),
+ m_host->ImeSetComposition(toString16(compositionString),
underlines,
replacementRange,
selectionRange.start(),
selectionRange.end());
};
- if (!commitString.isEmpty()) {
- m_host->ImeConfirmComposition(toString16(commitString), replacementRange, false);
+ if (!commitString.isEmpty() || replacementLength > 0) {
+ setCompositionString(commitString);
+ m_host->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(), false);
// We might get a commit string and a pre-edit string in a single event, which means
// we need to confirm the怀last composition, and start a new composition.
if (!preeditString.isEmpty()) {
- setCompositionForPreEditString();
+ setCompositionString(preeditString);
m_imeInProgress = true;
} else {
m_imeInProgress = false;
}
- m_receivedEmptyImeText = false;
-
+ m_receivedEmptyImeText = commitString.isEmpty();
} else if (!preeditString.isEmpty()) {
- setCompositionForPreEditString();
+ setCompositionString(preeditString);
m_imeInProgress = true;
m_receivedEmptyImeText = false;
} else {
@@ -1115,7 +1132,10 @@ void RenderWidgetHostViewQt::handleInputMethodEvent(QInputMethodEvent *ev)
QGuiApplication::postEvent(qApp->focusObject(), eventCopy);
} else {
m_receivedEmptyImeText = false;
- m_host->ImeCancelComposition();
+ if (m_imeInProgress) {
+ m_imeInProgress = false;
+ m_host->ImeCancelComposition();
+ }
}
}
}
diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h
index 0b2d7bc9d..2f5d97b67 100644
--- a/src/core/render_widget_host_view_qt.h
+++ b/src/core/render_widget_host_view_qt.h
@@ -244,6 +244,8 @@ private:
gfx::Vector2dF m_lastScrollOffset;
gfx::SizeF m_lastContentsSize;
+
+ QString m_surroundingText;
};
} // namespace QtWebEngineCore
diff --git a/src/core/render_widget_host_view_qt_delegate.h b/src/core/render_widget_host_view_qt_delegate.h
index 1e50c8f08..1e1234e72 100644
--- a/src/core/render_widget_host_view_qt_delegate.h
+++ b/src/core/render_widget_host_view_qt_delegate.h
@@ -112,6 +112,7 @@ public:
virtual void resize(int width, int height) = 0;
virtual void move(const QPoint &) = 0;
virtual void inputMethodStateChanged(bool editorVisible) = 0;
+ virtual void setInputMethodHints(Qt::InputMethodHints hints) = 0;
virtual void setClearColor(const QColor &color) = 0;
};
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 9de2085ba..2534286bf 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -348,7 +348,7 @@ WebContentsAdapterPrivate::WebContentsAdapterPrivate()
, adapterClient(0)
, nextRequestId(CallbackDirectory::ReservedCallbackIdsEnd)
, lastFindRequestId(0)
- , currentDropAction(Qt::IgnoreAction)
+ , currentDropAction(blink::WebDragOperationNone)
, inDragUpdateLoop(false)
, updateDragCursorMessagePollingTimer(new QTimer)
{
@@ -1153,6 +1153,18 @@ static QMimeData *mimeDataFromDropData(const content::DropData &dropData)
return mimeData;
}
+static blink::WebDragOperationsMask toWeb(const Qt::DropActions action)
+{
+ int result = blink::WebDragOperationNone;
+ if (action & Qt::CopyAction)
+ result |= blink::WebDragOperationCopy;
+ if (action & Qt::LinkAction)
+ result |= blink::WebDragOperationLink;
+ if (action & Qt::MoveAction)
+ result |= blink::WebDragOperationMove;
+ return static_cast<blink::WebDragOperationsMask>(result);
+}
+
void WebContentsAdapter::startDragging(QObject *dragSource, const content::DropData &dropData,
Qt::DropActions allowedActions, const QPixmap &pixmap,
const QPoint &offset)
@@ -1169,7 +1181,7 @@ void WebContentsAdapter::startDragging(QObject *dragSource, const content::DropD
d->currentDropData->file_contents.clear();
d->currentDropData->file_description_filename.clear();
- d->currentDropAction = Qt::IgnoreAction;
+ d->currentDropAction = blink::WebDragOperationNone;
QDrag *drag = new QDrag(dragSource); // will be deleted by Qt's DnD implementation
bool dValid = true;
QMetaObject::Connection onDestroyed = QObject::connect(dragSource, &QObject::destroyed, [&dValid](){
@@ -1192,25 +1204,17 @@ void WebContentsAdapter::startDragging(QObject *dragSource, const content::DropD
if (dValid) {
if (d->webContents) {
content::RenderViewHost *rvh = d->webContents->GetRenderViewHost();
- if (rvh)
+ if (rvh) {
+ rvh->DragSourceEndedAt(d->lastDragClientPos.x(), d->lastDragClientPos.y(),
+ d->lastDragScreenPos.x(), d->lastDragScreenPos.y(),
+ d->currentDropAction);
rvh->DragSourceSystemDragEnded();
+ }
}
d->currentDropData.reset();
}
}
-static blink::WebDragOperationsMask toWeb(const Qt::DropActions action)
-{
- int result = blink::WebDragOperationNone;
- if (action & Qt::CopyAction)
- result |= blink::WebDragOperationCopy;
- if (action & Qt::LinkAction)
- result |= blink::WebDragOperationLink;
- if (action & Qt::MoveAction)
- result |= blink::WebDragOperationMove;
- return static_cast<blink::WebDragOperationsMask>(result);
-}
-
static void fillDropDataFromMimeData(content::DropData *dropData, const QMimeData *mimeData)
{
Q_ASSERT(dropData->filenames.empty());
@@ -1246,12 +1250,51 @@ void WebContentsAdapter::enterDrag(QDragEnterEvent *e, const QPoint &screenPos)
flagsFromModifiers(e->keyboardModifiers()));
}
+Qt::DropAction toQt(blink::WebDragOperation op)
+{
+ if (op & blink::WebDragOperationCopy)
+ return Qt::CopyAction;
+ if (op & blink::WebDragOperationLink)
+ return Qt::LinkAction;
+ if (op & blink::WebDragOperationMove || op & blink::WebDragOperationDelete)
+ return Qt::MoveAction;
+ return Qt::IgnoreAction;
+}
+
+static int toWeb(Qt::MouseButtons buttons)
+{
+ int result = 0;
+ if (buttons & Qt::LeftButton)
+ result |= blink::WebInputEvent::LeftButtonDown;
+ if (buttons & Qt::RightButton)
+ result |= blink::WebInputEvent::RightButtonDown;
+ if (buttons & Qt::MiddleButton)
+ result |= blink::WebInputEvent::MiddleButtonDown;
+ return result;
+}
+
+static int toWeb(Qt::KeyboardModifiers modifiers)
+{
+ int result = 0;
+ if (modifiers & Qt::ShiftModifier)
+ result |= blink::WebInputEvent::ShiftKey;
+ if (modifiers & Qt::ControlModifier)
+ result |= blink::WebInputEvent::ControlKey;
+ if (modifiers & Qt::AltModifier)
+ result |= blink::WebInputEvent::AltKey;
+ if (modifiers & Qt::MetaModifier)
+ result |= blink::WebInputEvent::MetaKey;
+ return result;
+}
+
Qt::DropAction WebContentsAdapter::updateDragPosition(QDragMoveEvent *e, const QPoint &screenPos)
{
Q_D(WebContentsAdapter);
content::RenderViewHost *rvh = d->webContents->GetRenderViewHost();
- rvh->DragTargetDragOver(toGfx(e->pos()), toGfx(screenPos), toWeb(e->possibleActions()),
- blink::WebInputEvent::LeftButtonDown);
+ d->lastDragClientPos = toGfx(e->pos());
+ d->lastDragScreenPos = toGfx(screenPos);
+ rvh->DragTargetDragOver(d->lastDragClientPos, d->lastDragScreenPos, toWeb(e->possibleActions()),
+ toWeb(e->mouseButtons()) | toWeb(e->keyboardModifiers()));
base::MessageLoop *currentMessageLoop = base::MessageLoop::current();
DCHECK(currentMessageLoop);
@@ -1273,13 +1316,13 @@ Qt::DropAction WebContentsAdapter::updateDragPosition(QDragMoveEvent *e, const Q
loop.Run();
d->updateDragCursorMessagePollingTimer->stop();
- return d->currentDropAction;
+ return toQt(d->currentDropAction);
}
-void WebContentsAdapter::updateDragAction(Qt::DropAction action)
+void WebContentsAdapter::updateDragAction(int action)
{
Q_D(WebContentsAdapter);
- d->currentDropAction = action;
+ d->currentDropAction = static_cast<blink::WebDragOperation>(action);
finishDragUpdate();
}
@@ -1298,7 +1341,9 @@ void WebContentsAdapter::endDragging(const QPoint &clientPos, const QPoint &scre
finishDragUpdate();
content::RenderViewHost *rvh = d->webContents->GetRenderViewHost();
rvh->FilterDropData(d->currentDropData.get());
- rvh->DragTargetDrop(*d->currentDropData, toGfx(clientPos), toGfx(screenPos), 0);
+ d->lastDragClientPos = toGfx(clientPos);
+ d->lastDragScreenPos = toGfx(screenPos);
+ rvh->DragTargetDrop(*d->currentDropData, d->lastDragClientPos, d->lastDragScreenPos, 0);
d->currentDropData.reset();
}
@@ -1398,4 +1443,15 @@ bool WebContentsAdapter::canViewSource()
return d->webContents->GetController().CanViewSource();
}
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::UnknownDisposition, WindowOpenDisposition::UNKNOWN)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::CurrentTabDisposition, WindowOpenDisposition::CURRENT_TAB)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::SingletonTabDisposition, WindowOpenDisposition::SINGLETON_TAB)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::NewForegroundTabDisposition, WindowOpenDisposition::NEW_FOREGROUND_TAB)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::NewBackgroundTabDisposition, WindowOpenDisposition::NEW_BACKGROUND_TAB)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::NewPopupDisposition, WindowOpenDisposition::NEW_POPUP)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::NewWindowDisposition, WindowOpenDisposition::NEW_WINDOW)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::SaveToDiskDisposition, WindowOpenDisposition::SAVE_TO_DISK)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::OffTheRecordDisposition, WindowOpenDisposition::OFF_THE_RECORD)
+ASSERT_ENUMS_MATCH(WebContentsAdapterClient::IgnoreActionDisposition, WindowOpenDisposition::IGNORE_ACTION)
+
} // namespace QtWebEngineCore
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index cb7f9b461..0accd3be5 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -168,7 +168,7 @@ public:
Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset);
void enterDrag(QDragEnterEvent *e, const QPoint &screenPos);
Qt::DropAction updateDragPosition(QDragMoveEvent *e, const QPoint &screenPos);
- void updateDragAction(Qt::DropAction action);
+ void updateDragAction(int action);
void finishDragUpdate();
void endDragging(const QPoint &clientPos, const QPoint &screenPos);
void leaveDrag();
diff --git a/src/core/web_contents_adapter_p.h b/src/core/web_contents_adapter_p.h
index 23a1aaef4..9503b4401 100644
--- a/src/core/web_contents_adapter_p.h
+++ b/src/core/web_contents_adapter_p.h
@@ -55,6 +55,8 @@
#include <base/callback.h>
#include "base/memory/ref_counted.h"
+#include <ui/gfx/geometry/point.h>
+#include <third_party/WebKit/public/platform/WebDragOperation.h>
#include <QScopedPointer>
#include <QSharedPointer>
@@ -93,8 +95,10 @@ public:
quint64 nextRequestId;
int lastFindRequestId;
std::unique_ptr<content::DropData> currentDropData;
- Qt::DropAction currentDropAction;
+ blink::WebDragOperation currentDropAction;
bool inDragUpdateLoop;
+ gfx::Point lastDragClientPos;
+ gfx::Point lastDragScreenPos;
base::Closure dragUpdateLoopQuitClosure;
QScopedPointer<QTimer> updateDragCursorMessagePollingTimer;
};
diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp
index 0c4cf29d3..24c4e198f 100644
--- a/src/core/web_contents_view_qt.cpp
+++ b/src/core/web_contents_view_qt.cpp
@@ -203,17 +203,6 @@ Qt::DropActions toQtDropActions(blink::WebDragOperationsMask ops)
return result;
}
-Qt::DropAction toQt(blink::WebDragOperation op)
-{
- if (op == blink::WebDragOperationCopy)
- return Qt::CopyAction;
- if (op == blink::WebDragOperationLink)
- return Qt::LinkAction;
- if (op == blink::WebDragOperationMove || op == blink::WebDragOperationDelete)
- return Qt::MoveAction;
- return Qt::IgnoreAction;
-}
-
void WebContentsViewQt::StartDragging(const content::DropData &drop_data,
blink::WebDragOperationsMask allowed_ops,
const gfx::ImageSkia &image,
@@ -235,7 +224,7 @@ void WebContentsViewQt::StartDragging(const content::DropData &drop_data,
void WebContentsViewQt::UpdateDragCursor(blink::WebDragOperation dragOperation)
{
- m_client->webContentsAdapter()->updateDragAction(toQt(dragOperation));
+ m_client->webContentsAdapter()->updateDragAction(dragOperation);
}
void WebContentsViewQt::TakeFocus(bool reverse)
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp
index 4f5023376..9681ad629 100644
--- a/src/core/web_event_factory.cpp
+++ b/src/core/web_event_factory.cpp
@@ -1259,5 +1259,14 @@ content::NativeWebKeyboardEvent WebEventFactory::toWebKeyboardEvent(QKeyEvent *e
const ushort* text = ev->text().utf16();
memcpy(&webKitEvent.text, text, std::min(sizeof(webKitEvent.text), size_t(ev->text().length() * 2)));
memcpy(&webKitEvent.unmodifiedText, text, std::min(sizeof(webKitEvent.unmodifiedText), size_t(ev->text().length() * 2)));
+
+ if (webKitEvent.windowsKeyCode == VK_RETURN) {
+ // This is the same behavior as GTK:
+ // We need to treat the enter key as a key press of character \r. This
+ // is apparently just how webkit handles it and what it expects.
+ webKitEvent.unmodifiedText[0] = '\r';
+ webKitEvent.text[0] = webKitEvent.unmodifiedText[0];
+ }
+
return webKitEvent;
}