mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Compare commits
68 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
cd6cbe008b | ||
|
3e94ebf031 | ||
|
364460420a | ||
|
18f6db50fc | ||
|
b045a6e974 | ||
|
01947ac530 | ||
|
7de12437b5 | ||
|
acfac2f56b | ||
|
d7ff3589e4 | ||
|
e768eb7c36 | ||
|
8e08b6c202 | ||
|
3b2f416731 | ||
|
1306235098 | ||
|
c5d55d4b5c | ||
|
fb115c6aec | ||
|
5445ef53a0 | ||
|
6a7969fa1c | ||
|
02028168ae | ||
|
17bc62666b | ||
|
37773afcc4 | ||
|
1119d2723c | ||
|
4c3785756f | ||
|
ee4e036af8 | ||
|
e12dc09620 | ||
|
d042c3a577 | ||
|
3bde5d25e9 | ||
|
3f0eaa53b7 | ||
|
5b78afcf54 | ||
|
94efef25d9 | ||
|
48ac1d640e | ||
|
082e6dc106 | ||
|
9a28c1fdf6 | ||
|
a0532bbb72 | ||
|
19c0e69125 | ||
|
f0c9073dc0 | ||
|
da5bb13369 | ||
|
bcf4f6bc92 | ||
|
989b0078e4 | ||
|
a49878faee | ||
|
2c0ba41a10 | ||
|
a177ba96e5 | ||
|
9fb5d763a8 | ||
|
4bd2755a6e | ||
|
b0a4097775 | ||
|
ee3ed79da3 | ||
|
b672bd9235 | ||
|
fab2af8876 | ||
|
e8573173dd | ||
|
13e3c8b42a | ||
|
280c9127c1 | ||
|
6573df6cc3 | ||
|
03c9156c80 | ||
|
02cdf05848 | ||
|
e9bf3cdb98 | ||
|
6cb9f0c695 | ||
|
6152d68b6a | ||
|
88b88251e7 | ||
|
48fc0bd220 | ||
|
619f18fea0 | ||
|
7b518511df | ||
|
5c1118230d | ||
|
0dfefe391c | ||
|
b3a8da9b25 | ||
|
84f3ff2afd | ||
|
f5587b74f0 | ||
|
1174994211 | ||
|
049caf9131 | ||
|
39aed35644 |
151
BUILD.gn
151
BUILD.gn
@@ -106,6 +106,7 @@ import("//media/media_options.gni")
|
||||
import("//mojo/public/tools/bindings/mojom.gni")
|
||||
import("//ppapi/buildflags/buildflags.gni")
|
||||
import("//printing/buildflags/buildflags.gni")
|
||||
import("//testing/test.gni")
|
||||
import("//third_party/icu/config.gni")
|
||||
import("//third_party/widevine/cdm/widevine.gni")
|
||||
import("//tools/grit/repack.gni")
|
||||
@@ -262,12 +263,6 @@ if (is_clang) {
|
||||
assert(!clang_use_chrome_plugins)
|
||||
}
|
||||
|
||||
if (is_linux) {
|
||||
# Use system fontconfig. This avoids a startup hang on Ubuntu 16.04.4 (see
|
||||
# issue #2424).
|
||||
assert(!use_bundled_fontconfig)
|
||||
}
|
||||
|
||||
if (is_mac) {
|
||||
# Always generate dSYM files. The make_distrib script will fail if
|
||||
# enable_dsyms=true is not explicitly set when is_official_build=false.
|
||||
@@ -316,6 +311,7 @@ group("cef") {
|
||||
deps = [
|
||||
":cefsimple",
|
||||
":ceftests",
|
||||
":libcef_static_unittests",
|
||||
]
|
||||
|
||||
if (!is_linux || use_x11) {
|
||||
@@ -373,9 +369,58 @@ if (is_win) {
|
||||
}
|
||||
}
|
||||
|
||||
# libcef_static source files that have unit tests.
|
||||
source_set("libcef_static_unittested") {
|
||||
sources = [
|
||||
"libcef/browser/devtools/devtools_util.cc",
|
||||
"libcef/browser/devtools/devtools_util.h",
|
||||
]
|
||||
|
||||
deps = [
|
||||
"//base",
|
||||
]
|
||||
|
||||
configs += [
|
||||
"libcef/features:config",
|
||||
"//build/config:precompiled_headers",
|
||||
]
|
||||
}
|
||||
|
||||
# Executable target for libcef_static unit tests.
|
||||
test("libcef_static_unittests") {
|
||||
sources = [
|
||||
"libcef/browser/devtools/devtools_util_unittest.cc",
|
||||
]
|
||||
|
||||
deps = [
|
||||
":libcef_static_unittested",
|
||||
"//base/test:run_all_unittests",
|
||||
"//testing/gtest",
|
||||
]
|
||||
|
||||
configs += [
|
||||
"libcef/features:config",
|
||||
"//build/config:precompiled_headers",
|
||||
]
|
||||
}
|
||||
|
||||
static_library("libcef_static") {
|
||||
sources = includes_common +
|
||||
gypi_paths.autogen_cpp_includes + [
|
||||
"libcef/browser/alloy/alloy_browser_context.cc",
|
||||
"libcef/browser/alloy/alloy_browser_context.h",
|
||||
"libcef/browser/alloy/alloy_browser_main.cc",
|
||||
"libcef/browser/alloy/alloy_browser_main.h",
|
||||
"libcef/browser/alloy/browser_platform_delegate_alloy.cc",
|
||||
"libcef/browser/alloy/browser_platform_delegate_alloy.h",
|
||||
"libcef/browser/alloy/chrome_browser_process_alloy.cc",
|
||||
"libcef/browser/alloy/chrome_browser_process_alloy.h",
|
||||
"libcef/browser/alloy/chrome_profile_manager_alloy.cc",
|
||||
"libcef/browser/alloy/chrome_profile_manager_alloy.h",
|
||||
"libcef/browser/alloy/chrome_profile_alloy.cc",
|
||||
"libcef/browser/alloy/chrome_profile_alloy.h",
|
||||
"libcef/browser/alloy/alloy_content_browser_client.cc",
|
||||
"libcef/browser/alloy/alloy_content_browser_client.h",
|
||||
"libcef/browser/audio_capturer.cc",
|
||||
"libcef/browser/audio_capturer.h",
|
||||
"libcef/browser/browser_context.cc",
|
||||
@@ -388,8 +433,6 @@ static_library("libcef_static") {
|
||||
"libcef/browser/browser_info.h",
|
||||
"libcef/browser/browser_info_manager.cc",
|
||||
"libcef/browser/browser_info_manager.h",
|
||||
"libcef/browser/browser_main.cc",
|
||||
"libcef/browser/browser_main.h",
|
||||
"libcef/browser/browser_message_filter.cc",
|
||||
"libcef/browser/browser_message_filter.h",
|
||||
"libcef/browser/browser_message_loop.cc",
|
||||
@@ -399,23 +442,27 @@ static_library("libcef_static") {
|
||||
"libcef/browser/browser_platform_delegate_create.cc",
|
||||
"libcef/browser/browser_util.cc",
|
||||
"libcef/browser/browser_util.h",
|
||||
"libcef/browser/chrome_browser_process_stub.cc",
|
||||
"libcef/browser/chrome_browser_process_stub.h",
|
||||
"libcef/browser/chrome/browser_platform_delegate_chrome.cc",
|
||||
"libcef/browser/chrome/browser_platform_delegate_chrome.h",
|
||||
"libcef/browser/chrome/chrome_browser_context.cc",
|
||||
"libcef/browser/chrome/chrome_browser_context.h",
|
||||
"libcef/browser/chrome/chrome_browser_main_extra_parts_cef.cc",
|
||||
"libcef/browser/chrome/chrome_browser_main_extra_parts_cef.h",
|
||||
"libcef/browser/chrome/chrome_content_browser_client_cef.cc",
|
||||
"libcef/browser/chrome/chrome_content_browser_client_cef.h",
|
||||
"libcef/browser/chrome_crash_reporter_client_stub.cc",
|
||||
"libcef/browser/chrome_profile_manager_stub.cc",
|
||||
"libcef/browser/chrome_profile_manager_stub.h",
|
||||
"libcef/browser/chrome_profile_stub.cc",
|
||||
"libcef/browser/chrome_profile_stub.h",
|
||||
"libcef/browser/content_browser_client.cc",
|
||||
"libcef/browser/content_browser_client.h",
|
||||
"libcef/browser/context.cc",
|
||||
"libcef/browser/context.h",
|
||||
"libcef/browser/context_menu_params_impl.cc",
|
||||
"libcef/browser/context_menu_params_impl.h",
|
||||
"libcef/browser/devtools/devtools_controller.cc",
|
||||
"libcef/browser/devtools/devtools_controller.h",
|
||||
"libcef/browser/devtools/devtools_file_manager.cc",
|
||||
"libcef/browser/devtools/devtools_file_manager.h",
|
||||
"libcef/browser/devtools/devtools_frontend.cc",
|
||||
"libcef/browser/devtools/devtools_frontend.h",
|
||||
"libcef/browser/devtools/devtools_manager.cc",
|
||||
"libcef/browser/devtools/devtools_manager.h",
|
||||
"libcef/browser/devtools/devtools_manager_delegate.cc",
|
||||
"libcef/browser/devtools/devtools_manager_delegate.h",
|
||||
"libcef/browser/download_item_impl.cc",
|
||||
@@ -473,9 +520,13 @@ static_library("libcef_static") {
|
||||
"libcef/browser/frame_host_impl.h",
|
||||
"libcef/browser/image_impl.cc",
|
||||
"libcef/browser/image_impl.h",
|
||||
"libcef/browser/iothread_state.cc",
|
||||
"libcef/browser/iothread_state.h",
|
||||
"libcef/browser/javascript_dialog_runner.h",
|
||||
"libcef/browser/javascript_dialog_manager.cc",
|
||||
"libcef/browser/javascript_dialog_manager.h",
|
||||
"libcef/browser/main_runner.cc",
|
||||
"libcef/browser/main_runner.h",
|
||||
"libcef/browser/media_capture_devices_dispatcher.cc",
|
||||
"libcef/browser/media_capture_devices_dispatcher.h",
|
||||
"libcef/browser/media_router/media_route_impl.cc",
|
||||
@@ -566,8 +617,6 @@ static_library("libcef_static") {
|
||||
"libcef/browser/printing/print_view_manager.cc",
|
||||
"libcef/browser/printing/print_view_manager.h",
|
||||
"libcef/browser/process_util_impl.cc",
|
||||
"libcef/browser/resource_context.cc",
|
||||
"libcef/browser/resource_context.h",
|
||||
"libcef/browser/request_context_handler_map.cc",
|
||||
"libcef/browser/request_context_handler_map.h",
|
||||
"libcef/browser/request_context_impl.cc",
|
||||
@@ -601,6 +650,14 @@ static_library("libcef_static") {
|
||||
"libcef/browser/xml_reader_impl.h",
|
||||
"libcef/browser/zip_reader_impl.cc",
|
||||
"libcef/browser/zip_reader_impl.h",
|
||||
"libcef/common/alloy/alloy_content_client.cc",
|
||||
"libcef/common/alloy/alloy_content_client.h",
|
||||
"libcef/common/alloy/alloy_main_delegate.cc",
|
||||
"libcef/common/alloy/alloy_main_delegate.h",
|
||||
"libcef/common/alloy/alloy_main_runner_delegate.cc",
|
||||
"libcef/common/alloy/alloy_main_runner_delegate.h",
|
||||
"libcef/common/app_manager.cc",
|
||||
"libcef/common/app_manager.h",
|
||||
"libcef/common/base_impl.cc",
|
||||
"libcef/common/cef_message_generator.cc",
|
||||
"libcef/common/cef_message_generator.h",
|
||||
@@ -608,10 +665,14 @@ static_library("libcef_static") {
|
||||
"libcef/common/cef_messages.h",
|
||||
"libcef/common/cef_switches.cc",
|
||||
"libcef/common/cef_switches.h",
|
||||
"libcef/common/chrome/chrome_content_client_cef.cc",
|
||||
"libcef/common/chrome/chrome_content_client_cef.h",
|
||||
"libcef/common/chrome/chrome_main_delegate_cef.cc",
|
||||
"libcef/common/chrome/chrome_main_delegate_cef.h",
|
||||
"libcef/common/chrome/chrome_main_runner_delegate.cc",
|
||||
"libcef/common/chrome/chrome_main_runner_delegate.h",
|
||||
"libcef/common/command_line_impl.cc",
|
||||
"libcef/common/command_line_impl.h",
|
||||
"libcef/common/content_client.cc",
|
||||
"libcef/common/content_client.h",
|
||||
"libcef/common/crash_reporter_client.cc",
|
||||
"libcef/common/crash_reporter_client.h",
|
||||
"libcef/common/crash_reporting.cc",
|
||||
@@ -630,8 +691,8 @@ static_library("libcef_static") {
|
||||
"libcef/common/frame_util.cc",
|
||||
"libcef/common/frame_util.h",
|
||||
"libcef/common/json_impl.cc",
|
||||
"libcef/common/main_delegate.cc",
|
||||
"libcef/common/main_delegate.h",
|
||||
"libcef/common/main_runner_delegate.h",
|
||||
"libcef/common/main_runner_handler.h",
|
||||
"libcef/common/net/http_header_utils.cc",
|
||||
"libcef/common/net/http_header_utils.h",
|
||||
"libcef/common/net/net_resource_provider.cc",
|
||||
@@ -653,6 +714,8 @@ static_library("libcef_static") {
|
||||
"libcef/common/resource_bundle_delegate.h",
|
||||
"libcef/common/resource_bundle_impl.cc",
|
||||
"libcef/common/resource_bundle_impl.h",
|
||||
"libcef/common/resource_util.cc",
|
||||
"libcef/common/resource_util.h",
|
||||
"libcef/common/response_impl.cc",
|
||||
"libcef/common/response_impl.h",
|
||||
"libcef/common/response_manager.cc",
|
||||
@@ -666,6 +729,8 @@ static_library("libcef_static") {
|
||||
"libcef/common/task_impl.cc",
|
||||
"libcef/common/task_runner_impl.cc",
|
||||
"libcef/common/task_runner_impl.h",
|
||||
"libcef/common/task_runner_manager.cc",
|
||||
"libcef/common/task_runner_manager.h",
|
||||
"libcef/common/test/translator_test_impl.cc",
|
||||
"libcef/common/thread_impl.cc",
|
||||
"libcef/common/thread_impl.h",
|
||||
@@ -682,10 +747,12 @@ static_library("libcef_static") {
|
||||
"libcef/common/waitable_event_impl.h",
|
||||
"libcef/common/widevine_loader.cc",
|
||||
"libcef/common/widevine_loader.h",
|
||||
"libcef/features/runtime.h",
|
||||
"libcef/features/runtime_checks.h",
|
||||
"libcef/renderer/alloy/alloy_content_renderer_client.cc",
|
||||
"libcef/renderer/alloy/alloy_content_renderer_client.h",
|
||||
"libcef/renderer/browser_impl.cc",
|
||||
"libcef/renderer/browser_impl.h",
|
||||
"libcef/renderer/content_renderer_client.cc",
|
||||
"libcef/renderer/content_renderer_client.h",
|
||||
"libcef/renderer/dom_document_impl.cc",
|
||||
"libcef/renderer/dom_document_impl.h",
|
||||
"libcef/renderer/dom_node_impl.cc",
|
||||
@@ -711,6 +778,10 @@ static_library("libcef_static") {
|
||||
"libcef/renderer/url_loader_throttle_provider_impl.h",
|
||||
"libcef/renderer/v8_impl.cc",
|
||||
"libcef/renderer/v8_impl.h",
|
||||
|
||||
# For Chrome runtime support.
|
||||
"//chrome/app/chrome_main_delegate.cc",
|
||||
"//chrome/app/chrome_main_delegate.h",
|
||||
]
|
||||
|
||||
configs += [
|
||||
@@ -739,6 +810,8 @@ static_library("libcef_static") {
|
||||
":cef_make_headers",
|
||||
":cef_service_manifests",
|
||||
|
||||
":libcef_static_unittested",
|
||||
|
||||
# Generate API bindings for extensions.
|
||||
# TODO(cef): Enable if/when CEF exposes its own Mojo APIs. See
|
||||
# libcef/common/extensions/api/README.txt for details.
|
||||
@@ -751,12 +824,13 @@ static_library("libcef_static") {
|
||||
"//base:base_static",
|
||||
"//base/third_party/dynamic_annotations",
|
||||
"//cc",
|
||||
"//chrome/browser",
|
||||
"//chrome/child",
|
||||
"//chrome/common",
|
||||
"//chrome/renderer",
|
||||
"//chrome:browser_dependencies",
|
||||
"//chrome:child_dependencies",
|
||||
"//chrome:packed_resources",
|
||||
"//chrome:resources",
|
||||
"//chrome:strings",
|
||||
"//chrome/common:buildflags",
|
||||
"//chrome/services/printing:lib",
|
||||
"//chrome/utility",
|
||||
"//components/cdm/renderer",
|
||||
"//components/certificate_transparency",
|
||||
"//components/content_settings/core/browser",
|
||||
@@ -842,7 +916,7 @@ static_library("libcef_static") {
|
||||
|
||||
if (is_win) {
|
||||
sources += includes_win + [
|
||||
"libcef/browser/browser_main_win.cc",
|
||||
"libcef/browser/alloy/alloy_browser_main_win.cc",
|
||||
"libcef/browser/native/browser_platform_delegate_native_win.cc",
|
||||
"libcef/browser/native/browser_platform_delegate_native_win.h",
|
||||
"libcef/browser/native/file_dialog_runner_win.cc",
|
||||
@@ -931,6 +1005,10 @@ static_library("libcef_static") {
|
||||
"libcef/browser/osr/browser_platform_delegate_osr_mac.mm",
|
||||
"libcef/common/util_mac.h",
|
||||
"libcef/common/util_mac.mm",
|
||||
|
||||
# For Chrome runtime support.
|
||||
"//chrome/app/chrome_main_mac.h",
|
||||
"//chrome/app/chrome_main_mac.mm",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1292,13 +1370,15 @@ repack("pak_devtools") {
|
||||
# Add associated .h files in the make_pack_header("resources") target.
|
||||
sources = [
|
||||
"$root_gen_dir/content/browser/devtools/devtools_resources.pak",
|
||||
"$root_gen_dir/third_party/blink/public/resources/inspector_overlay_resources.pak",
|
||||
]
|
||||
|
||||
# Use public_deps so that generated grit headers are discoverable from
|
||||
# the libcef_static target. Grit deps that generate .cc files must be
|
||||
# listed both here and in the libcef_static target.
|
||||
public_deps = [
|
||||
"//content/browser/devtools:resources",
|
||||
"//content/browser/devtools:devtools_resources",
|
||||
"//third_party/blink/public:devtools_inspector_resources",
|
||||
]
|
||||
|
||||
output = "$root_out_dir/devtools_resources.pak"
|
||||
@@ -1382,6 +1462,7 @@ repack("pak") {
|
||||
"$root_gen_dir/chrome/browser_resources.pak",
|
||||
"$root_gen_dir/chrome/dev_ui_browser_resources.pak",
|
||||
"$root_gen_dir/chrome/net_internals_resources.pak",
|
||||
"$root_gen_dir/chrome/print_preview_pdf_resources.pak",
|
||||
"$root_gen_dir/chrome/print_preview_resources.pak",
|
||||
"$root_gen_dir/chrome/common_resources.pak",
|
||||
"$root_gen_dir/components/components_resources.pak",
|
||||
@@ -1401,6 +1482,7 @@ repack("pak") {
|
||||
"//chrome/browser:dev_ui_browser_resources",
|
||||
"//chrome/browser:resources",
|
||||
"//chrome/browser/resources/net_internals:net_internals_resources",
|
||||
"//chrome/browser/resources:print_preview_pdf_resources",
|
||||
"//chrome/browser/resources:print_preview_resources",
|
||||
"//chrome/common:resources",
|
||||
"//components/resources:components_resources",
|
||||
@@ -1453,6 +1535,8 @@ make_pack_header("resources") {
|
||||
"$root_gen_dir/chrome/grit/component_extension_resources.h",
|
||||
"$root_gen_dir/chrome/grit/dev_ui_browser_resources.h",
|
||||
"$root_gen_dir/chrome/grit/net_internals_resources.h",
|
||||
"$root_gen_dir/chrome/grit/print_preview_pdf_resources.h",
|
||||
"$root_gen_dir/chrome/grit/print_preview_resources.h",
|
||||
"$root_gen_dir/chrome/grit/renderer_resources.h",
|
||||
"$root_gen_dir/components/grit/components_resources.h",
|
||||
"$root_gen_dir/components/grit/dev_ui_components_resources.h",
|
||||
@@ -1480,6 +1564,7 @@ make_pack_header("strings") {
|
||||
"$root_gen_dir/chrome/grit/generated_resources.h",
|
||||
"$root_gen_dir/chrome/grit/locale_settings.h",
|
||||
"$root_gen_dir/chrome/grit/platform_locale_settings.h",
|
||||
"$root_gen_dir/components/strings/grit/components_chromium_strings.h",
|
||||
"$root_gen_dir/components/strings/grit/components_strings.h",
|
||||
"$root_gen_dir/extensions/strings/grit/extensions_strings.h",
|
||||
"$root_gen_dir/services/strings/grit/services_strings.h",
|
||||
@@ -1654,10 +1739,6 @@ if (is_mac) {
|
||||
gypi_paths2.libcef_sources_common +
|
||||
gypi_paths.autogen_library_side
|
||||
|
||||
# TODO(rsesek): Handle these missing pieces:
|
||||
# - crash_inspector
|
||||
# - crash_report_sender.app
|
||||
|
||||
deps = [
|
||||
":cef_framework_angle_library",
|
||||
":cef_framework_locales",
|
||||
|
@@ -7,5 +7,6 @@
|
||||
# https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
|
||||
|
||||
{
|
||||
'chromium_checkout': 'refs/tags/84.0.4147.0'
|
||||
'chromium_checkout': 'refs/tags/85.0.4183.121',
|
||||
'depot_tools_checkout': '233589f2e7'
|
||||
}
|
||||
|
@@ -12,8 +12,8 @@
|
||||
# distribution include:
|
||||
#
|
||||
# Linux: Ninja, Unix Makefiles
|
||||
# Mac OS X: Ninja, Xcode 5+
|
||||
# Windows: Ninja, Visual Studio 2010+
|
||||
# MacOS: Ninja, Xcode 8+
|
||||
# Windows: Ninja, Visual Studio 2015+
|
||||
#
|
||||
# Ninja is a cross-platform open-source tool for running fast builds using
|
||||
# pre-installed platform toolchains (GNU, clang, Xcode or MSVC). It can be
|
||||
@@ -40,21 +40,21 @@
|
||||
#
|
||||
# - Linux requirements:
|
||||
# Currently supported distributions include Debian Wheezy, Ubuntu Precise, and
|
||||
# related. Ubuntu 14.04 64-bit is recommended. Newer versions will likely also
|
||||
# related. Ubuntu 18.04 64-bit is recommended. Newer versions will likely also
|
||||
# work but may not have been tested.
|
||||
# Required packages include:
|
||||
# build-essential
|
||||
# libgtk2.0-dev (required by the cefclient target only)
|
||||
# libgtkglext1-dev (required by the cefclient target only)
|
||||
#
|
||||
# - Mac OS X requirements:
|
||||
# Xcode 5 or newer building on Mac OS X 10.9 (Mavericks) or newer. Xcode 8.3
|
||||
# and OS X 10.12 are recommended. The Xcode command-line tools must also be
|
||||
# installed. Only 64-bit builds are supported on OS X.
|
||||
# - MacOS requirements:
|
||||
# Xcode 8 or newer building on MacOS 10.10 (Yosemite) or newer. Xcode 11.2
|
||||
# and MacOS 10.14 are recommended. The Xcode command-line tools must also be
|
||||
# installed. Only 64-bit builds are supported.
|
||||
#
|
||||
# - Windows requirements:
|
||||
# Visual Studio 2010 or newer building on Windows 7 or newer. Visual Studio
|
||||
# 2015 Update 3 and Windows 10 64-bit are recommended.
|
||||
# Visual Studio 2015 or newer building on Windows 7 or newer. Visual Studio
|
||||
# 2019 and Windows 10 64-bit are recommended.
|
||||
#
|
||||
# BUILD EXAMPLES
|
||||
#
|
||||
@@ -75,7 +75,7 @@
|
||||
# > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
|
||||
# > ninja cefclient cefsimple
|
||||
#
|
||||
# To perform a Mac OS X build using a 64-bit CEF binary distribution:
|
||||
# To perform a MacOS build using a 64-bit CEF binary distribution:
|
||||
# Using the Xcode IDE:
|
||||
# > cmake -G "Xcode" -DPROJECT_ARCH="x86_64" ..
|
||||
# Open build\cef.xcodeproj in Xcode and select Product > Build.
|
||||
@@ -85,24 +85,24 @@
|
||||
# > ninja cefclient cefsimple
|
||||
#
|
||||
# To perform a Windows build using a 32-bit CEF binary distribution:
|
||||
# Using the Visual Studio 2015 IDE:
|
||||
# > cmake -G "Visual Studio 14" ..
|
||||
# Using the Visual Studio 2019 IDE:
|
||||
# > cmake -G "Visual Studio 16" -A Win32 ..
|
||||
# Open build\cef.sln in Visual Studio and select Build > Build Solution.
|
||||
#
|
||||
# Using Ninja with Visual Studio 2015 command-line tools:
|
||||
# Using Ninja with Visual Studio 2019 command-line tools:
|
||||
# (this path may be different depending on your Visual Studio installation)
|
||||
# > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"
|
||||
# > "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat"
|
||||
# > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
|
||||
# > ninja cefclient cefsimple
|
||||
#
|
||||
# To perform a Windows build using a 64-bit CEF binary distribution:
|
||||
# Using the Visual Studio 2015 IDE:
|
||||
# > cmake -G "Visual Studio 14 Win64" ..
|
||||
# Using the Visual Studio 2019 IDE:
|
||||
# > cmake -G "Visual Studio 16" -A x64 ..
|
||||
# Open build\cef.sln in Visual Studio and select Build > Build Solution.
|
||||
#
|
||||
# Using Ninja with Visual Studio 2015 command-line tools:
|
||||
# Using Ninja with Visual Studio 2019 command-line tools:
|
||||
# (this path may be different depending on your Visual Studio installation)
|
||||
# > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
|
||||
# > "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat"
|
||||
# > cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug ..
|
||||
# > ninja cefclient cefsimple
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
# by hand. See the translator.README.txt file in the tools directory for
|
||||
# more information.
|
||||
#
|
||||
# $hash=21f0ab1e9902e4a47bf2893a4a383d33bd8161e2$
|
||||
# $hash=72268a78a76d7d91b8ad47f6b6e9f6d9cb04d9cf$
|
||||
#
|
||||
|
||||
{
|
||||
@@ -26,6 +26,7 @@
|
||||
'include/cef_context_menu_handler.h',
|
||||
'include/cef_cookie.h',
|
||||
'include/cef_crash_util.h',
|
||||
'include/cef_devtools_message_observer.h',
|
||||
'include/cef_dialog_handler.h',
|
||||
'include/cef_display_handler.h',
|
||||
'include/cef_dom.h',
|
||||
@@ -122,6 +123,7 @@
|
||||
'include/capi/cef_context_menu_handler_capi.h',
|
||||
'include/capi/cef_cookie_capi.h',
|
||||
'include/capi/cef_crash_util_capi.h',
|
||||
'include/capi/cef_devtools_message_observer_capi.h',
|
||||
'include/capi/cef_dialog_handler_capi.h',
|
||||
'include/capi/cef_display_handler_capi.h',
|
||||
'include/capi/cef_dom_capi.h',
|
||||
@@ -260,6 +262,8 @@
|
||||
'libcef_dll/ctocpp/domvisitor_ctocpp.h',
|
||||
'libcef_dll/ctocpp/delete_cookies_callback_ctocpp.cc',
|
||||
'libcef_dll/ctocpp/delete_cookies_callback_ctocpp.h',
|
||||
'libcef_dll/ctocpp/dev_tools_message_observer_ctocpp.cc',
|
||||
'libcef_dll/ctocpp/dev_tools_message_observer_ctocpp.h',
|
||||
'libcef_dll/ctocpp/dialog_handler_ctocpp.cc',
|
||||
'libcef_dll/ctocpp/dialog_handler_ctocpp.h',
|
||||
'libcef_dll/cpptoc/dictionary_value_cpptoc.cc',
|
||||
@@ -326,6 +330,8 @@
|
||||
'libcef_dll/cpptoc/media_router_cpptoc.h',
|
||||
'libcef_dll/cpptoc/media_sink_cpptoc.cc',
|
||||
'libcef_dll/cpptoc/media_sink_cpptoc.h',
|
||||
'libcef_dll/ctocpp/media_sink_device_info_callback_ctocpp.cc',
|
||||
'libcef_dll/ctocpp/media_sink_device_info_callback_ctocpp.h',
|
||||
'libcef_dll/cpptoc/media_source_cpptoc.cc',
|
||||
'libcef_dll/cpptoc/media_source_cpptoc.h',
|
||||
'libcef_dll/cpptoc/views/menu_button_cpptoc.cc',
|
||||
@@ -566,6 +572,8 @@
|
||||
'libcef_dll/cpptoc/domvisitor_cpptoc.h',
|
||||
'libcef_dll/cpptoc/delete_cookies_callback_cpptoc.cc',
|
||||
'libcef_dll/cpptoc/delete_cookies_callback_cpptoc.h',
|
||||
'libcef_dll/cpptoc/dev_tools_message_observer_cpptoc.cc',
|
||||
'libcef_dll/cpptoc/dev_tools_message_observer_cpptoc.h',
|
||||
'libcef_dll/cpptoc/dialog_handler_cpptoc.cc',
|
||||
'libcef_dll/cpptoc/dialog_handler_cpptoc.h',
|
||||
'libcef_dll/ctocpp/dictionary_value_ctocpp.cc',
|
||||
@@ -632,6 +640,8 @@
|
||||
'libcef_dll/ctocpp/media_router_ctocpp.h',
|
||||
'libcef_dll/ctocpp/media_sink_ctocpp.cc',
|
||||
'libcef_dll/ctocpp/media_sink_ctocpp.h',
|
||||
'libcef_dll/cpptoc/media_sink_device_info_callback_cpptoc.cc',
|
||||
'libcef_dll/cpptoc/media_sink_device_info_callback_cpptoc.h',
|
||||
'libcef_dll/ctocpp/media_source_ctocpp.cc',
|
||||
'libcef_dll/ctocpp/media_source_ctocpp.h',
|
||||
'libcef_dll/ctocpp/views/menu_button_ctocpp.cc',
|
||||
|
@@ -470,6 +470,8 @@
|
||||
'tests/ceftests/browser_info_map_unittest.cc',
|
||||
'tests/ceftests/command_line_unittest.cc',
|
||||
'tests/ceftests/cookie_unittest.cc',
|
||||
'tests/ceftests/cors_unittest.cc',
|
||||
'tests/ceftests/devtools_message_unittest.cc',
|
||||
'tests/ceftests/dialog_unittest.cc',
|
||||
'tests/ceftests/display_unittest.cc',
|
||||
'tests/ceftests/dom_unittest.cc',
|
||||
@@ -519,6 +521,11 @@
|
||||
'tests/ceftests/task_unittest.cc',
|
||||
'tests/ceftests/test_handler.cc',
|
||||
'tests/ceftests/test_handler.h',
|
||||
'tests/ceftests/test_request.cc',
|
||||
'tests/ceftests/test_request.h',
|
||||
'tests/ceftests/test_server.cc',
|
||||
'tests/ceftests/test_server.h',
|
||||
'tests/ceftests/test_server_unittest.cc',
|
||||
'tests/ceftests/test_suite.cc',
|
||||
'tests/ceftests/test_suite.h',
|
||||
'tests/ceftests/test_util.cc',
|
||||
@@ -527,6 +534,7 @@
|
||||
'tests/ceftests/thread_helper.h',
|
||||
'tests/ceftests/thread_unittest.cc',
|
||||
'tests/ceftests/tracing_unittest.cc',
|
||||
'tests/ceftests/track_callback.h',
|
||||
'tests/ceftests/translator_unittest.cc',
|
||||
'tests/ceftests/urlrequest_unittest.cc',
|
||||
'tests/ceftests/v8_unittest.cc',
|
||||
@@ -586,10 +594,15 @@
|
||||
'tests/ceftests/urlrequest_unittest.cc',
|
||||
'tests/ceftests/test_handler.cc',
|
||||
'tests/ceftests/test_handler.h',
|
||||
'tests/ceftests/test_request.cc',
|
||||
'tests/ceftests/test_request.h',
|
||||
'tests/ceftests/test_server.cc',
|
||||
'tests/ceftests/test_server.h',
|
||||
'tests/ceftests/test_suite.cc',
|
||||
'tests/ceftests/test_suite.h',
|
||||
'tests/ceftests/test_util.cc',
|
||||
'tests/ceftests/test_util.h',
|
||||
'tests/ceftests/track_callback.h',
|
||||
'tests/ceftests/thread_helper.cc',
|
||||
'tests/ceftests/thread_helper.h',
|
||||
'tests/ceftests/thread_unittest.cc',
|
||||
|
@@ -34,6 +34,7 @@ template("_repack_one_locale") {
|
||||
"${root_gen_dir}/chrome/generated_resources_${locale}.pak",
|
||||
"${root_gen_dir}/chrome/locale_settings_${locale}.pak",
|
||||
"${root_gen_dir}/chrome/platform_locale_settings_${locale}.pak",
|
||||
"${root_gen_dir}/components/strings/components_chromium_strings_${locale}.pak",
|
||||
"${root_gen_dir}/components/strings/components_locale_settings_${locale}.pak",
|
||||
"${root_gen_dir}/components/strings/components_strings_${locale}.pak",
|
||||
"${root_gen_dir}/extensions/strings/extensions_strings_${locale}.pak",
|
||||
@@ -52,6 +53,7 @@ template("_repack_one_locale") {
|
||||
"//chrome/app:generated_resources",
|
||||
"//chrome/app/resources:locale_settings",
|
||||
"//chrome/app/resources:platform_locale_settings",
|
||||
"//components/strings:components_chromium_strings",
|
||||
"//components/strings:components_locale_settings",
|
||||
"//components/strings:components_strings",
|
||||
"//extensions/strings",
|
||||
|
@@ -310,7 +310,7 @@ if(OS_MACOSX)
|
||||
|
||||
# Find the newest available base SDK.
|
||||
execute_process(COMMAND xcode-select --print-path OUTPUT_VARIABLE XCODE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
foreach(OS_VERSION 10.11 10.10 10.9)
|
||||
foreach(OS_VERSION 10.15 10.14 10.13 10.12 10.11 10.10)
|
||||
set(SDK "${XCODE_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OS_VERSION}.sdk")
|
||||
if(NOT "${CMAKE_OSX_SYSROOT}" AND EXISTS "${SDK}" AND IS_DIRECTORY "${SDK}")
|
||||
set(CMAKE_OSX_SYSROOT ${SDK})
|
||||
@@ -318,7 +318,7 @@ if(OS_MACOSX)
|
||||
endforeach()
|
||||
|
||||
# Target SDK.
|
||||
set(CEF_TARGET_SDK "10.9")
|
||||
set(CEF_TARGET_SDK "10.10")
|
||||
list(APPEND CEF_COMPILER_FLAGS
|
||||
-mmacosx-version-min=${CEF_TARGET_SDK}
|
||||
)
|
||||
@@ -375,25 +375,8 @@ if(OS_WINDOWS)
|
||||
|
||||
if(USE_SANDBOX)
|
||||
# Check if the current MSVC version is compatible with the cef_sandbox.lib
|
||||
# static library. For a list of all version numbers see
|
||||
# https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering
|
||||
list(APPEND supported_msvc_versions
|
||||
1900 # VS2015 and updates 1, 2, & 3
|
||||
1910 # VS2017 version 15.1 & 15.2
|
||||
1911 # VS2017 version 15.3 & 15.4
|
||||
1912 # VS2017 version 15.5
|
||||
1913 # VS2017 version 15.6
|
||||
1914 # VS2017 version 15.7
|
||||
1915 # VS2017 version 15.8
|
||||
1916 # VS2017 version 15.9
|
||||
1920 # VS2019 version 16.0
|
||||
1921 # VS2019 version 16.1
|
||||
1922 # VS2019 version 16.2
|
||||
1923 # VS2019 version 16.3
|
||||
1924 # VS2019 version 16.4
|
||||
)
|
||||
list(FIND supported_msvc_versions ${MSVC_VERSION} _index)
|
||||
if (${_index} EQUAL -1)
|
||||
# static library. We require VS2015 or newer.
|
||||
if(MSVC_VERSION LESS 1900)
|
||||
message(WARNING "CEF sandbox is not compatible with the current MSVC version (${MSVC_VERSION})")
|
||||
set(USE_SANDBOX OFF)
|
||||
endif()
|
||||
|
@@ -136,7 +136,11 @@
|
||||
#define CEF_INCLUDE_BASE_CEF_LOGGING_H_
|
||||
#pragma once
|
||||
|
||||
#if defined(DCHECK)
|
||||
#if defined(USING_CHROMIUM_INCLUDES)
|
||||
// When building CEF include the Chromium header directly.
|
||||
#include "base/logging.h"
|
||||
#include "base/notreached.h"
|
||||
#elif defined(DCHECK)
|
||||
// Do nothing if the macros provided by this header already exist.
|
||||
// This can happen in cases where Chromium code is used directly by the
|
||||
// client application. When using Chromium code directly always include
|
||||
@@ -149,10 +153,7 @@
|
||||
#define DCHECK_IS_ON() true
|
||||
#endif
|
||||
|
||||
#elif defined(USING_CHROMIUM_INCLUDES)
|
||||
// When building CEF include the Chromium header directly.
|
||||
#include "base/logging.h"
|
||||
#else // !USING_CHROMIUM_INCLUDES
|
||||
#else // !defined(DCHECK)
|
||||
// The following is substantially similar to the Chromium implementation.
|
||||
// If the Chromium implementation diverges the below implementation should be
|
||||
// updated to match.
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=ba4033eaf40a8ee24408b89b78496bf1381e7e6b$
|
||||
// $hash=6cb00a0fa3631a46903abb3a783f315895511db2$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_
|
||||
@@ -41,10 +41,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "include/capi/cef_base_capi.h"
|
||||
#include "include/capi/cef_devtools_message_observer_capi.h"
|
||||
#include "include/capi/cef_drag_data_capi.h"
|
||||
#include "include/capi/cef_frame_capi.h"
|
||||
#include "include/capi/cef_image_capi.h"
|
||||
#include "include/capi/cef_navigation_entry_capi.h"
|
||||
#include "include/capi/cef_registration_capi.h"
|
||||
#include "include/capi/cef_request_context_capi.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -484,6 +486,71 @@ typedef struct _cef_browser_host_t {
|
||||
///
|
||||
int(CEF_CALLBACK* has_dev_tools)(struct _cef_browser_host_t* self);
|
||||
|
||||
///
|
||||
// Send a function call message over the DevTools protocol. |message| must be
|
||||
// a UTF8-encoded JSON dictionary that contains "id" (int), "function"
|
||||
// (string) and "params" (dictionary, optional) values. See the DevTools
|
||||
// protocol documentation at https://chromedevtools.github.io/devtools-
|
||||
// protocol/ for details of supported functions and the expected "params"
|
||||
// dictionary contents. |message| will be copied if necessary. This function
|
||||
// will return true (1) if called on the UI thread and the message was
|
||||
// successfully submitted for validation, otherwise false (0). Validation will
|
||||
// be applied asynchronously and any messages that fail due to formatting
|
||||
// errors or missing parameters may be discarded without notification. Prefer
|
||||
// ExecuteDevToolsMethod if a more structured approach to message formatting
|
||||
// is desired.
|
||||
//
|
||||
// Every valid function call will result in an asynchronous function result or
|
||||
// error message that references the sent message "id". Event messages are
|
||||
// received while notifications are enabled (for example, between function
|
||||
// calls for "Page.enable" and "Page.disable"). All received messages will be
|
||||
// delivered to the observer(s) registered with AddDevToolsMessageObserver.
|
||||
// See cef_dev_tools_message_observer_t::OnDevToolsMessage documentation for
|
||||
// details of received message contents.
|
||||
//
|
||||
// Usage of the SendDevToolsMessage, ExecuteDevToolsMethod and
|
||||
// AddDevToolsMessageObserver functions does not require an active DevTools
|
||||
// front-end or remote-debugging session. Other active DevTools sessions will
|
||||
// continue to function independently. However, any modification of global
|
||||
// browser state by one session may not be reflected in the UI of other
|
||||
// sessions.
|
||||
//
|
||||
// Communication with the DevTools front-end (when displayed) can be logged
|
||||
// for development purposes by passing the `--devtools-protocol-log-
|
||||
// file=<path>` command-line flag.
|
||||
///
|
||||
int(CEF_CALLBACK* send_dev_tools_message)(struct _cef_browser_host_t* self,
|
||||
const void* message,
|
||||
size_t message_size);
|
||||
|
||||
///
|
||||
// Execute a function call over the DevTools protocol. This is a more
|
||||
// structured version of SendDevToolsMessage. |message_id| is an incremental
|
||||
// number that uniquely identifies the message (pass 0 to have the next number
|
||||
// assigned automatically based on previous values). |function| is the
|
||||
// function name. |params| are the function parameters, which may be NULL. See
|
||||
// the DevTools protocol documentation (linked above) for details of supported
|
||||
// functions and the expected |params| dictionary contents. This function will
|
||||
// return the assigned message ID if called on the UI thread and the message
|
||||
// was successfully submitted for validation, otherwise 0. See the
|
||||
// SendDevToolsMessage documentation for additional usage information.
|
||||
///
|
||||
int(CEF_CALLBACK* execute_dev_tools_method)(
|
||||
struct _cef_browser_host_t* self,
|
||||
int message_id,
|
||||
const cef_string_t* method,
|
||||
struct _cef_dictionary_value_t* params);
|
||||
|
||||
///
|
||||
// Add an observer for DevTools protocol messages (function results and
|
||||
// events). The observer will remain registered until the returned
|
||||
// Registration object is destroyed. See the SendDevToolsMessage documentation
|
||||
// for additional usage information.
|
||||
///
|
||||
struct _cef_registration_t*(CEF_CALLBACK* add_dev_tools_message_observer)(
|
||||
struct _cef_browser_host_t* self,
|
||||
struct _cef_dev_tools_message_observer_t* observer);
|
||||
|
||||
///
|
||||
// Retrieve a snapshot of current navigation entries as values sent to the
|
||||
// specified visitor. If |current_only| is true (1) only the current
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=b15ba2c750f5227b6b40fea59965817ba4431ee0$
|
||||
// $hash=306236316b35037523ca566068d133755bce48fd$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_PROCESS_HANDLER_CAPI_H_
|
||||
@@ -78,17 +78,6 @@ typedef struct _cef_browser_process_handler_t {
|
||||
struct _cef_browser_process_handler_t* self,
|
||||
struct _cef_command_line_t* command_line);
|
||||
|
||||
///
|
||||
// Called on the browser process IO thread after the main thread has been
|
||||
// created for a new render process. Provides an opportunity to specify extra
|
||||
// information that will be passed to
|
||||
// cef_render_process_handler_t::on_render_thread_created() in the render
|
||||
// process. Do not keep a reference to |extra_info| outside of this function.
|
||||
///
|
||||
void(CEF_CALLBACK* on_render_process_thread_created)(
|
||||
struct _cef_browser_process_handler_t* self,
|
||||
struct _cef_list_value_t* extra_info);
|
||||
|
||||
///
|
||||
// Return the handler for printing on Linux. If a print handler is not
|
||||
// provided then printing will not be supported on the Linux platform.
|
||||
|
147
include/capi/cef_devtools_message_observer_capi.h
Normal file
147
include/capi/cef_devtools_message_observer_capi.h
Normal file
@@ -0,0 +1,147 @@
|
||||
// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * 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.
|
||||
// * Neither the name of Google Inc. nor the name Chromium Embedded
|
||||
// Framework 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 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.
|
||||
//
|
||||
// ---------------------------------------------------------------------------
|
||||
//
|
||||
// This file was generated by the CEF translator tool and should not edited
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=86906c2e971fea7e479738f59bbf85d71ce31953$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_
|
||||
#define CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_
|
||||
#pragma once
|
||||
|
||||
#include "include/capi/cef_base_capi.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct _cef_browser_t;
|
||||
|
||||
///
|
||||
// Callback structure for cef_browser_host_t::AddDevToolsMessageObserver. The
|
||||
// functions of this structure will be called on the browser process UI thread.
|
||||
///
|
||||
typedef struct _cef_dev_tools_message_observer_t {
|
||||
///
|
||||
// Base structure.
|
||||
///
|
||||
cef_base_ref_counted_t base;
|
||||
|
||||
///
|
||||
// Method that will be called on receipt of a DevTools protocol message.
|
||||
// |browser| is the originating browser instance. |message| is a UTF8-encoded
|
||||
// JSON dictionary representing either a function result or an event.
|
||||
// |message| is only valid for the scope of this callback and should be copied
|
||||
// if necessary. Return true (1) if the message was handled or false (0) if
|
||||
// the message should be further processed and passed to the
|
||||
// OnDevToolsMethodResult or OnDevToolsEvent functions as appropriate.
|
||||
//
|
||||
// Method result dictionaries include an "id" (int) value that identifies the
|
||||
// orginating function call sent from cef_browser_host_t::SendDevToolsMessage,
|
||||
// and optionally either a "result" (dictionary) or "error" (dictionary)
|
||||
// value. The "error" dictionary will contain "code" (int) and "message"
|
||||
// (string) values. Event dictionaries include a "function" (string) value and
|
||||
// optionally a "params" (dictionary) value. See the DevTools protocol
|
||||
// documentation at https://chromedevtools.github.io/devtools-protocol/ for
|
||||
// details of supported function calls and the expected "result" or "params"
|
||||
// dictionary contents. JSON dictionaries can be parsed using the CefParseJSON
|
||||
// function if desired, however be aware of performance considerations when
|
||||
// parsing large messages (some of which may exceed 1MB in size).
|
||||
///
|
||||
int(CEF_CALLBACK* on_dev_tools_message)(
|
||||
struct _cef_dev_tools_message_observer_t* self,
|
||||
struct _cef_browser_t* browser,
|
||||
const void* message,
|
||||
size_t message_size);
|
||||
|
||||
///
|
||||
// Method that will be called after attempted execution of a DevTools protocol
|
||||
// function. |browser| is the originating browser instance. |message_id| is
|
||||
// the "id" value that identifies the originating function call message. If
|
||||
// the function succeeded |success| will be true (1) and |result| will be the
|
||||
// UTF8-encoded JSON "result" dictionary value (which may be NULL). If the
|
||||
// function failed |success| will be false (0) and |result| will be the
|
||||
// UTF8-encoded JSON "error" dictionary value. |result| is only valid for the
|
||||
// scope of this callback and should be copied if necessary. See the
|
||||
// OnDevToolsMessage documentation for additional details on |result|
|
||||
// contents.
|
||||
///
|
||||
void(CEF_CALLBACK* on_dev_tools_method_result)(
|
||||
struct _cef_dev_tools_message_observer_t* self,
|
||||
struct _cef_browser_t* browser,
|
||||
int message_id,
|
||||
int success,
|
||||
const void* result,
|
||||
size_t result_size);
|
||||
|
||||
///
|
||||
// Method that will be called on receipt of a DevTools protocol event.
|
||||
// |browser| is the originating browser instance. |function| is the "function"
|
||||
// value. |params| is the UTF8-encoded JSON "params" dictionary value (which
|
||||
// may be NULL). |params| is only valid for the scope of this callback and
|
||||
// should be copied if necessary. See the OnDevToolsMessage documentation for
|
||||
// additional details on |params| contents.
|
||||
///
|
||||
void(CEF_CALLBACK* on_dev_tools_event)(
|
||||
struct _cef_dev_tools_message_observer_t* self,
|
||||
struct _cef_browser_t* browser,
|
||||
const cef_string_t* method,
|
||||
const void* params,
|
||||
size_t params_size);
|
||||
|
||||
///
|
||||
// Method that will be called when the DevTools agent has attached. |browser|
|
||||
// is the originating browser instance. This will generally occur in response
|
||||
// to the first message sent while the agent is detached.
|
||||
///
|
||||
void(CEF_CALLBACK* on_dev_tools_agent_attached)(
|
||||
struct _cef_dev_tools_message_observer_t* self,
|
||||
struct _cef_browser_t* browser);
|
||||
|
||||
///
|
||||
// Method that will be called when the DevTools agent has detached. |browser|
|
||||
// is the originating browser instance. Any function results that were pending
|
||||
// before the agent became detached will not be delivered, and any active
|
||||
// event subscriptions will be canceled.
|
||||
///
|
||||
void(CEF_CALLBACK* on_dev_tools_agent_detached)(
|
||||
struct _cef_dev_tools_message_observer_t* self,
|
||||
struct _cef_browser_t* browser);
|
||||
} cef_dev_tools_message_observer_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=aa1310919932145744d5347d449d6ee10a3a0813$
|
||||
// $hash=4f4a0d76efaf87055ebf5e784f5d1b69fafdabc2$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_MEDIA_ROUTER_CAPI_H_
|
||||
@@ -50,6 +50,7 @@ extern "C" {
|
||||
struct _cef_media_observer_t;
|
||||
struct _cef_media_route_create_callback_t;
|
||||
struct _cef_media_route_t;
|
||||
struct _cef_media_sink_device_info_callback_t;
|
||||
struct _cef_media_sink_t;
|
||||
struct _cef_media_source_t;
|
||||
|
||||
@@ -246,11 +247,6 @@ typedef struct _cef_media_sink_t {
|
||||
// The resulting string must be freed by calling cef_string_userfree_free().
|
||||
cef_string_userfree_t(CEF_CALLBACK* get_id)(struct _cef_media_sink_t* self);
|
||||
|
||||
///
|
||||
// Returns true (1) if this sink is valid.
|
||||
///
|
||||
int(CEF_CALLBACK* is_valid)(struct _cef_media_sink_t* self);
|
||||
|
||||
///
|
||||
// Returns the name of this sink.
|
||||
///
|
||||
@@ -270,6 +266,13 @@ typedef struct _cef_media_sink_t {
|
||||
cef_media_sink_icon_type_t(CEF_CALLBACK* get_icon_type)(
|
||||
struct _cef_media_sink_t* self);
|
||||
|
||||
///
|
||||
// Asynchronously retrieves device info.
|
||||
///
|
||||
void(CEF_CALLBACK* get_device_info)(
|
||||
struct _cef_media_sink_t* self,
|
||||
struct _cef_media_sink_device_info_callback_t* callback);
|
||||
|
||||
///
|
||||
// Returns true (1) if this sink accepts content via Cast.
|
||||
///
|
||||
@@ -287,6 +290,25 @@ typedef struct _cef_media_sink_t {
|
||||
struct _cef_media_source_t* source);
|
||||
} cef_media_sink_t;
|
||||
|
||||
///
|
||||
// Callback structure for cef_media_sink_t::GetDeviceInfo. The functions of this
|
||||
// structure will be called on the browser process UI thread.
|
||||
///
|
||||
typedef struct _cef_media_sink_device_info_callback_t {
|
||||
///
|
||||
// Base structure.
|
||||
///
|
||||
cef_base_ref_counted_t base;
|
||||
|
||||
///
|
||||
// Method that will be executed asyncronously once device information has been
|
||||
// retrieved.
|
||||
///
|
||||
void(CEF_CALLBACK* on_media_sink_device_info)(
|
||||
struct _cef_media_sink_device_info_callback_t* self,
|
||||
const struct _cef_media_sink_device_info_t* device_info);
|
||||
} cef_media_sink_device_info_callback_t;
|
||||
|
||||
///
|
||||
// Represents a source from which media can be routed. Instances of this object
|
||||
// are retrieved via cef_media_router_t::GetSource. The functions of this
|
||||
@@ -305,11 +327,6 @@ typedef struct _cef_media_source_t {
|
||||
// The resulting string must be freed by calling cef_string_userfree_free().
|
||||
cef_string_userfree_t(CEF_CALLBACK* get_id)(struct _cef_media_source_t* self);
|
||||
|
||||
///
|
||||
// Returns true (1) if this source is valid.
|
||||
///
|
||||
int(CEF_CALLBACK* is_valid)(struct _cef_media_source_t* self);
|
||||
|
||||
///
|
||||
// Returns true (1) if this source outputs its content via Cast.
|
||||
///
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=3bc4225f43428d8a3a24dcac1830dafac18b0caf$
|
||||
// $hash=14cf03e02d8ca3416e65f756470afd8185c7bc78$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_PARSER_CAPI_H_
|
||||
@@ -140,6 +140,16 @@ CEF_EXPORT struct _cef_value_t* cef_parse_json(
|
||||
const cef_string_t* json_string,
|
||||
cef_json_parser_options_t options);
|
||||
|
||||
///
|
||||
// Parses the specified UTF8-encoded |json| buffer of size |json_size| and
|
||||
// returns a dictionary or list representation. If JSON parsing fails this
|
||||
// function returns NULL.
|
||||
///
|
||||
CEF_EXPORT struct _cef_value_t* cef_parse_json_buffer(
|
||||
const void* json,
|
||||
size_t json_size,
|
||||
cef_json_parser_options_t options);
|
||||
|
||||
///
|
||||
// Parses the specified |json_string| and returns a dictionary or list
|
||||
// representation. If JSON parsing fails this function returns NULL and
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=3630a82a4ea731b43ed4ba468a57c5dfe15f8679$
|
||||
// $hash=8419eb3eba9dd372b019bd367d4f195433b21c9b$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_RENDER_PROCESS_HANDLER_CAPI_H_
|
||||
@@ -64,16 +64,6 @@ typedef struct _cef_render_process_handler_t {
|
||||
///
|
||||
cef_base_ref_counted_t base;
|
||||
|
||||
///
|
||||
// Called after the render process main thread has been created. |extra_info|
|
||||
// is a read-only value originating from
|
||||
// cef_browser_process_handler_t::on_render_process_thread_created(). Do not
|
||||
// keep a reference to |extra_info| outside of this function.
|
||||
///
|
||||
void(CEF_CALLBACK* on_render_thread_created)(
|
||||
struct _cef_render_process_handler_t* self,
|
||||
struct _cef_list_value_t* extra_info);
|
||||
|
||||
///
|
||||
// Called after WebKit has been initialized.
|
||||
///
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=a28219cc8c1cb53faacaf236374c3cf2c0c45bef$
|
||||
// $hash=0167eb1abe614bd6391d273a8085fa3e53e7c217$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_
|
||||
@@ -253,6 +253,14 @@ typedef struct _cef_request_handler_t {
|
||||
struct _cef_request_handler_t* self,
|
||||
struct _cef_browser_t* browser,
|
||||
cef_termination_status_t status);
|
||||
|
||||
///
|
||||
// Called on the browser process UI thread when the window.document object of
|
||||
// the main frame has been created.
|
||||
///
|
||||
void(CEF_CALLBACK* on_document_available_in_main_frame)(
|
||||
struct _cef_request_handler_t* self,
|
||||
struct _cef_browser_t* browser);
|
||||
} cef_request_handler_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=b9577b495df3990284d4e4a3db2824196175dc91$
|
||||
// $hash=b0e2b63b467c6d4e990405d948908da3546ea1c7$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_CAPI_H_
|
||||
@@ -41,6 +41,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "include/capi/cef_base_capi.h"
|
||||
#include "include/capi/cef_values_capi.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -70,34 +71,25 @@ typedef struct _cef_resource_bundle_t {
|
||||
int string_id);
|
||||
|
||||
///
|
||||
// Retrieves the contents of the specified scale independent |resource_id|. If
|
||||
// the value is found then |data| and |data_size| will be populated and this
|
||||
// function will return true (1). If the value is not found then this function
|
||||
// will return false (0). The returned |data| pointer will remain resident in
|
||||
// memory and should not be freed. Include cef_pack_resources.h for a listing
|
||||
// of valid resource ID values.
|
||||
// Returns a cef_binary_value_t containing the decompressed contents of the
|
||||
// specified scale independent |resource_id| or NULL if not found. Include
|
||||
// cef_pack_resources.h for a listing of valid resource ID values.
|
||||
///
|
||||
int(CEF_CALLBACK* get_data_resource)(struct _cef_resource_bundle_t* self,
|
||||
int resource_id,
|
||||
void** data,
|
||||
size_t* data_size);
|
||||
struct _cef_binary_value_t*(CEF_CALLBACK* get_data_resource)(
|
||||
struct _cef_resource_bundle_t* self,
|
||||
int resource_id);
|
||||
|
||||
///
|
||||
// Retrieves the contents of the specified |resource_id| nearest the scale
|
||||
// factor |scale_factor|. Use a |scale_factor| value of SCALE_FACTOR_NONE for
|
||||
// scale independent resources or call GetDataResource instead. If the value
|
||||
// is found then |data| and |data_size| will be populated and this function
|
||||
// will return true (1). If the value is not found then this function will
|
||||
// return false (0). The returned |data| pointer will remain resident in
|
||||
// memory and should not be freed. Include cef_pack_resources.h for a listing
|
||||
// of valid resource ID values.
|
||||
// Returns a cef_binary_value_t containing the decompressed contents of the
|
||||
// specified |resource_id| nearest the scale factor |scale_factor| or NULL if
|
||||
// not found. Use a |scale_factor| value of SCALE_FACTOR_NONE for scale
|
||||
// independent resources or call GetDataResource instead.Include
|
||||
// cef_pack_resources.h for a listing of valid resource ID values.
|
||||
///
|
||||
int(CEF_CALLBACK* get_data_resource_for_scale)(
|
||||
struct _cef_binary_value_t*(CEF_CALLBACK* get_data_resource_for_scale)(
|
||||
struct _cef_resource_bundle_t* self,
|
||||
int resource_id,
|
||||
cef_scale_factor_t scale_factor,
|
||||
void** data,
|
||||
size_t* data_size);
|
||||
cef_scale_factor_t scale_factor);
|
||||
} cef_resource_bundle_t;
|
||||
|
||||
///
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=422243fda6e1404222aca7bdd4e7b84b961a9626$
|
||||
// $hash=652ac7a90c6cd10b1cbc6ae99a549c03f36c794e$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_DISPLAY_CAPI_H_
|
||||
@@ -50,9 +50,9 @@ extern "C" {
|
||||
// This structure typically, but not always, corresponds to a physical display
|
||||
// connected to the system. A fake Display may exist on a headless system, or a
|
||||
// Display may correspond to a remote, virtual display. All size and position
|
||||
// values are in density independent pixels (DIP) unless otherwise indicated.
|
||||
// Methods must be called on the browser process UI thread unless otherwise
|
||||
// indicated.
|
||||
// values are in density independent pixel (DIP) coordinates unless otherwise
|
||||
// indicated. Methods must be called on the browser process UI thread unless
|
||||
// otherwise indicated.
|
||||
///
|
||||
typedef struct _cef_display_t {
|
||||
///
|
||||
@@ -74,27 +74,28 @@ typedef struct _cef_display_t {
|
||||
float(CEF_CALLBACK* get_device_scale_factor)(struct _cef_display_t* self);
|
||||
|
||||
///
|
||||
// Convert |point| from density independent pixels (DIP) to pixel coordinates
|
||||
// using this Display's device scale factor.
|
||||
// Convert |point| from DIP coordinates to pixel coordinates using this
|
||||
// Display's device scale factor.
|
||||
///
|
||||
void(CEF_CALLBACK* convert_point_to_pixels)(struct _cef_display_t* self,
|
||||
cef_point_t* point);
|
||||
|
||||
///
|
||||
// Convert |point| from pixel coordinates to density independent pixels (DIP)
|
||||
// using this Display's device scale factor.
|
||||
// Convert |point| from pixel coordinates to DIP coordinates using this
|
||||
// Display's device scale factor.
|
||||
///
|
||||
void(CEF_CALLBACK* convert_point_from_pixels)(struct _cef_display_t* self,
|
||||
cef_point_t* point);
|
||||
|
||||
///
|
||||
// Returns this Display's bounds. This is the full size of the display.
|
||||
// Returns this Display's bounds in DIP screen coordinates. This is the full
|
||||
// size of the display.
|
||||
///
|
||||
cef_rect_t(CEF_CALLBACK* get_bounds)(struct _cef_display_t* self);
|
||||
|
||||
///
|
||||
// Returns this Display's work area. This excludes areas of the display that
|
||||
// are occupied for window manager toolbars, etc.
|
||||
// Returns this Display's work area in DIP screen coordinates. This excludes
|
||||
// areas of the display that are occupied with window manager toolbars, etc.
|
||||
///
|
||||
cef_rect_t(CEF_CALLBACK* get_work_area)(struct _cef_display_t* self);
|
||||
|
||||
@@ -111,7 +112,7 @@ CEF_EXPORT cef_display_t* cef_display_get_primary();
|
||||
|
||||
///
|
||||
// Returns the Display nearest |point|. Set |input_pixel_coords| to true (1) if
|
||||
// |point| is in pixel coordinates instead of density independent pixels (DIP).
|
||||
// |point| is in pixel screen coordinates instead of DIP screen coordinates.
|
||||
///
|
||||
CEF_EXPORT cef_display_t* cef_display_get_nearest_point(
|
||||
const cef_point_t* point,
|
||||
@@ -119,8 +120,8 @@ CEF_EXPORT cef_display_t* cef_display_get_nearest_point(
|
||||
|
||||
///
|
||||
// Returns the Display that most closely intersects |bounds|. Set
|
||||
// |input_pixel_coords| to true (1) if |bounds| is in pixel coordinates instead
|
||||
// of density independent pixels (DIP).
|
||||
// |input_pixel_coords| to true (1) if |bounds| is in pixel screen coordinates
|
||||
// instead of DIP screen coordinates.
|
||||
///
|
||||
CEF_EXPORT cef_display_t* cef_display_get_matching_bounds(
|
||||
const cef_rect_t* bounds,
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=45b421dfcf8ee7cf61b1991a336bc65d33fbe10a$
|
||||
// $hash=55be3e44016d9861bb8e9270b52f2bf45c8a53f5$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_VIEW_CAPI_H_
|
||||
@@ -176,64 +176,72 @@ typedef struct _cef_view_t {
|
||||
int id);
|
||||
|
||||
///
|
||||
// Sets the bounds (size and position) of this View. Position is in parent
|
||||
// coordinates.
|
||||
// Sets the bounds (size and position) of this View. |bounds| is in parent
|
||||
// coordinates, or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
void(CEF_CALLBACK* set_bounds)(struct _cef_view_t* self,
|
||||
const cef_rect_t* bounds);
|
||||
|
||||
///
|
||||
// Returns the bounds (size and position) of this View. Position is in parent
|
||||
// coordinates.
|
||||
// Returns the bounds (size and position) of this View in parent coordinates,
|
||||
// or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
cef_rect_t(CEF_CALLBACK* get_bounds)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Returns the bounds (size and position) of this View. Position is in screen
|
||||
// Returns the bounds (size and position) of this View in DIP screen
|
||||
// coordinates.
|
||||
///
|
||||
cef_rect_t(CEF_CALLBACK* get_bounds_in_screen)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Sets the size of this View without changing the position.
|
||||
// Sets the size of this View without changing the position. |size| in parent
|
||||
// coordinates, or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
void(CEF_CALLBACK* set_size)(struct _cef_view_t* self,
|
||||
const cef_size_t* size);
|
||||
|
||||
///
|
||||
// Returns the size of this View.
|
||||
// Returns the size of this View in parent coordinates, or DIP screen
|
||||
// coordinates if there is no parent.
|
||||
///
|
||||
cef_size_t(CEF_CALLBACK* get_size)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Sets the position of this View without changing the size. |position| is in
|
||||
// parent coordinates.
|
||||
// parent coordinates, or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
void(CEF_CALLBACK* set_position)(struct _cef_view_t* self,
|
||||
const cef_point_t* position);
|
||||
|
||||
///
|
||||
// Returns the position of this View. Position is in parent coordinates.
|
||||
// Returns the position of this View. Position is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
cef_point_t(CEF_CALLBACK* get_position)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Returns the size this View would like to be if enough space is available.
|
||||
// Size is in parent coordinates, or DIP screen coordinates if there is no
|
||||
// parent.
|
||||
///
|
||||
cef_size_t(CEF_CALLBACK* get_preferred_size)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Size this View to its preferred size.
|
||||
// Size this View to its preferred size. Size is in parent coordinates, or DIP
|
||||
// screen coordinates if there is no parent.
|
||||
///
|
||||
void(CEF_CALLBACK* size_to_preferred_size)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Returns the minimum size for this View.
|
||||
// Returns the minimum size for this View. Size is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
cef_size_t(CEF_CALLBACK* get_minimum_size)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Returns the maximum size for this View.
|
||||
// Returns the maximum size for this View. Size is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
cef_size_t(CEF_CALLBACK* get_maximum_size)(struct _cef_view_t* self);
|
||||
|
||||
@@ -327,21 +335,21 @@ typedef struct _cef_view_t {
|
||||
cef_color_t(CEF_CALLBACK* get_background_color)(struct _cef_view_t* self);
|
||||
|
||||
///
|
||||
// Convert |point| from this View's coordinate system to that of the screen.
|
||||
// This View must belong to a Window when calling this function. Returns true
|
||||
// (1) if the conversion is successful or false (0) otherwise. Use
|
||||
// cef_display_t::convert_point_to_pixels() after calling this function if
|
||||
// Convert |point| from this View's coordinate system to DIP screen
|
||||
// coordinates. This View must belong to a Window when calling this function.
|
||||
// Returns true (1) if the conversion is successful or false (0) otherwise.
|
||||
// Use cef_display_t::convert_point_to_pixels() after calling this function if
|
||||
// further conversion to display-specific pixel coordinates is desired.
|
||||
///
|
||||
int(CEF_CALLBACK* convert_point_to_screen)(struct _cef_view_t* self,
|
||||
cef_point_t* point);
|
||||
|
||||
///
|
||||
// Convert |point| to this View's coordinate system from that of the screen.
|
||||
// This View must belong to a Window when calling this function. Returns true
|
||||
// (1) if the conversion is successful or false (0) otherwise. Use
|
||||
// cef_display_t::convert_point_from_pixels() before calling this function if
|
||||
// conversion from display-specific pixel coordinates is necessary.
|
||||
// Convert |point| to this View's coordinate system from DIP screen
|
||||
// coordinates. This View must belong to a Window when calling this function.
|
||||
// Returns true (1) if the conversion is successful or false (0) otherwise.
|
||||
// Use cef_display_t::convert_point_from_pixels() before calling this function
|
||||
// if conversion from display-specific pixel coordinates is necessary.
|
||||
///
|
||||
int(CEF_CALLBACK* convert_point_from_screen)(struct _cef_view_t* self,
|
||||
cef_point_t* point);
|
||||
|
@@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=a0cec778fbaf0b1f5c9b3ef75dc7bbeeba777a44$
|
||||
// $hash=fee25d300df47c6143b935d0f99d543ea888f55c$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_WINDOW_DELEGATE_CAPI_H_
|
||||
@@ -87,6 +87,18 @@ typedef struct _cef_window_delegate_t {
|
||||
int* is_menu,
|
||||
int* can_activate_menu);
|
||||
|
||||
///
|
||||
// Return the initial bounds for |window| in density independent pixel (DIP)
|
||||
// coordinates. If this function returns an NULL CefRect then
|
||||
// get_preferred_size() will be called to retrieve the size, and the window
|
||||
// will be placed on the screen with origin (0,0). This function can be used
|
||||
// in combination with cef_view_t::get_bounds_in_screen() to restore the
|
||||
// previous window bounds.
|
||||
///
|
||||
cef_rect_t(CEF_CALLBACK* get_initial_bounds)(
|
||||
struct _cef_window_delegate_t* self,
|
||||
struct _cef_window_t* window);
|
||||
|
||||
///
|
||||
// Return true (1) if |window| should be created without a frame or title bar.
|
||||
// The window will be resizable if can_resize() returns true (1). Use
|
||||
|
@@ -42,13 +42,13 @@
|
||||
// way that may cause binary incompatibility with other builds. The universal
|
||||
// hash value will change if any platform is affected whereas the platform hash
|
||||
// values will change only if that particular platform is affected.
|
||||
#define CEF_API_HASH_UNIVERSAL "a48c939496261acf27f45293484f2c9e4065ca6f"
|
||||
#define CEF_API_HASH_UNIVERSAL "09d3d4f08869644fe3baa7a751de537f3446525b"
|
||||
#if defined(OS_WIN)
|
||||
#define CEF_API_HASH_PLATFORM "7ab8365e6f76e376342247954be2f90f69014776"
|
||||
#define CEF_API_HASH_PLATFORM "3022db6736af26cc38158d38e22f74a51312a5c9"
|
||||
#elif defined(OS_MACOSX)
|
||||
#define CEF_API_HASH_PLATFORM "01cc20ae8dbd5ce63ff50cac215855c4c58059f4"
|
||||
#define CEF_API_HASH_PLATFORM "13e2e2451c2320f0d16b35ba53b3295409888dd8"
|
||||
#elif defined(OS_LINUX)
|
||||
#define CEF_API_HASH_PLATFORM "112ef821732253dfda925d4a1a6d490396bac6d2"
|
||||
#define CEF_API_HASH_PLATFORM "d781b815150795b0bce95d72ce967b508c9a04d5"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@@ -40,10 +40,12 @@
|
||||
|
||||
#include <vector>
|
||||
#include "include/cef_base.h"
|
||||
#include "include/cef_devtools_message_observer.h"
|
||||
#include "include/cef_drag_data.h"
|
||||
#include "include/cef_frame.h"
|
||||
#include "include/cef_image.h"
|
||||
#include "include/cef_navigation_entry.h"
|
||||
#include "include/cef_registration.h"
|
||||
#include "include/cef_request_context.h"
|
||||
|
||||
class CefBrowserHost;
|
||||
@@ -517,6 +519,69 @@ class CefBrowserHost : public virtual CefBaseRefCounted {
|
||||
/*--cef()--*/
|
||||
virtual bool HasDevTools() = 0;
|
||||
|
||||
///
|
||||
// Send a method call message over the DevTools protocol. |message| must be a
|
||||
// UTF8-encoded JSON dictionary that contains "id" (int), "method" (string)
|
||||
// and "params" (dictionary, optional) values. See the DevTools protocol
|
||||
// documentation at https://chromedevtools.github.io/devtools-protocol/ for
|
||||
// details of supported methods and the expected "params" dictionary contents.
|
||||
// |message| will be copied if necessary. This method will return true if
|
||||
// called on the UI thread and the message was successfully submitted for
|
||||
// validation, otherwise false. Validation will be applied asynchronously and
|
||||
// any messages that fail due to formatting errors or missing parameters may
|
||||
// be discarded without notification. Prefer ExecuteDevToolsMethod if a more
|
||||
// structured approach to message formatting is desired.
|
||||
//
|
||||
// Every valid method call will result in an asynchronous method result or
|
||||
// error message that references the sent message "id". Event messages are
|
||||
// received while notifications are enabled (for example, between method calls
|
||||
// for "Page.enable" and "Page.disable"). All received messages will be
|
||||
// delivered to the observer(s) registered with AddDevToolsMessageObserver.
|
||||
// See CefDevToolsMessageObserver::OnDevToolsMessage documentation for details
|
||||
// of received message contents.
|
||||
//
|
||||
// Usage of the SendDevToolsMessage, ExecuteDevToolsMethod and
|
||||
// AddDevToolsMessageObserver methods does not require an active DevTools
|
||||
// front-end or remote-debugging session. Other active DevTools sessions will
|
||||
// continue to function independently. However, any modification of global
|
||||
// browser state by one session may not be reflected in the UI of other
|
||||
// sessions.
|
||||
//
|
||||
// Communication with the DevTools front-end (when displayed) can be logged
|
||||
// for development purposes by passing the
|
||||
// `--devtools-protocol-log-file=<path>` command-line flag.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual bool SendDevToolsMessage(const void* message,
|
||||
size_t message_size) = 0;
|
||||
|
||||
///
|
||||
// Execute a method call over the DevTools protocol. This is a more structured
|
||||
// version of SendDevToolsMessage. |message_id| is an incremental number that
|
||||
// uniquely identifies the message (pass 0 to have the next number assigned
|
||||
// automatically based on previous values). |method| is the method name.
|
||||
// |params| are the method parameters, which may be empty. See the DevTools
|
||||
// protocol documentation (linked above) for details of supported methods and
|
||||
// the expected |params| dictionary contents. This method will return the
|
||||
// assigned message ID if called on the UI thread and the message was
|
||||
// successfully submitted for validation, otherwise 0. See the
|
||||
// SendDevToolsMessage documentation for additional usage information.
|
||||
///
|
||||
/*--cef(optional_param=params)--*/
|
||||
virtual int ExecuteDevToolsMethod(int message_id,
|
||||
const CefString& method,
|
||||
CefRefPtr<CefDictionaryValue> params) = 0;
|
||||
|
||||
///
|
||||
// Add an observer for DevTools protocol messages (method results and events).
|
||||
// The observer will remain registered until the returned Registration object
|
||||
// is destroyed. See the SendDevToolsMessage documentation for additional
|
||||
// usage information.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefRefPtr<CefRegistration> AddDevToolsMessageObserver(
|
||||
CefRefPtr<CefDevToolsMessageObserver> observer) = 0;
|
||||
|
||||
///
|
||||
// Retrieve a snapshot of current navigation entries as values sent to the
|
||||
// specified visitor. If |current_only| is true only the current navigation
|
||||
|
@@ -68,17 +68,6 @@ class CefBrowserProcessHandler : public virtual CefBaseRefCounted {
|
||||
virtual void OnBeforeChildProcessLaunch(
|
||||
CefRefPtr<CefCommandLine> command_line) {}
|
||||
|
||||
///
|
||||
// Called on the browser process IO thread after the main thread has been
|
||||
// created for a new render process. Provides an opportunity to specify extra
|
||||
// information that will be passed to
|
||||
// CefRenderProcessHandler::OnRenderThreadCreated() in the render process. Do
|
||||
// not keep a reference to |extra_info| outside of this method.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnRenderProcessThreadCreated(
|
||||
CefRefPtr<CefListValue> extra_info) {}
|
||||
|
||||
///
|
||||
// Return the handler for printing on Linux. If a print handler is not
|
||||
// provided then printing will not be supported on the Linux platform.
|
||||
|
130
include/cef_devtools_message_observer.h
Normal file
130
include/cef_devtools_message_observer.h
Normal file
@@ -0,0 +1,130 @@
|
||||
// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * 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.
|
||||
// * Neither the name of Google Inc. nor the name Chromium Embedded
|
||||
// Framework 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 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.
|
||||
//
|
||||
// ---------------------------------------------------------------------------
|
||||
//
|
||||
// The contents of this file must follow a specific format in order to
|
||||
// support the CEF translator tool. See the translator.README.txt file in the
|
||||
// tools directory for more information.
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CEF_DEVTOOLS_MESSAGE_OBSERVER_H_
|
||||
#define CEF_INCLUDE_CEF_DEVTOOLS_MESSAGE_OBSERVER_H_
|
||||
#pragma once
|
||||
|
||||
#include "include/cef_base.h"
|
||||
|
||||
class CefBrowser;
|
||||
|
||||
///
|
||||
// Callback interface for CefBrowserHost::AddDevToolsMessageObserver. The
|
||||
// methods of this class will be called on the browser process UI thread.
|
||||
///
|
||||
/*--cef(source=client)--*/
|
||||
class CefDevToolsMessageObserver : public virtual CefBaseRefCounted {
|
||||
public:
|
||||
///
|
||||
// Method that will be called on receipt of a DevTools protocol message.
|
||||
// |browser| is the originating browser instance. |message| is a UTF8-encoded
|
||||
// JSON dictionary representing either a method result or an event. |message|
|
||||
// is only valid for the scope of this callback and should be copied if
|
||||
// necessary. Return true if the message was handled or false if the message
|
||||
// should be further processed and passed to the OnDevToolsMethodResult or
|
||||
// OnDevToolsEvent methods as appropriate.
|
||||
//
|
||||
// Method result dictionaries include an "id" (int) value that identifies the
|
||||
// orginating method call sent from CefBrowserHost::SendDevToolsMessage, and
|
||||
// optionally either a "result" (dictionary) or "error" (dictionary) value.
|
||||
// The "error" dictionary will contain "code" (int) and "message" (string)
|
||||
// values. Event dictionaries include a "method" (string) value and optionally
|
||||
// a "params" (dictionary) value. See the DevTools protocol documentation at
|
||||
// https://chromedevtools.github.io/devtools-protocol/ for details of
|
||||
// supported method calls and the expected "result" or "params" dictionary
|
||||
// contents. JSON dictionaries can be parsed using the CefParseJSON function
|
||||
// if desired, however be aware of performance considerations when parsing
|
||||
// large messages (some of which may exceed 1MB in size).
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual bool OnDevToolsMessage(CefRefPtr<CefBrowser> browser,
|
||||
const void* message,
|
||||
size_t message_size) {
|
||||
return false;
|
||||
}
|
||||
|
||||
///
|
||||
// Method that will be called after attempted execution of a DevTools protocol
|
||||
// method. |browser| is the originating browser instance. |message_id| is the
|
||||
// "id" value that identifies the originating method call message. If the
|
||||
// method succeeded |success| will be true and |result| will be the
|
||||
// UTF8-encoded JSON "result" dictionary value (which may be empty). If the
|
||||
// method failed |success| will be false and |result| will be the UTF8-encoded
|
||||
// JSON "error" dictionary value. |result| is only valid for the scope of this
|
||||
// callback and should be copied if necessary. See the OnDevToolsMessage
|
||||
// documentation for additional details on |result| contents.
|
||||
///
|
||||
/*--cef(optional_param=result)--*/
|
||||
virtual void OnDevToolsMethodResult(CefRefPtr<CefBrowser> browser,
|
||||
int message_id,
|
||||
bool success,
|
||||
const void* result,
|
||||
size_t result_size) {}
|
||||
|
||||
///
|
||||
// Method that will be called on receipt of a DevTools protocol event.
|
||||
// |browser| is the originating browser instance. |method| is the "method"
|
||||
// value. |params| is the UTF8-encoded JSON "params" dictionary value (which
|
||||
// may be empty). |params| is only valid for the scope of this callback and
|
||||
// should be copied if necessary. See the OnDevToolsMessage documentation for
|
||||
// additional details on |params| contents.
|
||||
///
|
||||
/*--cef(optional_param=params)--*/
|
||||
virtual void OnDevToolsEvent(CefRefPtr<CefBrowser> browser,
|
||||
const CefString& method,
|
||||
const void* params,
|
||||
size_t params_size) {}
|
||||
|
||||
///
|
||||
// Method that will be called when the DevTools agent has attached. |browser|
|
||||
// is the originating browser instance. This will generally occur in response
|
||||
// to the first message sent while the agent is detached.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnDevToolsAgentAttached(CefRefPtr<CefBrowser> browser) {}
|
||||
|
||||
///
|
||||
// Method that will be called when the DevTools agent has detached. |browser|
|
||||
// is the originating browser instance. Any method results that were pending
|
||||
// before the agent became detached will not be delivered, and any active
|
||||
// event subscriptions will be canceled.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnDevToolsAgentDetached(CefRefPtr<CefBrowser> browser) {}
|
||||
};
|
||||
|
||||
#endif // CEF_INCLUDE_CEF_DEVTOOLS_MESSAGE_OBSERVER_H_
|
@@ -46,6 +46,7 @@ class CefMediaObserver;
|
||||
class CefMediaRoute;
|
||||
class CefMediaRouteCreateCallback;
|
||||
class CefMediaSink;
|
||||
class CefMediaSinkDeviceInfoCallback;
|
||||
class CefMediaSource;
|
||||
|
||||
///
|
||||
@@ -229,12 +230,6 @@ class CefMediaSink : public virtual CefBaseRefCounted {
|
||||
/*--cef()--*/
|
||||
virtual CefString GetId() = 0;
|
||||
|
||||
///
|
||||
// Returns true if this sink is valid.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual bool IsValid() = 0;
|
||||
|
||||
///
|
||||
// Returns the name of this sink.
|
||||
///
|
||||
@@ -253,6 +248,13 @@ class CefMediaSink : public virtual CefBaseRefCounted {
|
||||
/*--cef(default_retval=CEF_MSIT_GENERIC)--*/
|
||||
virtual IconType GetIconType() = 0;
|
||||
|
||||
///
|
||||
// Asynchronously retrieves device info.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void GetDeviceInfo(
|
||||
CefRefPtr<CefMediaSinkDeviceInfoCallback> callback) = 0;
|
||||
|
||||
///
|
||||
// Returns true if this sink accepts content via Cast.
|
||||
///
|
||||
@@ -272,6 +274,22 @@ class CefMediaSink : public virtual CefBaseRefCounted {
|
||||
virtual bool IsCompatibleWith(CefRefPtr<CefMediaSource> source) = 0;
|
||||
};
|
||||
|
||||
///
|
||||
// Callback interface for CefMediaSink::GetDeviceInfo. The methods of this
|
||||
// class will be called on the browser process UI thread.
|
||||
///
|
||||
/*--cef(source=client)--*/
|
||||
class CefMediaSinkDeviceInfoCallback : public virtual CefBaseRefCounted {
|
||||
public:
|
||||
///
|
||||
// Method that will be executed asyncronously once device information has been
|
||||
// retrieved.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnMediaSinkDeviceInfo(
|
||||
const CefMediaSinkDeviceInfo& device_info) = 0;
|
||||
};
|
||||
|
||||
///
|
||||
// Represents a source from which media can be routed. Instances of this object
|
||||
// are retrieved via CefMediaRouter::GetSource. The methods of this class may be
|
||||
@@ -286,12 +304,6 @@ class CefMediaSource : public virtual CefBaseRefCounted {
|
||||
/*--cef()--*/
|
||||
virtual CefString GetId() = 0;
|
||||
|
||||
///
|
||||
// Returns true if this source is valid.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual bool IsValid() = 0;
|
||||
|
||||
///
|
||||
// Returns true if this source outputs its content via Cast.
|
||||
///
|
||||
|
@@ -133,6 +133,16 @@ CefString CefURIDecode(const CefString& text,
|
||||
CefRefPtr<CefValue> CefParseJSON(const CefString& json_string,
|
||||
cef_json_parser_options_t options);
|
||||
|
||||
///
|
||||
// Parses the specified UTF8-encoded |json| buffer of size |json_size| and
|
||||
// returns a dictionary or list representation. If JSON parsing fails this
|
||||
// method returns NULL.
|
||||
///
|
||||
/*--cef(capi_name=cef_parse_json_buffer)--*/
|
||||
CefRefPtr<CefValue> CefParseJSON(const void* json,
|
||||
size_t json_size,
|
||||
cef_json_parser_options_t options);
|
||||
|
||||
///
|
||||
// Parses the specified |json_string| and returns a dictionary or list
|
||||
// representation. If JSON parsing fails this method returns NULL and populates
|
||||
|
@@ -57,15 +57,6 @@ class CefRenderProcessHandler : public virtual CefBaseRefCounted {
|
||||
public:
|
||||
typedef cef_navigation_type_t NavigationType;
|
||||
|
||||
///
|
||||
// Called after the render process main thread has been created. |extra_info|
|
||||
// is a read-only value originating from
|
||||
// CefBrowserProcessHandler::OnRenderProcessThreadCreated(). Do not keep a
|
||||
// reference to |extra_info| outside of this method.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnRenderThreadCreated(CefRefPtr<CefListValue> extra_info) {}
|
||||
|
||||
///
|
||||
// Called after WebKit has been initialized.
|
||||
///
|
||||
|
@@ -252,6 +252,13 @@ class CefRequestHandler : public virtual CefBaseRefCounted {
|
||||
/*--cef()--*/
|
||||
virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser,
|
||||
TerminationStatus status) {}
|
||||
|
||||
///
|
||||
// Called on the browser process UI thread when the window.document object of
|
||||
// the main frame has been created.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnDocumentAvailableInMainFrame(CefRefPtr<CefBrowser> browser) {}
|
||||
};
|
||||
|
||||
#endif // CEF_INCLUDE_CEF_REQUEST_HANDLER_H_
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "include/cef_base.h"
|
||||
#include "include/cef_values.h"
|
||||
|
||||
///
|
||||
// Class used for retrieving resources from the resource bundle (*.pak) files
|
||||
@@ -67,33 +68,24 @@ class CefResourceBundle : public virtual CefBaseRefCounted {
|
||||
virtual CefString GetLocalizedString(int string_id) = 0;
|
||||
|
||||
///
|
||||
// Retrieves the contents of the specified scale independent |resource_id|.
|
||||
// If the value is found then |data| and |data_size| will be populated and
|
||||
// this method will return true. If the value is not found then this method
|
||||
// will return false. The returned |data| pointer will remain resident in
|
||||
// memory and should not be freed. Include cef_pack_resources.h for a listing
|
||||
// of valid resource ID values.
|
||||
// Returns a CefBinaryValue containing the decompressed contents of the
|
||||
// specified scale independent |resource_id| or NULL if not found. Include
|
||||
// cef_pack_resources.h for a listing of valid resource ID values.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual bool GetDataResource(int resource_id,
|
||||
void*& data,
|
||||
size_t& data_size) = 0;
|
||||
virtual CefRefPtr<CefBinaryValue> GetDataResource(int resource_id) = 0;
|
||||
|
||||
///
|
||||
// Retrieves the contents of the specified |resource_id| nearest the scale
|
||||
// factor |scale_factor|. Use a |scale_factor| value of SCALE_FACTOR_NONE for
|
||||
// scale independent resources or call GetDataResource instead. If the value
|
||||
// is found then |data| and |data_size| will be populated and this method will
|
||||
// return true. If the value is not found then this method will return false.
|
||||
// The returned |data| pointer will remain resident in memory and should not
|
||||
// be freed. Include cef_pack_resources.h for a listing of valid resource ID
|
||||
// values.
|
||||
// Returns a CefBinaryValue containing the decompressed contents of the
|
||||
// specified |resource_id| nearest the scale factor |scale_factor| or NULL if
|
||||
// not found. Use a |scale_factor| value of SCALE_FACTOR_NONE for scale
|
||||
// independent resources or call GetDataResource instead.Include
|
||||
// cef_pack_resources.h for a listing of valid resource ID values.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual bool GetDataResourceForScale(int resource_id,
|
||||
ScaleFactor scale_factor,
|
||||
void*& data,
|
||||
size_t& data_size) = 0;
|
||||
virtual CefRefPtr<CefBinaryValue> GetDataResourceForScale(
|
||||
int resource_id,
|
||||
ScaleFactor scale_factor) = 0;
|
||||
};
|
||||
|
||||
#endif // CEF_INCLUDE_CEF_RESOURCE_BUNDLE_H_
|
||||
|
@@ -192,6 +192,13 @@ typedef struct _cef_settings_t {
|
||||
///
|
||||
cef_string_t main_bundle_path;
|
||||
|
||||
///
|
||||
// Set to true (1) to enable use of the Chrome runtime in CEF. This feature is
|
||||
// considered experimental and is not recommended for most users at this time.
|
||||
// See issue #2969 for details.
|
||||
///
|
||||
int chrome_runtime;
|
||||
|
||||
///
|
||||
// Set to true (1) to have the browser process message loop run in a separate
|
||||
// thread. If false (0) than the CefDoMessageLoopWork() function must be
|
||||
@@ -1472,7 +1479,7 @@ typedef enum {
|
||||
///
|
||||
// The main thread in the renderer. Used for all WebKit and V8 interaction.
|
||||
// Tasks may be posted to this thread after
|
||||
// CefRenderProcessHandler::OnRenderThreadCreated but are not guaranteed to
|
||||
// CefRenderProcessHandler::OnWebKitInitialized but are not guaranteed to
|
||||
// run before sub-process termination (sub-processes may be killed at any time
|
||||
// without warning).
|
||||
///
|
||||
@@ -3180,6 +3187,15 @@ typedef enum {
|
||||
CEF_MSIT_TOTAL_COUNT, // The total number of values.
|
||||
} cef_media_sink_icon_type_t;
|
||||
|
||||
///
|
||||
// Device information for a MediaSink object.
|
||||
///
|
||||
typedef struct _cef_media_sink_device_info_t {
|
||||
cef_string_t ip_address;
|
||||
int port;
|
||||
cef_string_t model_name;
|
||||
} cef_media_sink_device_info_t;
|
||||
|
||||
///
|
||||
// Represents commands available to TextField.
|
||||
///
|
||||
|
@@ -569,6 +569,7 @@ struct CefSettingsTraits {
|
||||
&target->framework_dir_path, copy);
|
||||
cef_string_set(src->main_bundle_path.str, src->main_bundle_path.length,
|
||||
&target->main_bundle_path, copy);
|
||||
target->chrome_runtime = src->chrome_runtime;
|
||||
target->multi_threaded_message_loop = src->multi_threaded_message_loop;
|
||||
target->external_message_pump = src->external_message_pump;
|
||||
target->windowless_rendering_enabled = src->windowless_rendering_enabled;
|
||||
@@ -979,4 +980,30 @@ struct CefAudioParametersTraits {
|
||||
///
|
||||
typedef CefStructBase<CefAudioParametersTraits> CefAudioParameters;
|
||||
|
||||
struct CefMediaSinkDeviceInfoTraits {
|
||||
typedef cef_media_sink_device_info_t struct_type;
|
||||
|
||||
static inline void init(struct_type* s) {}
|
||||
|
||||
static inline void clear(struct_type* s) {
|
||||
cef_string_clear(&s->ip_address);
|
||||
cef_string_clear(&s->model_name);
|
||||
}
|
||||
|
||||
static inline void set(const struct_type* src,
|
||||
struct_type* target,
|
||||
bool copy) {
|
||||
cef_string_set(src->ip_address.str, src->ip_address.length,
|
||||
&target->ip_address, copy);
|
||||
target->port = src->port;
|
||||
cef_string_set(src->model_name.str, src->model_name.length,
|
||||
&target->model_name, copy);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
// Class representing MediaSink device info.
|
||||
///
|
||||
typedef CefStructBase<CefMediaSinkDeviceInfoTraits> CefMediaSinkDeviceInfo;
|
||||
|
||||
#endif // CEF_INCLUDE_INTERNAL_CEF_TYPES_WRAPPERS_H_
|
||||
|
@@ -46,9 +46,9 @@
|
||||
// This class typically, but not always, corresponds to a physical display
|
||||
// connected to the system. A fake Display may exist on a headless system, or a
|
||||
// Display may correspond to a remote, virtual display. All size and position
|
||||
// values are in density independent pixels (DIP) unless otherwise indicated.
|
||||
// Methods must be called on the browser process UI thread unless otherwise
|
||||
// indicated.
|
||||
// values are in density independent pixel (DIP) coordinates unless otherwise
|
||||
// indicated. Methods must be called on the browser process UI thread unless
|
||||
// otherwise indicated.
|
||||
///
|
||||
/*--cef(source=library)--*/
|
||||
class CefDisplay : public CefBaseRefCounted {
|
||||
@@ -61,8 +61,7 @@ class CefDisplay : public CefBaseRefCounted {
|
||||
|
||||
///
|
||||
// Returns the Display nearest |point|. Set |input_pixel_coords| to true if
|
||||
// |point| is in pixel coordinates instead of density independent pixels
|
||||
// (DIP).
|
||||
// |point| is in pixel screen coordinates instead of DIP screen coordinates.
|
||||
///
|
||||
/*--cef()--*/
|
||||
static CefRefPtr<CefDisplay> GetDisplayNearestPoint(const CefPoint& point,
|
||||
@@ -70,8 +69,8 @@ class CefDisplay : public CefBaseRefCounted {
|
||||
|
||||
///
|
||||
// Returns the Display that most closely intersects |bounds|. Set
|
||||
// |input_pixel_coords| to true if |bounds| is in pixel coordinates instead of
|
||||
// density independent pixels (DIP).
|
||||
// |input_pixel_coords| to true if |bounds| is in pixel screen coordinates
|
||||
// instead of DIP screen coordinates.
|
||||
///
|
||||
/*--cef()--*/
|
||||
static CefRefPtr<CefDisplay> GetDisplayMatchingBounds(
|
||||
@@ -108,28 +107,29 @@ class CefDisplay : public CefBaseRefCounted {
|
||||
virtual float GetDeviceScaleFactor() = 0;
|
||||
|
||||
///
|
||||
// Convert |point| from density independent pixels (DIP) to pixel coordinates
|
||||
// using this Display's device scale factor.
|
||||
// Convert |point| from DIP coordinates to pixel coordinates using this
|
||||
// Display's device scale factor.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void ConvertPointToPixels(CefPoint& point) = 0;
|
||||
|
||||
///
|
||||
// Convert |point| from pixel coordinates to density independent pixels (DIP)
|
||||
// using this Display's device scale factor.
|
||||
// Convert |point| from pixel coordinates to DIP coordinates using this
|
||||
// Display's device scale factor.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void ConvertPointFromPixels(CefPoint& point) = 0;
|
||||
|
||||
///
|
||||
// Returns this Display's bounds. This is the full size of the display.
|
||||
// Returns this Display's bounds in DIP screen coordinates. This is the full
|
||||
// size of the display.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefRect GetBounds() = 0;
|
||||
|
||||
///
|
||||
// Returns this Display's work area. This excludes areas of the display that
|
||||
// are occupied for window manager toolbars, etc.
|
||||
// Returns this Display's work area in DIP screen coordinates. This excludes
|
||||
// areas of the display that are occupied with window manager toolbars, etc.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefRect GetWorkArea() = 0;
|
||||
|
@@ -174,71 +174,79 @@ class CefView : public CefBaseRefCounted {
|
||||
virtual CefRefPtr<CefView> GetViewForID(int id) = 0;
|
||||
|
||||
///
|
||||
// Sets the bounds (size and position) of this View. Position is in parent
|
||||
// coordinates.
|
||||
// Sets the bounds (size and position) of this View. |bounds| is in parent
|
||||
// coordinates, or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void SetBounds(const CefRect& bounds) = 0;
|
||||
|
||||
///
|
||||
// Returns the bounds (size and position) of this View. Position is in parent
|
||||
// coordinates.
|
||||
// Returns the bounds (size and position) of this View in parent coordinates,
|
||||
// or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefRect GetBounds() = 0;
|
||||
|
||||
///
|
||||
// Returns the bounds (size and position) of this View. Position is in screen
|
||||
// Returns the bounds (size and position) of this View in DIP screen
|
||||
// coordinates.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefRect GetBoundsInScreen() = 0;
|
||||
|
||||
///
|
||||
// Sets the size of this View without changing the position.
|
||||
// Sets the size of this View without changing the position. |size| in
|
||||
// parent coordinates, or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void SetSize(const CefSize& size) = 0;
|
||||
|
||||
///
|
||||
// Returns the size of this View.
|
||||
// Returns the size of this View in parent coordinates, or DIP screen
|
||||
// coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefSize GetSize() = 0;
|
||||
|
||||
///
|
||||
// Sets the position of this View without changing the size. |position| is in
|
||||
// parent coordinates.
|
||||
// parent coordinates, or DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void SetPosition(const CefPoint& position) = 0;
|
||||
|
||||
///
|
||||
// Returns the position of this View. Position is in parent coordinates.
|
||||
// Returns the position of this View. Position is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefPoint GetPosition() = 0;
|
||||
|
||||
///
|
||||
// Returns the size this View would like to be if enough space is available.
|
||||
// Size is in parent coordinates, or DIP screen coordinates if there is no
|
||||
// parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefSize GetPreferredSize() = 0;
|
||||
|
||||
///
|
||||
// Size this View to its preferred size.
|
||||
// Size this View to its preferred size. Size is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void SizeToPreferredSize() = 0;
|
||||
|
||||
///
|
||||
// Returns the minimum size for this View.
|
||||
// Returns the minimum size for this View. Size is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefSize GetMinimumSize() = 0;
|
||||
|
||||
///
|
||||
// Returns the maximum size for this View.
|
||||
// Returns the maximum size for this View. Size is in parent coordinates, or
|
||||
// DIP screen coordinates if there is no parent.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefSize GetMaximumSize() = 0;
|
||||
@@ -345,9 +353,9 @@ class CefView : public CefBaseRefCounted {
|
||||
virtual cef_color_t GetBackgroundColor() = 0;
|
||||
|
||||
///
|
||||
// Convert |point| from this View's coordinate system to that of the screen.
|
||||
// This View must belong to a Window when calling this method. Returns true
|
||||
// if the conversion is successful or false otherwise. Use
|
||||
// Convert |point| from this View's coordinate system to DIP screen
|
||||
// coordinates. This View must belong to a Window when calling this method.
|
||||
// Returns true if the conversion is successful or false otherwise. Use
|
||||
// CefDisplay::ConvertPointToPixels() after calling this method if further
|
||||
// conversion to display-specific pixel coordinates is desired.
|
||||
///
|
||||
@@ -355,9 +363,9 @@ class CefView : public CefBaseRefCounted {
|
||||
virtual bool ConvertPointToScreen(CefPoint& point) = 0;
|
||||
|
||||
///
|
||||
// Convert |point| to this View's coordinate system from that of the screen.
|
||||
// This View must belong to a Window when calling this method. Returns true if
|
||||
// the conversion is successful or false otherwise. Use
|
||||
// Convert |point| to this View's coordinate system from DIP screen
|
||||
// coordinates. This View must belong to a Window when calling this method.
|
||||
// Returns true if the conversion is successful or false otherwise. Use
|
||||
// CefDisplay::ConvertPointFromPixels() before calling this method if
|
||||
// conversion from display-specific pixel coordinates is necessary.
|
||||
///
|
||||
|
@@ -78,6 +78,19 @@ class CefWindowDelegate : public CefPanelDelegate {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
///
|
||||
// Return the initial bounds for |window| in density independent pixel (DIP)
|
||||
// coordinates. If this method returns an empty CefRect then
|
||||
// GetPreferredSize() will be called to retrieve the size, and the window will
|
||||
// be placed on the screen with origin (0,0). This method can be used in
|
||||
// combination with CefView::GetBoundsInScreen() to restore the previous
|
||||
// window bounds.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual CefRect GetInitialBounds(CefRefPtr<CefWindow> window) {
|
||||
return CefRect();
|
||||
}
|
||||
|
||||
///
|
||||
// Return true if |window| should be created without a frame or title bar. The
|
||||
// window will be resizable if CanResize() returns true. Use
|
||||
|
@@ -89,6 +89,32 @@ struct CefDeleteOnIOThread : public CefDeleteOnThread<TID_IO> {};
|
||||
struct CefDeleteOnFileThread : public CefDeleteOnThread<TID_FILE> {};
|
||||
struct CefDeleteOnRendererThread : public CefDeleteOnThread<TID_RENDERER> {};
|
||||
|
||||
// Same as IMPLEMENT_REFCOUNTING() but using the specified Destructor.
|
||||
#define IMPLEMENT_REFCOUNTING_EX(ClassName, Destructor) \
|
||||
public: \
|
||||
void AddRef() const OVERRIDE { ref_count_.AddRef(); } \
|
||||
bool Release() const OVERRIDE { \
|
||||
if (ref_count_.Release()) { \
|
||||
Destructor::Destruct(this); \
|
||||
return true; \
|
||||
} \
|
||||
return false; \
|
||||
} \
|
||||
bool HasOneRef() const OVERRIDE { return ref_count_.HasOneRef(); } \
|
||||
bool HasAtLeastOneRef() const OVERRIDE { \
|
||||
return ref_count_.HasAtLeastOneRef(); \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
CefRefCount ref_count_
|
||||
|
||||
#define IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(ClassName) \
|
||||
IMPLEMENT_REFCOUNTING_EX(ClassName, CefDeleteOnUIThread)
|
||||
|
||||
#define IMPLEMENT_REFCOUNTING_DELETE_ON_IOT(ClassName) \
|
||||
IMPLEMENT_REFCOUNTING_EX(ClassName, CefDeleteOnIOThread)
|
||||
|
||||
|
||||
///
|
||||
// Helper class to manage a scoped copy of |argv|.
|
||||
///
|
||||
|
456
libcef/browser/alloy/alloy_browser_context.cc
Normal file
456
libcef/browser/alloy/alloy_browser_context.cc
Normal file
@@ -0,0 +1,456 @@
|
||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/alloy/alloy_browser_context.h"
|
||||
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
#include "libcef/browser/download_manager_delegate.h"
|
||||
#include "libcef/browser/extensions/extension_system.h"
|
||||
#include "libcef/browser/prefs/browser_prefs.h"
|
||||
#include "libcef/browser/ssl_host_state_delegate.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
#include "libcef/common/cef_switches.h"
|
||||
#include "libcef/common/extensions/extensions_util.h"
|
||||
|
||||
#include "base/command_line.h"
|
||||
#include "base/files/file_util.h"
|
||||
#include "base/lazy_instance.h"
|
||||
#include "base/logging.h"
|
||||
#include "base/strings/string_util.h"
|
||||
#include "chrome/browser/font_family_cache.h"
|
||||
#include "chrome/browser/media/media_device_id_salt.h"
|
||||
#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
|
||||
#include "chrome/browser/profiles/profile_key.h"
|
||||
#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
|
||||
#include "chrome/common/pref_names.h"
|
||||
#include "components/guest_view/browser/guest_view_manager.h"
|
||||
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
||||
#include "components/keyed_service/core/simple_dependency_manager.h"
|
||||
#include "components/keyed_service/core/simple_key_map.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "components/proxy_config/pref_proxy_config_tracker_impl.h"
|
||||
#include "components/user_prefs/user_prefs.h"
|
||||
#include "components/visitedlink/browser/visitedlink_event_listener.h"
|
||||
#include "components/visitedlink/browser/visitedlink_writer.h"
|
||||
#include "components/zoom/zoom_event_manager.h"
|
||||
#include "content/public/browser/browser_task_traits.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "content/public/browser/download_manager.h"
|
||||
#include "content/public/browser/resource_context.h"
|
||||
#include "content/public/browser/storage_partition.h"
|
||||
#include "extensions/browser/extension_protocols.h"
|
||||
#include "extensions/browser/process_manager.h"
|
||||
#include "extensions/common/constants.h"
|
||||
#include "net/proxy_resolution/proxy_config_service.h"
|
||||
#include "services/network/public/mojom/cors_origin_pattern.mojom.h"
|
||||
|
||||
using content::BrowserThread;
|
||||
|
||||
// Creates and manages VisitedLinkEventListener objects for each
|
||||
// AlloyBrowserContext sharing the same VisitedLinkWriter.
|
||||
class CefVisitedLinkListener : public visitedlink::VisitedLinkWriter::Listener {
|
||||
public:
|
||||
CefVisitedLinkListener() { DCHECK(listener_map_.empty()); }
|
||||
|
||||
void CreateListenerForContext(content::BrowserContext* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
auto listener =
|
||||
std::make_unique<visitedlink::VisitedLinkEventListener>(context);
|
||||
listener_map_.insert(std::make_pair(context, std::move(listener)));
|
||||
}
|
||||
|
||||
void RemoveListenerForContext(content::BrowserContext* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.find(context);
|
||||
DCHECK(it != listener_map_.end());
|
||||
listener_map_.erase(it);
|
||||
}
|
||||
|
||||
// visitedlink::VisitedLinkWriter::Listener methods.
|
||||
|
||||
void NewTable(base::ReadOnlySharedMemoryRegion* table_region) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.begin();
|
||||
for (; it != listener_map_.end(); ++it)
|
||||
it->second->NewTable(table_region);
|
||||
}
|
||||
|
||||
void Add(visitedlink::VisitedLinkCommon::Fingerprint fingerprint) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.begin();
|
||||
for (; it != listener_map_.end(); ++it)
|
||||
it->second->Add(fingerprint);
|
||||
}
|
||||
|
||||
void Reset(bool invalidate_hashes) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.begin();
|
||||
for (; it != listener_map_.end(); ++it)
|
||||
it->second->Reset(invalidate_hashes);
|
||||
}
|
||||
|
||||
private:
|
||||
// Map of AlloyBrowserContext to the associated VisitedLinkEventListener.
|
||||
typedef std::map<const content::BrowserContext*,
|
||||
std::unique_ptr<visitedlink::VisitedLinkEventListener>>
|
||||
ListenerMap;
|
||||
ListenerMap listener_map_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefVisitedLinkListener);
|
||||
};
|
||||
|
||||
AlloyBrowserContext::AlloyBrowserContext(
|
||||
const CefRequestContextSettings& settings)
|
||||
: CefBrowserContext(settings) {}
|
||||
|
||||
AlloyBrowserContext::~AlloyBrowserContext() {
|
||||
if (resource_context_) {
|
||||
content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE,
|
||||
resource_context_.release());
|
||||
}
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::Initialize() {
|
||||
CefBrowserContext::Initialize();
|
||||
|
||||
key_ = std::make_unique<ProfileKey>(cache_path_);
|
||||
SimpleKeyMap::GetInstance()->Associate(this, key_.get());
|
||||
|
||||
// Initialize the PrefService object.
|
||||
pref_service_ = browser_prefs::CreatePrefService(
|
||||
this, cache_path_, !!settings_.persist_user_preferences);
|
||||
|
||||
// This must be called before creating any services to avoid hitting
|
||||
// DependencyManager::AssertContextWasntDestroyed when creating/destroying
|
||||
// multiple browser contexts (due to pointer address reuse).
|
||||
BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
|
||||
this);
|
||||
|
||||
const bool extensions_enabled = extensions::ExtensionsEnabled();
|
||||
if (extensions_enabled) {
|
||||
// Create the custom ExtensionSystem first because other KeyedServices
|
||||
// depend on it.
|
||||
extension_system_ = static_cast<extensions::CefExtensionSystem*>(
|
||||
extensions::ExtensionSystem::Get(this));
|
||||
extension_system_->InitForRegularProfile(true);
|
||||
|
||||
// Make sure the ProcessManager is created so that it receives extension
|
||||
// load notifications. This is necessary for the proper initialization of
|
||||
// background/event pages.
|
||||
extensions::ProcessManager::Get(this);
|
||||
}
|
||||
|
||||
// Initialize visited links management.
|
||||
base::FilePath visited_link_path;
|
||||
if (!cache_path_.empty())
|
||||
visited_link_path = cache_path_.Append(FILE_PATH_LITERAL("Visited Links"));
|
||||
visitedlink_listener_ = new CefVisitedLinkListener;
|
||||
visitedlink_master_.reset(new visitedlink::VisitedLinkWriter(
|
||||
visitedlink_listener_, this, !visited_link_path.empty(), false,
|
||||
visited_link_path, 0));
|
||||
visitedlink_listener_->CreateListenerForContext(this);
|
||||
visitedlink_master_->Init();
|
||||
|
||||
// Initialize proxy configuration tracker.
|
||||
pref_proxy_config_tracker_.reset(new PrefProxyConfigTrackerImpl(
|
||||
GetPrefs(), content::GetIOThreadTaskRunner({})));
|
||||
|
||||
// Spell checking support and possibly other subsystems retrieve the
|
||||
// PrefService associated with a BrowserContext via UserPrefs::Get().
|
||||
PrefService* pref_service = GetPrefs();
|
||||
DCHECK(pref_service);
|
||||
user_prefs::UserPrefs::Set(this, pref_service);
|
||||
key_->SetPrefs(pref_service);
|
||||
|
||||
if (extensions_enabled)
|
||||
extension_system_->Init();
|
||||
|
||||
ChromePluginServiceFilter::GetInstance()->RegisterProfile(this);
|
||||
|
||||
media_device_id_salt_ = new MediaDeviceIDSalt(pref_service);
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::Shutdown() {
|
||||
CefBrowserContext::Shutdown();
|
||||
|
||||
// Send notifications to clean up objects associated with this Profile.
|
||||
MaybeSendDestroyedNotification();
|
||||
|
||||
ChromePluginServiceFilter::GetInstance()->UnregisterProfile(this);
|
||||
|
||||
// Remove any BrowserContextKeyedServiceFactory associations. This must be
|
||||
// called before the ProxyService owned by AlloyBrowserContext is destroyed.
|
||||
// The SimpleDependencyManager should always be passed after the
|
||||
// BrowserContextDependencyManager. This is because the KeyedService instances
|
||||
// in the BrowserContextDependencyManager's dependency graph can depend on the
|
||||
// ones in the SimpleDependencyManager's graph.
|
||||
DependencyManager::PerformInterlockedTwoPhaseShutdown(
|
||||
BrowserContextDependencyManager::GetInstance(), this,
|
||||
SimpleDependencyManager::GetInstance(), key_.get());
|
||||
|
||||
key_.reset();
|
||||
SimpleKeyMap::GetInstance()->Dissociate(this);
|
||||
|
||||
// Shuts down the storage partitions associated with this browser context.
|
||||
// This must be called before the browser context is actually destroyed
|
||||
// and before a clean-up task for its corresponding IO thread residents
|
||||
// (e.g. ResourceContext) is posted, so that the classes that hung on
|
||||
// StoragePartition can have time to do necessary cleanups on IO thread.
|
||||
ShutdownStoragePartitions();
|
||||
|
||||
visitedlink_listener_->RemoveListenerForContext(this);
|
||||
|
||||
// The FontFamilyCache references the ProxyService so delete it before the
|
||||
// ProxyService is deleted.
|
||||
SetUserData(&kFontFamilyCacheKey, nullptr);
|
||||
|
||||
pref_proxy_config_tracker_->DetachFromPrefService();
|
||||
|
||||
// Delete the download manager delegate here because otherwise we'll crash
|
||||
// when it's accessed from the content::BrowserContext destructor.
|
||||
if (download_manager_delegate_)
|
||||
download_manager_delegate_.reset(nullptr);
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::RemoveCefRequestContext(
|
||||
CefRequestContextImpl* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
if (extensions::ExtensionsEnabled()) {
|
||||
extension_system()->OnRequestContextDeleted(context);
|
||||
}
|
||||
|
||||
// May result in |this| being deleted.
|
||||
CefBrowserContext::RemoveCefRequestContext(context);
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::LoadExtension(
|
||||
const CefString& root_directory,
|
||||
CefRefPtr<CefDictionaryValue> manifest,
|
||||
CefRefPtr<CefExtensionHandler> handler,
|
||||
CefRefPtr<CefRequestContext> loader_context) {
|
||||
if (!extensions::ExtensionsEnabled()) {
|
||||
if (handler)
|
||||
handler->OnExtensionLoadFailed(ERR_ABORTED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (manifest && manifest->GetSize() > 0) {
|
||||
CefDictionaryValueImpl* value_impl =
|
||||
static_cast<CefDictionaryValueImpl*>(manifest.get());
|
||||
extension_system()->LoadExtension(base::WrapUnique(value_impl->CopyValue()),
|
||||
root_directory, false /* builtin */,
|
||||
loader_context, handler);
|
||||
} else {
|
||||
extension_system()->LoadExtension(root_directory, false /* builtin */,
|
||||
loader_context, handler);
|
||||
}
|
||||
}
|
||||
|
||||
bool AlloyBrowserContext::GetExtensions(std::vector<CefString>& extension_ids) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
return false;
|
||||
|
||||
extensions::CefExtensionSystem::ExtensionMap extension_map =
|
||||
extension_system()->GetExtensions();
|
||||
extensions::CefExtensionSystem::ExtensionMap::const_iterator it =
|
||||
extension_map.begin();
|
||||
for (; it != extension_map.end(); ++it)
|
||||
extension_ids.push_back(it->second->GetIdentifier());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CefRefPtr<CefExtension> AlloyBrowserContext::GetExtension(
|
||||
const CefString& extension_id) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
return nullptr;
|
||||
|
||||
return extension_system()->GetExtension(extension_id);
|
||||
}
|
||||
|
||||
bool AlloyBrowserContext::UnloadExtension(const CefString& extension_id) {
|
||||
DCHECK(extensions::ExtensionsEnabled());
|
||||
return extension_system()->UnloadExtension(extension_id);
|
||||
}
|
||||
|
||||
bool AlloyBrowserContext::IsPrintPreviewSupported() const {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!extensions::PrintPreviewEnabled())
|
||||
return false;
|
||||
|
||||
return !GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled);
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::AddVisitedURLs(const std::vector<GURL>& urls) {
|
||||
visitedlink_master_->AddURLs(urls);
|
||||
}
|
||||
|
||||
content::ResourceContext* AlloyBrowserContext::GetResourceContext() {
|
||||
if (!resource_context_) {
|
||||
resource_context_ = std::make_unique<content::ResourceContext>();
|
||||
}
|
||||
return resource_context_.get();
|
||||
}
|
||||
|
||||
content::ClientHintsControllerDelegate*
|
||||
AlloyBrowserContext::GetClientHintsControllerDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::SetCorsOriginAccessListForOrigin(
|
||||
const url::Origin& source_origin,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
|
||||
base::OnceClosure closure) {
|
||||
// This method is called for Extension support.
|
||||
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(closure));
|
||||
}
|
||||
|
||||
ChromeZoomLevelPrefs* AlloyBrowserContext::GetZoomLevelPrefs() {
|
||||
return static_cast<ChromeZoomLevelPrefs*>(
|
||||
GetStoragePartition(this, nullptr)->GetZoomLevelDelegate());
|
||||
}
|
||||
|
||||
scoped_refptr<network::SharedURLLoaderFactory>
|
||||
AlloyBrowserContext::GetURLLoaderFactory() {
|
||||
return GetDefaultStoragePartition(this)
|
||||
->GetURLLoaderFactoryForBrowserProcess();
|
||||
}
|
||||
|
||||
base::FilePath AlloyBrowserContext::GetPath() {
|
||||
return cache_path_;
|
||||
}
|
||||
|
||||
base::FilePath AlloyBrowserContext::GetPath() const {
|
||||
return cache_path_;
|
||||
}
|
||||
|
||||
std::unique_ptr<content::ZoomLevelDelegate>
|
||||
AlloyBrowserContext::CreateZoomLevelDelegate(
|
||||
const base::FilePath& partition_path) {
|
||||
if (cache_path_.empty())
|
||||
return std::unique_ptr<content::ZoomLevelDelegate>();
|
||||
|
||||
return base::WrapUnique(new ChromeZoomLevelPrefs(
|
||||
GetPrefs(), cache_path_, partition_path,
|
||||
zoom::ZoomEventManager::GetForBrowserContext(this)->GetWeakPtr()));
|
||||
}
|
||||
|
||||
bool AlloyBrowserContext::IsOffTheRecord() const {
|
||||
// Alloy contexts are never flagged as off-the-record. It causes problems
|
||||
// for the extension system.
|
||||
return false;
|
||||
}
|
||||
|
||||
content::DownloadManagerDelegate*
|
||||
AlloyBrowserContext::GetDownloadManagerDelegate() {
|
||||
if (!download_manager_delegate_) {
|
||||
content::DownloadManager* manager =
|
||||
BrowserContext::GetDownloadManager(this);
|
||||
download_manager_delegate_.reset(new CefDownloadManagerDelegate(manager));
|
||||
}
|
||||
return download_manager_delegate_.get();
|
||||
}
|
||||
|
||||
content::BrowserPluginGuestManager* AlloyBrowserContext::GetGuestManager() {
|
||||
DCHECK(extensions::ExtensionsEnabled());
|
||||
return guest_view::GuestViewManager::FromBrowserContext(this);
|
||||
}
|
||||
|
||||
storage::SpecialStoragePolicy* AlloyBrowserContext::GetSpecialStoragePolicy() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::PushMessagingService* AlloyBrowserContext::GetPushMessagingService() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::StorageNotificationService*
|
||||
AlloyBrowserContext::GetStorageNotificationService() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::SSLHostStateDelegate* AlloyBrowserContext::GetSSLHostStateDelegate() {
|
||||
if (!ssl_host_state_delegate_)
|
||||
ssl_host_state_delegate_.reset(new CefSSLHostStateDelegate());
|
||||
return ssl_host_state_delegate_.get();
|
||||
}
|
||||
|
||||
content::PermissionControllerDelegate*
|
||||
AlloyBrowserContext::GetPermissionControllerDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::BackgroundFetchDelegate*
|
||||
AlloyBrowserContext::GetBackgroundFetchDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::BackgroundSyncController*
|
||||
AlloyBrowserContext::GetBackgroundSyncController() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::BrowsingDataRemoverDelegate*
|
||||
AlloyBrowserContext::GetBrowsingDataRemoverDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string AlloyBrowserContext::GetMediaDeviceIDSalt() {
|
||||
return media_device_id_salt_->GetSalt();
|
||||
}
|
||||
|
||||
PrefService* AlloyBrowserContext::GetPrefs() {
|
||||
return pref_service_.get();
|
||||
}
|
||||
|
||||
const PrefService* AlloyBrowserContext::GetPrefs() const {
|
||||
return pref_service_.get();
|
||||
}
|
||||
|
||||
ProfileKey* AlloyBrowserContext::GetProfileKey() const {
|
||||
DCHECK(key_);
|
||||
return key_.get();
|
||||
}
|
||||
|
||||
policy::SchemaRegistryService*
|
||||
AlloyBrowserContext::GetPolicySchemaRegistryService() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
policy::UserCloudPolicyManager*
|
||||
AlloyBrowserContext::GetUserCloudPolicyManager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
policy::ProfilePolicyConnector*
|
||||
AlloyBrowserContext::GetProfilePolicyConnector() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const policy::ProfilePolicyConnector*
|
||||
AlloyBrowserContext::GetProfilePolicyConnector() const {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AlloyBrowserContext::RebuildTable(
|
||||
const scoped_refptr<URLEnumerator>& enumerator) {
|
||||
// Called when visited links will not or cannot be loaded from disk.
|
||||
enumerator->OnComplete(true);
|
||||
}
|
||||
|
||||
DownloadPrefs* AlloyBrowserContext::GetDownloadPrefs() {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!download_prefs_) {
|
||||
download_prefs_.reset(new DownloadPrefs(this));
|
||||
}
|
||||
return download_prefs_.get();
|
||||
}
|
150
libcef/browser/alloy/alloy_browser_context.h
Normal file
150
libcef/browser/alloy/alloy_browser_context.h
Normal file
@@ -0,0 +1,150 @@
|
||||
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_ALLOY_BROWSER_CONTEXT_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_ALLOY_BROWSER_CONTEXT_H_
|
||||
#pragma once
|
||||
|
||||
#include "include/cef_request_context_handler.h"
|
||||
#include "libcef/browser/alloy/chrome_profile_alloy.h"
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/request_context_handler_map.h"
|
||||
|
||||
#include "chrome/browser/download/download_prefs.h"
|
||||
#include "components/proxy_config/pref_proxy_config_tracker.h"
|
||||
#include "components/visitedlink/browser/visitedlink_delegate.h"
|
||||
|
||||
class CefDownloadManagerDelegate;
|
||||
class CefSSLHostStateDelegate;
|
||||
class CefVisitedLinkListener;
|
||||
class MediaDeviceIDSalt;
|
||||
class PrefService;
|
||||
|
||||
namespace extensions {
|
||||
class CefExtensionSystem;
|
||||
}
|
||||
|
||||
namespace visitedlink {
|
||||
class VisitedLinkWriter;
|
||||
}
|
||||
|
||||
// See CefBrowserContext documentation for usage. Only accessed on the UI thread
|
||||
// unless otherwise indicated. ChromeProfileAlloy must be the first listed base
|
||||
// class to avoid issues when casting between void* and content::BrowserContext*
|
||||
// in Chromium code.
|
||||
class AlloyBrowserContext : public ChromeProfileAlloy,
|
||||
public CefBrowserContext,
|
||||
public visitedlink::VisitedLinkDelegate {
|
||||
public:
|
||||
explicit AlloyBrowserContext(const CefRequestContextSettings& settings);
|
||||
|
||||
// CefBrowserContext overrides.
|
||||
content::BrowserContext* AsBrowserContext() override { return this; }
|
||||
Profile* AsProfile() override { return this; }
|
||||
void Initialize() override;
|
||||
void Shutdown() override;
|
||||
void RemoveCefRequestContext(CefRequestContextImpl* context) override;
|
||||
void LoadExtension(const CefString& root_directory,
|
||||
CefRefPtr<CefDictionaryValue> manifest,
|
||||
CefRefPtr<CefExtensionHandler> handler,
|
||||
CefRefPtr<CefRequestContext> loader_context) override;
|
||||
bool GetExtensions(std::vector<CefString>& extension_ids) override;
|
||||
CefRefPtr<CefExtension> GetExtension(const CefString& extension_id) override;
|
||||
bool UnloadExtension(const CefString& extension_id) override;
|
||||
bool IsPrintPreviewSupported() const override;
|
||||
void AddVisitedURLs(const std::vector<GURL>& urls) override;
|
||||
|
||||
// content::BrowserContext overrides.
|
||||
content::ResourceContext* GetResourceContext() override;
|
||||
content::ClientHintsControllerDelegate* GetClientHintsControllerDelegate()
|
||||
override;
|
||||
void SetCorsOriginAccessListForOrigin(
|
||||
const url::Origin& source_origin,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
|
||||
base::OnceClosure closure) override;
|
||||
base::FilePath GetPath() override;
|
||||
base::FilePath GetPath() const override;
|
||||
std::unique_ptr<content::ZoomLevelDelegate> CreateZoomLevelDelegate(
|
||||
const base::FilePath& partition_path) override;
|
||||
bool IsOffTheRecord() const override;
|
||||
content::DownloadManagerDelegate* GetDownloadManagerDelegate() override;
|
||||
content::BrowserPluginGuestManager* GetGuestManager() override;
|
||||
storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override;
|
||||
content::PushMessagingService* GetPushMessagingService() override;
|
||||
content::StorageNotificationService* GetStorageNotificationService() override;
|
||||
content::SSLHostStateDelegate* GetSSLHostStateDelegate() override;
|
||||
content::PermissionControllerDelegate* GetPermissionControllerDelegate()
|
||||
override;
|
||||
content::BackgroundFetchDelegate* GetBackgroundFetchDelegate() override;
|
||||
content::BackgroundSyncController* GetBackgroundSyncController() override;
|
||||
content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate()
|
||||
override;
|
||||
std::string GetMediaDeviceIDSalt() override;
|
||||
|
||||
// Profile overrides.
|
||||
ChromeZoomLevelPrefs* GetZoomLevelPrefs() override;
|
||||
scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
|
||||
PrefService* GetPrefs() override;
|
||||
bool AllowsBrowserWindows() const override { return false; }
|
||||
const PrefService* GetPrefs() const override;
|
||||
ProfileKey* GetProfileKey() const override;
|
||||
policy::SchemaRegistryService* GetPolicySchemaRegistryService() override;
|
||||
policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
|
||||
policy::ProfilePolicyConnector* GetProfilePolicyConnector() override;
|
||||
const policy::ProfilePolicyConnector* GetProfilePolicyConnector()
|
||||
const override;
|
||||
|
||||
// Values checked in ProfileNetworkContextService::CreateNetworkContextParams
|
||||
// when creating the NetworkContext.
|
||||
bool ShouldRestoreOldSessionCookies() override {
|
||||
return ShouldPersistSessionCookies();
|
||||
}
|
||||
bool ShouldPersistSessionCookies() override {
|
||||
return !!settings_.persist_session_cookies;
|
||||
}
|
||||
base::Optional<std::vector<std::string>> GetCookieableSchemes() override {
|
||||
return cookieable_schemes();
|
||||
}
|
||||
|
||||
// visitedlink::VisitedLinkDelegate methods.
|
||||
void RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) override;
|
||||
|
||||
// Manages extensions.
|
||||
extensions::CefExtensionSystem* extension_system() const {
|
||||
return extension_system_;
|
||||
}
|
||||
|
||||
// Called from DownloadPrefs::FromBrowserContext.
|
||||
DownloadPrefs* GetDownloadPrefs();
|
||||
|
||||
private:
|
||||
~AlloyBrowserContext() override;
|
||||
|
||||
std::unique_ptr<PrefService> pref_service_;
|
||||
std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
|
||||
|
||||
std::unique_ptr<CefDownloadManagerDelegate> download_manager_delegate_;
|
||||
std::unique_ptr<CefSSLHostStateDelegate> ssl_host_state_delegate_;
|
||||
std::unique_ptr<visitedlink::VisitedLinkWriter> visitedlink_master_;
|
||||
// |visitedlink_listener_| is owned by visitedlink_master_.
|
||||
CefVisitedLinkListener* visitedlink_listener_ = nullptr;
|
||||
|
||||
// Owned by the KeyedService system.
|
||||
extensions::CefExtensionSystem* extension_system_ = nullptr;
|
||||
|
||||
// The key to index KeyedService instances created by
|
||||
// SimpleKeyedServiceFactory.
|
||||
std::unique_ptr<ProfileKey> key_;
|
||||
|
||||
std::unique_ptr<DownloadPrefs> download_prefs_;
|
||||
|
||||
std::unique_ptr<content::ResourceContext> resource_context_;
|
||||
|
||||
scoped_refptr<MediaDeviceIDSalt> media_device_id_salt_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(AlloyBrowserContext);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_ALLOY_BROWSER_CONTEXT_H_
|
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/browser_main.h"
|
||||
#include "libcef/browser/alloy/alloy_browser_main.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/browser_context_keyed_service_factories.h"
|
||||
#include "libcef/browser/content_browser_client.h"
|
||||
#include "libcef/browser/context.h"
|
||||
#include "libcef/browser/devtools/devtools_manager_delegate.h"
|
||||
#include "libcef/browser/extensions/extension_system_factory.h"
|
||||
@@ -19,12 +18,12 @@
|
||||
#include "libcef/browser/printing/constrained_window_views_client.h"
|
||||
#include "libcef/browser/printing/printing_message_filter.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
#include "libcef/common/app_manager.h"
|
||||
#include "libcef/common/extensions/extensions_client.h"
|
||||
#include "libcef/common/extensions/extensions_util.h"
|
||||
#include "libcef/common/net/net_resource_provider.h"
|
||||
|
||||
#include "base/bind.h"
|
||||
#include "base/message_loop/message_loop.h"
|
||||
#include "base/strings/string_number_conversions.h"
|
||||
#include "base/task/post_task.h"
|
||||
#include "chrome/browser/browser_process.h"
|
||||
@@ -74,15 +73,15 @@
|
||||
#include "libcef/browser/printing/print_dialog_linux.h"
|
||||
#endif
|
||||
|
||||
CefBrowserMainParts::CefBrowserMainParts(
|
||||
AlloyBrowserMainParts::AlloyBrowserMainParts(
|
||||
const content::MainFunctionParams& parameters)
|
||||
: BrowserMainParts(), devtools_delegate_(nullptr) {}
|
||||
|
||||
CefBrowserMainParts::~CefBrowserMainParts() {
|
||||
AlloyBrowserMainParts::~AlloyBrowserMainParts() {
|
||||
constrained_window::SetConstrainedWindowViewsClient(nullptr);
|
||||
}
|
||||
|
||||
int CefBrowserMainParts::PreEarlyInitialization() {
|
||||
int AlloyBrowserMainParts::PreEarlyInitialization() {
|
||||
#if defined(USE_AURA) && defined(OS_LINUX)
|
||||
// TODO(linux): Consider using a real input method or
|
||||
// views::LinuxUI::SetInstance.
|
||||
@@ -92,7 +91,7 @@ int CefBrowserMainParts::PreEarlyInitialization() {
|
||||
return service_manager::RESULT_CODE_NORMAL_EXIT;
|
||||
}
|
||||
|
||||
void CefBrowserMainParts::ToolkitInitialized() {
|
||||
void AlloyBrowserMainParts::ToolkitInitialized() {
|
||||
SetConstrainedWindowViewsClient(CreateCefConstrainedWindowViewsClient());
|
||||
#if defined(USE_AURA)
|
||||
CHECK(aura::Env::GetInstance());
|
||||
@@ -101,7 +100,7 @@ void CefBrowserMainParts::ToolkitInitialized() {
|
||||
|
||||
#if defined(OS_WIN)
|
||||
ui::CursorLoaderWin::SetCursorResourceModule(
|
||||
CefContentBrowserClient::Get()->GetResourceDllName());
|
||||
CefAppManager::Get()->GetResourceDllName());
|
||||
#endif
|
||||
#endif // defined(USE_AURA)
|
||||
|
||||
@@ -115,7 +114,7 @@ void CefBrowserMainParts::ToolkitInitialized() {
|
||||
#endif // defined(TOOLKIT_VIEWS)
|
||||
}
|
||||
|
||||
void CefBrowserMainParts::PreMainMessageLoopStart() {
|
||||
void AlloyBrowserMainParts::PreMainMessageLoopStart() {
|
||||
#if defined(USE_AURA) && defined(USE_X11)
|
||||
ui::TouchFactory::SetTouchDeviceListFromCommandLine();
|
||||
#endif
|
||||
@@ -133,7 +132,7 @@ void CefBrowserMainParts::PreMainMessageLoopStart() {
|
||||
#endif // defined(OS_WIN)
|
||||
}
|
||||
|
||||
void CefBrowserMainParts::PostMainMessageLoopStart() {
|
||||
void AlloyBrowserMainParts::PostMainMessageLoopStart() {
|
||||
#if defined(OS_LINUX)
|
||||
printing::PrintingContextLinux::SetCreatePrintDialogFunction(
|
||||
&CefPrintDialogLinux::CreatePrintDialog);
|
||||
@@ -142,7 +141,7 @@ void CefBrowserMainParts::PostMainMessageLoopStart() {
|
||||
#endif
|
||||
}
|
||||
|
||||
int CefBrowserMainParts::PreCreateThreads() {
|
||||
int AlloyBrowserMainParts::PreCreateThreads() {
|
||||
#if defined(OS_WIN)
|
||||
PlatformInitialize();
|
||||
#endif
|
||||
@@ -157,7 +156,7 @@ int CefBrowserMainParts::PreCreateThreads() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CefBrowserMainParts::PreMainMessageLoopRun() {
|
||||
void AlloyBrowserMainParts::PreMainMessageLoopRun() {
|
||||
#if defined(USE_AURA)
|
||||
display::Screen::SetScreenInstance(views::CreateDesktopScreen());
|
||||
#endif
|
||||
@@ -196,8 +195,8 @@ void CefBrowserMainParts::PreMainMessageLoopRun() {
|
||||
// Create the global RequestContext.
|
||||
global_request_context_ =
|
||||
CefRequestContextImpl::CreateGlobalRequestContext(settings);
|
||||
CefBrowserContext* browser_context = static_cast<CefBrowserContext*>(
|
||||
global_request_context_->GetBrowserContext());
|
||||
auto browser_context =
|
||||
global_request_context_->GetBrowserContext()->AsBrowserContext();
|
||||
|
||||
CefDevToolsManagerDelegate::StartHttpHandler(browser_context);
|
||||
|
||||
@@ -213,7 +212,7 @@ void CefBrowserMainParts::PreMainMessageLoopRun() {
|
||||
scheme::RegisterWebUIControllerFactory();
|
||||
}
|
||||
|
||||
void CefBrowserMainParts::PostMainMessageLoopRun() {
|
||||
void AlloyBrowserMainParts::PostMainMessageLoopRun() {
|
||||
// NOTE: Destroy objects in reverse order of creation.
|
||||
CefDevToolsManagerDelegate::StopHttpHandler();
|
||||
|
||||
@@ -223,7 +222,7 @@ void CefBrowserMainParts::PostMainMessageLoopRun() {
|
||||
global_request_context_ = nullptr;
|
||||
}
|
||||
|
||||
void CefBrowserMainParts::PostDestroyThreads() {
|
||||
void AlloyBrowserMainParts::PostDestroyThreads() {
|
||||
if (extensions::ExtensionsEnabled()) {
|
||||
extensions::ExtensionsBrowserClient::Set(nullptr);
|
||||
extensions_browser_client_.reset();
|
@@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_BROWSER_MAIN_H_
|
||||
#define CEF_LIBCEF_BROWSER_BROWSER_MAIN_H_
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_ALLOY_BROWSER_MAIN_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_ALLOY_BROWSER_MAIN_H_
|
||||
#pragma once
|
||||
|
||||
#include "libcef/browser/request_context_impl.h"
|
||||
@@ -35,15 +35,15 @@ class ViewsDelegate;
|
||||
#if defined(OS_MACOSX)
|
||||
class LayoutProvider;
|
||||
#endif
|
||||
}
|
||||
} // namespace views
|
||||
#endif // defined(TOOLKIT_VIEWS)
|
||||
|
||||
class CefDevToolsDelegate;
|
||||
|
||||
class CefBrowserMainParts : public content::BrowserMainParts {
|
||||
class AlloyBrowserMainParts : public content::BrowserMainParts {
|
||||
public:
|
||||
explicit CefBrowserMainParts(const content::MainFunctionParams& parameters);
|
||||
~CefBrowserMainParts() override;
|
||||
explicit AlloyBrowserMainParts(const content::MainFunctionParams& parameters);
|
||||
~AlloyBrowserMainParts() override;
|
||||
|
||||
int PreEarlyInitialization() override;
|
||||
void ToolkitInitialized() override;
|
||||
@@ -101,7 +101,7 @@ class CefBrowserMainParts : public content::BrowserMainParts {
|
||||
#endif
|
||||
#endif // defined(TOOLKIT_VIEWS)
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefBrowserMainParts);
|
||||
DISALLOW_COPY_AND_ASSIGN(AlloyBrowserMainParts);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_BROWSER_MAIN_H_
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_ALLOY_BROWSER_MAIN_H_
|
@@ -6,11 +6,11 @@
|
||||
#include <commctrl.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "libcef/browser/browser_main.h"
|
||||
#include "libcef/browser/alloy/alloy_browser_main.h"
|
||||
|
||||
#include "base/logging.h"
|
||||
|
||||
void CefBrowserMainParts::PlatformInitialize() {
|
||||
void AlloyBrowserMainParts::PlatformInitialize() {
|
||||
HRESULT res;
|
||||
|
||||
// Initialize common controls.
|
@@ -2,17 +2,18 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/content_browser_client.h"
|
||||
#include "libcef/browser/alloy/alloy_content_browser_client.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <utility>
|
||||
|
||||
#include "include/cef_version.h"
|
||||
#include "libcef/browser/alloy/alloy_browser_context.h"
|
||||
#include "libcef/browser/alloy/alloy_browser_main.h"
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/browser_host_impl.h"
|
||||
#include "libcef/browser/browser_info.h"
|
||||
#include "libcef/browser/browser_info_manager.h"
|
||||
#include "libcef/browser/browser_main.h"
|
||||
#include "libcef/browser/browser_message_filter.h"
|
||||
#include "libcef/browser/browser_platform_delegate.h"
|
||||
#include "libcef/browser/context.h"
|
||||
@@ -31,10 +32,11 @@
|
||||
#include "libcef/browser/ssl_info_impl.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
#include "libcef/browser/x509_certificate_impl.h"
|
||||
#include "libcef/common/alloy/alloy_content_client.h"
|
||||
#include "libcef/common/app_manager.h"
|
||||
#include "libcef/common/cef_messages.h"
|
||||
#include "libcef/common/cef_switches.h"
|
||||
#include "libcef/common/command_line_impl.h"
|
||||
#include "libcef/common/content_client.h"
|
||||
#include "libcef/common/extensions/extensions_util.h"
|
||||
#include "libcef/common/net/scheme_registration.h"
|
||||
#include "libcef/common/request_impl.h"
|
||||
@@ -50,6 +52,7 @@
|
||||
#include "cef/grit/cef_resources.h"
|
||||
#include "chrome/browser/browser_process.h"
|
||||
#include "chrome/browser/chrome_content_browser_client.h"
|
||||
#include "chrome/browser/content_settings/cookie_settings_factory.h"
|
||||
#include "chrome/browser/net/system_network_context_manager.h"
|
||||
#include "chrome/browser/plugins/plugin_info_host_impl.h"
|
||||
#include "chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h"
|
||||
@@ -59,6 +62,7 @@
|
||||
#include "chrome/browser/profiles/renderer_updater_factory.h"
|
||||
#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
|
||||
#include "chrome/browser/spellchecker/spell_check_host_chrome_impl.h"
|
||||
#include "chrome/common/chrome_content_client.h"
|
||||
#include "chrome/common/chrome_paths.h"
|
||||
#include "chrome/common/chrome_switches.h"
|
||||
#include "chrome/common/google_url_loader_throttle.h"
|
||||
@@ -67,6 +71,7 @@
|
||||
#include "chrome/grit/browser_resources.h"
|
||||
#include "chrome/grit/generated_resources.h"
|
||||
#include "chrome/services/printing/printing_service.h"
|
||||
#include "components/content_settings/core/browser/cookie_settings.h"
|
||||
#include "components/navigation_interception/intercept_navigation_throttle.h"
|
||||
#include "components/navigation_interception/navigation_params.h"
|
||||
#include "components/spellcheck/common/spellcheck.mojom.h"
|
||||
@@ -386,7 +391,7 @@ breakpad::CrashHandlerHostLinux* CreateCrashHandlerHost(
|
||||
{
|
||||
ANNOTATE_SCOPED_MEMORY_LEAK;
|
||||
// Uploads will only occur if a non-empty crash URL is specified in
|
||||
// CefMainDelegate::InitCrashReporter.
|
||||
// AlloyMainDelegate::InitCrashReporter.
|
||||
breakpad::CrashHandlerHostLinux* crash_handler =
|
||||
new breakpad::CrashHandlerHostLinux(process_type, dumps_path,
|
||||
true /* upload */);
|
||||
@@ -448,10 +453,21 @@ bool NavigationOnUIThread(
|
||||
const navigation_interception::NavigationParams& params) {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
content::OpenURLParams open_params(
|
||||
params.url(), params.referrer(), WindowOpenDisposition::CURRENT_TAB,
|
||||
params.transition_type(), params.is_renderer_initiated());
|
||||
open_params.user_gesture = params.has_user_gesture();
|
||||
open_params.initiator_origin = params.initiator_origin();
|
||||
|
||||
CefRefPtr<CefBrowserHostImpl> browser;
|
||||
if (!CefBrowserInfoManager::GetInstance()->MaybeAllowNavigation(
|
||||
source->GetMainFrame(), open_params, browser)) {
|
||||
// Cancel the navigation.
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ignore_navigation = false;
|
||||
|
||||
CefRefPtr<CefBrowserHostImpl> browser =
|
||||
CefBrowserHostImpl::GetBrowserForContents(source);
|
||||
if (browser.get()) {
|
||||
CefRefPtr<CefClient> client = browser->GetClient();
|
||||
if (client.get()) {
|
||||
@@ -533,31 +549,22 @@ void PopulateChromeFrameBinders(
|
||||
|
||||
} // namespace
|
||||
|
||||
CefContentBrowserClient::CefContentBrowserClient()
|
||||
: browser_main_parts_(nullptr) {
|
||||
AlloyContentBrowserClient::AlloyContentBrowserClient() {
|
||||
plugin_service_filter_.reset(new CefPluginServiceFilter);
|
||||
content::PluginServiceImpl::GetInstance()->SetFilter(
|
||||
plugin_service_filter_.get());
|
||||
}
|
||||
|
||||
CefContentBrowserClient::~CefContentBrowserClient() {}
|
||||
|
||||
// static
|
||||
CefContentBrowserClient* CefContentBrowserClient::Get() {
|
||||
if (!CefContentClient::Get())
|
||||
return nullptr;
|
||||
return static_cast<CefContentBrowserClient*>(
|
||||
CefContentClient::Get()->browser());
|
||||
}
|
||||
AlloyContentBrowserClient::~AlloyContentBrowserClient() {}
|
||||
|
||||
std::unique_ptr<content::BrowserMainParts>
|
||||
CefContentBrowserClient::CreateBrowserMainParts(
|
||||
AlloyContentBrowserClient::CreateBrowserMainParts(
|
||||
const content::MainFunctionParams& parameters) {
|
||||
browser_main_parts_ = new CefBrowserMainParts(parameters);
|
||||
browser_main_parts_ = new AlloyBrowserMainParts(parameters);
|
||||
return base::WrapUnique(browser_main_parts_);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::RenderProcessWillLaunch(
|
||||
void AlloyContentBrowserClient::RenderProcessWillLaunch(
|
||||
content::RenderProcessHost* host) {
|
||||
const int id = host->GetID();
|
||||
Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext());
|
||||
@@ -583,7 +590,7 @@ void CefContentBrowserClient::RenderProcessWillLaunch(
|
||||
->InitializeRenderer(host);
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::ShouldUseProcessPerSite(
|
||||
bool AlloyContentBrowserClient::ShouldUseProcessPerSite(
|
||||
content::BrowserContext* browser_context,
|
||||
const GURL& effective_url) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
@@ -612,7 +619,7 @@ bool CefContentBrowserClient::ShouldUseProcessPerSite(
|
||||
|
||||
// Based on
|
||||
// ChromeContentBrowserClientExtensionsPart::DoesSiteRequireDedicatedProcess.
|
||||
bool CefContentBrowserClient::DoesSiteRequireDedicatedProcess(
|
||||
bool AlloyContentBrowserClient::DoesSiteRequireDedicatedProcess(
|
||||
content::BrowserContext* browser_context,
|
||||
const GURL& effective_site_url) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
@@ -626,7 +633,7 @@ bool CefContentBrowserClient::DoesSiteRequireDedicatedProcess(
|
||||
return extension != nullptr;
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::OverrideURLLoaderFactoryParams(
|
||||
void AlloyContentBrowserClient::OverrideURLLoaderFactoryParams(
|
||||
content::BrowserContext* browser_context,
|
||||
const url::Origin& origin,
|
||||
bool is_for_isolated_world,
|
||||
@@ -637,21 +644,21 @@ void CefContentBrowserClient::OverrideURLLoaderFactoryParams(
|
||||
}
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::GetAdditionalWebUISchemes(
|
||||
void AlloyContentBrowserClient::GetAdditionalWebUISchemes(
|
||||
std::vector<std::string>* additional_schemes) {
|
||||
// Any schemes listed here are treated as WebUI schemes but do not get WebUI
|
||||
// bindings. Also, view-source is allowed for these schemes. WebUI schemes
|
||||
// will not be passed to HandleExternalProtocol.
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::GetAdditionalViewSourceSchemes(
|
||||
void AlloyContentBrowserClient::GetAdditionalViewSourceSchemes(
|
||||
std::vector<std::string>* additional_schemes) {
|
||||
GetAdditionalWebUISchemes(additional_schemes);
|
||||
|
||||
additional_schemes->push_back(extensions::kExtensionScheme);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
|
||||
void AlloyContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
|
||||
std::vector<std::string>* additional_allowed_schemes) {
|
||||
ContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
|
||||
additional_allowed_schemes);
|
||||
@@ -659,12 +666,12 @@ void CefContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
|
||||
additional_allowed_schemes->push_back(content::kChromeUIScheme);
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::IsWebUIAllowedToMakeNetworkRequests(
|
||||
bool AlloyContentBrowserClient::IsWebUIAllowedToMakeNetworkRequests(
|
||||
const url::Origin& origin) {
|
||||
return scheme::IsWebUIAllowedToMakeNetworkRequests(origin);
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::IsHandledURL(const GURL& url) {
|
||||
bool AlloyContentBrowserClient::IsHandledURL(const GURL& url) {
|
||||
if (!url.is_valid())
|
||||
return false;
|
||||
const std::string& scheme = url.scheme();
|
||||
@@ -673,10 +680,10 @@ bool CefContentBrowserClient::IsHandledURL(const GURL& url) {
|
||||
if (scheme::IsInternalHandledScheme(scheme))
|
||||
return true;
|
||||
|
||||
return CefContentClient::Get()->HasCustomScheme(scheme);
|
||||
return CefAppManager::Get()->HasCustomScheme(scheme);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::SiteInstanceGotProcess(
|
||||
void AlloyContentBrowserClient::SiteInstanceGotProcess(
|
||||
content::SiteInstance* site_instance) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
return;
|
||||
@@ -686,8 +693,8 @@ void CefContentBrowserClient::SiteInstanceGotProcess(
|
||||
if (!extension)
|
||||
return;
|
||||
|
||||
CefBrowserContext* browser_context =
|
||||
static_cast<CefBrowserContext*>(site_instance->GetBrowserContext());
|
||||
auto browser_context =
|
||||
static_cast<AlloyBrowserContext*>(site_instance->GetBrowserContext());
|
||||
|
||||
extensions::ProcessMap::Get(browser_context)
|
||||
->Insert(extension->id(), site_instance->GetProcess()->GetID(),
|
||||
@@ -700,7 +707,7 @@ void CefContentBrowserClient::SiteInstanceGotProcess(
|
||||
site_instance->GetId()));
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::SiteInstanceDeleting(
|
||||
void AlloyContentBrowserClient::SiteInstanceDeleting(
|
||||
content::SiteInstance* site_instance) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
return;
|
||||
@@ -718,8 +725,8 @@ void CefContentBrowserClient::SiteInstanceDeleting(
|
||||
if (!extension)
|
||||
return;
|
||||
|
||||
CefBrowserContext* browser_context =
|
||||
static_cast<CefBrowserContext*>(site_instance->GetBrowserContext());
|
||||
auto browser_context =
|
||||
static_cast<AlloyBrowserContext*>(site_instance->GetBrowserContext());
|
||||
|
||||
extensions::ProcessMap::Get(browser_context)
|
||||
->Remove(extension->id(), site_instance->GetProcess()->GetID(),
|
||||
@@ -732,7 +739,7 @@ void CefContentBrowserClient::SiteInstanceDeleting(
|
||||
site_instance->GetId()));
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::BindHostReceiverForRenderer(
|
||||
void AlloyContentBrowserClient::BindHostReceiverForRenderer(
|
||||
content::RenderProcessHost* render_process_host,
|
||||
mojo::GenericPendingReceiver receiver) {
|
||||
if (auto host_receiver = receiver.As<spellcheck::mojom::SpellCheckHost>()) {
|
||||
@@ -752,7 +759,7 @@ void CefContentBrowserClient::BindHostReceiverForRenderer(
|
||||
}
|
||||
|
||||
base::Optional<service_manager::Manifest>
|
||||
CefContentBrowserClient::GetServiceManifestOverlay(base::StringPiece name) {
|
||||
AlloyContentBrowserClient::GetServiceManifestOverlay(base::StringPiece name) {
|
||||
if (name == content::mojom::kBrowserServiceName) {
|
||||
return GetCefContentBrowserOverlayManifest();
|
||||
}
|
||||
@@ -760,7 +767,7 @@ CefContentBrowserClient::GetServiceManifestOverlay(base::StringPiece name) {
|
||||
return base::nullopt;
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::AppendExtraCommandLineSwitches(
|
||||
void AlloyContentBrowserClient::AppendExtraCommandLineSwitches(
|
||||
base::CommandLine* command_line,
|
||||
int child_process_id) {
|
||||
const base::CommandLine* browser_cmd = base::CommandLine::ForCurrentProcess();
|
||||
@@ -811,18 +818,19 @@ void CefContentBrowserClient::AppendExtraCommandLineSwitches(
|
||||
if (extensions::ExtensionsEnabled()) {
|
||||
content::RenderProcessHost* process =
|
||||
content::RenderProcessHost::FromID(child_process_id);
|
||||
CefBrowserContext* context =
|
||||
process
|
||||
? CefBrowserContext::GetForContext(process->GetBrowserContext())
|
||||
: nullptr;
|
||||
if (context) {
|
||||
if (context->IsPrintPreviewSupported()) {
|
||||
auto browser_context = process->GetBrowserContext();
|
||||
CefBrowserContext* cef_browser_context =
|
||||
process ? CefBrowserContext::FromBrowserContext(browser_context)
|
||||
: nullptr;
|
||||
if (cef_browser_context) {
|
||||
if (cef_browser_context->IsPrintPreviewSupported()) {
|
||||
command_line->AppendSwitch(switches::kEnablePrintPreview);
|
||||
}
|
||||
|
||||
// Based on ChromeContentBrowserClientExtensionsPart::
|
||||
// AppendExtraRendererCommandLineSwitches
|
||||
if (extensions::ProcessMap::Get(context)->Contains(process->GetID())) {
|
||||
if (extensions::ProcessMap::Get(browser_context)
|
||||
->Contains(process->GetID())) {
|
||||
command_line->AppendSwitch(extensions::switches::kExtensionProcess);
|
||||
}
|
||||
}
|
||||
@@ -868,7 +876,7 @@ void CefContentBrowserClient::AppendExtraCommandLineSwitches(
|
||||
}
|
||||
#endif // defined(OS_LINUX)
|
||||
|
||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||
CefRefPtr<CefApp> app = CefAppManager::Get()->GetApplication();
|
||||
if (app.get()) {
|
||||
CefRefPtr<CefBrowserProcessHandler> handler =
|
||||
app->GetBrowserProcessHandler();
|
||||
@@ -881,12 +889,12 @@ void CefContentBrowserClient::AppendExtraCommandLineSwitches(
|
||||
}
|
||||
}
|
||||
|
||||
std::string CefContentBrowserClient::GetApplicationLocale() {
|
||||
std::string AlloyContentBrowserClient::GetApplicationLocale() {
|
||||
return g_browser_process->GetApplicationLocale();
|
||||
}
|
||||
|
||||
scoped_refptr<network::SharedURLLoaderFactory>
|
||||
CefContentBrowserClient::GetSystemSharedURLLoaderFactory() {
|
||||
AlloyContentBrowserClient::GetSystemSharedURLLoaderFactory() {
|
||||
DCHECK(
|
||||
content::BrowserThread::CurrentlyOn(content::BrowserThread::UI) ||
|
||||
!content::BrowserThread::IsThreadInitialized(content::BrowserThread::UI));
|
||||
@@ -899,23 +907,23 @@ CefContentBrowserClient::GetSystemSharedURLLoaderFactory() {
|
||||
}
|
||||
|
||||
network::mojom::NetworkContext*
|
||||
CefContentBrowserClient::GetSystemNetworkContext() {
|
||||
AlloyContentBrowserClient::GetSystemNetworkContext() {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
DCHECK(SystemNetworkContextManager::GetInstance());
|
||||
return SystemNetworkContextManager::GetInstance()->GetContext();
|
||||
}
|
||||
|
||||
scoped_refptr<content::QuotaPermissionContext>
|
||||
CefContentBrowserClient::CreateQuotaPermissionContext() {
|
||||
AlloyContentBrowserClient::CreateQuotaPermissionContext() {
|
||||
return new CefQuotaPermissionContext();
|
||||
}
|
||||
|
||||
content::MediaObserver* CefContentBrowserClient::GetMediaObserver() {
|
||||
content::MediaObserver* AlloyContentBrowserClient::GetMediaObserver() {
|
||||
return CefMediaCaptureDevicesDispatcher::GetInstance();
|
||||
}
|
||||
|
||||
content::SpeechRecognitionManagerDelegate*
|
||||
CefContentBrowserClient::CreateSpeechRecognitionManagerDelegate() {
|
||||
AlloyContentBrowserClient::CreateSpeechRecognitionManagerDelegate() {
|
||||
const base::CommandLine* command_line =
|
||||
base::CommandLine::ForCurrentProcess();
|
||||
if (command_line->HasSwitch(switches::kEnableSpeechInput))
|
||||
@@ -925,7 +933,7 @@ CefContentBrowserClient::CreateSpeechRecognitionManagerDelegate() {
|
||||
}
|
||||
|
||||
content::GeneratedCodeCacheSettings
|
||||
CefContentBrowserClient::GetGeneratedCodeCacheSettings(
|
||||
AlloyContentBrowserClient::GetGeneratedCodeCacheSettings(
|
||||
content::BrowserContext* context) {
|
||||
// If we pass 0 for size, disk_cache will pick a default size using the
|
||||
// heuristics based on available disk size. These are implemented in
|
||||
@@ -935,7 +943,7 @@ CefContentBrowserClient::GetGeneratedCodeCacheSettings(
|
||||
0 /* size */, cache_path);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::AllowCertificateError(
|
||||
void AlloyContentBrowserClient::AllowCertificateError(
|
||||
content::WebContents* web_contents,
|
||||
int cert_error,
|
||||
const net::SSLInfo& ssl_info,
|
||||
@@ -981,7 +989,7 @@ void CefContentBrowserClient::AllowCertificateError(
|
||||
}
|
||||
}
|
||||
|
||||
base::OnceClosure CefContentBrowserClient::SelectClientCertificate(
|
||||
base::OnceClosure AlloyContentBrowserClient::SelectClientCertificate(
|
||||
content::WebContents* web_contents,
|
||||
net::SSLCertRequestInfo* cert_request_info,
|
||||
net::ClientCertIdentityList client_certs,
|
||||
@@ -1022,7 +1030,7 @@ base::OnceClosure CefContentBrowserClient::SelectClientCertificate(
|
||||
return base::OnceClosure();
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::CanCreateWindow(
|
||||
bool AlloyContentBrowserClient::CanCreateWindow(
|
||||
content::RenderFrameHost* opener,
|
||||
const GURL& opener_url,
|
||||
const GURL& opener_top_level_frame_url,
|
||||
@@ -1044,7 +1052,7 @@ bool CefContentBrowserClient::CanCreateWindow(
|
||||
user_gesture, opener_suppressed, no_javascript_access);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::OverrideWebkitPrefs(
|
||||
void AlloyContentBrowserClient::OverrideWebkitPrefs(
|
||||
content::RenderViewHost* rvh,
|
||||
content::WebPreferences* prefs) {
|
||||
// Using RVH instead of RFH here because rvh->GetMainFrame() may be nullptr
|
||||
@@ -1057,16 +1065,16 @@ void CefContentBrowserClient::OverrideWebkitPrefs(
|
||||
}
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::BrowserURLHandlerCreated(
|
||||
void AlloyContentBrowserClient::BrowserURLHandlerCreated(
|
||||
content::BrowserURLHandler* handler) {
|
||||
scheme::BrowserURLHandlerCreated(handler);
|
||||
}
|
||||
|
||||
std::string CefContentBrowserClient::GetDefaultDownloadName() {
|
||||
std::string AlloyContentBrowserClient::GetDefaultDownloadName() {
|
||||
return "download";
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::DidCreatePpapiPlugin(
|
||||
void AlloyContentBrowserClient::DidCreatePpapiPlugin(
|
||||
content::BrowserPpapiHost* browser_host) {
|
||||
browser_host->GetPpapiHost()->AddHostFactoryFilter(
|
||||
std::unique_ptr<ppapi::host::HostFactory>(
|
||||
@@ -1074,12 +1082,12 @@ void CefContentBrowserClient::DidCreatePpapiPlugin(
|
||||
}
|
||||
|
||||
content::DevToolsManagerDelegate*
|
||||
CefContentBrowserClient::GetDevToolsManagerDelegate() {
|
||||
AlloyContentBrowserClient::GetDevToolsManagerDelegate() {
|
||||
return new CefDevToolsManagerDelegate();
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<content::NavigationThrottle>>
|
||||
CefContentBrowserClient::CreateThrottlesForNavigation(
|
||||
AlloyContentBrowserClient::CreateThrottlesForNavigation(
|
||||
content::NavigationHandle* navigation_handle) {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
@@ -1112,7 +1120,7 @@ CefContentBrowserClient::CreateThrottlesForNavigation(
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
|
||||
CefContentBrowserClient::CreateURLLoaderThrottles(
|
||||
AlloyContentBrowserClient::CreateURLLoaderThrottles(
|
||||
const network::ResourceRequest& request,
|
||||
content::BrowserContext* browser_context,
|
||||
const base::RepeatingCallback<content::WebContents*()>& wc_getter,
|
||||
@@ -1137,7 +1145,7 @@ CefContentBrowserClient::CreateURLLoaderThrottles(
|
||||
}
|
||||
|
||||
#if defined(OS_LINUX)
|
||||
void CefContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
|
||||
void AlloyContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
|
||||
const base::CommandLine& command_line,
|
||||
int child_process_id,
|
||||
content::PosixFileDescriptorInfo* mappings) {
|
||||
@@ -1149,29 +1157,13 @@ void CefContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
|
||||
#endif // defined(OS_LINUX)
|
||||
|
||||
#if defined(OS_WIN)
|
||||
const wchar_t* CefContentBrowserClient::GetResourceDllName() {
|
||||
static wchar_t file_path[MAX_PATH + 1] = {0};
|
||||
|
||||
if (file_path[0] == 0) {
|
||||
// Retrieve the module path (usually libcef.dll).
|
||||
base::FilePath module;
|
||||
base::PathService::Get(base::FILE_MODULE, &module);
|
||||
const std::wstring wstr = module.value();
|
||||
size_t count = std::min(static_cast<size_t>(MAX_PATH), wstr.size());
|
||||
wcsncpy(file_path, wstr.c_str(), count);
|
||||
file_path[count] = 0;
|
||||
}
|
||||
|
||||
return file_path;
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy,
|
||||
RendererSpawnFlags flags) {
|
||||
bool AlloyContentBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy,
|
||||
RendererSpawnFlags flags) {
|
||||
return true;
|
||||
}
|
||||
#endif // defined(OS_WIN)
|
||||
|
||||
void CefContentBrowserClient::ExposeInterfacesToRenderer(
|
||||
void AlloyContentBrowserClient::ExposeInterfacesToRenderer(
|
||||
service_manager::BinderRegistry* registry,
|
||||
blink::AssociatedInterfaceRegistry* associated_registry,
|
||||
content::RenderProcessHost* host) {
|
||||
@@ -1180,7 +1172,7 @@ void CefContentBrowserClient::ExposeInterfacesToRenderer(
|
||||
}
|
||||
|
||||
std::unique_ptr<net::ClientCertStore>
|
||||
CefContentBrowserClient::CreateClientCertStore(
|
||||
AlloyContentBrowserClient::CreateClientCertStore(
|
||||
content::BrowserContext* browser_context) {
|
||||
// Match the logic in ProfileNetworkContextService::CreateClientCertStore.
|
||||
#if defined(USE_NSS_CERTS)
|
||||
@@ -1197,7 +1189,7 @@ CefContentBrowserClient::CreateClientCertStore(
|
||||
}
|
||||
|
||||
std::unique_ptr<content::LoginDelegate>
|
||||
CefContentBrowserClient::CreateLoginDelegate(
|
||||
AlloyContentBrowserClient::CreateLoginDelegate(
|
||||
const net::AuthChallengeInfo& auth_info,
|
||||
content::WebContents* web_contents,
|
||||
const content::GlobalRequestID& request_id,
|
||||
@@ -1211,7 +1203,7 @@ CefContentBrowserClient::CreateLoginDelegate(
|
||||
std::move(auth_required_callback));
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
|
||||
void AlloyContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
|
||||
int frame_tree_node_id,
|
||||
NonNetworkURLLoaderFactoryMap* factories) {
|
||||
if (!extensions::ExtensionsEnabled())
|
||||
@@ -1226,7 +1218,7 @@ void CefContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
|
||||
!!extensions::WebViewGuest::FromWebContents(web_contents)));
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories(
|
||||
void AlloyContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories(
|
||||
int render_process_id,
|
||||
int render_frame_id,
|
||||
NonNetworkURLLoaderFactoryMap* factories) {
|
||||
@@ -1265,6 +1257,7 @@ void CefContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories(
|
||||
extensions::Manifest::IsComponentLocation(extension->location())) {
|
||||
// Components of chrome that are implemented as extensions or platform apps
|
||||
// are allowed to use chrome://resources/ and chrome://theme/ URLs.
|
||||
// See also HasCrossOriginWhitelistEntry.
|
||||
allowed_webui_hosts.emplace_back(content::kChromeUIResourcesHost);
|
||||
allowed_webui_hosts.emplace_back(chrome::kChromeUIThemeHost);
|
||||
}
|
||||
@@ -1276,7 +1269,7 @@ void CefContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories(
|
||||
}
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::WillCreateURLLoaderFactory(
|
||||
bool AlloyContentBrowserClient::WillCreateURLLoaderFactory(
|
||||
content::BrowserContext* browser_context,
|
||||
content::RenderFrameHost* frame,
|
||||
int render_process_id,
|
||||
@@ -1300,7 +1293,7 @@ bool CefContentBrowserClient::WillCreateURLLoaderFactory(
|
||||
return true;
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::OnNetworkServiceCreated(
|
||||
void AlloyContentBrowserClient::OnNetworkServiceCreated(
|
||||
network::mojom::NetworkService* network_service) {
|
||||
DCHECK(g_browser_process);
|
||||
PrefService* local_state = g_browser_process->local_state();
|
||||
@@ -1312,12 +1305,21 @@ void CefContentBrowserClient::OnNetworkServiceCreated(
|
||||
network_service);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::ConfigureNetworkContextParams(
|
||||
void AlloyContentBrowserClient::ConfigureNetworkContextParams(
|
||||
content::BrowserContext* context,
|
||||
bool in_memory,
|
||||
const base::FilePath& relative_partition_path,
|
||||
network::mojom::NetworkContextParams* network_context_params,
|
||||
network::mojom::CertVerifierCreationParams* cert_verifier_creation_params) {
|
||||
// This method may be called during shutdown when using multi-threaded
|
||||
// message loop mode. In that case exit early to avoid crashes.
|
||||
if (!SystemNetworkContextManager::GetInstance()) {
|
||||
// This must match the value expected in
|
||||
// StoragePartitionImpl::InitNetworkContext.
|
||||
network_context_params->context_name = "magic_shutting_down";
|
||||
return;
|
||||
}
|
||||
|
||||
Profile* profile = Profile::FromBrowserContext(context);
|
||||
profile->ConfigureNetworkContextParams(in_memory, relative_partition_path,
|
||||
network_context_params,
|
||||
@@ -1330,7 +1332,7 @@ void CefContentBrowserClient::ConfigureNetworkContextParams(
|
||||
// The sandbox may block read/write access from the NetworkService to
|
||||
// directories that are not returned by this method.
|
||||
std::vector<base::FilePath>
|
||||
CefContentBrowserClient::GetNetworkContextsParentDirectory() {
|
||||
AlloyContentBrowserClient::GetNetworkContextsParentDirectory() {
|
||||
base::FilePath user_data_path;
|
||||
base::PathService::Get(chrome::DIR_USER_DATA, &user_data_path);
|
||||
DCHECK(!user_data_path.empty());
|
||||
@@ -1346,7 +1348,7 @@ CefContentBrowserClient::GetNetworkContextsParentDirectory() {
|
||||
return {user_data_path, root_cache_path};
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::HandleExternalProtocol(
|
||||
bool AlloyContentBrowserClient::HandleExternalProtocol(
|
||||
const GURL& url,
|
||||
base::OnceCallback<content::WebContents*()> web_contents_getter,
|
||||
int child_id,
|
||||
@@ -1360,7 +1362,7 @@ bool CefContentBrowserClient::HandleExternalProtocol(
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CefContentBrowserClient::HandleExternalProtocol(
|
||||
bool AlloyContentBrowserClient::HandleExternalProtocol(
|
||||
content::WebContents::Getter web_contents_getter,
|
||||
int frame_tree_node_id,
|
||||
content::NavigationUIData* navigation_data,
|
||||
@@ -1398,7 +1400,7 @@ bool CefContentBrowserClient::HandleExternalProtocol(
|
||||
}
|
||||
|
||||
std::unique_ptr<content::OverlayWindow>
|
||||
CefContentBrowserClient::CreateWindowForPictureInPicture(
|
||||
AlloyContentBrowserClient::CreateWindowForPictureInPicture(
|
||||
content::PictureInPictureWindowController* controller) {
|
||||
// Note: content::OverlayWindow::Create() is defined by platform-specific
|
||||
// implementation in chrome/browser/ui/views. This layering hack, which goes
|
||||
@@ -1409,7 +1411,7 @@ CefContentBrowserClient::CreateWindowForPictureInPicture(
|
||||
return content::OverlayWindow::Create(controller);
|
||||
}
|
||||
|
||||
void CefContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
|
||||
void AlloyContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
|
||||
content::RenderFrameHost* render_frame_host,
|
||||
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) {
|
||||
PopulateChromeFrameBinders(map);
|
||||
@@ -1439,25 +1441,25 @@ void CefContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
|
||||
}
|
||||
|
||||
base::FilePath
|
||||
CefContentBrowserClient::GetSandboxedStorageServiceDataDirectory() {
|
||||
AlloyContentBrowserClient::GetSandboxedStorageServiceDataDirectory() {
|
||||
return GetRootCachePath();
|
||||
}
|
||||
|
||||
std::string CefContentBrowserClient::GetProduct() {
|
||||
std::string AlloyContentBrowserClient::GetProduct() {
|
||||
// Match the logic in chrome_content_browser_client.cc GetProduct().
|
||||
return ::GetProduct();
|
||||
}
|
||||
|
||||
std::string CefContentBrowserClient::GetChromeProduct() {
|
||||
std::string AlloyContentBrowserClient::GetChromeProduct() {
|
||||
return version_info::GetProductNameAndVersionForUserAgent();
|
||||
}
|
||||
|
||||
std::string CefContentBrowserClient::GetUserAgent() {
|
||||
std::string AlloyContentBrowserClient::GetUserAgent() {
|
||||
// Match the logic in chrome_content_browser_client.cc GetUserAgent().
|
||||
return ::GetUserAgent();
|
||||
}
|
||||
|
||||
blink::UserAgentMetadata CefContentBrowserClient::GetUserAgentMetadata() {
|
||||
blink::UserAgentMetadata AlloyContentBrowserClient::GetUserAgentMetadata() {
|
||||
blink::UserAgentMetadata metadata;
|
||||
|
||||
metadata.brand_version_list = {blink::UserAgentBrandVersion{
|
||||
@@ -1473,7 +1475,7 @@ blink::UserAgentMetadata CefContentBrowserClient::GetUserAgentMetadata() {
|
||||
}
|
||||
|
||||
base::flat_set<std::string>
|
||||
CefContentBrowserClient::GetPluginMimeTypesWithExternalHandlers(
|
||||
AlloyContentBrowserClient::GetPluginMimeTypesWithExternalHandlers(
|
||||
content::BrowserContext* browser_context) {
|
||||
base::flat_set<std::string> mime_types;
|
||||
auto map = PluginUtils::GetMimeTypeToExtensionIdMap(browser_context);
|
||||
@@ -1482,31 +1484,67 @@ CefContentBrowserClient::GetPluginMimeTypesWithExternalHandlers(
|
||||
return mime_types;
|
||||
}
|
||||
|
||||
CefRefPtr<CefRequestContextImpl> CefContentBrowserClient::request_context()
|
||||
bool AlloyContentBrowserClient::ArePersistentMediaDeviceIDsAllowed(
|
||||
content::BrowserContext* browser_context,
|
||||
const GURL& url,
|
||||
const GURL& site_for_cookies,
|
||||
const base::Optional<url::Origin>& top_frame_origin) {
|
||||
// Persistent MediaDevice IDs are allowed if cookies are allowed.
|
||||
return CookieSettingsFactory::GetForProfile(
|
||||
Profile::FromBrowserContext(browser_context))
|
||||
->IsCookieAccessAllowed(url, site_for_cookies, top_frame_origin);
|
||||
}
|
||||
|
||||
bool AlloyContentBrowserClient::ShouldAllowPluginCreation(
|
||||
const url::Origin& embedder_origin,
|
||||
const content::PepperPluginInfo& plugin_info) {
|
||||
if (plugin_info.name == ChromeContentClient::kPDFInternalPluginName) {
|
||||
// Allow embedding the internal PDF plugin in the built-in PDF extension.
|
||||
if (embedder_origin.scheme() == extensions::kExtensionScheme &&
|
||||
embedder_origin.host() == extension_misc::kPdfExtensionId) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Allow embedding the internal PDF plugin in chrome://print.
|
||||
if (embedder_origin ==
|
||||
url::Origin::Create(GURL(chrome::kChromeUIPrintURL))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Only allow the PDF plugin in the known, trustworthy origins that are
|
||||
// allowlisted above. See also https://crbug.com/520422 and
|
||||
// https://crbug.com/1027173.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CefRefPtr<CefRequestContextImpl> AlloyContentBrowserClient::request_context()
|
||||
const {
|
||||
return browser_main_parts_->request_context();
|
||||
}
|
||||
|
||||
CefDevToolsDelegate* CefContentBrowserClient::devtools_delegate() const {
|
||||
CefDevToolsDelegate* AlloyContentBrowserClient::devtools_delegate() const {
|
||||
return browser_main_parts_->devtools_delegate();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner>
|
||||
CefContentBrowserClient::background_task_runner() const {
|
||||
AlloyContentBrowserClient::background_task_runner() const {
|
||||
return browser_main_parts_->background_task_runner();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner>
|
||||
CefContentBrowserClient::user_visible_task_runner() const {
|
||||
AlloyContentBrowserClient::user_visible_task_runner() const {
|
||||
return browser_main_parts_->user_visible_task_runner();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner>
|
||||
CefContentBrowserClient::user_blocking_task_runner() const {
|
||||
AlloyContentBrowserClient::user_blocking_task_runner() const {
|
||||
return browser_main_parts_->user_blocking_task_runner();
|
||||
}
|
||||
|
||||
const extensions::Extension* CefContentBrowserClient::GetExtension(
|
||||
const extensions::Extension* AlloyContentBrowserClient::GetExtension(
|
||||
content::SiteInstance* site_instance) {
|
||||
extensions::ExtensionRegistry* registry =
|
||||
extensions::ExtensionRegistry::Get(site_instance->GetBrowserContext());
|
@@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CONTENT_BROWSER_CLIENT_H_
|
||||
#define CEF_LIBCEF_BROWSER_CONTENT_BROWSER_CLIENT_H_
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_ALLOY_CONTENT_BROWSER_CLIENT_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_ALLOY_CONTENT_BROWSER_CLIENT_H_
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
@@ -18,7 +18,7 @@
|
||||
#include "content/public/browser/content_browser_client.h"
|
||||
#include "third_party/skia/include/core/SkColor.h"
|
||||
|
||||
class CefBrowserMainParts;
|
||||
class AlloyBrowserMainParts;
|
||||
class CefDevToolsDelegate;
|
||||
|
||||
namespace content {
|
||||
@@ -30,13 +30,10 @@ namespace extensions {
|
||||
class Extension;
|
||||
}
|
||||
|
||||
class CefContentBrowserClient : public content::ContentBrowserClient {
|
||||
class AlloyContentBrowserClient : public content::ContentBrowserClient {
|
||||
public:
|
||||
CefContentBrowserClient();
|
||||
~CefContentBrowserClient() override;
|
||||
|
||||
// Returns the singleton CefContentBrowserClient instance.
|
||||
static CefContentBrowserClient* Get();
|
||||
AlloyContentBrowserClient();
|
||||
~AlloyContentBrowserClient() override;
|
||||
|
||||
// ContentBrowserClient implementation.
|
||||
std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
|
||||
@@ -131,7 +128,6 @@ class CefContentBrowserClient : public content::ContentBrowserClient {
|
||||
#endif
|
||||
|
||||
#if defined(OS_WIN)
|
||||
const wchar_t* GetResourceDllName();
|
||||
bool PreSpawnRenderer(sandbox::TargetPolicy* policy,
|
||||
RendererSpawnFlags flags) override;
|
||||
#endif
|
||||
@@ -211,6 +207,14 @@ class CefContentBrowserClient : public content::ContentBrowserClient {
|
||||
blink::UserAgentMetadata GetUserAgentMetadata() override;
|
||||
base::flat_set<std::string> GetPluginMimeTypesWithExternalHandlers(
|
||||
content::BrowserContext* browser_context) override;
|
||||
bool ArePersistentMediaDeviceIDsAllowed(
|
||||
content::BrowserContext* browser_context,
|
||||
const GURL& scope,
|
||||
const GURL& site_for_cookies,
|
||||
const base::Optional<url::Origin>& top_frame_origin) override;
|
||||
bool ShouldAllowPluginCreation(
|
||||
const url::Origin& embedder_origin,
|
||||
const content::PepperPluginInfo& plugin_info) override;
|
||||
|
||||
CefRefPtr<CefRequestContextImpl> request_context() const;
|
||||
CefDevToolsDelegate* devtools_delegate() const;
|
||||
@@ -224,9 +228,9 @@ class CefContentBrowserClient : public content::ContentBrowserClient {
|
||||
const extensions::Extension* GetExtension(
|
||||
content::SiteInstance* site_instance);
|
||||
|
||||
CefBrowserMainParts* browser_main_parts_;
|
||||
AlloyBrowserMainParts* browser_main_parts_ = nullptr;
|
||||
|
||||
std::unique_ptr<content::PluginServiceFilter> plugin_service_filter_;
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CONTENT_BROWSER_CLIENT_H_
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_ALLOY_CONTENT_BROWSER_CLIENT_H_
|
436
libcef/browser/alloy/browser_platform_delegate_alloy.cc
Normal file
436
libcef/browser/alloy/browser_platform_delegate_alloy.cc
Normal file
@@ -0,0 +1,436 @@
|
||||
// Copyright 2015 The Chromium Embedded Framework Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/alloy/browser_platform_delegate_alloy.h"
|
||||
|
||||
#include "libcef/browser/browser_host_impl.h"
|
||||
#include "libcef/browser/extensions/browser_extensions_util.h"
|
||||
#include "libcef/browser/extensions/extension_background_host.h"
|
||||
#include "libcef/browser/extensions/extension_system.h"
|
||||
#include "libcef/browser/extensions/extension_view_host.h"
|
||||
#include "libcef/browser/extensions/extension_web_contents_observer.h"
|
||||
#include "libcef/browser/printing/print_view_manager.h"
|
||||
#include "libcef/common/extensions/extensions_util.h"
|
||||
|
||||
#include "base/logging.h"
|
||||
#include "chrome/browser/printing/print_view_manager.h"
|
||||
#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
|
||||
#include "components/zoom/zoom_controller.h"
|
||||
#include "content/browser/renderer_host/render_widget_host_impl.h"
|
||||
#include "content/browser/web_contents/web_contents_impl.h"
|
||||
#include "content/public/browser/render_view_host.h"
|
||||
#include "content/public/browser/render_widget_host.h"
|
||||
#include "extensions/browser/process_manager.h"
|
||||
#include "third_party/blink/public/mojom/frame/find_in_page.mojom.h"
|
||||
|
||||
CefBrowserPlatformDelegateAlloy::CefBrowserPlatformDelegateAlloy()
|
||||
: weak_ptr_factory_(this) {}
|
||||
|
||||
content::WebContents* CefBrowserPlatformDelegateAlloy::CreateWebContents(
|
||||
CefBrowserHostImpl::CreateParams& create_params,
|
||||
bool& own_web_contents) {
|
||||
// Get or create the request context and browser context.
|
||||
CefRefPtr<CefRequestContextImpl> request_context_impl =
|
||||
CefRequestContextImpl::GetOrCreateForRequestContext(
|
||||
create_params.request_context);
|
||||
CHECK(request_context_impl);
|
||||
auto cef_browser_context = request_context_impl->GetBrowserContext();
|
||||
CHECK(cef_browser_context);
|
||||
auto browser_context = cef_browser_context->AsBrowserContext();
|
||||
|
||||
if (!create_params.request_context) {
|
||||
// Using the global request context.
|
||||
create_params.request_context = request_context_impl.get();
|
||||
}
|
||||
|
||||
scoped_refptr<content::SiteInstance> site_instance;
|
||||
if (extensions::ExtensionsEnabled() && !create_params.url.is_empty()) {
|
||||
if (!create_params.extension) {
|
||||
// We might be loading an extension app view where the extension URL is
|
||||
// provided by the client.
|
||||
create_params.extension =
|
||||
extensions::GetExtensionForUrl(browser_context, create_params.url);
|
||||
}
|
||||
if (create_params.extension) {
|
||||
if (create_params.extension_host_type == extensions::VIEW_TYPE_INVALID) {
|
||||
// Default to dialog behavior.
|
||||
create_params.extension_host_type =
|
||||
extensions::VIEW_TYPE_EXTENSION_DIALOG;
|
||||
}
|
||||
|
||||
// Extension resources will fail to load if we don't use a SiteInstance
|
||||
// associated with the extension.
|
||||
// (AlloyContentBrowserClient::SiteInstanceGotProcess won't find the
|
||||
// extension to register with InfoMap, and AllowExtensionResourceLoad in
|
||||
// ExtensionProtocolHandler::MaybeCreateJob will return false resulting in
|
||||
// ERR_BLOCKED_BY_CLIENT).
|
||||
site_instance = extensions::ProcessManager::Get(browser_context)
|
||||
->GetSiteInstanceForURL(create_params.url);
|
||||
DCHECK(site_instance);
|
||||
}
|
||||
}
|
||||
|
||||
content::WebContents::CreateParams wc_create_params(browser_context,
|
||||
site_instance);
|
||||
|
||||
if (IsWindowless()) {
|
||||
// Create the OSR view for the WebContents.
|
||||
CreateViewForWebContents(&wc_create_params.view,
|
||||
&wc_create_params.delegate_view);
|
||||
}
|
||||
|
||||
auto web_contents = content::WebContents::Create(wc_create_params);
|
||||
CHECK(web_contents);
|
||||
|
||||
own_web_contents = true;
|
||||
return web_contents.release();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::WebContentsCreated(
|
||||
content::WebContents* web_contents,
|
||||
bool owned) {
|
||||
CefBrowserPlatformDelegate::WebContentsCreated(web_contents, owned);
|
||||
|
||||
if (owned) {
|
||||
SetOwnedWebContents(web_contents);
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::AddNewContents(
|
||||
content::WebContents* source,
|
||||
std::unique_ptr<content::WebContents> new_contents,
|
||||
const GURL& target_url,
|
||||
WindowOpenDisposition disposition,
|
||||
const gfx::Rect& initial_rect,
|
||||
bool user_gesture,
|
||||
bool* was_blocked) {
|
||||
CefRefPtr<CefBrowserHostImpl> owner =
|
||||
CefBrowserHostImpl::GetBrowserForContents(new_contents.get());
|
||||
if (owner) {
|
||||
// Taking ownership of |new_contents|.
|
||||
static_cast<CefBrowserPlatformDelegateAlloy*>(
|
||||
owner->platform_delegate_.get())
|
||||
->SetOwnedWebContents(new_contents.release());
|
||||
return;
|
||||
}
|
||||
|
||||
if (extension_host_) {
|
||||
extension_host_->AddNewContents(source, std::move(new_contents), target_url,
|
||||
disposition, initial_rect, user_gesture,
|
||||
was_blocked);
|
||||
}
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateAlloy::ShouldTransferNavigation(
|
||||
bool is_main_frame_navigation) {
|
||||
if (extension_host_) {
|
||||
return extension_host_->ShouldTransferNavigation(is_main_frame_navigation);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::RenderViewCreated(
|
||||
content::RenderViewHost* render_view_host) {
|
||||
// Indicate that the view has an external parent (namely us). This changes the
|
||||
// default view behavior in some cases (e.g. focus handling on Linux).
|
||||
if (!IsViewsHosted() && render_view_host->GetWidget()->GetView())
|
||||
render_view_host->GetWidget()->GetView()->SetHasExternalParent(true);
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::RenderViewReady() {
|
||||
ConfigureAutoResize();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::BrowserCreated(
|
||||
CefBrowserHostImpl* browser) {
|
||||
CefBrowserPlatformDelegate::BrowserCreated(browser);
|
||||
|
||||
web_contents_->SetDelegate(browser);
|
||||
|
||||
PrefsTabHelper::CreateForWebContents(web_contents_);
|
||||
printing::CefPrintViewManager::CreateForWebContents(web_contents_);
|
||||
|
||||
if (extensions::ExtensionsEnabled()) {
|
||||
extensions::CefExtensionWebContentsObserver::CreateForWebContents(
|
||||
web_contents_);
|
||||
|
||||
// Used by the tabs extension API.
|
||||
zoom::ZoomController::CreateForWebContents(web_contents_);
|
||||
}
|
||||
|
||||
if (IsPrintPreviewSupported()) {
|
||||
web_contents_dialog_helper_.reset(
|
||||
new CefWebContentsDialogHelper(web_contents_, this));
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::CreateExtensionHost(
|
||||
const extensions::Extension* extension,
|
||||
const GURL& url,
|
||||
extensions::ViewType host_type) {
|
||||
// Should get WebContentsCreated and BrowserCreated calls first.
|
||||
DCHECK(web_contents_);
|
||||
DCHECK(browser_);
|
||||
DCHECK(!extension_host_);
|
||||
|
||||
if (host_type == extensions::VIEW_TYPE_EXTENSION_DIALOG ||
|
||||
host_type == extensions::VIEW_TYPE_EXTENSION_POPUP) {
|
||||
// Create an extension host that we own.
|
||||
extension_host_ = new extensions::CefExtensionViewHost(
|
||||
browser_, extension, web_contents_, url, host_type);
|
||||
// Trigger load of the extension URL.
|
||||
extension_host_->CreateRenderViewSoon();
|
||||
} else if (host_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
|
||||
is_background_host_ = true;
|
||||
browser_->is_background_host_ = true;
|
||||
// Create an extension host that will be owned by ProcessManager.
|
||||
extension_host_ = new extensions::CefExtensionBackgroundHost(
|
||||
browser_,
|
||||
base::BindOnce(&CefBrowserPlatformDelegateAlloy::OnExtensionHostDeleted,
|
||||
weak_ptr_factory_.GetWeakPtr()),
|
||||
extension, web_contents_, url, host_type);
|
||||
// Load will be triggered by ProcessManager::CreateBackgroundHost.
|
||||
} else {
|
||||
NOTREACHED() << " Unsupported extension host type: " << host_type;
|
||||
}
|
||||
}
|
||||
|
||||
extensions::ExtensionHost* CefBrowserPlatformDelegateAlloy::GetExtensionHost()
|
||||
const {
|
||||
return extension_host_;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::BrowserDestroyed(
|
||||
CefBrowserHostImpl* browser) {
|
||||
DestroyExtensionHost();
|
||||
owned_web_contents_.reset();
|
||||
|
||||
CefBrowserPlatformDelegate::BrowserDestroyed(browser);
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::SendCaptureLostEvent() {
|
||||
if (!web_contents_)
|
||||
return;
|
||||
content::RenderViewHost* host = web_contents_->GetRenderViewHost();
|
||||
if (!host)
|
||||
return;
|
||||
|
||||
content::RenderWidgetHostImpl* widget =
|
||||
content::RenderWidgetHostImpl::From(host->GetWidget());
|
||||
if (widget)
|
||||
widget->LostCapture();
|
||||
}
|
||||
|
||||
#if defined(OS_WIN) || (defined(OS_POSIX) && !defined(OS_MACOSX))
|
||||
void CefBrowserPlatformDelegateAlloy::NotifyMoveOrResizeStarted() {
|
||||
if (!web_contents_)
|
||||
return;
|
||||
|
||||
// Dismiss any existing popups.
|
||||
content::RenderViewHost* host = web_contents_->GetRenderViewHost();
|
||||
if (host)
|
||||
host->NotifyMoveOrResizeStarted();
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CefBrowserPlatformDelegateAlloy::PreHandleGestureEvent(
|
||||
content::WebContents* source,
|
||||
const blink::WebGestureEvent& event) {
|
||||
if (extension_host_)
|
||||
return extension_host_->PreHandleGestureEvent(source, event);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateAlloy::IsNeverComposited(
|
||||
content::WebContents* web_contents) {
|
||||
if (extension_host_)
|
||||
return extension_host_->IsNeverComposited(web_contents);
|
||||
return false;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::SetAutoResizeEnabled(
|
||||
bool enabled,
|
||||
const CefSize& min_size,
|
||||
const CefSize& max_size) {
|
||||
if (enabled == auto_resize_enabled_)
|
||||
return;
|
||||
|
||||
auto_resize_enabled_ = enabled;
|
||||
if (enabled) {
|
||||
auto_resize_min_ = gfx::Size(min_size.width, min_size.height);
|
||||
auto_resize_max_ = gfx::Size(max_size.width, max_size.height);
|
||||
} else {
|
||||
auto_resize_min_ = auto_resize_max_ = gfx::Size();
|
||||
}
|
||||
ConfigureAutoResize();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::ConfigureAutoResize() {
|
||||
if (!web_contents_ || !web_contents_->GetRenderWidgetHostView()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (auto_resize_enabled_) {
|
||||
web_contents_->GetRenderWidgetHostView()->EnableAutoResize(
|
||||
auto_resize_min_, auto_resize_max_);
|
||||
} else {
|
||||
web_contents_->GetRenderWidgetHostView()->DisableAutoResize(gfx::Size());
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::SetAccessibilityState(
|
||||
cef_state_t accessibility_state) {
|
||||
// Do nothing if state is set to default. It'll be disabled by default and
|
||||
// controlled by the commmand-line flags "force-renderer-accessibility" and
|
||||
// "disable-renderer-accessibility".
|
||||
if (accessibility_state == STATE_DEFAULT)
|
||||
return;
|
||||
|
||||
content::WebContentsImpl* web_contents_impl =
|
||||
static_cast<content::WebContentsImpl*>(web_contents_);
|
||||
|
||||
if (!web_contents_impl)
|
||||
return;
|
||||
|
||||
ui::AXMode accMode;
|
||||
// In windowless mode set accessibility to TreeOnly mode. Else native
|
||||
// accessibility APIs, specific to each platform, are also created.
|
||||
if (accessibility_state == STATE_ENABLED) {
|
||||
accMode = IsWindowless() ? ui::kAXModeWebContentsOnly : ui::kAXModeComplete;
|
||||
}
|
||||
web_contents_impl->SetAccessibilityMode(accMode);
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateAlloy::IsPrintPreviewSupported() const {
|
||||
auto actionable_contents = GetActionableWebContents();
|
||||
if (!actionable_contents)
|
||||
return false;
|
||||
|
||||
auto cef_browser_context = CefBrowserContext::FromBrowserContext(
|
||||
actionable_contents->GetBrowserContext());
|
||||
if (!cef_browser_context->IsPrintPreviewSupported()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Print preview is not currently supported with OSR.
|
||||
return !IsWindowless();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::Print() {
|
||||
auto actionable_contents = GetActionableWebContents();
|
||||
if (!actionable_contents)
|
||||
return;
|
||||
|
||||
auto rfh = actionable_contents->GetMainFrame();
|
||||
|
||||
if (IsPrintPreviewSupported()) {
|
||||
printing::CefPrintViewManager::FromWebContents(actionable_contents)
|
||||
->PrintPreviewNow(rfh, false);
|
||||
} else {
|
||||
printing::PrintViewManager::FromWebContents(actionable_contents)
|
||||
->PrintNow(rfh);
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::PrintToPDF(
|
||||
const CefString& path,
|
||||
const CefPdfPrintSettings& settings,
|
||||
CefRefPtr<CefPdfPrintCallback> callback) {
|
||||
content::WebContents* actionable_contents = GetActionableWebContents();
|
||||
if (!actionable_contents)
|
||||
return;
|
||||
printing::CefPrintViewManager::PdfPrintCallback pdf_callback;
|
||||
if (callback.get()) {
|
||||
pdf_callback = base::Bind(&CefPdfPrintCallback::OnPdfPrintFinished,
|
||||
callback.get(), path);
|
||||
}
|
||||
printing::CefPrintViewManager::FromWebContents(actionable_contents)
|
||||
->PrintToPDF(actionable_contents->GetMainFrame(), base::FilePath(path),
|
||||
settings, pdf_callback);
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::Find(int identifier,
|
||||
const CefString& searchText,
|
||||
bool forward,
|
||||
bool matchCase,
|
||||
bool findNext) {
|
||||
if (!web_contents_)
|
||||
return;
|
||||
|
||||
// Every find request must have a unique ID and these IDs must strictly
|
||||
// increase so that newer requests always have greater IDs than older
|
||||
// requests.
|
||||
if (identifier <= find_request_id_counter_)
|
||||
identifier = ++find_request_id_counter_;
|
||||
else
|
||||
find_request_id_counter_ = identifier;
|
||||
|
||||
auto options = blink::mojom::FindOptions::New();
|
||||
options->forward = forward;
|
||||
options->match_case = matchCase;
|
||||
options->find_next_if_selection_matches = findNext;
|
||||
web_contents_->Find(identifier, searchText, std::move(options));
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::StopFinding(bool clearSelection) {
|
||||
if (!web_contents_)
|
||||
return;
|
||||
|
||||
content::StopFindAction action =
|
||||
clearSelection ? content::STOP_FIND_ACTION_CLEAR_SELECTION
|
||||
: content::STOP_FIND_ACTION_KEEP_SELECTION;
|
||||
web_contents_->StopFinding(action);
|
||||
}
|
||||
|
||||
base::RepeatingClosure
|
||||
CefBrowserPlatformDelegateAlloy::GetBoundsChangedCallback() {
|
||||
if (web_contents_dialog_helper_) {
|
||||
return web_contents_dialog_helper_->GetBoundsChangedCallback();
|
||||
}
|
||||
|
||||
return base::RepeatingClosure();
|
||||
}
|
||||
|
||||
content::WebContents*
|
||||
CefBrowserPlatformDelegateAlloy::GetActionableWebContents() const {
|
||||
if (web_contents_ && extensions::ExtensionsEnabled()) {
|
||||
content::WebContents* guest_contents =
|
||||
extensions::GetFullPageGuestForOwnerContents(web_contents_);
|
||||
if (guest_contents)
|
||||
return guest_contents;
|
||||
}
|
||||
return web_contents_;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::SetOwnedWebContents(
|
||||
content::WebContents* owned_contents) {
|
||||
// Should not currently own a WebContents.
|
||||
CHECK(!owned_web_contents_);
|
||||
owned_web_contents_.reset(owned_contents);
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::DestroyExtensionHost() {
|
||||
if (!extension_host_)
|
||||
return;
|
||||
if (extension_host_->extension_host_type() ==
|
||||
extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
|
||||
DCHECK(is_background_host_);
|
||||
// Close notification for background pages arrives via CloseContents.
|
||||
// The extension host will be deleted by
|
||||
// ProcessManager::CloseBackgroundHost and OnExtensionHostDeleted will be
|
||||
// called to notify us.
|
||||
extension_host_->Close();
|
||||
} else {
|
||||
DCHECK(!is_background_host_);
|
||||
// We own the extension host and must delete it.
|
||||
delete extension_host_;
|
||||
extension_host_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateAlloy::OnExtensionHostDeleted() {
|
||||
DCHECK(is_background_host_);
|
||||
DCHECK(extension_host_);
|
||||
extension_host_ = nullptr;
|
||||
}
|
106
libcef/browser/alloy/browser_platform_delegate_alloy.h
Normal file
106
libcef/browser/alloy/browser_platform_delegate_alloy.h
Normal file
@@ -0,0 +1,106 @@
|
||||
// Copyright (c) 2015 The Chromium Embedded Framework Authors.
|
||||
// Portions copyright (c) 2011 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_BROWSER_PLATFORM_DELEGATE_ALLOY_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_BROWSER_PLATFORM_DELEGATE_ALLOY_H_
|
||||
|
||||
#include "libcef/browser/browser_platform_delegate.h"
|
||||
#include "libcef/browser/web_contents_dialog_helper.h"
|
||||
|
||||
#include "base/memory/weak_ptr.h"
|
||||
|
||||
// Implementation of Alloy-based browser functionality.
|
||||
class CefBrowserPlatformDelegateAlloy : public CefBrowserPlatformDelegate {
|
||||
public:
|
||||
content::WebContents* CreateWebContents(
|
||||
CefBrowserHostImpl::CreateParams& create_params,
|
||||
bool& own_web_contents) override;
|
||||
void WebContentsCreated(content::WebContents* web_contents,
|
||||
bool owned) override;
|
||||
void AddNewContents(content::WebContents* source,
|
||||
std::unique_ptr<content::WebContents> new_contents,
|
||||
const GURL& target_url,
|
||||
WindowOpenDisposition disposition,
|
||||
const gfx::Rect& initial_rect,
|
||||
bool user_gesture,
|
||||
bool* was_blocked) override;
|
||||
bool ShouldTransferNavigation(bool is_main_frame_navigation) override;
|
||||
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
|
||||
void RenderViewReady() override;
|
||||
void BrowserCreated(CefBrowserHostImpl* browser) override;
|
||||
void CreateExtensionHost(const extensions::Extension* extension,
|
||||
const GURL& url,
|
||||
extensions::ViewType host_type) override;
|
||||
extensions::ExtensionHost* GetExtensionHost() const override;
|
||||
void BrowserDestroyed(CefBrowserHostImpl* browser) override;
|
||||
void SendCaptureLostEvent() override;
|
||||
#if defined(OS_WIN) || (defined(OS_POSIX) && !defined(OS_MACOSX))
|
||||
void NotifyMoveOrResizeStarted() override;
|
||||
#endif
|
||||
bool PreHandleGestureEvent(content::WebContents* source,
|
||||
const blink::WebGestureEvent& event) override;
|
||||
bool IsNeverComposited(content::WebContents* web_contents) override;
|
||||
void SetAutoResizeEnabled(bool enabled,
|
||||
const CefSize& min_size,
|
||||
const CefSize& max_size) override;
|
||||
void SetAccessibilityState(cef_state_t accessibility_state) override;
|
||||
bool IsPrintPreviewSupported() const override;
|
||||
void Print() override;
|
||||
void PrintToPDF(const CefString& path,
|
||||
const CefPdfPrintSettings& settings,
|
||||
CefRefPtr<CefPdfPrintCallback> callback) override;
|
||||
void Find(int identifier,
|
||||
const CefString& searchText,
|
||||
bool forward,
|
||||
bool matchCase,
|
||||
bool findNext) override;
|
||||
void StopFinding(bool clearSelection) override;
|
||||
|
||||
protected:
|
||||
CefBrowserPlatformDelegateAlloy();
|
||||
|
||||
base::RepeatingClosure GetBoundsChangedCallback();
|
||||
|
||||
// Returns the WebContents most likely to handle an action. If extensions are
|
||||
// enabled and this browser has a full-page guest (for example, a full-page
|
||||
// PDF viewer extension) then the guest's WebContents will be returned.
|
||||
// Otherwise, the browser's WebContents will be returned.
|
||||
content::WebContents* GetActionableWebContents() const;
|
||||
|
||||
private:
|
||||
void SetOwnedWebContents(content::WebContents* owned_contents);
|
||||
|
||||
void DestroyExtensionHost();
|
||||
void OnExtensionHostDeleted();
|
||||
|
||||
void ConfigureAutoResize();
|
||||
|
||||
// Non-nullptr if this object owns the WebContents. Will be nullptr for popup
|
||||
// browsers between the calls to WebContentsCreated() and AddNewContents(),
|
||||
// and may never be set if the parent browser is destroyed during popup
|
||||
// creation.
|
||||
std::unique_ptr<content::WebContents> owned_web_contents_;
|
||||
|
||||
// Used for the print preview dialog.
|
||||
std::unique_ptr<CefWebContentsDialogHelper> web_contents_dialog_helper_;
|
||||
|
||||
// Used to provide unique incremental IDs for each find request.
|
||||
int find_request_id_counter_ = 0;
|
||||
|
||||
// Used when the browser is hosting an extension.
|
||||
extensions::ExtensionHost* extension_host_ = nullptr;
|
||||
bool is_background_host_ = false;
|
||||
|
||||
// Used with auto-resize.
|
||||
bool auto_resize_enabled_ = false;
|
||||
gfx::Size auto_resize_min_;
|
||||
gfx::Size auto_resize_max_;
|
||||
|
||||
base::WeakPtrFactory<CefBrowserPlatformDelegateAlloy> weak_ptr_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefBrowserPlatformDelegateAlloy);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_BROWSER_PLATFORM_DELEGATE_ALLOY_H_
|
@@ -3,10 +3,10 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome_browser_process_stub.h"
|
||||
#include "libcef/browser/alloy/chrome_browser_process_alloy.h"
|
||||
|
||||
#include "libcef/browser/alloy/chrome_profile_manager_alloy.h"
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/chrome_profile_manager_stub.h"
|
||||
#include "libcef/browser/context.h"
|
||||
#include "libcef/browser/prefs/browser_prefs.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
@@ -27,17 +27,17 @@
|
||||
#include "services/network/public/cpp/network_switches.h"
|
||||
#include "services/network/public/cpp/shared_url_loader_factory.h"
|
||||
|
||||
ChromeBrowserProcessStub::ChromeBrowserProcessStub()
|
||||
ChromeBrowserProcessAlloy::ChromeBrowserProcessAlloy()
|
||||
: initialized_(false),
|
||||
context_initialized_(false),
|
||||
shutdown_(false),
|
||||
locale_("en-US") {}
|
||||
|
||||
ChromeBrowserProcessStub::~ChromeBrowserProcessStub() {
|
||||
ChromeBrowserProcessAlloy::~ChromeBrowserProcessAlloy() {
|
||||
DCHECK((!initialized_ && !context_initialized_) || shutdown_);
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::Initialize() {
|
||||
void ChromeBrowserProcessAlloy::Initialize() {
|
||||
DCHECK(!initialized_);
|
||||
DCHECK(!context_initialized_);
|
||||
DCHECK(!shutdown_);
|
||||
@@ -49,7 +49,7 @@ void ChromeBrowserProcessStub::Initialize() {
|
||||
initialized_ = true;
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::OnContextInitialized() {
|
||||
void ChromeBrowserProcessAlloy::OnContextInitialized() {
|
||||
CEF_REQUIRE_UIT();
|
||||
DCHECK(initialized_);
|
||||
DCHECK(!context_initialized_);
|
||||
@@ -57,12 +57,12 @@ void ChromeBrowserProcessStub::OnContextInitialized() {
|
||||
|
||||
// Must be created after the NotificationService.
|
||||
print_job_manager_.reset(new printing::PrintJobManager());
|
||||
profile_manager_.reset(new ChromeProfileManagerStub());
|
||||
profile_manager_.reset(new ChromeProfileManagerAlloy());
|
||||
event_router_forwarder_ = new extensions::EventRouterForwarder();
|
||||
context_initialized_ = true;
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::Shutdown() {
|
||||
void ChromeBrowserProcessAlloy::CleanupOnUIThread() {
|
||||
CEF_REQUIRE_UIT();
|
||||
DCHECK(initialized_);
|
||||
DCHECK(context_initialized_);
|
||||
@@ -84,8 +84,9 @@ void ChromeBrowserProcessStub::Shutdown() {
|
||||
|
||||
// Release any references held by objects associated with a Profile. The
|
||||
// Profile will be deleted later.
|
||||
for (const auto& profile : CefBrowserContext::GetAll()) {
|
||||
for (const auto& browser_context : CefBrowserContext::GetAll()) {
|
||||
// Release any references to |local_state_|.
|
||||
auto profile = browser_context->AsProfile();
|
||||
PrefWatcher* pref_watcher = PrefWatcher::Get(profile);
|
||||
if (pref_watcher)
|
||||
pref_watcher->Shutdown();
|
||||
@@ -107,54 +108,54 @@ void ChromeBrowserProcessStub::Shutdown() {
|
||||
shutdown_ = true;
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::EndSession() {
|
||||
void ChromeBrowserProcessAlloy::EndSession() {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::FlushLocalStateAndReply(
|
||||
void ChromeBrowserProcessAlloy::FlushLocalStateAndReply(
|
||||
base::OnceClosure reply) {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
metrics_services_manager::MetricsServicesManager*
|
||||
ChromeBrowserProcessStub::GetMetricsServicesManager() {
|
||||
ChromeBrowserProcessAlloy::GetMetricsServicesManager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
metrics::MetricsService* ChromeBrowserProcessStub::metrics_service() {
|
||||
metrics::MetricsService* ChromeBrowserProcessAlloy::metrics_service() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
rappor::RapporServiceImpl* ChromeBrowserProcessStub::rappor_service() {
|
||||
rappor::RapporServiceImpl* ChromeBrowserProcessAlloy::rappor_service() {
|
||||
// Called from PluginInfoHostImpl::ReportMetrics.
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SystemNetworkContextManager*
|
||||
ChromeBrowserProcessStub::system_network_context_manager() {
|
||||
ChromeBrowserProcessAlloy::system_network_context_manager() {
|
||||
DCHECK(SystemNetworkContextManager::GetInstance());
|
||||
return SystemNetworkContextManager::GetInstance();
|
||||
}
|
||||
|
||||
network::NetworkQualityTracker*
|
||||
ChromeBrowserProcessStub::network_quality_tracker() {
|
||||
ChromeBrowserProcessAlloy::network_quality_tracker() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
WatchDogThread* ChromeBrowserProcessStub::watchdog_thread() {
|
||||
WatchDogThread* ChromeBrowserProcessAlloy::watchdog_thread() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ProfileManager* ChromeBrowserProcessStub::profile_manager() {
|
||||
ProfileManager* ChromeBrowserProcessAlloy::profile_manager() {
|
||||
DCHECK(context_initialized_);
|
||||
return profile_manager_.get();
|
||||
}
|
||||
|
||||
PrefService* ChromeBrowserProcessStub::local_state() {
|
||||
PrefService* ChromeBrowserProcessAlloy::local_state() {
|
||||
DCHECK(initialized_);
|
||||
if (!local_state_) {
|
||||
// Use a location that is shared by all request contexts.
|
||||
@@ -173,40 +174,40 @@ PrefService* ChromeBrowserProcessStub::local_state() {
|
||||
}
|
||||
|
||||
scoped_refptr<network::SharedURLLoaderFactory>
|
||||
ChromeBrowserProcessStub::shared_url_loader_factory() {
|
||||
ChromeBrowserProcessAlloy::shared_url_loader_factory() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
variations::VariationsService* ChromeBrowserProcessStub::variations_service() {
|
||||
variations::VariationsService* ChromeBrowserProcessAlloy::variations_service() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BrowserProcessPlatformPart* ChromeBrowserProcessStub::platform_part() {
|
||||
BrowserProcessPlatformPart* ChromeBrowserProcessAlloy::platform_part() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
extensions::EventRouterForwarder*
|
||||
ChromeBrowserProcessStub::extension_event_router_forwarder() {
|
||||
ChromeBrowserProcessAlloy::extension_event_router_forwarder() {
|
||||
DCHECK(context_initialized_);
|
||||
return event_router_forwarder_.get();
|
||||
}
|
||||
|
||||
NotificationUIManager* ChromeBrowserProcessStub::notification_ui_manager() {
|
||||
NotificationUIManager* ChromeBrowserProcessAlloy::notification_ui_manager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NotificationPlatformBridge*
|
||||
ChromeBrowserProcessStub::notification_platform_bridge() {
|
||||
ChromeBrowserProcessAlloy::notification_platform_bridge() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
policy::ChromeBrowserPolicyConnector*
|
||||
ChromeBrowserProcessStub::browser_policy_connector() {
|
||||
ChromeBrowserProcessAlloy::browser_policy_connector() {
|
||||
if (!browser_policy_connector_) {
|
||||
browser_policy_connector_ =
|
||||
std::make_unique<policy::ChromeBrowserPolicyConnector>();
|
||||
@@ -214,40 +215,40 @@ ChromeBrowserProcessStub::browser_policy_connector() {
|
||||
return browser_policy_connector_.get();
|
||||
}
|
||||
|
||||
policy::PolicyService* ChromeBrowserProcessStub::policy_service() {
|
||||
policy::PolicyService* ChromeBrowserProcessAlloy::policy_service() {
|
||||
return browser_policy_connector()->GetPolicyService();
|
||||
}
|
||||
|
||||
IconManager* ChromeBrowserProcessStub::icon_manager() {
|
||||
IconManager* ChromeBrowserProcessAlloy::icon_manager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GpuModeManager* ChromeBrowserProcessStub::gpu_mode_manager() {
|
||||
GpuModeManager* ChromeBrowserProcessAlloy::gpu_mode_manager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::CreateDevToolsProtocolHandler() {
|
||||
void ChromeBrowserProcessAlloy::CreateDevToolsProtocolHandler() {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::CreateDevToolsAutoOpener() {
|
||||
void ChromeBrowserProcessAlloy::CreateDevToolsAutoOpener() {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
bool ChromeBrowserProcessStub::IsShuttingDown() {
|
||||
bool ChromeBrowserProcessAlloy::IsShuttingDown() {
|
||||
NOTREACHED();
|
||||
return false;
|
||||
}
|
||||
|
||||
printing::PrintJobManager* ChromeBrowserProcessStub::print_job_manager() {
|
||||
printing::PrintJobManager* ChromeBrowserProcessAlloy::print_job_manager() {
|
||||
DCHECK(context_initialized_);
|
||||
return print_job_manager_.get();
|
||||
}
|
||||
|
||||
printing::PrintPreviewDialogController*
|
||||
ChromeBrowserProcessStub::print_preview_dialog_controller() {
|
||||
ChromeBrowserProcessAlloy::print_preview_dialog_controller() {
|
||||
if (!print_preview_dialog_controller_.get()) {
|
||||
print_preview_dialog_controller_ =
|
||||
new printing::PrintPreviewDialogController();
|
||||
@@ -256,7 +257,7 @@ ChromeBrowserProcessStub::print_preview_dialog_controller() {
|
||||
}
|
||||
|
||||
printing::BackgroundPrintingManager*
|
||||
ChromeBrowserProcessStub::background_printing_manager() {
|
||||
ChromeBrowserProcessAlloy::background_printing_manager() {
|
||||
if (!background_printing_manager_.get()) {
|
||||
background_printing_manager_.reset(
|
||||
new printing::BackgroundPrintingManager());
|
||||
@@ -265,111 +266,120 @@ ChromeBrowserProcessStub::background_printing_manager() {
|
||||
}
|
||||
|
||||
IntranetRedirectDetector*
|
||||
ChromeBrowserProcessStub::intranet_redirect_detector() {
|
||||
ChromeBrowserProcessAlloy::intranet_redirect_detector() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const std::string& ChromeBrowserProcessStub::GetApplicationLocale() {
|
||||
const std::string& ChromeBrowserProcessAlloy::GetApplicationLocale() {
|
||||
DCHECK(!locale_.empty());
|
||||
return locale_;
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::SetApplicationLocale(const std::string& locale) {
|
||||
void ChromeBrowserProcessAlloy::SetApplicationLocale(
|
||||
const std::string& locale) {
|
||||
locale_ = locale;
|
||||
}
|
||||
|
||||
DownloadStatusUpdater* ChromeBrowserProcessStub::download_status_updater() {
|
||||
DownloadStatusUpdater* ChromeBrowserProcessAlloy::download_status_updater() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DownloadRequestLimiter* ChromeBrowserProcessStub::download_request_limiter() {
|
||||
DownloadRequestLimiter* ChromeBrowserProcessAlloy::download_request_limiter() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BackgroundModeManager* ChromeBrowserProcessStub::background_mode_manager() {
|
||||
#if BUILDFLAG(ENABLE_BACKGROUND_MODE)
|
||||
BackgroundModeManager* ChromeBrowserProcessAlloy::background_mode_manager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ChromeBrowserProcessStub::set_background_mode_manager_for_test(
|
||||
void ChromeBrowserProcessAlloy::set_background_mode_manager_for_test(
|
||||
std::unique_ptr<BackgroundModeManager> manager) {
|
||||
NOTREACHED();
|
||||
}
|
||||
#endif
|
||||
|
||||
StatusTray* ChromeBrowserProcessStub::status_tray() {
|
||||
StatusTray* ChromeBrowserProcessAlloy::status_tray() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
safe_browsing::SafeBrowsingService*
|
||||
ChromeBrowserProcessStub::safe_browsing_service() {
|
||||
ChromeBrowserProcessAlloy::safe_browsing_service() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
subresource_filter::RulesetService*
|
||||
ChromeBrowserProcessStub::subresource_filter_ruleset_service() {
|
||||
ChromeBrowserProcessAlloy::subresource_filter_ruleset_service() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
federated_learning::FlocBlocklistService*
|
||||
ChromeBrowserProcessAlloy::floc_blocklist_service() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
optimization_guide::OptimizationGuideService*
|
||||
ChromeBrowserProcessStub::optimization_guide_service() {
|
||||
ChromeBrowserProcessAlloy::optimization_guide_service() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
StartupData* ChromeBrowserProcessStub::startup_data() {
|
||||
StartupData* ChromeBrowserProcessAlloy::startup_data() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
|
||||
void ChromeBrowserProcessStub::StartAutoupdateTimer() {}
|
||||
void ChromeBrowserProcessAlloy::StartAutoupdateTimer() {}
|
||||
#endif
|
||||
|
||||
component_updater::ComponentUpdateService*
|
||||
ChromeBrowserProcessStub::component_updater() {
|
||||
ChromeBrowserProcessAlloy::component_updater() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MediaFileSystemRegistry*
|
||||
ChromeBrowserProcessStub::media_file_system_registry() {
|
||||
ChromeBrowserProcessAlloy::media_file_system_registry() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
WebRtcLogUploader* ChromeBrowserProcessStub::webrtc_log_uploader() {
|
||||
WebRtcLogUploader* ChromeBrowserProcessAlloy::webrtc_log_uploader() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
network_time::NetworkTimeTracker*
|
||||
ChromeBrowserProcessStub::network_time_tracker() {
|
||||
ChromeBrowserProcessAlloy::network_time_tracker() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
gcm::GCMDriver* ChromeBrowserProcessStub::gcm_driver() {
|
||||
gcm::GCMDriver* ChromeBrowserProcessAlloy::gcm_driver() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
resource_coordinator::TabManager* ChromeBrowserProcessStub::GetTabManager() {
|
||||
resource_coordinator::TabManager* ChromeBrowserProcessAlloy::GetTabManager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
resource_coordinator::ResourceCoordinatorParts*
|
||||
ChromeBrowserProcessStub::resource_coordinator_parts() {
|
||||
ChromeBrowserProcessAlloy::resource_coordinator_parts() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BuildState* ChromeBrowserProcessStub::GetBuildState() {
|
||||
BuildState* ChromeBrowserProcessAlloy::GetBuildState() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
@@ -6,8 +6,8 @@
|
||||
// This file provides a stub implementation of Chrome's BrowserProcess object
|
||||
// for use as an interop layer between CEF and files that live in chrome/.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_BROWSER_PROCESS_STUB_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_BROWSER_PROCESS_STUB_H_
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_CHROME_BROWSER_PROCESS_ALLOY_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_CHROME_BROWSER_PROCESS_ALLOY_H_
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
@@ -18,7 +18,7 @@
|
||||
#include "chrome/browser/extensions/event_router_forwarder.h"
|
||||
#include "media/media_buildflags.h"
|
||||
|
||||
class ChromeProfileManagerStub;
|
||||
class ChromeProfileManagerAlloy;
|
||||
|
||||
class BackgroundModeManager {
|
||||
public:
|
||||
@@ -29,14 +29,14 @@ class BackgroundModeManager {
|
||||
DISALLOW_COPY_AND_ASSIGN(BackgroundModeManager);
|
||||
};
|
||||
|
||||
class ChromeBrowserProcessStub : public BrowserProcess {
|
||||
class ChromeBrowserProcessAlloy : public BrowserProcess {
|
||||
public:
|
||||
ChromeBrowserProcessStub();
|
||||
~ChromeBrowserProcessStub() override;
|
||||
ChromeBrowserProcessAlloy();
|
||||
~ChromeBrowserProcessAlloy() override;
|
||||
|
||||
void Initialize();
|
||||
void OnContextInitialized();
|
||||
void Shutdown();
|
||||
void CleanupOnUIThread();
|
||||
|
||||
// BrowserProcess implementation.
|
||||
void EndSession() override;
|
||||
@@ -73,13 +73,16 @@ class ChromeBrowserProcessStub : public BrowserProcess {
|
||||
void SetApplicationLocale(const std::string& locale) override;
|
||||
DownloadStatusUpdater* download_status_updater() override;
|
||||
DownloadRequestLimiter* download_request_limiter() override;
|
||||
#if BUILDFLAG(ENABLE_BACKGROUND_MODE)
|
||||
BackgroundModeManager* background_mode_manager() override;
|
||||
void set_background_mode_manager_for_test(
|
||||
std::unique_ptr<BackgroundModeManager> manager) override;
|
||||
#endif
|
||||
StatusTray* status_tray() override;
|
||||
safe_browsing::SafeBrowsingService* safe_browsing_service() override;
|
||||
subresource_filter::RulesetService* subresource_filter_ruleset_service()
|
||||
override;
|
||||
federated_learning::FlocBlocklistService* floc_blocklist_service() override;
|
||||
optimization_guide::OptimizationGuideService* optimization_guide_service()
|
||||
override;
|
||||
StartupData* startup_data() override;
|
||||
@@ -105,7 +108,7 @@ class ChromeBrowserProcessStub : public BrowserProcess {
|
||||
|
||||
std::string locale_;
|
||||
std::unique_ptr<printing::PrintJobManager> print_job_manager_;
|
||||
std::unique_ptr<ChromeProfileManagerStub> profile_manager_;
|
||||
std::unique_ptr<ChromeProfileManagerAlloy> profile_manager_;
|
||||
scoped_refptr<extensions::EventRouterForwarder> event_router_forwarder_;
|
||||
scoped_refptr<printing::PrintPreviewDialogController>
|
||||
print_preview_dialog_controller_;
|
||||
@@ -117,7 +120,7 @@ class ChromeBrowserProcessStub : public BrowserProcess {
|
||||
browser_policy_connector_;
|
||||
std::unique_ptr<base::FieldTrialList> field_trial_list_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProcessStub);
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProcessAlloy);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_BROWSER_PROCESS_STUB_H_
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_CHROME_BROWSER_PROCESS_ALLOY_H_
|
@@ -3,11 +3,10 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome_profile_stub.h"
|
||||
#include "libcef/browser/alloy/chrome_profile_alloy.h"
|
||||
|
||||
#include "components/variations/variations_client.h"
|
||||
#include "components/variations/variations_http_header_provider.h"
|
||||
#include "content/public/browser/resource_context.h"
|
||||
#include "net/url_request/url_request_context.h"
|
||||
|
||||
namespace {
|
||||
@@ -19,7 +18,7 @@ class CefVariationsClient : public variations::VariationsClient {
|
||||
|
||||
~CefVariationsClient() override = default;
|
||||
|
||||
bool IsIncognito() const override {
|
||||
bool IsOffTheRecord() const override {
|
||||
return browser_context_->IsOffTheRecord();
|
||||
}
|
||||
|
||||
@@ -34,144 +33,140 @@ class CefVariationsClient : public variations::VariationsClient {
|
||||
|
||||
} // namespace
|
||||
|
||||
ChromeProfileStub::ChromeProfileStub() {}
|
||||
ChromeProfileAlloy::ChromeProfileAlloy() {}
|
||||
|
||||
ChromeProfileStub::~ChromeProfileStub() {}
|
||||
ChromeProfileAlloy::~ChromeProfileAlloy() {}
|
||||
|
||||
bool ChromeProfileStub::IsOffTheRecord() {
|
||||
bool ChromeProfileAlloy::IsOffTheRecord() {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::IsOffTheRecord() const {
|
||||
bool ChromeProfileAlloy::IsOffTheRecord() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
const Profile::OTRProfileID& ChromeProfileStub::GetOTRProfileID() const {
|
||||
const Profile::OTRProfileID& ChromeProfileAlloy::GetOTRProfileID() const {
|
||||
NOTREACHED();
|
||||
static base::NoDestructor<Profile::OTRProfileID> otr_profile_id(
|
||||
"ProfileImp::NoOTRProfileID");
|
||||
return *otr_profile_id;
|
||||
}
|
||||
|
||||
variations::VariationsClient* ChromeProfileStub::GetVariationsClient() {
|
||||
variations::VariationsClient* ChromeProfileAlloy::GetVariationsClient() {
|
||||
if (!variations_client_)
|
||||
variations_client_ = std::make_unique<CefVariationsClient>(this);
|
||||
return variations_client_.get();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SequencedTaskRunner> ChromeProfileStub::GetIOTaskRunner() {
|
||||
scoped_refptr<base::SequencedTaskRunner> ChromeProfileAlloy::GetIOTaskRunner() {
|
||||
NOTREACHED();
|
||||
return scoped_refptr<base::SequencedTaskRunner>();
|
||||
}
|
||||
|
||||
std::string ChromeProfileStub::GetProfileUserName() const {
|
||||
std::string ChromeProfileAlloy::GetProfileUserName() const {
|
||||
NOTREACHED();
|
||||
return std::string();
|
||||
}
|
||||
|
||||
Profile::ProfileType ChromeProfileStub::GetProfileType() const {
|
||||
return REGULAR_PROFILE;
|
||||
}
|
||||
|
||||
Profile* ChromeProfileStub::GetOffTheRecordProfile(
|
||||
Profile* ChromeProfileAlloy::GetOffTheRecordProfile(
|
||||
const Profile::OTRProfileID& otr_profile_id) {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<Profile*> ChromeProfileStub::GetAllOffTheRecordProfiles() {
|
||||
NOTREACHED();
|
||||
std::vector<Profile*> ChromeProfileAlloy::GetAllOffTheRecordProfiles() {
|
||||
return {};
|
||||
}
|
||||
|
||||
void ChromeProfileStub::DestroyOffTheRecordProfile(Profile* otr_profile) {
|
||||
void ChromeProfileAlloy::DestroyOffTheRecordProfile(Profile* otr_profile) {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::HasOffTheRecordProfile(
|
||||
bool ChromeProfileAlloy::HasOffTheRecordProfile(
|
||||
const Profile::OTRProfileID& otr_profile_id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::HasAnyOffTheRecordProfile() {
|
||||
bool ChromeProfileAlloy::HasAnyOffTheRecordProfile() {
|
||||
return false;
|
||||
}
|
||||
|
||||
Profile* ChromeProfileStub::GetOriginalProfile() {
|
||||
Profile* ChromeProfileAlloy::GetOriginalProfile() {
|
||||
return this;
|
||||
}
|
||||
|
||||
const Profile* ChromeProfileStub::GetOriginalProfile() const {
|
||||
const Profile* ChromeProfileAlloy::GetOriginalProfile() const {
|
||||
return this;
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::IsSupervised() const {
|
||||
bool ChromeProfileAlloy::IsSupervised() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::IsChild() const {
|
||||
bool ChromeProfileAlloy::IsChild() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::IsLegacySupervised() const {
|
||||
bool ChromeProfileAlloy::IsLegacySupervised() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
ExtensionSpecialStoragePolicy*
|
||||
ChromeProfileStub::GetExtensionSpecialStoragePolicy() {
|
||||
ChromeProfileAlloy::GetExtensionSpecialStoragePolicy() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PrefService* ChromeProfileStub::GetOffTheRecordPrefs() {
|
||||
PrefService* ChromeProfileAlloy::GetOffTheRecordPrefs() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::IsSameProfile(Profile* profile) {
|
||||
bool ChromeProfileAlloy::IsSameOrParent(Profile* profile) {
|
||||
NOTREACHED();
|
||||
return false;
|
||||
}
|
||||
|
||||
base::Time ChromeProfileStub::GetStartTime() const {
|
||||
base::Time ChromeProfileAlloy::GetStartTime() const {
|
||||
NOTREACHED();
|
||||
return base::Time();
|
||||
}
|
||||
|
||||
base::FilePath ChromeProfileStub::last_selected_directory() {
|
||||
base::FilePath ChromeProfileAlloy::last_selected_directory() {
|
||||
NOTREACHED();
|
||||
return base::FilePath();
|
||||
}
|
||||
|
||||
void ChromeProfileStub::set_last_selected_directory(
|
||||
void ChromeProfileAlloy::set_last_selected_directory(
|
||||
const base::FilePath& path) {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
GURL ChromeProfileStub::GetHomePage() {
|
||||
GURL ChromeProfileAlloy::GetHomePage() {
|
||||
NOTREACHED();
|
||||
return GURL();
|
||||
}
|
||||
|
||||
bool ChromeProfileStub::WasCreatedByVersionOrLater(const std::string& version) {
|
||||
bool ChromeProfileAlloy::WasCreatedByVersionOrLater(
|
||||
const std::string& version) {
|
||||
NOTREACHED();
|
||||
return false;
|
||||
}
|
||||
|
||||
void ChromeProfileStub::SetExitType(ExitType exit_type) {
|
||||
void ChromeProfileAlloy::SetExitType(ExitType exit_type) {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
Profile::ExitType ChromeProfileStub::GetLastSessionExitType() {
|
||||
Profile::ExitType ChromeProfileAlloy::GetLastSessionExitType() {
|
||||
NOTREACHED();
|
||||
return EXIT_NORMAL;
|
||||
}
|
||||
|
||||
base::Time ChromeProfileStub::GetCreationTime() const {
|
||||
base::Time ChromeProfileAlloy::GetCreationTime() const {
|
||||
NOTREACHED();
|
||||
return base::Time();
|
||||
}
|
||||
|
||||
void ChromeProfileStub::SetCreationTimeForTesting(base::Time creation_time) {
|
||||
void ChromeProfileAlloy::SetCreationTimeForTesting(base::Time creation_time) {
|
||||
NOTREACHED();
|
||||
}
|
@@ -5,18 +5,18 @@
|
||||
|
||||
// This class gathers state related to a single user profile.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_PROFILE_STUB_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_PROFILE_STUB_H_
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_CHROME_PROFILE_ALLOY_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_CHROME_PROFILE_ALLOY_H_
|
||||
|
||||
#include "chrome/browser/profiles/profile.h"
|
||||
|
||||
// This file provides a stub implementation of Chrome's Profile object for use
|
||||
// as an interop layer between CEF and files that live in chrome/.
|
||||
|
||||
class ChromeProfileStub : public Profile {
|
||||
class ChromeProfileAlloy : public Profile {
|
||||
public:
|
||||
ChromeProfileStub();
|
||||
~ChromeProfileStub() override;
|
||||
ChromeProfileAlloy();
|
||||
~ChromeProfileAlloy() override;
|
||||
|
||||
protected:
|
||||
// Profile methods.
|
||||
@@ -26,7 +26,6 @@ class ChromeProfileStub : public Profile {
|
||||
variations::VariationsClient* GetVariationsClient() override;
|
||||
scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() override;
|
||||
std::string GetProfileUserName() const override;
|
||||
ProfileType GetProfileType() const override;
|
||||
Profile* GetOffTheRecordProfile(
|
||||
const Profile::OTRProfileID& otr_profile_id) override;
|
||||
std::vector<Profile*> GetAllOffTheRecordProfiles() override;
|
||||
@@ -41,7 +40,7 @@ class ChromeProfileStub : public Profile {
|
||||
bool IsLegacySupervised() const override;
|
||||
ExtensionSpecialStoragePolicy* GetExtensionSpecialStoragePolicy() override;
|
||||
PrefService* GetOffTheRecordPrefs() override;
|
||||
bool IsSameProfile(Profile* profile) override;
|
||||
bool IsSameOrParent(Profile* profile) override;
|
||||
base::Time GetStartTime() const override;
|
||||
base::FilePath last_selected_directory() override;
|
||||
void set_last_selected_directory(const base::FilePath& path) override;
|
||||
@@ -55,7 +54,7 @@ class ChromeProfileStub : public Profile {
|
||||
private:
|
||||
std::unique_ptr<variations::VariationsClient> variations_client_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeProfileStub);
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeProfileAlloy);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_PROFILE_STUB_H_
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_CHROME_PROFILE_ALLOY_H_
|
@@ -3,10 +3,11 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome_profile_manager_stub.h"
|
||||
#include "libcef/browser/alloy/chrome_profile_manager_alloy.h"
|
||||
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/content_browser_client.h"
|
||||
#include "libcef/browser/request_context_impl.h"
|
||||
#include "libcef/common/app_manager.h"
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -21,21 +22,22 @@ namespace {
|
||||
// Return the main context for now since we don't currently have a good way to
|
||||
// determine that.
|
||||
CefBrowserContext* GetActiveBrowserContext() {
|
||||
return static_cast<CefBrowserContext*>(
|
||||
CefContentBrowserClient::Get()->request_context()->GetBrowserContext());
|
||||
auto request_context = static_cast<CefRequestContextImpl*>(
|
||||
CefAppManager::Get()->GetGlobalRequestContext().get());
|
||||
return request_context->GetBrowserContext();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
ChromeProfileManagerStub::ChromeProfileManagerStub()
|
||||
ChromeProfileManagerAlloy::ChromeProfileManagerAlloy()
|
||||
: ProfileManager(base::FilePath()) {}
|
||||
|
||||
ChromeProfileManagerStub::~ChromeProfileManagerStub() {}
|
||||
ChromeProfileManagerAlloy::~ChromeProfileManagerAlloy() {}
|
||||
|
||||
Profile* ChromeProfileManagerStub::GetProfile(
|
||||
Profile* ChromeProfileManagerAlloy::GetProfile(
|
||||
const base::FilePath& profile_dir) {
|
||||
CefBrowserContext* browser_context =
|
||||
CefBrowserContext::GetForCachePath(profile_dir);
|
||||
CefBrowserContext::FromCachePath(profile_dir);
|
||||
if (!browser_context) {
|
||||
// ProfileManager makes assumptions about profile directory paths that do
|
||||
// not match CEF usage. For example, the default Chrome profile name is
|
||||
@@ -45,19 +47,19 @@ Profile* ChromeProfileManagerStub::GetProfile(
|
||||
// asking for.
|
||||
browser_context = GetActiveBrowserContext();
|
||||
}
|
||||
return browser_context;
|
||||
return browser_context->AsProfile();
|
||||
}
|
||||
|
||||
bool ChromeProfileManagerStub::IsValidProfile(const void* profile) {
|
||||
bool ChromeProfileManagerAlloy::IsValidProfile(const void* profile) {
|
||||
if (!profile)
|
||||
return false;
|
||||
return !!CefBrowserContext::GetForContext(
|
||||
reinterpret_cast<content::BrowserContext*>(const_cast<void*>(profile)));
|
||||
return !!CefBrowserContext::FromBrowserContext(
|
||||
static_cast<const content::BrowserContext*>(profile));
|
||||
}
|
||||
|
||||
Profile* ChromeProfileManagerStub::GetLastUsedProfile(
|
||||
Profile* ChromeProfileManagerAlloy::GetLastUsedProfile(
|
||||
const base::FilePath& user_data_dir) {
|
||||
// Override this method to avoid having to register prefs::kProfileLastUsed,
|
||||
// usage of which doesn't make sense for CEF.
|
||||
return GetActiveBrowserContext();
|
||||
return GetActiveBrowserContext()->AsProfile();
|
||||
}
|
@@ -6,22 +6,22 @@
|
||||
// This file provides a stub implementation of Chrome's ProfileManager object
|
||||
// for use as an interop layer between CEF and files that live in chrome/.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_PROFILE_MANAGER_STUB_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_PROFILE_MANAGER_STUB_H_
|
||||
#ifndef CEF_LIBCEF_BROWSER_ALLOY_CHROME_PROFILE_MANAGER_ALLOY_H_
|
||||
#define CEF_LIBCEF_BROWSER_ALLOY_CHROME_PROFILE_MANAGER_ALLOY_H_
|
||||
|
||||
#include "chrome/browser/profiles/profile_manager.h"
|
||||
|
||||
class ChromeProfileManagerStub : public ProfileManager {
|
||||
class ChromeProfileManagerAlloy : public ProfileManager {
|
||||
public:
|
||||
ChromeProfileManagerStub();
|
||||
~ChromeProfileManagerStub() override;
|
||||
ChromeProfileManagerAlloy();
|
||||
~ChromeProfileManagerAlloy() override;
|
||||
|
||||
Profile* GetProfile(const base::FilePath& profile_dir) override;
|
||||
bool IsValidProfile(const void* profile) override;
|
||||
Profile* GetLastUsedProfile(const base::FilePath& user_data_dir) override;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeProfileManagerStub);
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeProfileManagerAlloy);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_PROFILE_MANAGER_STUB_H_
|
||||
#endif // CEF_LIBCEF_BROWSER_ALLOY_CHROME_PROFILE_MANAGER_ALLOY_H_
|
@@ -77,7 +77,8 @@ CefAudioCapturer::CefAudioCapturer(const CefAudioParameters& params,
|
||||
std::make_unique<mirroring::CapturedAudioInput>(base::BindRepeating(
|
||||
&StreamCreatorHelper, base::Unretained(browser_->web_contents()),
|
||||
base::Unretained(audio_stream_creator_.get()))),
|
||||
media::AudioInputDevice::kLoopback);
|
||||
media::AudioInputDevice::kLoopback,
|
||||
media::AudioInputDevice::DeadStreamDetection::kEnabled);
|
||||
|
||||
audio_input_device_->Initialize(audio_params, this);
|
||||
audio_input_device_->Start();
|
||||
|
@@ -7,47 +7,20 @@
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
#include "libcef/browser/content_browser_client.h"
|
||||
#include "libcef/browser/download_manager_delegate.h"
|
||||
#include "libcef/browser/extensions/extension_system.h"
|
||||
#include "libcef/browser/iothread_state.h"
|
||||
#include "libcef/browser/media_router/media_router_manager.h"
|
||||
#include "libcef/browser/prefs/browser_prefs.h"
|
||||
#include "libcef/browser/request_context_impl.h"
|
||||
#include "libcef/browser/ssl_host_state_delegate.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
#include "libcef/common/cef_switches.h"
|
||||
#include "libcef/common/extensions/extensions_util.h"
|
||||
|
||||
#include "base/command_line.h"
|
||||
#include "base/files/file_util.h"
|
||||
#include "base/lazy_instance.h"
|
||||
#include "base/logging.h"
|
||||
#include "base/strings/string_util.h"
|
||||
#include "chrome/browser/font_family_cache.h"
|
||||
#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
|
||||
#include "chrome/browser/profiles/profile_key.h"
|
||||
#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
|
||||
#include "chrome/common/pref_names.h"
|
||||
#include "components/content_settings/core/browser/host_content_settings_map.h"
|
||||
#include "components/guest_view/browser/guest_view_manager.h"
|
||||
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
||||
#include "components/keyed_service/core/simple_dependency_manager.h"
|
||||
#include "components/keyed_service/core/simple_key_map.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "components/proxy_config/pref_proxy_config_tracker_impl.h"
|
||||
#include "components/user_prefs/user_prefs.h"
|
||||
#include "components/visitedlink/browser/visitedlink_event_listener.h"
|
||||
#include "components/visitedlink/browser/visitedlink_writer.h"
|
||||
#include "components/zoom/zoom_event_manager.h"
|
||||
#include "content/public/browser/browser_context.h"
|
||||
#include "content/public/browser/browser_task_traits.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "content/public/browser/download_manager.h"
|
||||
#include "content/public/browser/storage_partition.h"
|
||||
#include "extensions/browser/extension_protocols.h"
|
||||
#include "extensions/browser/process_manager.h"
|
||||
#include "extensions/common/constants.h"
|
||||
#include "net/proxy_resolution/proxy_config_service.h"
|
||||
#include "services/network/public/mojom/cors_origin_pattern.mojom.h"
|
||||
|
||||
using content::BrowserThread;
|
||||
|
||||
@@ -90,10 +63,10 @@ class ImplManager {
|
||||
return GetImplPos(impl) != all_.end();
|
||||
}
|
||||
|
||||
CefBrowserContext* GetImplForIDs(int render_process_id,
|
||||
int render_frame_id,
|
||||
int frame_tree_node_id,
|
||||
bool require_frame_match) {
|
||||
CefBrowserContext* GetImplFromIDs(int render_process_id,
|
||||
int render_frame_id,
|
||||
int frame_tree_node_id,
|
||||
bool require_frame_match) {
|
||||
CEF_REQUIRE_UIT();
|
||||
for (const auto& context : all_) {
|
||||
if (context->IsAssociatedContext(render_process_id, render_frame_id,
|
||||
@@ -105,15 +78,15 @@ class ImplManager {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CefBrowserContext* GetImplForContext(const content::BrowserContext* context) {
|
||||
CefBrowserContext* GetImplFromBrowserContext(
|
||||
const content::BrowserContext* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!context)
|
||||
return nullptr;
|
||||
|
||||
Vector::iterator it = all_.begin();
|
||||
for (; it != all_.end(); ++it) {
|
||||
if (*it == context)
|
||||
return *it;
|
||||
for (const auto& bc : all_) {
|
||||
if (bc->AsBrowserContext() == context)
|
||||
return bc;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
@@ -122,11 +95,11 @@ class ImplManager {
|
||||
CEF_REQUIRE_UIT();
|
||||
DCHECK(!path.empty());
|
||||
DCHECK(IsValidImpl(impl));
|
||||
DCHECK(GetImplForPath(path) == nullptr);
|
||||
DCHECK(GetImplFromPath(path) == nullptr);
|
||||
map_.insert(std::make_pair(path, impl));
|
||||
}
|
||||
|
||||
CefBrowserContext* GetImplForPath(const base::FilePath& path) {
|
||||
CefBrowserContext* GetImplFromPath(const base::FilePath& path) {
|
||||
CEF_REQUIRE_UIT();
|
||||
DCHECK(!path.empty());
|
||||
PathMap::const_iterator it = map_.find(path);
|
||||
@@ -170,59 +143,6 @@ CefBrowserContext* GetSelf(base::WeakPtr<CefBrowserContext> self) {
|
||||
|
||||
} // namespace
|
||||
|
||||
// Creates and manages VisitedLinkEventListener objects for each
|
||||
// CefBrowserContext sharing the same VisitedLinkWriter.
|
||||
class CefVisitedLinkListener : public visitedlink::VisitedLinkWriter::Listener {
|
||||
public:
|
||||
CefVisitedLinkListener() { DCHECK(listener_map_.empty()); }
|
||||
|
||||
void CreateListenerForContext(const CefBrowserContext* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
auto listener = std::make_unique<visitedlink::VisitedLinkEventListener>(
|
||||
const_cast<CefBrowserContext*>(context));
|
||||
listener_map_.insert(std::make_pair(context, std::move(listener)));
|
||||
}
|
||||
|
||||
void RemoveListenerForContext(const CefBrowserContext* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.find(context);
|
||||
DCHECK(it != listener_map_.end());
|
||||
listener_map_.erase(it);
|
||||
}
|
||||
|
||||
// visitedlink::VisitedLinkWriter::Listener methods.
|
||||
|
||||
void NewTable(base::ReadOnlySharedMemoryRegion* table_region) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.begin();
|
||||
for (; it != listener_map_.end(); ++it)
|
||||
it->second->NewTable(table_region);
|
||||
}
|
||||
|
||||
void Add(visitedlink::VisitedLinkCommon::Fingerprint fingerprint) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.begin();
|
||||
for (; it != listener_map_.end(); ++it)
|
||||
it->second->Add(fingerprint);
|
||||
}
|
||||
|
||||
void Reset(bool invalidate_hashes) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
ListenerMap::iterator it = listener_map_.begin();
|
||||
for (; it != listener_map_.end(); ++it)
|
||||
it->second->Reset(invalidate_hashes);
|
||||
}
|
||||
|
||||
private:
|
||||
// Map of CefBrowserContext to the associated VisitedLinkEventListener.
|
||||
typedef std::map<const CefBrowserContext*,
|
||||
std::unique_ptr<visitedlink::VisitedLinkEventListener>>
|
||||
ListenerMap;
|
||||
ListenerMap listener_map_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefVisitedLinkListener);
|
||||
};
|
||||
|
||||
CefBrowserContext::CefBrowserContext(const CefRequestContextSettings& settings)
|
||||
: settings_(settings), weak_ptr_factory_(this) {
|
||||
g_manager.Get().AddImpl(this);
|
||||
@@ -231,6 +151,33 @@ CefBrowserContext::CefBrowserContext(const CefRequestContextSettings& settings)
|
||||
|
||||
CefBrowserContext::~CefBrowserContext() {
|
||||
CEF_REQUIRE_UIT();
|
||||
#if DCHECK_IS_ON()
|
||||
DCHECK(is_shutdown_);
|
||||
#endif
|
||||
|
||||
if (iothread_state_) {
|
||||
// Destruction of the CefIOThreadState will trigger destruction of all
|
||||
// associated network requests.
|
||||
content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE,
|
||||
iothread_state_.release());
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserContext::Initialize() {
|
||||
cache_path_ = base::FilePath(CefString(&settings_.cache_path));
|
||||
|
||||
if (!cache_path_.empty())
|
||||
g_manager.Get().SetImplPath(this, cache_path_);
|
||||
|
||||
iothread_state_ = std::make_unique<CefIOThreadState>();
|
||||
}
|
||||
|
||||
void CefBrowserContext::Shutdown() {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
#if DCHECK_IS_ON()
|
||||
is_shutdown_ = true;
|
||||
#endif
|
||||
|
||||
// No CefRequestContext should be referencing this object any longer.
|
||||
DCHECK(request_context_set_.empty());
|
||||
@@ -240,121 +187,6 @@ CefBrowserContext::~CefBrowserContext() {
|
||||
|
||||
// Destroy objects that may hold references to the MediaRouter.
|
||||
media_router_manager_.reset();
|
||||
|
||||
// Send notifications to clean up objects associated with this Profile.
|
||||
MaybeSendDestroyedNotification();
|
||||
|
||||
ChromePluginServiceFilter::GetInstance()->UnregisterProfile(this);
|
||||
|
||||
// Remove any BrowserContextKeyedServiceFactory associations. This must be
|
||||
// called before the ProxyService owned by CefBrowserContext is destroyed.
|
||||
// The SimpleDependencyManager should always be passed after the
|
||||
// BrowserContextDependencyManager. This is because the KeyedService instances
|
||||
// in the BrowserContextDependencyManager's dependency graph can depend on the
|
||||
// ones in the SimpleDependencyManager's graph.
|
||||
DependencyManager::PerformInterlockedTwoPhaseShutdown(
|
||||
BrowserContextDependencyManager::GetInstance(), this,
|
||||
SimpleDependencyManager::GetInstance(), key_.get());
|
||||
|
||||
key_.reset();
|
||||
SimpleKeyMap::GetInstance()->Dissociate(this);
|
||||
|
||||
// Shuts down the storage partitions associated with this browser context.
|
||||
// This must be called before the browser context is actually destroyed
|
||||
// and before a clean-up task for its corresponding IO thread residents
|
||||
// (e.g. ResourceContext) is posted, so that the classes that hung on
|
||||
// StoragePartition can have time to do necessary cleanups on IO thread.
|
||||
ShutdownStoragePartitions();
|
||||
|
||||
if (resource_context_.get()) {
|
||||
// Destruction of the ResourceContext will trigger destruction of all
|
||||
// associated network requests.
|
||||
content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE,
|
||||
resource_context_.release());
|
||||
}
|
||||
|
||||
visitedlink_listener_->RemoveListenerForContext(this);
|
||||
|
||||
// The FontFamilyCache references the ProxyService so delete it before the
|
||||
// ProxyService is deleted.
|
||||
SetUserData(&kFontFamilyCacheKey, nullptr);
|
||||
|
||||
pref_proxy_config_tracker_->DetachFromPrefService();
|
||||
|
||||
if (host_content_settings_map_)
|
||||
host_content_settings_map_->ShutdownOnUIThread();
|
||||
|
||||
// Delete the download manager delegate here because otherwise we'll crash
|
||||
// when it's accessed from the content::BrowserContext destructor.
|
||||
if (download_manager_delegate_)
|
||||
download_manager_delegate_.reset(nullptr);
|
||||
}
|
||||
|
||||
void CefBrowserContext::Initialize() {
|
||||
cache_path_ = base::FilePath(CefString(&settings_.cache_path));
|
||||
|
||||
if (!cache_path_.empty())
|
||||
g_manager.Get().SetImplPath(this, cache_path_);
|
||||
|
||||
if (!!settings_.persist_session_cookies) {
|
||||
set_should_persist_session_cookies(true);
|
||||
}
|
||||
|
||||
key_ = std::make_unique<ProfileKey>(cache_path_);
|
||||
SimpleKeyMap::GetInstance()->Associate(this, key_.get());
|
||||
|
||||
// Initialize the PrefService object.
|
||||
pref_service_ = browser_prefs::CreatePrefService(
|
||||
this, cache_path_, !!settings_.persist_user_preferences);
|
||||
|
||||
resource_context_.reset(new CefResourceContext(IsOffTheRecord()));
|
||||
|
||||
// This must be called before creating any services to avoid hitting
|
||||
// DependencyManager::AssertContextWasntDestroyed when creating/destroying
|
||||
// multiple browser contexts (due to pointer address reuse).
|
||||
BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
|
||||
this);
|
||||
|
||||
const bool extensions_enabled = extensions::ExtensionsEnabled();
|
||||
if (extensions_enabled) {
|
||||
// Create the custom ExtensionSystem first because other KeyedServices
|
||||
// depend on it.
|
||||
extension_system_ = static_cast<extensions::CefExtensionSystem*>(
|
||||
extensions::ExtensionSystem::Get(this));
|
||||
extension_system_->InitForRegularProfile(true);
|
||||
|
||||
// Make sure the ProcessManager is created so that it receives extension
|
||||
// load notifications. This is necessary for the proper initialization of
|
||||
// background/event pages.
|
||||
extensions::ProcessManager::Get(this);
|
||||
}
|
||||
|
||||
// Initialize visited links management.
|
||||
base::FilePath visited_link_path;
|
||||
if (!cache_path_.empty())
|
||||
visited_link_path = cache_path_.Append(FILE_PATH_LITERAL("Visited Links"));
|
||||
visitedlink_listener_ = new CefVisitedLinkListener;
|
||||
visitedlink_master_.reset(new visitedlink::VisitedLinkWriter(
|
||||
visitedlink_listener_, this, !visited_link_path.empty(), false,
|
||||
visited_link_path, 0));
|
||||
visitedlink_listener_->CreateListenerForContext(this);
|
||||
visitedlink_master_->Init();
|
||||
|
||||
// Initialize proxy configuration tracker.
|
||||
pref_proxy_config_tracker_.reset(new PrefProxyConfigTrackerImpl(
|
||||
GetPrefs(), base::CreateSingleThreadTaskRunner({BrowserThread::IO})));
|
||||
|
||||
// Spell checking support and possibly other subsystems retrieve the
|
||||
// PrefService associated with a BrowserContext via UserPrefs::Get().
|
||||
PrefService* pref_service = GetPrefs();
|
||||
DCHECK(pref_service);
|
||||
user_prefs::UserPrefs::Set(this, pref_service);
|
||||
key_->SetPrefs(pref_service);
|
||||
|
||||
if (extensions_enabled)
|
||||
extension_system_->Init();
|
||||
|
||||
ChromePluginServiceFilter::GetInstance()->RegisterProfile(this);
|
||||
}
|
||||
|
||||
void CefBrowserContext::AddCefRequestContext(CefRequestContextImpl* context) {
|
||||
@@ -366,36 +198,35 @@ void CefBrowserContext::RemoveCefRequestContext(
|
||||
CefRequestContextImpl* context) {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
if (extensions::ExtensionsEnabled()) {
|
||||
extension_system()->OnRequestContextDeleted(context);
|
||||
}
|
||||
|
||||
request_context_set_.erase(context);
|
||||
|
||||
// Delete ourselves when the reference count reaches zero.
|
||||
if (request_context_set_.empty())
|
||||
if (request_context_set_.empty()) {
|
||||
Shutdown();
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
CefBrowserContext* CefBrowserContext::GetForCachePath(
|
||||
CefBrowserContext* CefBrowserContext::FromCachePath(
|
||||
const base::FilePath& cache_path) {
|
||||
return g_manager.Get().GetImplForPath(cache_path);
|
||||
return g_manager.Get().GetImplFromPath(cache_path);
|
||||
}
|
||||
|
||||
// static
|
||||
CefBrowserContext* CefBrowserContext::GetForIDs(int render_process_id,
|
||||
int render_frame_id,
|
||||
int frame_tree_node_id,
|
||||
bool require_frame_match) {
|
||||
return g_manager.Get().GetImplForIDs(render_process_id, render_frame_id,
|
||||
frame_tree_node_id, require_frame_match);
|
||||
CefBrowserContext* CefBrowserContext::FromIDs(int render_process_id,
|
||||
int render_frame_id,
|
||||
int frame_tree_node_id,
|
||||
bool require_frame_match) {
|
||||
return g_manager.Get().GetImplFromIDs(render_process_id, render_frame_id,
|
||||
frame_tree_node_id,
|
||||
require_frame_match);
|
||||
}
|
||||
|
||||
// static
|
||||
CefBrowserContext* CefBrowserContext::GetForContext(
|
||||
content::BrowserContext* context) {
|
||||
return g_manager.Get().GetImplForContext(context);
|
||||
CefBrowserContext* CefBrowserContext::FromBrowserContext(
|
||||
const content::BrowserContext* context) {
|
||||
return g_manager.Get().GetImplFromBrowserContext(context);
|
||||
}
|
||||
|
||||
// static
|
||||
@@ -403,194 +234,6 @@ std::vector<CefBrowserContext*> CefBrowserContext::GetAll() {
|
||||
return g_manager.Get().GetAllImpl();
|
||||
}
|
||||
|
||||
content::ResourceContext* CefBrowserContext::GetResourceContext() {
|
||||
return resource_context_.get();
|
||||
}
|
||||
|
||||
content::ClientHintsControllerDelegate*
|
||||
CefBrowserContext::GetClientHintsControllerDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CefBrowserContext::SetCorsOriginAccessListForOrigin(
|
||||
const url::Origin& source_origin,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
|
||||
base::OnceClosure closure) {
|
||||
// This method is called for Extension support.
|
||||
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(closure));
|
||||
}
|
||||
|
||||
ChromeZoomLevelPrefs* CefBrowserContext::GetZoomLevelPrefs() {
|
||||
return static_cast<ChromeZoomLevelPrefs*>(
|
||||
GetStoragePartition(this, nullptr)->GetZoomLevelDelegate());
|
||||
}
|
||||
|
||||
scoped_refptr<network::SharedURLLoaderFactory>
|
||||
CefBrowserContext::GetURLLoaderFactory() {
|
||||
return GetDefaultStoragePartition(this)
|
||||
->GetURLLoaderFactoryForBrowserProcess();
|
||||
}
|
||||
|
||||
base::FilePath CefBrowserContext::GetPath() {
|
||||
return cache_path_;
|
||||
}
|
||||
|
||||
base::FilePath CefBrowserContext::GetPath() const {
|
||||
return cache_path_;
|
||||
}
|
||||
|
||||
std::unique_ptr<content::ZoomLevelDelegate>
|
||||
CefBrowserContext::CreateZoomLevelDelegate(
|
||||
const base::FilePath& partition_path) {
|
||||
if (cache_path_.empty())
|
||||
return std::unique_ptr<content::ZoomLevelDelegate>();
|
||||
|
||||
return base::WrapUnique(new ChromeZoomLevelPrefs(
|
||||
GetPrefs(), cache_path_, partition_path,
|
||||
zoom::ZoomEventManager::GetForBrowserContext(this)->GetWeakPtr()));
|
||||
}
|
||||
|
||||
bool CefBrowserContext::IsOffTheRecord() const {
|
||||
// CEF contexts are never flagged as off-the-record. It causes problems
|
||||
// for the extension system.
|
||||
return false;
|
||||
}
|
||||
|
||||
content::DownloadManagerDelegate*
|
||||
CefBrowserContext::GetDownloadManagerDelegate() {
|
||||
if (!download_manager_delegate_) {
|
||||
content::DownloadManager* manager =
|
||||
BrowserContext::GetDownloadManager(this);
|
||||
download_manager_delegate_.reset(new CefDownloadManagerDelegate(manager));
|
||||
}
|
||||
return download_manager_delegate_.get();
|
||||
}
|
||||
|
||||
content::BrowserPluginGuestManager* CefBrowserContext::GetGuestManager() {
|
||||
DCHECK(extensions::ExtensionsEnabled());
|
||||
return guest_view::GuestViewManager::FromBrowserContext(this);
|
||||
}
|
||||
|
||||
storage::SpecialStoragePolicy* CefBrowserContext::GetSpecialStoragePolicy() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::PushMessagingService* CefBrowserContext::GetPushMessagingService() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::StorageNotificationService*
|
||||
CefBrowserContext::GetStorageNotificationService() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::SSLHostStateDelegate* CefBrowserContext::GetSSLHostStateDelegate() {
|
||||
if (!ssl_host_state_delegate_.get())
|
||||
ssl_host_state_delegate_.reset(new CefSSLHostStateDelegate());
|
||||
return ssl_host_state_delegate_.get();
|
||||
}
|
||||
|
||||
content::PermissionControllerDelegate*
|
||||
CefBrowserContext::GetPermissionControllerDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::BackgroundFetchDelegate*
|
||||
CefBrowserContext::GetBackgroundFetchDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::BackgroundSyncController*
|
||||
CefBrowserContext::GetBackgroundSyncController() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
content::BrowsingDataRemoverDelegate*
|
||||
CefBrowserContext::GetBrowsingDataRemoverDelegate() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PrefService* CefBrowserContext::GetPrefs() {
|
||||
return pref_service_.get();
|
||||
}
|
||||
|
||||
const PrefService* CefBrowserContext::GetPrefs() const {
|
||||
return pref_service_.get();
|
||||
}
|
||||
|
||||
ProfileKey* CefBrowserContext::GetProfileKey() const {
|
||||
DCHECK(key_);
|
||||
return key_.get();
|
||||
}
|
||||
|
||||
policy::SchemaRegistryService*
|
||||
CefBrowserContext::GetPolicySchemaRegistryService() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
policy::UserCloudPolicyManager* CefBrowserContext::GetUserCloudPolicyManager() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
policy::ProfilePolicyConnector* CefBrowserContext::GetProfilePolicyConnector() {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const policy::ProfilePolicyConnector*
|
||||
CefBrowserContext::GetProfilePolicyConnector() const {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const CefRequestContextSettings& CefBrowserContext::GetSettings() const {
|
||||
return settings_;
|
||||
}
|
||||
|
||||
HostContentSettingsMap* CefBrowserContext::GetHostContentSettingsMap() {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
if (!host_content_settings_map_.get()) {
|
||||
// The |is_incognito_profile| and |is_guest_profile| arguments are
|
||||
// intentionally set to false as they otherwise limit the types of values
|
||||
// that can be stored in the settings map (for example, default values set
|
||||
// via DefaultProvider::SetWebsiteSetting).
|
||||
host_content_settings_map_ =
|
||||
new HostContentSettingsMap(GetPrefs(), false, false, false, false);
|
||||
|
||||
// Change the default plugin policy.
|
||||
const base::CommandLine* command_line =
|
||||
base::CommandLine::ForCurrentProcess();
|
||||
const std::string& plugin_policy_str =
|
||||
command_line->GetSwitchValueASCII(switches::kPluginPolicy);
|
||||
if (!plugin_policy_str.empty()) {
|
||||
ContentSetting plugin_policy = CONTENT_SETTING_ALLOW;
|
||||
if (base::LowerCaseEqualsASCII(plugin_policy_str,
|
||||
switches::kPluginPolicy_Detect)) {
|
||||
plugin_policy = CONTENT_SETTING_DETECT_IMPORTANT_CONTENT;
|
||||
} else if (base::LowerCaseEqualsASCII(plugin_policy_str,
|
||||
switches::kPluginPolicy_Block)) {
|
||||
plugin_policy = CONTENT_SETTING_BLOCK;
|
||||
}
|
||||
host_content_settings_map_->SetDefaultContentSetting(
|
||||
ContentSettingsType::PLUGINS, plugin_policy);
|
||||
}
|
||||
}
|
||||
return host_content_settings_map_.get();
|
||||
}
|
||||
|
||||
void CefBrowserContext::AddVisitedURLs(const std::vector<GURL>& urls) {
|
||||
visitedlink_master_->AddURLs(urls);
|
||||
}
|
||||
|
||||
void CefBrowserContext::RebuildTable(
|
||||
const scoped_refptr<URLEnumerator>& enumerator) {
|
||||
// Called when visited links will not or cannot be loaded from disk.
|
||||
enumerator->OnComplete(true);
|
||||
}
|
||||
|
||||
void CefBrowserContext::OnRenderFrameCreated(
|
||||
CefRequestContextImpl* request_context,
|
||||
int render_process_id,
|
||||
@@ -611,15 +254,14 @@ void CefBrowserContext::OnRenderFrameCreated(
|
||||
handler_map_.AddHandler(render_process_id, render_frame_id,
|
||||
frame_tree_node_id, handler);
|
||||
|
||||
if (resource_context_) {
|
||||
if (iothread_state_) {
|
||||
// Using base::Unretained() is safe because both this callback and
|
||||
// possible deletion of |resource_context_| will execute on the IO thread,
|
||||
// possible deletion of |iothread_state_| will execute on the IO thread,
|
||||
// and this callback will be executed first.
|
||||
CEF_POST_TASK(CEF_IOT,
|
||||
base::Bind(&CefResourceContext::AddHandler,
|
||||
base::Unretained(resource_context_.get()),
|
||||
render_process_id, render_frame_id,
|
||||
frame_tree_node_id, handler));
|
||||
CEF_POST_TASK(CEF_IOT, base::Bind(&CefIOThreadState::AddHandler,
|
||||
base::Unretained(iothread_state_.get()),
|
||||
render_process_id, render_frame_id,
|
||||
frame_tree_node_id, handler));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -650,15 +292,14 @@ void CefBrowserContext::OnRenderFrameDeleted(
|
||||
handler_map_.RemoveHandler(render_process_id, render_frame_id,
|
||||
frame_tree_node_id);
|
||||
|
||||
if (resource_context_) {
|
||||
if (iothread_state_) {
|
||||
// Using base::Unretained() is safe because both this callback and
|
||||
// possible deletion of |resource_context_| will execute on the IO thread,
|
||||
// possible deletion of |iothread_state_| will execute on the IO thread,
|
||||
// and this callback will be executed first.
|
||||
CEF_POST_TASK(
|
||||
CEF_IOT,
|
||||
base::Bind(&CefResourceContext::RemoveHandler,
|
||||
base::Unretained(resource_context_.get()),
|
||||
render_process_id, render_frame_id, frame_tree_node_id));
|
||||
CEF_POST_TASK(CEF_IOT, base::Bind(&CefIOThreadState::RemoveHandler,
|
||||
base::Unretained(iothread_state_.get()),
|
||||
render_process_id, render_frame_id,
|
||||
frame_tree_node_id));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -760,56 +401,74 @@ void CefBrowserContext::ClearPluginLoadDecision(int render_process_id) {
|
||||
}
|
||||
|
||||
void CefBrowserContext::RegisterSchemeHandlerFactory(
|
||||
const std::string& scheme_name,
|
||||
const std::string& domain_name,
|
||||
const CefString& scheme_name,
|
||||
const CefString& domain_name,
|
||||
CefRefPtr<CefSchemeHandlerFactory> factory) {
|
||||
if (resource_context_) {
|
||||
if (iothread_state_) {
|
||||
// Using base::Unretained() is safe because both this callback and possible
|
||||
// deletion of |resource_context_| will execute on the IO thread, and this
|
||||
// deletion of |iothread_state_| will execute on the IO thread, and this
|
||||
// callback will be executed first.
|
||||
CEF_POST_TASK(CEF_IOT,
|
||||
base::Bind(&CefResourceContext::RegisterSchemeHandlerFactory,
|
||||
base::Unretained(resource_context_.get()),
|
||||
base::Bind(&CefIOThreadState::RegisterSchemeHandlerFactory,
|
||||
base::Unretained(iothread_state_.get()),
|
||||
scheme_name, domain_name, factory));
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserContext::ClearSchemeHandlerFactories() {
|
||||
if (resource_context_) {
|
||||
if (iothread_state_) {
|
||||
// Using base::Unretained() is safe because both this callback and possible
|
||||
// deletion of |resource_context_| will execute on the IO thread, and this
|
||||
// deletion of |iothread_state_| will execute on the IO thread, and this
|
||||
// callback will be executed first.
|
||||
CEF_POST_TASK(CEF_IOT,
|
||||
base::Bind(&CefResourceContext::ClearSchemeHandlerFactories,
|
||||
base::Unretained(resource_context_.get())));
|
||||
base::Bind(&CefIOThreadState::ClearSchemeHandlerFactories,
|
||||
base::Unretained(iothread_state_.get())));
|
||||
}
|
||||
}
|
||||
|
||||
network::mojom::NetworkContext* CefBrowserContext::GetNetworkContext() {
|
||||
CEF_REQUIRE_UIT();
|
||||
return GetDefaultStoragePartition(this)->GetNetworkContext();
|
||||
void CefBrowserContext::LoadExtension(
|
||||
const CefString& root_directory,
|
||||
CefRefPtr<CefDictionaryValue> manifest,
|
||||
CefRefPtr<CefExtensionHandler> handler,
|
||||
CefRefPtr<CefRequestContext> loader_context) {
|
||||
NOTIMPLEMENTED();
|
||||
if (handler)
|
||||
handler->OnExtensionLoadFailed(ERR_ABORTED);
|
||||
}
|
||||
|
||||
DownloadPrefs* CefBrowserContext::GetDownloadPrefs() {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!download_prefs_) {
|
||||
download_prefs_.reset(new DownloadPrefs(this));
|
||||
}
|
||||
return download_prefs_.get();
|
||||
bool CefBrowserContext::GetExtensions(std::vector<CefString>& extension_ids) {
|
||||
NOTIMPLEMENTED();
|
||||
return false;
|
||||
}
|
||||
|
||||
CefRefPtr<CefExtension> CefBrowserContext::GetExtension(
|
||||
const CefString& extension_id) {
|
||||
NOTIMPLEMENTED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool CefBrowserContext::UnloadExtension(const CefString& extension_id) {
|
||||
NOTIMPLEMENTED();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CefBrowserContext::IsPrintPreviewSupported() const {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!extensions::PrintPreviewEnabled())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return !GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled);
|
||||
void CefBrowserContext::AddVisitedURLs(const std::vector<GURL>& urls) {}
|
||||
|
||||
network::mojom::NetworkContext* CefBrowserContext::GetNetworkContext() {
|
||||
CEF_REQUIRE_UIT();
|
||||
auto browser_context = AsBrowserContext();
|
||||
return browser_context->GetDefaultStoragePartition(browser_context)
|
||||
->GetNetworkContext();
|
||||
}
|
||||
|
||||
CefMediaRouterManager* CefBrowserContext::GetMediaRouterManager() {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!media_router_manager_) {
|
||||
media_router_manager_.reset(new CefMediaRouterManager(this));
|
||||
media_router_manager_.reset(new CefMediaRouterManager(AsBrowserContext()));
|
||||
}
|
||||
return media_router_manager_.get();
|
||||
}
|
||||
|
@@ -7,23 +7,17 @@
|
||||
#pragma once
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
#include "include/cef_request_context_handler.h"
|
||||
#include "libcef/browser/chrome_profile_stub.h"
|
||||
#include "libcef/browser/request_context_handler_map.h"
|
||||
#include "libcef/browser/resource_context.h"
|
||||
|
||||
#include "base/callback.h"
|
||||
#include "base/files/file_path.h"
|
||||
#include "base/memory/ref_counted.h"
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "chrome/browser/download/download_prefs.h"
|
||||
#include "base/optional.h"
|
||||
#include "chrome/common/plugin.mojom.h"
|
||||
#include "components/proxy_config/pref_proxy_config_tracker.h"
|
||||
#include "components/visitedlink/browser/visitedlink_delegate.h"
|
||||
#include "content/public/browser/browser_context.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "content/public/browser/content_browser_client.h"
|
||||
#include "services/network/public/mojom/network_context.mojom.h"
|
||||
#include "url/origin.h"
|
||||
|
||||
/*
|
||||
@@ -31,31 +25,30 @@
|
||||
//
|
||||
// WC = WebContents
|
||||
// Content API representation of a browser. Created by BHI or the system (for
|
||||
// popups) and owned by BHI. Keeps a pointer to BC.
|
||||
// popups) and owned by BHI. Keeps a pointer to the content::BrowserContext.
|
||||
//
|
||||
// BHI = CefBrowserHostImpl
|
||||
// Implements the CefBrowser and CefBrowserHost interfaces which are exposed
|
||||
// to clients. References an RCI instance. Owns a WC. Life span is controlled
|
||||
// by client references and CefContentBrowserClient.
|
||||
// to clients. References an RCI instance. Owns a WC. Lifespan is controlled
|
||||
// by client references and CefBrowserInfoManager (until the browser has
|
||||
// closed).
|
||||
//
|
||||
// RCI = CefRequestContextImpl
|
||||
// Implements the CefRequestContext interface which is exposed to clients.
|
||||
// References the isolated BC.
|
||||
// Creates or references a BC. Lifespan is controlled by client references and
|
||||
// BrowserMainParts (for the global RCI).
|
||||
//
|
||||
// BC = CefBrowserContext
|
||||
// Entry point from WC when using an isolated RCI. Owns the RC and creates the
|
||||
// SPI indirectly. Owned by CefBrowserMainParts for the global context or RCI
|
||||
// for non-global contexts.
|
||||
// Is/owns the content::BrowserContext which is the entry point from WC.
|
||||
// Owns the IOTS and creates the SPI indirectly. Potentially shared by
|
||||
// multiple RCI. Deletes itself when no longer needed by RCI.
|
||||
//
|
||||
// SPI = content::StoragePartitionImpl
|
||||
// Owns storage-related objects like Quota, IndexedDB, Cache, etc. Created by
|
||||
// StoragePartitionImplMap::Get(). Provides access to the URCG. Life span is
|
||||
// controlled indirectly by BC.
|
||||
// StoragePartitionImplMap::Get(). Life span is controlled indirectly by BC.
|
||||
//
|
||||
// RC = CefResourceContext
|
||||
// Acts as a bridge for resource loading. Network request life span is tied to
|
||||
// this object. Must be destroyed before the associated URCG. Life span is
|
||||
// controlled by BC.
|
||||
// IOTS = CefIOThreadState
|
||||
// Stores state for access on the IO thread. Life span is controlled by BC.
|
||||
//
|
||||
//
|
||||
// Relationship diagram:
|
||||
@@ -63,142 +56,65 @@
|
||||
// own = ownership (std::unique_ptr)
|
||||
// ptr = raw pointer
|
||||
//
|
||||
// CefBrowserMainParts
|
||||
// |
|
||||
// own
|
||||
// v
|
||||
// BHI -own-> WC -ptr-> BC -own-> SPI
|
||||
//
|
||||
// BHI -ref-> RCI -own-> BC -own-> RC
|
||||
// BHI -ref-> RCI -ptr-> BC -own-> SPI, IOTS
|
||||
// ^
|
||||
// BHI -own-> WC -ptr--/
|
||||
//
|
||||
//
|
||||
// How shutdown works:
|
||||
// 1. CefBrowserHostImpl is destroyed on any thread due to browser close,
|
||||
// ref release, etc.
|
||||
// 1. CefBrowserHostImpl::DestroyBrowser is called on the UI thread after the
|
||||
// browser is closed and deletes the WebContents.
|
||||
// 1. CefBrowserHostImpl is destroyed on any thread when the last reference
|
||||
// is released.
|
||||
// 2. CefRequestContextImpl is destroyed (possibly asynchronously) on the UI
|
||||
// thread due to CefBrowserHostImpl destruction, ref release, etc.
|
||||
// 3. CefBrowserContext is destroyed on the UI thread due to
|
||||
// CefRequestContextImpl destruction or deletion in
|
||||
// CefBrowserMainParts::PostMainMessageLoopRun().
|
||||
// 4. CefResourceContext is destroyed asynchronously on the IO thread due to
|
||||
// CefBrowserContext destruction. This cancels/destroys any pending
|
||||
// network requests.
|
||||
// thread when the last reference is released.
|
||||
// 3. CefBrowserContext is destroyed on the UI thread when no longer needed
|
||||
// by any CefRequestContextImpl (via RemoveCefRequestContext).
|
||||
// 4. CefIOThreadState is destroyed asynchronously on the IO thread after
|
||||
// the owning CefBrowserContext is destroyed.
|
||||
*/
|
||||
|
||||
class CefDownloadManagerDelegate;
|
||||
namespace content {
|
||||
class BrowserContext;
|
||||
}
|
||||
|
||||
class CefMediaRouterManager;
|
||||
class CefRequestContextImpl;
|
||||
class CefSSLHostStateDelegate;
|
||||
class CefVisitedLinkListener;
|
||||
class HostContentSettingsMap;
|
||||
class PrefService;
|
||||
class CefIOThreadState;
|
||||
class Profile;
|
||||
|
||||
namespace extensions {
|
||||
class CefExtensionSystem;
|
||||
}
|
||||
|
||||
namespace visitedlink {
|
||||
class VisitedLinkWriter;
|
||||
}
|
||||
|
||||
// Main entry point for configuring behavior on a per-browser basis. An instance
|
||||
// of this class is passed to WebContents::Create in CefBrowserHostImpl::
|
||||
// CreateInternal. Only accessed on the UI thread unless otherwise indicated.
|
||||
class CefBrowserContext : public ChromeProfileStub,
|
||||
public visitedlink::VisitedLinkDelegate {
|
||||
// Main entry point for configuring behavior on a per-RequestContext basis. The
|
||||
// content::BrowserContext represented by this class is passed to
|
||||
// WebContents::Create in CefBrowserHostImpl::CreateInternal. Only accessed on
|
||||
// the UI thread unless otherwise indicated.
|
||||
class CefBrowserContext {
|
||||
public:
|
||||
explicit CefBrowserContext(const CefRequestContextSettings& settings);
|
||||
|
||||
// Returns the existing instance, if any, associated with the specified
|
||||
// |cache_path|.
|
||||
static CefBrowserContext* GetForCachePath(const base::FilePath& cache_path);
|
||||
static CefBrowserContext* FromCachePath(const base::FilePath& cache_path);
|
||||
|
||||
// Returns the existing instance, if any, associated with the specified IDs.
|
||||
// See comments on IsAssociatedContext() for usage.
|
||||
static CefBrowserContext* GetForIDs(int render_process_id,
|
||||
int render_frame_id,
|
||||
int frame_tree_node_id,
|
||||
bool require_frame_match);
|
||||
static CefBrowserContext* FromIDs(int render_process_id,
|
||||
int render_frame_id,
|
||||
int frame_tree_node_id,
|
||||
bool require_frame_match);
|
||||
|
||||
// Returns the underlying CefBrowserContext if any.
|
||||
static CefBrowserContext* GetForContext(content::BrowserContext* context);
|
||||
static CefBrowserContext* FromBrowserContext(
|
||||
const content::BrowserContext* context);
|
||||
|
||||
// Returns all existing CefBrowserContext.
|
||||
static std::vector<CefBrowserContext*> GetAll();
|
||||
|
||||
// Must be called immediately after this object is created.
|
||||
void Initialize();
|
||||
// Returns the content and chrome layer representations of the context.
|
||||
virtual content::BrowserContext* AsBrowserContext() = 0;
|
||||
virtual Profile* AsProfile() = 0;
|
||||
|
||||
// Track associated CefRequestContextImpl objects. This object will delete
|
||||
// itself when the count reaches zero.
|
||||
// Called from CefRequestContextImpl to track associated objects. This
|
||||
// object will delete itself when the count reaches zero.
|
||||
void AddCefRequestContext(CefRequestContextImpl* context);
|
||||
void RemoveCefRequestContext(CefRequestContextImpl* context);
|
||||
|
||||
// BrowserContext methods.
|
||||
content::ResourceContext* GetResourceContext() override;
|
||||
content::ClientHintsControllerDelegate* GetClientHintsControllerDelegate()
|
||||
override;
|
||||
void SetCorsOriginAccessListForOrigin(
|
||||
const url::Origin& source_origin,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,
|
||||
std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
|
||||
base::OnceClosure closure) override;
|
||||
base::FilePath GetPath() override;
|
||||
base::FilePath GetPath() const override;
|
||||
std::unique_ptr<content::ZoomLevelDelegate> CreateZoomLevelDelegate(
|
||||
const base::FilePath& partition_path) override;
|
||||
bool IsOffTheRecord() const override;
|
||||
content::DownloadManagerDelegate* GetDownloadManagerDelegate() override;
|
||||
content::BrowserPluginGuestManager* GetGuestManager() override;
|
||||
storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override;
|
||||
content::PushMessagingService* GetPushMessagingService() override;
|
||||
content::StorageNotificationService* GetStorageNotificationService() override;
|
||||
content::SSLHostStateDelegate* GetSSLHostStateDelegate() override;
|
||||
content::PermissionControllerDelegate* GetPermissionControllerDelegate()
|
||||
override;
|
||||
content::BackgroundFetchDelegate* GetBackgroundFetchDelegate() override;
|
||||
content::BackgroundSyncController* GetBackgroundSyncController() override;
|
||||
content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate()
|
||||
override;
|
||||
|
||||
// Profile methods.
|
||||
ChromeZoomLevelPrefs* GetZoomLevelPrefs() override;
|
||||
scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
|
||||
PrefService* GetPrefs() override;
|
||||
bool AllowsBrowserWindows() const override { return false; }
|
||||
const PrefService* GetPrefs() const override;
|
||||
ProfileKey* GetProfileKey() const override;
|
||||
policy::SchemaRegistryService* GetPolicySchemaRegistryService() override;
|
||||
policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
|
||||
policy::ProfilePolicyConnector* GetProfilePolicyConnector() override;
|
||||
const policy::ProfilePolicyConnector* GetProfilePolicyConnector()
|
||||
const override;
|
||||
|
||||
// Values checked in ProfileNetworkContextService::CreateNetworkContextParams
|
||||
// when creating the NetworkContext.
|
||||
bool ShouldRestoreOldSessionCookies() override {
|
||||
return should_persist_session_cookies_;
|
||||
}
|
||||
bool ShouldPersistSessionCookies() override {
|
||||
return should_persist_session_cookies_;
|
||||
}
|
||||
base::Optional<std::vector<std::string>> GetCookieableSchemes() override {
|
||||
return cookieable_schemes_;
|
||||
}
|
||||
|
||||
// visitedlink::VisitedLinkDelegate methods.
|
||||
void RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) override;
|
||||
|
||||
// Returns the settings associated with this object. Safe to call from any
|
||||
// thread.
|
||||
const CefRequestContextSettings& GetSettings() const;
|
||||
|
||||
// Settings for plugins and extensions.
|
||||
HostContentSettingsMap* GetHostContentSettingsMap();
|
||||
|
||||
// Called from CefBrowserHostImpl::DidNavigateAnyFrame to update the table of
|
||||
// visited links.
|
||||
void AddVisitedURLs(const std::vector<GURL>& urls);
|
||||
virtual void RemoveCefRequestContext(CefRequestContextImpl* context);
|
||||
|
||||
// Called from CefRequestContextImpl::OnRenderFrameCreated.
|
||||
void OnRenderFrameCreated(CefRequestContextImpl* request_context,
|
||||
@@ -254,79 +170,72 @@ class CefBrowserContext : public ChromeProfileStub,
|
||||
void ClearPluginLoadDecision(int render_process_id);
|
||||
|
||||
// Called from CefRequestContextImpl methods of the same name.
|
||||
void RegisterSchemeHandlerFactory(const std::string& scheme_name,
|
||||
const std::string& domain_name,
|
||||
void RegisterSchemeHandlerFactory(const CefString& scheme_name,
|
||||
const CefString& domain_name,
|
||||
CefRefPtr<CefSchemeHandlerFactory> factory);
|
||||
void ClearSchemeHandlerFactories();
|
||||
// TODO(chrome-runtime): Make these extension methods pure virtual.
|
||||
virtual void LoadExtension(const CefString& root_directory,
|
||||
CefRefPtr<CefDictionaryValue> manifest,
|
||||
CefRefPtr<CefExtensionHandler> handler,
|
||||
CefRefPtr<CefRequestContext> loader_context);
|
||||
virtual bool GetExtensions(std::vector<CefString>& extension_ids);
|
||||
virtual CefRefPtr<CefExtension> GetExtension(const CefString& extension_id);
|
||||
|
||||
// Called from CefExtensionImpl::Unload().
|
||||
virtual bool UnloadExtension(const CefString& extension_id);
|
||||
|
||||
// Returns true if this context supports print preview.
|
||||
virtual bool IsPrintPreviewSupported() const;
|
||||
|
||||
// Called from CefBrowserHostImpl::DidNavigateAnyFrame to update the table of
|
||||
// visited links.
|
||||
virtual void AddVisitedURLs(const std::vector<GURL>& urls);
|
||||
|
||||
network::mojom::NetworkContext* GetNetworkContext();
|
||||
|
||||
void set_should_persist_session_cookies(bool value) {
|
||||
should_persist_session_cookies_ = value;
|
||||
}
|
||||
void set_cookieable_schemes(
|
||||
base::Optional<std::vector<std::string>> schemes) {
|
||||
cookieable_schemes_ = schemes;
|
||||
}
|
||||
|
||||
CefResourceContext* resource_context() const {
|
||||
return resource_context_.get();
|
||||
}
|
||||
extensions::CefExtensionSystem* extension_system() const {
|
||||
return extension_system_;
|
||||
}
|
||||
|
||||
// Called from DownloadPrefs::FromBrowserContext.
|
||||
DownloadPrefs* GetDownloadPrefs();
|
||||
|
||||
// Returns true if this context supports print preview.
|
||||
bool IsPrintPreviewSupported() const;
|
||||
|
||||
CefMediaRouterManager* GetMediaRouterManager();
|
||||
|
||||
// Returns the BrowserContext, or nullptr if the BrowserContext has already
|
||||
// been destroyed.
|
||||
using CookieableSchemes = base::Optional<std::vector<std::string>>;
|
||||
void set_cookieable_schemes(const CookieableSchemes& schemes) {
|
||||
cookieable_schemes_ = schemes;
|
||||
}
|
||||
CookieableSchemes cookieable_schemes() const { return cookieable_schemes_; }
|
||||
|
||||
// These accessors are safe to call from any thread because the values don't
|
||||
// change during this object's lifespan.
|
||||
const CefRequestContextSettings& settings() const { return settings_; }
|
||||
base::FilePath cache_path() const { return cache_path_; }
|
||||
CefIOThreadState* iothread_state() const { return iothread_state_.get(); }
|
||||
|
||||
// Used to hold a WeakPtr reference to this this object. The Getter returns
|
||||
// nullptr if this object has already been destroyed.
|
||||
using Getter = base::RepeatingCallback<CefBrowserContext*()>;
|
||||
Getter getter() const { return getter_; }
|
||||
|
||||
private:
|
||||
// Allow deletion via std::unique_ptr().
|
||||
friend std::default_delete<CefBrowserContext>;
|
||||
protected:
|
||||
explicit CefBrowserContext(const CefRequestContextSettings& settings);
|
||||
virtual ~CefBrowserContext();
|
||||
|
||||
~CefBrowserContext() override;
|
||||
// Will be called immediately after this object is created.
|
||||
virtual void Initialize();
|
||||
|
||||
// Members initialized during construction are safe to access from any thread.
|
||||
// Will be called immediately before this object is deleted.
|
||||
virtual void Shutdown();
|
||||
|
||||
// Members initialized during construction or Initialize() are safe to access
|
||||
// from any thread.
|
||||
const CefRequestContextSettings settings_;
|
||||
base::FilePath cache_path_;
|
||||
|
||||
private:
|
||||
std::unique_ptr<CefIOThreadState> iothread_state_;
|
||||
CookieableSchemes cookieable_schemes_;
|
||||
std::unique_ptr<CefMediaRouterManager> media_router_manager_;
|
||||
|
||||
// CefRequestContextImpl objects referencing this object.
|
||||
std::set<CefRequestContextImpl*> request_context_set_;
|
||||
|
||||
std::unique_ptr<PrefService> pref_service_;
|
||||
std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
|
||||
|
||||
std::unique_ptr<CefDownloadManagerDelegate> download_manager_delegate_;
|
||||
std::unique_ptr<CefSSLHostStateDelegate> ssl_host_state_delegate_;
|
||||
scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
|
||||
std::unique_ptr<visitedlink::VisitedLinkWriter> visitedlink_master_;
|
||||
// |visitedlink_listener_| is owned by visitedlink_master_.
|
||||
CefVisitedLinkListener* visitedlink_listener_;
|
||||
bool should_persist_session_cookies_ = false;
|
||||
base::Optional<std::vector<std::string>> cookieable_schemes_;
|
||||
|
||||
std::unique_ptr<CefResourceContext> resource_context_;
|
||||
|
||||
// Owned by the KeyedService system.
|
||||
extensions::CefExtensionSystem* extension_system_ = nullptr;
|
||||
|
||||
// The key to index KeyedService instances created by
|
||||
// SimpleKeyedServiceFactory.
|
||||
std::unique_ptr<ProfileKey> key_;
|
||||
|
||||
std::unique_ptr<DownloadPrefs> download_prefs_;
|
||||
|
||||
std::unique_ptr<CefMediaRouterManager> media_router_manager_;
|
||||
|
||||
// Map IDs to CefRequestContextHandler objects.
|
||||
CefRequestContextHandlerMap handler_map_;
|
||||
|
||||
@@ -350,6 +259,10 @@ class CefBrowserContext : public ChromeProfileStub,
|
||||
typedef std::set<int> NodeIdSet;
|
||||
NodeIdSet node_id_set_;
|
||||
|
||||
#if DCHECK_IS_ON()
|
||||
bool is_shutdown_ = false;
|
||||
#endif
|
||||
|
||||
Getter getter_;
|
||||
base::WeakPtrFactory<CefBrowserContext> weak_ptr_factory_;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -42,6 +42,10 @@ class Extension;
|
||||
class ExtensionHost;
|
||||
} // namespace extensions
|
||||
|
||||
namespace gfx {
|
||||
class ImageSkia;
|
||||
}
|
||||
|
||||
#if defined(USE_AURA)
|
||||
namespace views {
|
||||
class Widget;
|
||||
@@ -51,7 +55,7 @@ class Widget;
|
||||
class CefAudioCapturer;
|
||||
class CefBrowserInfo;
|
||||
class CefBrowserPlatformDelegate;
|
||||
class CefDevToolsFrontend;
|
||||
class CefDevToolsManager;
|
||||
class SiteInstance;
|
||||
|
||||
// Implementation of CefBrowser.
|
||||
@@ -192,6 +196,12 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
const CefPoint& inspect_element_at) override;
|
||||
void CloseDevTools() override;
|
||||
bool HasDevTools() override;
|
||||
bool SendDevToolsMessage(const void* message, size_t message_size) override;
|
||||
int ExecuteDevToolsMethod(int message_id,
|
||||
const CefString& method,
|
||||
CefRefPtr<CefDictionaryValue> params) override;
|
||||
CefRefPtr<CefRegistration> AddDevToolsMessageObserver(
|
||||
CefRefPtr<CefDevToolsMessageObserver> observer) override;
|
||||
void GetNavigationEntries(CefRefPtr<CefNavigationEntryVisitor> visitor,
|
||||
bool current_only) override;
|
||||
void SetMouseCursorChangeDisabled(bool disabled) override;
|
||||
@@ -275,9 +285,6 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
// Returns true if this browser is views-hosted.
|
||||
bool IsViewsHosted() const;
|
||||
|
||||
// Returns true if this browser supports print preview.
|
||||
bool IsPrintPreviewSupported() const;
|
||||
|
||||
// Returns true if this browser supports picture-in-picture.
|
||||
bool IsPictureInPictureSupported() const;
|
||||
|
||||
@@ -344,8 +351,8 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
}
|
||||
|
||||
// Accessors that must be called on the UI thread.
|
||||
content::BrowserContext* GetBrowserContext();
|
||||
extensions::ExtensionHost* extension_host() const { return extension_host_; }
|
||||
content::BrowserContext* GetBrowserContext() const;
|
||||
extensions::ExtensionHost* GetExtensionHost() const;
|
||||
|
||||
void OnSetFocus(cef_focus_source_t source);
|
||||
|
||||
@@ -358,12 +365,6 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
bool HandleContextMenu(content::WebContents* web_contents,
|
||||
const content::ContextMenuParams& params);
|
||||
|
||||
// Returns the WebContents most likely to handle an action. If extensions are
|
||||
// enabled and this browser has a full-page guest (for example, a full-page
|
||||
// PDF viewer extension) then the guest's WebContents will be returned.
|
||||
// Otherwise, the browser's WebContents will be returned.
|
||||
content::WebContents* GetActionableWebContents() const;
|
||||
|
||||
enum DestructionState {
|
||||
DESTRUCTION_STATE_NONE = 0,
|
||||
DESTRUCTION_STATE_PENDING,
|
||||
@@ -398,7 +399,6 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
bool proceed,
|
||||
bool* proceed_to_fire_unload) override;
|
||||
bool TakeFocus(content::WebContents* source, bool reverse) override;
|
||||
|
||||
bool HandleContextMenu(content::RenderFrameHost* render_frame_host,
|
||||
const content::ContextMenuParams& params) override;
|
||||
content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
|
||||
@@ -434,8 +434,7 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
const blink::mojom::FileChooserParams& params) override;
|
||||
bool EmbedsFullscreenWidget() override;
|
||||
void EnterFullscreenModeForTab(
|
||||
content::WebContents* web_contents,
|
||||
const GURL& origin,
|
||||
content::RenderFrameHost* requesting_frame,
|
||||
const blink::mojom::FullscreenOptions& options) override;
|
||||
void ExitFullscreenModeForTab(content::WebContents* web_contents) override;
|
||||
bool IsFullscreenForTabOrPending(
|
||||
@@ -487,6 +486,7 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
void PluginCrashed(const base::FilePath& plugin_path,
|
||||
base::ProcessId plugin_pid) override;
|
||||
void DidUpdateFaviconURL(
|
||||
content::RenderFrameHost* render_frame_host,
|
||||
const std::vector<blink::mojom::FaviconURLPtr>& candidates) override;
|
||||
void OnAudioStateChanged(bool audible) override;
|
||||
bool OnMessageReceived(const IPC::Message& message,
|
||||
@@ -497,9 +497,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
void AccessibilityLocationChangesReceived(
|
||||
const std::vector<content::AXLocationChangeNotificationDetails>& locData)
|
||||
override;
|
||||
|
||||
void OnWebContentsFocused(
|
||||
content::RenderWidgetHost* render_widget_host) override;
|
||||
void WebContentsDestroyed() override;
|
||||
|
||||
// Manage observer objects. The observer must either outlive this object or
|
||||
// remove itself before destruction. These methods can only be called on the
|
||||
@@ -523,7 +523,7 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
std::unique_ptr<NavigationLock> CreateNavigationLock();
|
||||
|
||||
private:
|
||||
class DevToolsWebContentsObserver;
|
||||
friend class CefBrowserPlatformDelegateAlloy;
|
||||
|
||||
static CefRefPtr<CefBrowserHostImpl> CreateInternal(
|
||||
const CefBrowserSettings& settings,
|
||||
@@ -552,20 +552,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
std::unique_ptr<CefBrowserPlatformDelegate> platform_delegate,
|
||||
CefRefPtr<CefExtension> extension);
|
||||
|
||||
void set_owned_web_contents(content::WebContents* owned_contents);
|
||||
|
||||
// Give the platform delegate an opportunity to create the host window.
|
||||
bool CreateHostWindow();
|
||||
|
||||
// Create/delete the host for extensions.
|
||||
void CreateExtensionHost(const extensions::Extension* extension,
|
||||
content::BrowserContext* browser_context,
|
||||
content::WebContents* host_contents,
|
||||
const GURL& url,
|
||||
extensions::ViewType host_type);
|
||||
void DestroyExtensionHost();
|
||||
void OnExtensionHostDeleted();
|
||||
|
||||
// Returns true if navigation actions are currently locked.
|
||||
bool navigation_locked() const;
|
||||
// Action to be executed once the navigation lock is released.
|
||||
@@ -581,16 +570,16 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
void OnFullscreenModeChange(bool fullscreen);
|
||||
void OnTitleChange(const base::string16& title);
|
||||
|
||||
void OnDevToolsWebContentsDestroyed();
|
||||
|
||||
// Create the CefFileDialogManager if it doesn't already exist.
|
||||
void EnsureFileDialogManager();
|
||||
|
||||
void ConfigureAutoResize();
|
||||
|
||||
void StartAudioCapturer();
|
||||
void OnRecentlyAudibleTimerFired();
|
||||
|
||||
bool EnsureDevToolsManager();
|
||||
void InitializeDevToolsRegistrationOnUIThread(
|
||||
CefRefPtr<CefRegistration> registration);
|
||||
|
||||
CefBrowserSettings settings_;
|
||||
CefRefPtr<CefClient> client_;
|
||||
scoped_refptr<CefBrowserInfo> browser_info_;
|
||||
@@ -599,28 +588,24 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
std::unique_ptr<CefBrowserPlatformDelegate> platform_delegate_;
|
||||
const bool is_windowless_;
|
||||
const bool is_views_hosted_;
|
||||
CefWindowHandle host_window_handle_;
|
||||
|
||||
// Non-nullptr if this object owns the WebContents. Will be nullptr for popup
|
||||
// browsers between the calls to WebContentsCreated() and AddNewContents(),
|
||||
// and may never be set if the parent browser is destroyed during popup
|
||||
// creation.
|
||||
std::unique_ptr<content::WebContents> owned_web_contents_;
|
||||
CefWindowHandle host_window_handle_ = kNullWindowHandle;
|
||||
CefRefPtr<CefExtension> extension_;
|
||||
bool is_background_host_ = false;
|
||||
|
||||
// Volatile state information. All access must be protected by the state lock.
|
||||
base::Lock state_lock_;
|
||||
bool is_loading_;
|
||||
bool can_go_back_;
|
||||
bool can_go_forward_;
|
||||
bool has_document_;
|
||||
bool is_fullscreen_;
|
||||
bool is_loading_ = false;
|
||||
bool can_go_back_ = false;
|
||||
bool can_go_forward_ = false;
|
||||
bool has_document_ = false;
|
||||
bool is_fullscreen_ = false;
|
||||
|
||||
// The currently focused frame, or nullptr if the main frame is focused.
|
||||
CefRefPtr<CefFrameHostImpl> focused_frame_;
|
||||
|
||||
// Represents the current browser destruction state. Only accessed on the UI
|
||||
// thread.
|
||||
DestructionState destruction_state_;
|
||||
DestructionState destruction_state_ = DESTRUCTION_STATE_NONE;
|
||||
|
||||
// Navigation will not occur while |navigation_lock_count_| > 0.
|
||||
// |pending_navigation_action_| will be executed when the lock is released.
|
||||
@@ -630,18 +615,18 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
|
||||
// True if the OS window hosting the browser has been destroyed. Only accessed
|
||||
// on the UI thread.
|
||||
bool window_destroyed_;
|
||||
bool window_destroyed_ = false;
|
||||
|
||||
// True if currently in the OnSetFocus callback. Only accessed on the UI
|
||||
// thread.
|
||||
bool is_in_onsetfocus_;
|
||||
bool is_in_onsetfocus_ = false;
|
||||
|
||||
// True if the focus is currently on an editable field on the page. Only
|
||||
// accessed on the UI thread.
|
||||
bool focus_on_editable_field_;
|
||||
bool focus_on_editable_field_ = false;
|
||||
|
||||
// True if mouse cursor change is disabled.
|
||||
bool mouse_cursor_change_disabled_;
|
||||
bool mouse_cursor_change_disabled_ = false;
|
||||
|
||||
// Used for managing notification subscriptions.
|
||||
std::unique_ptr<content::NotificationRegistrar> registrar_;
|
||||
@@ -655,24 +640,12 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
// Used for creating and managing context menus.
|
||||
std::unique_ptr<CefMenuManager> menu_manager_;
|
||||
|
||||
// Track the lifespan of the frontend WebContents associated with this
|
||||
// browser.
|
||||
std::unique_ptr<DevToolsWebContentsObserver> devtools_observer_;
|
||||
// CefDevToolsFrontend will delete itself when the frontend WebContents is
|
||||
// destroyed.
|
||||
CefDevToolsFrontend* devtools_frontend_;
|
||||
// Used for creating and managing DevTools instances.
|
||||
std::unique_ptr<CefDevToolsManager> devtools_manager_;
|
||||
|
||||
// Observers that want to be notified of changes to this object.
|
||||
base::ObserverList<Observer>::Unchecked observers_;
|
||||
|
||||
// Used to provide unique incremental IDs for each find request.
|
||||
int find_request_id_counter_ = 0;
|
||||
|
||||
// Used when the browser is hosting an extension.
|
||||
extensions::ExtensionHost* extension_host_ = nullptr;
|
||||
CefRefPtr<CefExtension> extension_;
|
||||
bool is_background_host_ = false;
|
||||
|
||||
// Used for capturing audio for CefAudioHandler.
|
||||
std::unique_ptr<CefAudioCapturer> audio_capturer_;
|
||||
|
||||
@@ -681,11 +654,6 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
// being audible again before it fires.
|
||||
base::OneShotTimer recently_audible_timer_;
|
||||
|
||||
// Used with auto-resize.
|
||||
bool auto_resize_enabled_ = false;
|
||||
gfx::Size auto_resize_min_;
|
||||
gfx::Size auto_resize_max_;
|
||||
|
||||
IMPLEMENT_REFCOUNTING(CefBrowserHostImpl);
|
||||
DISALLOW_COPY_AND_ASSIGN(CefBrowserHostImpl);
|
||||
};
|
||||
|
@@ -22,6 +22,8 @@
|
||||
#include "content/public/browser/render_process_host.h"
|
||||
#include "content/public/browser/web_contents.h"
|
||||
#include "content/public/common/child_process_host.h"
|
||||
#include "content/public/common/url_constants.h"
|
||||
#include "extensions/common/constants.h"
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -115,26 +117,13 @@ bool CefBrowserInfoManager::CanCreateWindow(
|
||||
bool* no_javascript_access) {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
bool is_guest_view = false;
|
||||
CefRefPtr<CefBrowserHostImpl> browser =
|
||||
extensions::GetOwnerBrowserForHost(opener, &is_guest_view);
|
||||
DCHECK(browser.get());
|
||||
if (!browser.get()) {
|
||||
// Cancel the popup.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_guest_view) {
|
||||
content::OpenURLParams params(target_url, referrer, disposition,
|
||||
ui::PAGE_TRANSITION_LINK, true);
|
||||
params.user_gesture = user_gesture;
|
||||
|
||||
// Pass navigation to the owner browser.
|
||||
CEF_POST_TASK(
|
||||
CEF_UIT,
|
||||
base::Bind(base::IgnoreResult(&CefBrowserHostImpl::OpenURLFromTab),
|
||||
browser.get(), nullptr, params));
|
||||
content::OpenURLParams params(target_url, referrer, disposition,
|
||||
ui::PAGE_TRANSITION_LINK,
|
||||
/*is_renderer_initiated=*/true);
|
||||
params.user_gesture = user_gesture;
|
||||
|
||||
CefRefPtr<CefBrowserHostImpl> browser;
|
||||
if (!MaybeAllowNavigation(opener, params, browser) || !browser) {
|
||||
// Cancel the popup.
|
||||
return false;
|
||||
}
|
||||
@@ -369,6 +358,38 @@ CefBrowserInfoManager::GetBrowserInfoForFrameRoute(int render_process_id,
|
||||
return GetBrowserInfo(render_process_id, render_routing_id, is_guest_view);
|
||||
}
|
||||
|
||||
bool CefBrowserInfoManager::MaybeAllowNavigation(
|
||||
content::RenderFrameHost* opener,
|
||||
const content::OpenURLParams& params,
|
||||
CefRefPtr<CefBrowserHostImpl>& browser_out) const {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
bool is_guest_view = false;
|
||||
CefRefPtr<CefBrowserHostImpl> browser =
|
||||
extensions::GetOwnerBrowserForHost(opener, &is_guest_view);
|
||||
if (!browser) {
|
||||
// Print preview uses a modal dialog where we don't own the WebContents.
|
||||
// Allow that navigation to proceed.
|
||||
return true;
|
||||
}
|
||||
|
||||
if (is_guest_view && !params.url.SchemeIs(extensions::kExtensionScheme) &&
|
||||
!params.url.SchemeIs(content::kChromeUIScheme)) {
|
||||
// The PDF viewer will load the PDF extension in the guest view, and print
|
||||
// preview will load chrome://print in the guest view. All other navigations
|
||||
// are passed to the owner browser.
|
||||
CEF_POST_TASK(
|
||||
CEF_UIT,
|
||||
base::Bind(base::IgnoreResult(&CefBrowserHostImpl::OpenURLFromTab),
|
||||
browser.get(), nullptr, params));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
browser_out = browser;
|
||||
return true;
|
||||
}
|
||||
|
||||
scoped_refptr<CefBrowserInfo>
|
||||
CefBrowserInfoManager::GetBrowserInfoForFrameTreeNode(int frame_tree_node_id,
|
||||
bool* is_guest_view) {
|
||||
|
@@ -25,6 +25,7 @@ struct WebWindowFeatures;
|
||||
}
|
||||
|
||||
namespace content {
|
||||
struct OpenURLParams;
|
||||
struct Referrer;
|
||||
class RenderFrameHost;
|
||||
class RenderViewHostDelegateView;
|
||||
@@ -63,7 +64,7 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
||||
bool is_windowless,
|
||||
CefRefPtr<CefDictionaryValue> extra_info);
|
||||
|
||||
// Called from CefContentBrowserClient::CanCreateWindow. See comments on
|
||||
// Called from AlloyContentBrowserClient::CanCreateWindow. See comments on
|
||||
// PendingPopup for more information.
|
||||
bool CanCreateWindow(content::RenderFrameHost* opener,
|
||||
const GURL& target_url,
|
||||
@@ -138,12 +139,19 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
||||
typedef std::list<scoped_refptr<CefBrowserInfo>> BrowserInfoList;
|
||||
BrowserInfoList GetBrowserInfoList();
|
||||
|
||||
// Returns true if the navigation should be allowed to proceed, or false if
|
||||
// the navigation will instead be sent via OpenURLFromTab. If allowed,
|
||||
// |browser| will be set to the target browser if any.
|
||||
bool MaybeAllowNavigation(content::RenderFrameHost* opener,
|
||||
const content::OpenURLParams& params,
|
||||
CefRefPtr<CefBrowserHostImpl>& browser) const;
|
||||
|
||||
private:
|
||||
// RenderProcessHostObserver methods:
|
||||
void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
|
||||
|
||||
// Store state information about pending popups. Call order is:
|
||||
// - CefContentBrowserClient::CanCreateWindow (UIT)
|
||||
// - AlloyContentBrowserClient::CanCreateWindow (UIT)
|
||||
// Provides an opportunity to cancel the popup (calls OnBeforePopup) and
|
||||
// creates the new platform delegate for the popup. If the popup owner is
|
||||
// an extension guest view then the popup is canceled and
|
||||
|
@@ -7,8 +7,8 @@
|
||||
|
||||
#include "libcef/browser/browser_info_manager.h"
|
||||
#include "libcef/browser/origin_whitelist_impl.h"
|
||||
#include "libcef/common/app_manager.h"
|
||||
#include "libcef/common/cef_messages.h"
|
||||
#include "libcef/common/content_client.h"
|
||||
#include "libcef/common/values_impl.h"
|
||||
|
||||
#include "base/bind.h"
|
||||
@@ -42,18 +42,6 @@ bool CefBrowserMessageFilter::OnMessageReceived(const IPC::Message& message) {
|
||||
void CefBrowserMessageFilter::OnGetNewRenderThreadInfo(
|
||||
CefProcessHostMsg_GetNewRenderThreadInfo_Params* params) {
|
||||
GetCrossOriginWhitelistEntries(¶ms->cross_origin_whitelist_entries);
|
||||
|
||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||
if (app.get()) {
|
||||
CefRefPtr<CefBrowserProcessHandler> handler =
|
||||
app->GetBrowserProcessHandler();
|
||||
if (handler.get()) {
|
||||
CefRefPtr<CefListValueImpl> listValuePtr(
|
||||
new CefListValueImpl(¶ms->extra_info, false, false));
|
||||
handler->OnRenderProcessThreadCreated(listValuePtr.get());
|
||||
listValuePtr->Detach(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserMessageFilter::OnGetNewBrowserInfo(int render_frame_routing_id,
|
||||
|
@@ -3,8 +3,7 @@
|
||||
// be found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/browser_message_loop.h"
|
||||
#include "libcef/browser/context.h"
|
||||
#include "libcef/common/content_client.h"
|
||||
#include "libcef/common/app_manager.h"
|
||||
|
||||
#include "base/memory/ptr_util.h"
|
||||
#include "base/message_loop/message_pump.h"
|
||||
@@ -71,19 +70,21 @@ class MessagePumpExternal : public base::MessagePumpForUI {
|
||||
// is_immediate() returns true if the next task is ready right away.
|
||||
more_immediate_work = next_work_info.is_immediate();
|
||||
if (!more_immediate_work) {
|
||||
// DoIdleWork() returns true if idle work was all done.
|
||||
more_idle_work = !delegate->DoIdleWork();
|
||||
|
||||
// Check the next PendingTask's |delayed_run_time|.
|
||||
// is_max() returns true if there are no more immediate nor delayed tasks.
|
||||
more_delayed_work = !next_work_info.delayed_run_time.is_max();
|
||||
if (more_delayed_work && !more_idle_work) {
|
||||
if (more_delayed_work) {
|
||||
// The only remaining work that we know about is the PendingTask.
|
||||
// Consider the run time for that task in the time slice calculation.
|
||||
*next_run_time = next_work_info.delayed_run_time;
|
||||
}
|
||||
}
|
||||
|
||||
if (!more_immediate_work && !more_delayed_work) {
|
||||
// DoIdleWork() returns true if idle work was all done.
|
||||
more_idle_work = !delegate->DoIdleWork();
|
||||
}
|
||||
|
||||
return more_immediate_work || more_idle_work || more_delayed_work;
|
||||
}
|
||||
|
||||
@@ -92,7 +93,7 @@ class MessagePumpExternal : public base::MessagePumpForUI {
|
||||
};
|
||||
|
||||
CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() {
|
||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||
CefRefPtr<CefApp> app = CefAppManager::Get()->GetApplication();
|
||||
if (app)
|
||||
return app->GetBrowserProcessHandler();
|
||||
return nullptr;
|
||||
@@ -116,9 +117,6 @@ std::unique_ptr<base::MessagePump> MessagePumpFactoryForUI() {
|
||||
|
||||
} // namespace
|
||||
|
||||
void InitMessagePumpFactoryForUI() {
|
||||
const CefSettings& settings = CefContext::Get()->settings();
|
||||
if (settings.external_message_pump) {
|
||||
base::MessagePump::OverrideMessagePumpForUIFactory(MessagePumpFactoryForUI);
|
||||
}
|
||||
void InitExternalMessagePumpFactoryForUI() {
|
||||
base::MessagePump::OverrideMessagePumpForUIFactory(MessagePumpFactoryForUI);
|
||||
}
|
||||
|
@@ -5,6 +5,6 @@
|
||||
#ifndef CEF_LIBCEF_BROWSER_BROWSER_MESSAGE_LOOP_H_
|
||||
#define CEF_LIBCEF_BROWSER_BROWSER_MESSAGE_LOOP_H_
|
||||
|
||||
void InitMessagePumpFactoryForUI();
|
||||
void InitExternalMessagePumpFactoryForUI();
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_BROWSER_MESSAGE_LOOP_H_
|
||||
|
@@ -5,16 +5,10 @@
|
||||
#include "libcef/browser/browser_platform_delegate.h"
|
||||
|
||||
#include "libcef/browser/browser_host_impl.h"
|
||||
#include "libcef/browser/osr/browser_platform_delegate_osr.h"
|
||||
#include "libcef/browser/web_contents_dialog_helper.h"
|
||||
#include "libcef/common/extensions/extensions_util.h"
|
||||
|
||||
#include "base/logging.h"
|
||||
#include "content/browser/renderer_host/render_widget_host_impl.h"
|
||||
#include "content/public/browser/render_view_host.h"
|
||||
#include "content/public/browser/render_widget_host.h"
|
||||
|
||||
CefBrowserPlatformDelegate::CefBrowserPlatformDelegate() {}
|
||||
CefBrowserPlatformDelegate::CefBrowserPlatformDelegate() = default;
|
||||
|
||||
CefBrowserPlatformDelegate::~CefBrowserPlatformDelegate() {
|
||||
DCHECK(!browser_);
|
||||
@@ -27,25 +21,62 @@ void CefBrowserPlatformDelegate::CreateViewForWebContents(
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::WebContentsCreated(
|
||||
content::WebContents* web_contents) {}
|
||||
content::WebContents* web_contents,
|
||||
bool owned) {
|
||||
// We should not have a browser at this point.
|
||||
DCHECK(!browser_);
|
||||
|
||||
void CefBrowserPlatformDelegate::RenderViewCreated(
|
||||
content::RenderViewHost* render_view_host) {
|
||||
// Indicate that the view has an external parent (namely us). This changes the
|
||||
// default view behavior in some cases (e.g. focus handling on Linux).
|
||||
if (!IsViewsHosted() && render_view_host->GetWidget()->GetView())
|
||||
render_view_host->GetWidget()->GetView()->SetHasExternalParent(true);
|
||||
DCHECK(!web_contents_);
|
||||
web_contents_ = web_contents;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::AddNewContents(
|
||||
content::WebContents* source,
|
||||
std::unique_ptr<content::WebContents> new_contents,
|
||||
const GURL& target_url,
|
||||
WindowOpenDisposition disposition,
|
||||
const gfx::Rect& initial_rect,
|
||||
bool user_gesture,
|
||||
bool* was_blocked) {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::WebContentsDestroyed(
|
||||
content::WebContents* web_contents) {
|
||||
DCHECK(web_contents_ && web_contents_ == web_contents);
|
||||
web_contents_ = nullptr;
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegate::ShouldTransferNavigation(
|
||||
bool is_main_frame_navigation) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::RenderViewCreated(
|
||||
content::RenderViewHost* render_view_host) {}
|
||||
|
||||
void CefBrowserPlatformDelegate::RenderViewReady() {}
|
||||
|
||||
void CefBrowserPlatformDelegate::BrowserCreated(CefBrowserHostImpl* browser) {
|
||||
// We should have an associated WebContents at this point.
|
||||
DCHECK(web_contents_);
|
||||
|
||||
DCHECK(!browser_);
|
||||
DCHECK(browser);
|
||||
browser_ = browser;
|
||||
}
|
||||
|
||||
if (browser_->IsPrintPreviewSupported()) {
|
||||
web_contents_dialog_helper_.reset(
|
||||
new CefWebContentsDialogHelper(browser_->web_contents(), this));
|
||||
}
|
||||
void CefBrowserPlatformDelegate::CreateExtensionHost(
|
||||
const extensions::Extension* extension,
|
||||
const GURL& url,
|
||||
extensions::ViewType host_type) {
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
extensions::ExtensionHost* CefBrowserPlatformDelegate::GetExtensionHost()
|
||||
const {
|
||||
NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::NotifyBrowserCreated() {}
|
||||
@@ -53,6 +84,9 @@ void CefBrowserPlatformDelegate::NotifyBrowserCreated() {}
|
||||
void CefBrowserPlatformDelegate::NotifyBrowserDestroyed() {}
|
||||
|
||||
void CefBrowserPlatformDelegate::BrowserDestroyed(CefBrowserHostImpl* browser) {
|
||||
// WebContentsDestroyed should already be called.
|
||||
DCHECK(!web_contents_);
|
||||
|
||||
DCHECK(browser_ && browser_ == browser);
|
||||
browser_ = nullptr;
|
||||
}
|
||||
@@ -90,30 +124,35 @@ void CefBrowserPlatformDelegate::PopupBrowserCreated(
|
||||
bool is_devtools) {}
|
||||
|
||||
void CefBrowserPlatformDelegate::SendCaptureLostEvent() {
|
||||
content::RenderWidgetHostImpl* widget = content::RenderWidgetHostImpl::From(
|
||||
browser_->web_contents()->GetRenderViewHost()->GetWidget());
|
||||
if (widget)
|
||||
widget->LostCapture();
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
#if defined(OS_WIN) || (defined(OS_POSIX) && !defined(OS_MACOSX))
|
||||
void CefBrowserPlatformDelegate::NotifyMoveOrResizeStarted() {
|
||||
// Dismiss any existing popups.
|
||||
content::RenderViewHost* host = browser_->web_contents()->GetRenderViewHost();
|
||||
if (host)
|
||||
host->NotifyMoveOrResizeStarted();
|
||||
}
|
||||
void CefBrowserPlatformDelegate::NotifyMoveOrResizeStarted() {}
|
||||
|
||||
void CefBrowserPlatformDelegate::SizeTo(int width, int height) {}
|
||||
#endif
|
||||
|
||||
bool CefBrowserPlatformDelegate::PreHandleGestureEvent(
|
||||
content::WebContents* source,
|
||||
const blink::WebGestureEvent& event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegate::IsNeverComposited(
|
||||
content::WebContents* web_contents) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::unique_ptr<CefFileDialogRunner>
|
||||
CefBrowserPlatformDelegate::CreateFileDialogRunner() {
|
||||
NOTIMPLEMENTED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<CefJavaScriptDialogRunner>
|
||||
CefBrowserPlatformDelegate::CreateJavaScriptDialogRunner() {
|
||||
NOTIMPLEMENTED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -228,12 +267,42 @@ gfx::Size CefBrowserPlatformDelegate::GetMaximumDialogSize() {
|
||||
return gfx::Size();
|
||||
}
|
||||
|
||||
base::RepeatingClosure CefBrowserPlatformDelegate::GetBoundsChangedCallback() {
|
||||
if (web_contents_dialog_helper_) {
|
||||
return web_contents_dialog_helper_->GetBoundsChangedCallback();
|
||||
}
|
||||
void CefBrowserPlatformDelegate::SetAutoResizeEnabled(bool enabled,
|
||||
const CefSize& min_size,
|
||||
const CefSize& max_size) {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
return base::RepeatingClosure();
|
||||
void CefBrowserPlatformDelegate::SetAccessibilityState(
|
||||
cef_state_t accessibility_state) {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegate::IsPrintPreviewSupported() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::Print() {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::PrintToPDF(
|
||||
const CefString& path,
|
||||
const CefPdfPrintSettings& settings,
|
||||
CefRefPtr<CefPdfPrintCallback> callback) {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::Find(int identifier,
|
||||
const CefString& searchText,
|
||||
bool forward,
|
||||
bool matchCase,
|
||||
bool findNext) {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegate::StopFinding(bool clearSelection) {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
// static
|
||||
|
@@ -32,17 +32,19 @@ class RenderViewHostDelegateView;
|
||||
class WebContentsView;
|
||||
} // namespace content
|
||||
|
||||
namespace extensions {
|
||||
class ExtensionHost;
|
||||
}
|
||||
|
||||
#if defined(USE_AURA)
|
||||
namespace views {
|
||||
class Widget;
|
||||
}
|
||||
#endif
|
||||
|
||||
class CefBrowserInfo;
|
||||
class CefFileDialogRunner;
|
||||
class CefJavaScriptDialogRunner;
|
||||
class CefMenuRunner;
|
||||
class CefWebContentsDialogHelper;
|
||||
|
||||
// Provides platform-specific implementations of browser functionality. All
|
||||
// methods are called on the browser process UI thread unless otherwise
|
||||
@@ -54,6 +56,13 @@ class CefBrowserPlatformDelegate {
|
||||
static std::unique_ptr<CefBrowserPlatformDelegate> Create(
|
||||
CefBrowserHostImpl::CreateParams& create_params);
|
||||
|
||||
// Called from CefBrowserHostImpl::Create.
|
||||
// Wait for the call to WebContentsCreated(owned=true) before taking ownership
|
||||
// of the resulting WebContents object.
|
||||
virtual content::WebContents* CreateWebContents(
|
||||
CefBrowserHostImpl::CreateParams& create_params,
|
||||
bool& own_web_contents) = 0;
|
||||
|
||||
// Called to create the view objects for a new WebContents. Will only be
|
||||
// called a single time per instance. May be called on multiple threads. Only
|
||||
// used with windowless rendering.
|
||||
@@ -61,18 +70,52 @@ class CefBrowserPlatformDelegate {
|
||||
content::WebContentsView** view,
|
||||
content::RenderViewHostDelegateView** delegate_view);
|
||||
|
||||
// Called after the WebContents for the browser is created. Will only be
|
||||
// called a single time per instance.
|
||||
virtual void WebContentsCreated(content::WebContents* web_contents);
|
||||
// Called after the WebContents for a browser has been created. |owned| will
|
||||
// be true if |web_contents| was created via CreateWebContents() and we should
|
||||
// take ownership. This will also be called for popup WebContents created
|
||||
// indirectly by Chromium. Will only be called a single time per instance.
|
||||
virtual void WebContentsCreated(content::WebContents* web_contents,
|
||||
bool owned);
|
||||
|
||||
// Called when Chromium is ready to hand over ownership of a popup
|
||||
// WebContents. WebContentsCreated(owned=false) will be called first for
|
||||
// |new_contents|. Will only be called a single time per instance. See also
|
||||
// the WebContentsDelegate documentation.
|
||||
virtual void AddNewContents(
|
||||
content::WebContents* source,
|
||||
std::unique_ptr<content::WebContents> new_contents,
|
||||
const GURL& target_url,
|
||||
WindowOpenDisposition disposition,
|
||||
const gfx::Rect& initial_rect,
|
||||
bool user_gesture,
|
||||
bool* was_blocked);
|
||||
|
||||
// Called when the WebContents is destroyed. This will be called before
|
||||
// BrowserDestroyed(). Will only be called a single time per instance.
|
||||
virtual void WebContentsDestroyed(content::WebContents* web_contents);
|
||||
|
||||
// See WebContentsDelegate documentation.
|
||||
virtual bool ShouldTransferNavigation(bool is_main_frame_navigation);
|
||||
|
||||
// Called after the RenderViewHost is created.
|
||||
virtual void RenderViewCreated(content::RenderViewHost* render_view_host);
|
||||
|
||||
// See WebContentsObserver documentation.
|
||||
virtual void RenderViewReady();
|
||||
|
||||
// Called after the owning CefBrowserHostImpl is created. Will only be called
|
||||
// a single time per instance. Do not send any client notifications from this
|
||||
// method.
|
||||
virtual void BrowserCreated(CefBrowserHostImpl* browser);
|
||||
|
||||
// Called from CefBrowserHostImpl::Create.
|
||||
virtual void CreateExtensionHost(const extensions::Extension* extension,
|
||||
const GURL& url,
|
||||
extensions::ViewType host_type);
|
||||
|
||||
// Returns the current extension host.
|
||||
virtual extensions::ExtensionHost* GetExtensionHost() const;
|
||||
|
||||
// Send any notifications related to browser creation. Called after
|
||||
// BrowserCreated().
|
||||
virtual void NotifyBrowserCreated();
|
||||
@@ -141,9 +184,6 @@ class CefBrowserPlatformDelegate {
|
||||
// enable transparency.
|
||||
virtual SkColor GetBackgroundColor() const = 0;
|
||||
|
||||
virtual bool CanUseSharedTexture() const = 0;
|
||||
virtual bool CanUseExternalBeginFrame() const = 0;
|
||||
|
||||
// Notify the window that it was resized.
|
||||
virtual void WasResized() = 0;
|
||||
|
||||
@@ -189,6 +229,13 @@ class CefBrowserPlatformDelegate {
|
||||
virtual bool HandleKeyboardEvent(
|
||||
const content::NativeWebKeyboardEvent& event) = 0;
|
||||
|
||||
// See WebContentsDelegate documentation.
|
||||
virtual bool PreHandleGestureEvent(content::WebContents* source,
|
||||
const blink::WebGestureEvent& event);
|
||||
|
||||
// See WebContentsDelegate documentation.
|
||||
virtual bool IsNeverComposited(content::WebContents* web_contents);
|
||||
|
||||
// Invoke platform specific handling for the external protocol.
|
||||
static void HandleExternalProtocol(const GURL& url);
|
||||
|
||||
@@ -224,6 +271,7 @@ class CefBrowserPlatformDelegate {
|
||||
// Invalidate the view. Only used with windowless rendering.
|
||||
virtual void Invalidate(cef_paint_element_type_t type);
|
||||
|
||||
// Send the external begin frame message. Only used with windowless rendering.
|
||||
virtual void SendExternalBeginFrame();
|
||||
|
||||
// Set the windowless frame rate. Only used with windowless rendering.
|
||||
@@ -267,6 +315,23 @@ class CefBrowserPlatformDelegate {
|
||||
virtual gfx::Point GetDialogPosition(const gfx::Size& size);
|
||||
virtual gfx::Size GetMaximumDialogSize();
|
||||
|
||||
// See CefBrowserHost documentation.
|
||||
virtual void SetAutoResizeEnabled(bool enabled,
|
||||
const CefSize& min_size,
|
||||
const CefSize& max_size);
|
||||
virtual void SetAccessibilityState(cef_state_t accessibility_state);
|
||||
virtual bool IsPrintPreviewSupported() const;
|
||||
virtual void Print();
|
||||
virtual void PrintToPDF(const CefString& path,
|
||||
const CefPdfPrintSettings& settings,
|
||||
CefRefPtr<CefPdfPrintCallback> callback);
|
||||
virtual void Find(int identifier,
|
||||
const CefString& searchText,
|
||||
bool forward,
|
||||
bool matchCase,
|
||||
bool findNext);
|
||||
virtual void StopFinding(bool clearSelection);
|
||||
|
||||
protected:
|
||||
// Allow deletion via scoped_ptr only.
|
||||
friend std::default_delete<CefBrowserPlatformDelegate>;
|
||||
@@ -274,15 +339,11 @@ class CefBrowserPlatformDelegate {
|
||||
CefBrowserPlatformDelegate();
|
||||
virtual ~CefBrowserPlatformDelegate();
|
||||
|
||||
base::RepeatingClosure GetBoundsChangedCallback();
|
||||
|
||||
static int TranslateWebEventModifiers(uint32 cef_modifiers);
|
||||
|
||||
CefBrowserHostImpl* browser_ = nullptr; // Not owned by this object.
|
||||
|
||||
private:
|
||||
// Used for the print preview dialog.
|
||||
std::unique_ptr<CefWebContentsDialogHelper> web_contents_dialog_helper_;
|
||||
// Not owned by this object.
|
||||
content::WebContents* web_contents_ = nullptr;
|
||||
CefBrowserHostImpl* browser_ = nullptr;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefBrowserPlatformDelegate);
|
||||
};
|
||||
|
@@ -11,7 +11,9 @@
|
||||
#include "base/memory/ptr_util.h"
|
||||
#include "build/build_config.h"
|
||||
|
||||
#include "libcef/browser/chrome/browser_platform_delegate_chrome.h"
|
||||
#include "libcef/browser/extensions/browser_platform_delegate_background.h"
|
||||
#include "libcef/features/runtime_checks.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include "libcef/browser/native/browser_platform_delegate_native_win.h"
|
||||
@@ -34,33 +36,32 @@ namespace {
|
||||
|
||||
std::unique_ptr<CefBrowserPlatformDelegateNative> CreateNativeDelegate(
|
||||
const CefWindowInfo& window_info,
|
||||
SkColor background_color,
|
||||
bool use_shared_texture,
|
||||
bool use_external_begin_frame) {
|
||||
SkColor background_color) {
|
||||
#if defined(OS_WIN)
|
||||
return std::make_unique<CefBrowserPlatformDelegateNativeWin>(
|
||||
window_info, background_color, use_shared_texture,
|
||||
use_external_begin_frame);
|
||||
window_info, background_color);
|
||||
#elif defined(OS_MACOSX)
|
||||
return std::make_unique<CefBrowserPlatformDelegateNativeMac>(
|
||||
window_info, background_color);
|
||||
#elif defined(OS_LINUX)
|
||||
return std::make_unique<CefBrowserPlatformDelegateNativeLinux>(
|
||||
window_info, background_color, use_external_begin_frame);
|
||||
window_info, background_color);
|
||||
#endif
|
||||
}
|
||||
|
||||
std::unique_ptr<CefBrowserPlatformDelegateOsr> CreateOSRDelegate(
|
||||
std::unique_ptr<CefBrowserPlatformDelegateNative> native_delegate) {
|
||||
std::unique_ptr<CefBrowserPlatformDelegateNative> native_delegate,
|
||||
bool use_shared_texture,
|
||||
bool use_external_begin_frame) {
|
||||
#if defined(OS_WIN)
|
||||
return std::make_unique<CefBrowserPlatformDelegateOsrWin>(
|
||||
std::move(native_delegate));
|
||||
std::move(native_delegate), use_shared_texture, use_external_begin_frame);
|
||||
#elif defined(OS_MACOSX)
|
||||
return std::make_unique<CefBrowserPlatformDelegateOsrMac>(
|
||||
std::move(native_delegate));
|
||||
#elif defined(OS_LINUX)
|
||||
return std::make_unique<CefBrowserPlatformDelegateOsrLinux>(
|
||||
std::move(native_delegate));
|
||||
std::move(native_delegate), use_external_begin_frame);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -76,31 +77,34 @@ std::unique_ptr<CefBrowserPlatformDelegate> CefBrowserPlatformDelegate::Create(
|
||||
const SkColor background_color = CefContext::Get()->GetBackgroundColor(
|
||||
&create_params.settings, is_windowless ? STATE_ENABLED : STATE_DISABLED);
|
||||
|
||||
bool use_shared_texture = false;
|
||||
bool use_external_begin_frame = false;
|
||||
|
||||
if (is_windowless) {
|
||||
use_shared_texture = create_params.window_info &&
|
||||
create_params.window_info->shared_texture_enabled;
|
||||
|
||||
use_external_begin_frame =
|
||||
create_params.window_info &&
|
||||
create_params.window_info->external_begin_frame_enabled;
|
||||
if (cef::IsChromeRuntimeEnabled()) {
|
||||
return std::make_unique<CefBrowserPlatformDelegateChrome>(background_color);
|
||||
}
|
||||
|
||||
if (create_params.window_info) {
|
||||
std::unique_ptr<CefBrowserPlatformDelegateNative> native_delegate =
|
||||
CreateNativeDelegate(*create_params.window_info.get(), background_color,
|
||||
use_shared_texture, use_external_begin_frame);
|
||||
if (is_windowless)
|
||||
return CreateOSRDelegate(std::move(native_delegate));
|
||||
CreateNativeDelegate(*create_params.window_info.get(),
|
||||
background_color);
|
||||
if (is_windowless) {
|
||||
REQUIRE_ALLOY_RUNTIME();
|
||||
|
||||
const bool use_shared_texture =
|
||||
create_params.window_info &&
|
||||
create_params.window_info->shared_texture_enabled;
|
||||
|
||||
const bool use_external_begin_frame =
|
||||
create_params.window_info &&
|
||||
create_params.window_info->external_begin_frame_enabled;
|
||||
|
||||
return CreateOSRDelegate(std::move(native_delegate), use_shared_texture,
|
||||
use_external_begin_frame);
|
||||
}
|
||||
return std::move(native_delegate);
|
||||
} else if (create_params.extension_host_type ==
|
||||
extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
|
||||
// Creating a background extension host without a window.
|
||||
std::unique_ptr<CefBrowserPlatformDelegateNative> native_delegate =
|
||||
CreateNativeDelegate(CefWindowInfo(), background_color,
|
||||
use_shared_texture, use_external_begin_frame);
|
||||
CreateNativeDelegate(CefWindowInfo(), background_color);
|
||||
return std::make_unique<CefBrowserPlatformDelegateBackground>(
|
||||
std::move(native_delegate));
|
||||
}
|
||||
@@ -108,8 +112,7 @@ std::unique_ptr<CefBrowserPlatformDelegate> CefBrowserPlatformDelegate::Create(
|
||||
else {
|
||||
// CefWindowInfo is not used in this case.
|
||||
std::unique_ptr<CefBrowserPlatformDelegateNative> native_delegate =
|
||||
CreateNativeDelegate(CefWindowInfo(), background_color,
|
||||
use_shared_texture, use_external_begin_frame);
|
||||
CreateNativeDelegate(CefWindowInfo(), background_color);
|
||||
return std::make_unique<CefBrowserPlatformDelegateViews>(
|
||||
std::move(native_delegate),
|
||||
static_cast<CefBrowserViewImpl*>(create_params.browser_view.get()));
|
||||
|
138
libcef/browser/chrome/browser_platform_delegate_chrome.cc
Normal file
138
libcef/browser/chrome/browser_platform_delegate_chrome.cc
Normal file
@@ -0,0 +1,138 @@
|
||||
// Copyright 2020 The Chromium Embedded Framework Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome/browser_platform_delegate_chrome.h"
|
||||
|
||||
#include "base/logging.h"
|
||||
#include "chrome/browser/ui/browser.h"
|
||||
#include "chrome/browser/ui/browser_tabstrip.h"
|
||||
#include "chrome/browser/ui/browser_window.h"
|
||||
#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
||||
|
||||
CefBrowserPlatformDelegateChrome::CefBrowserPlatformDelegateChrome(
|
||||
SkColor background_color)
|
||||
: background_color_(background_color) {}
|
||||
|
||||
content::WebContents* CefBrowserPlatformDelegateChrome::CreateWebContents(
|
||||
CefBrowserHostImpl::CreateParams& create_params,
|
||||
bool& own_web_contents) {
|
||||
// Get or create the request context and profile.
|
||||
CefRefPtr<CefRequestContextImpl> request_context_impl =
|
||||
CefRequestContextImpl::GetOrCreateForRequestContext(
|
||||
create_params.request_context);
|
||||
CHECK(request_context_impl);
|
||||
auto cef_browser_context = request_context_impl->GetBrowserContext();
|
||||
CHECK(cef_browser_context);
|
||||
auto profile = cef_browser_context->AsProfile();
|
||||
|
||||
if (!create_params.request_context) {
|
||||
// Using the global request context.
|
||||
create_params.request_context = request_context_impl.get();
|
||||
}
|
||||
|
||||
// Create a Browser.
|
||||
Browser::CreateParams params =
|
||||
Browser::CreateParams(profile, /*user_gesture=*/false);
|
||||
chrome_browser_ = new Browser(params);
|
||||
|
||||
chrome::AddTabAt(chrome_browser_, create_params.url, /*idx=*/-1,
|
||||
/*foreground=*/true);
|
||||
|
||||
auto web_contents =
|
||||
chrome_browser_->tab_strip_model()->GetActiveWebContents();
|
||||
CHECK(web_contents);
|
||||
|
||||
own_web_contents = false;
|
||||
return web_contents;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::WebContentsDestroyed(
|
||||
content::WebContents* web_contents) {
|
||||
CefBrowserPlatformDelegate::WebContentsDestroyed(web_contents);
|
||||
|
||||
// TODO(chrome-runtime): Find a better way to be notified of Browser
|
||||
// destruction.
|
||||
browser_->WindowDestroyed();
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::BrowserDestroyed(
|
||||
CefBrowserHostImpl* browser) {
|
||||
CefBrowserPlatformDelegate::BrowserDestroyed(browser);
|
||||
|
||||
// Release the reference added in CreateHostWindow.
|
||||
browser->Release();
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateChrome::CreateHostWindow() {
|
||||
// Keep a reference to the CEF browser.
|
||||
browser_->AddRef();
|
||||
|
||||
chrome_browser_->window()->Show();
|
||||
return true;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::CloseHostWindow() {}
|
||||
|
||||
CefWindowHandle CefBrowserPlatformDelegateChrome::GetHostWindowHandle() const {
|
||||
return kNullWindowHandle;
|
||||
}
|
||||
|
||||
SkColor CefBrowserPlatformDelegateChrome::GetBackgroundColor() const {
|
||||
return background_color_;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::WasResized() {}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::SendKeyEvent(const CefKeyEvent& event) {}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::SendMouseClickEvent(
|
||||
const CefMouseEvent& event,
|
||||
CefBrowserHost::MouseButtonType type,
|
||||
bool mouseUp,
|
||||
int clickCount) {}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::SendMouseMoveEvent(
|
||||
const CefMouseEvent& event,
|
||||
bool mouseLeave) {}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::SendMouseWheelEvent(
|
||||
const CefMouseEvent& event,
|
||||
int deltaX,
|
||||
int deltaY) {}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::SendTouchEvent(
|
||||
const CefTouchEvent& event) {}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::SendFocusEvent(bool setFocus) {}
|
||||
|
||||
gfx::Point CefBrowserPlatformDelegateChrome::GetScreenPoint(
|
||||
const gfx::Point& view) const {
|
||||
return view;
|
||||
}
|
||||
|
||||
void CefBrowserPlatformDelegateChrome::ViewText(const std::string& text) {}
|
||||
|
||||
bool CefBrowserPlatformDelegateChrome::HandleKeyboardEvent(
|
||||
const content::NativeWebKeyboardEvent& event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CefEventHandle CefBrowserPlatformDelegateChrome::GetEventHandle(
|
||||
const content::NativeWebKeyboardEvent& event) const {
|
||||
return kNullEventHandle;
|
||||
}
|
||||
|
||||
std::unique_ptr<CefMenuRunner>
|
||||
CefBrowserPlatformDelegateChrome::CreateMenuRunner() {
|
||||
NOTIMPLEMENTED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateChrome::IsWindowless() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateChrome::IsViewsHosted() const {
|
||||
return false;
|
||||
}
|
55
libcef/browser/chrome/browser_platform_delegate_chrome.h
Normal file
55
libcef/browser/chrome/browser_platform_delegate_chrome.h
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright 2020 The Chromium Embedded Framework Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_BROWSER_PLATFORM_DELEGATE_CHROME_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_BROWSER_PLATFORM_DELEGATE_CHROME_H_
|
||||
|
||||
#include "libcef/browser/browser_platform_delegate.h"
|
||||
|
||||
class Browser;
|
||||
|
||||
// Implementation of Chrome-based browser functionality.
|
||||
class CefBrowserPlatformDelegateChrome : public CefBrowserPlatformDelegate {
|
||||
public:
|
||||
explicit CefBrowserPlatformDelegateChrome(SkColor background_color);
|
||||
|
||||
// CefBrowserPlatformDelegate overrides.
|
||||
content::WebContents* CreateWebContents(
|
||||
CefBrowserHostImpl::CreateParams& create_params,
|
||||
bool& own_web_contents) override;
|
||||
void WebContentsDestroyed(content::WebContents* web_contents) override;
|
||||
void BrowserDestroyed(CefBrowserHostImpl* browser) override;
|
||||
bool CreateHostWindow() override;
|
||||
void CloseHostWindow() override;
|
||||
CefWindowHandle GetHostWindowHandle() const override;
|
||||
SkColor GetBackgroundColor() const override;
|
||||
void WasResized() override;
|
||||
void SendKeyEvent(const CefKeyEvent& event) override;
|
||||
void SendMouseClickEvent(const CefMouseEvent& event,
|
||||
CefBrowserHost::MouseButtonType type,
|
||||
bool mouseUp,
|
||||
int clickCount) override;
|
||||
void SendMouseMoveEvent(const CefMouseEvent& event, bool mouseLeave) override;
|
||||
void SendMouseWheelEvent(const CefMouseEvent& event,
|
||||
int deltaX,
|
||||
int deltaY) override;
|
||||
void SendTouchEvent(const CefTouchEvent& event) override;
|
||||
void SendFocusEvent(bool setFocus) override;
|
||||
gfx::Point GetScreenPoint(const gfx::Point& view) const override;
|
||||
void ViewText(const std::string& text) override;
|
||||
bool HandleKeyboardEvent(
|
||||
const content::NativeWebKeyboardEvent& event) override;
|
||||
CefEventHandle GetEventHandle(
|
||||
const content::NativeWebKeyboardEvent& event) const override;
|
||||
std::unique_ptr<CefMenuRunner> CreateMenuRunner() override;
|
||||
bool IsWindowless() const override;
|
||||
bool IsViewsHosted() const override;
|
||||
|
||||
private:
|
||||
const SkColor background_color_;
|
||||
|
||||
Browser* chrome_browser_;
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_BROWSER_PLATFORM_DELEGATE_CHROME_H_
|
36
libcef/browser/chrome/chrome_browser_context.cc
Normal file
36
libcef/browser/chrome/chrome_browser_context.cc
Normal file
@@ -0,0 +1,36 @@
|
||||
// Copyright 2020 The Chromium Embedded Framework Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome/chrome_browser_context.h"
|
||||
|
||||
#include "chrome/browser/profiles/profile_manager.h"
|
||||
|
||||
ChromeBrowserContext::ChromeBrowserContext(
|
||||
const CefRequestContextSettings& settings)
|
||||
: CefBrowserContext(settings) {}
|
||||
|
||||
ChromeBrowserContext::~ChromeBrowserContext() = default;
|
||||
|
||||
content::BrowserContext* ChromeBrowserContext::AsBrowserContext() {
|
||||
return profile_;
|
||||
}
|
||||
|
||||
Profile* ChromeBrowserContext::AsProfile() {
|
||||
return profile_;
|
||||
}
|
||||
|
||||
void ChromeBrowserContext::Initialize() {
|
||||
CefBrowserContext::Initialize();
|
||||
|
||||
// TODO(chrome-runtime): ProfileManager can create new profiles relative to
|
||||
// the user-data-dir, but it should be done asynchronously.
|
||||
// The global ProfileManager instance can be retrieved via
|
||||
// |g_browser_process->profile_manager()|.
|
||||
profile_ = ProfileManager::GetLastUsedProfileAllowedByPolicy();
|
||||
}
|
||||
|
||||
void ChromeBrowserContext::Shutdown() {
|
||||
CefBrowserContext::Shutdown();
|
||||
profile_ = nullptr;
|
||||
}
|
31
libcef/browser/chrome/chrome_browser_context.h
Normal file
31
libcef/browser/chrome/chrome_browser_context.h
Normal file
@@ -0,0 +1,31 @@
|
||||
// Copyright 2020 The Chromium Embedded Framework Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_CONTEXT_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_CONTEXT_H_
|
||||
#pragma once
|
||||
|
||||
#include "libcef/browser/browser_context.h"
|
||||
|
||||
// See CefBrowserContext documentation for usage. Only accessed on the UI thread
|
||||
// unless otherwise indicated.
|
||||
class ChromeBrowserContext : public CefBrowserContext {
|
||||
public:
|
||||
explicit ChromeBrowserContext(const CefRequestContextSettings& settings);
|
||||
|
||||
// CefBrowserContext overrides.
|
||||
content::BrowserContext* AsBrowserContext() override;
|
||||
Profile* AsProfile() override;
|
||||
void Initialize() override;
|
||||
void Shutdown() override;
|
||||
|
||||
private:
|
||||
~ChromeBrowserContext() override;
|
||||
|
||||
Profile* profile_ = nullptr;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserContext);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_CONTEXT_H_
|
34
libcef/browser/chrome/chrome_browser_main_extra_parts_cef.cc
Normal file
34
libcef/browser/chrome/chrome_browser_main_extra_parts_cef.cc
Normal file
@@ -0,0 +1,34 @@
|
||||
// Copyright 2019 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome/chrome_browser_main_extra_parts_cef.h"
|
||||
|
||||
#include "libcef/browser/context.h"
|
||||
|
||||
#include "base/task/post_task.h"
|
||||
|
||||
ChromeBrowserMainExtraPartsCef::ChromeBrowserMainExtraPartsCef() = default;
|
||||
|
||||
ChromeBrowserMainExtraPartsCef::~ChromeBrowserMainExtraPartsCef() = default;
|
||||
|
||||
void ChromeBrowserMainExtraPartsCef::PostProfileInit() {
|
||||
CefRequestContextSettings settings;
|
||||
CefContext::Get()->PopulateGlobalRequestContextSettings(&settings);
|
||||
|
||||
// Create the global RequestContext.
|
||||
global_request_context_ =
|
||||
CefRequestContextImpl::CreateGlobalRequestContext(settings);
|
||||
}
|
||||
|
||||
void ChromeBrowserMainExtraPartsCef::PostMainMessageLoopRun() {
|
||||
background_task_runner_ = base::CreateSingleThreadTaskRunner(
|
||||
{base::ThreadPool(), base::TaskPriority::BEST_EFFORT,
|
||||
base::TaskShutdownBehavior::BLOCK_SHUTDOWN, base::MayBlock()});
|
||||
user_visible_task_runner_ = base::CreateSingleThreadTaskRunner(
|
||||
{base::ThreadPool(), base::TaskPriority::USER_VISIBLE,
|
||||
base::TaskShutdownBehavior::BLOCK_SHUTDOWN, base::MayBlock()});
|
||||
user_blocking_task_runner_ = base::CreateSingleThreadTaskRunner(
|
||||
{base::ThreadPool(), base::TaskPriority::USER_BLOCKING,
|
||||
base::TaskShutdownBehavior::BLOCK_SHUTDOWN, base::MayBlock()});
|
||||
}
|
54
libcef/browser/chrome/chrome_browser_main_extra_parts_cef.h
Normal file
54
libcef/browser/chrome/chrome_browser_main_extra_parts_cef.h
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright 2019 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_MAIN_EXTRA_PARTS_CEF_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_MAIN_EXTRA_PARTS_CEF_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "libcef/browser/request_context_impl.h"
|
||||
|
||||
#include "base/macros.h"
|
||||
#include "base/single_thread_task_runner.h"
|
||||
#include "chrome/browser/chrome_browser_main_extra_parts.h"
|
||||
|
||||
// Wrapper that owns and initialize the browser memory-related extra parts.
|
||||
class ChromeBrowserMainExtraPartsCef : public ChromeBrowserMainExtraParts {
|
||||
public:
|
||||
ChromeBrowserMainExtraPartsCef();
|
||||
~ChromeBrowserMainExtraPartsCef() override;
|
||||
|
||||
CefRefPtr<CefRequestContextImpl> request_context() const {
|
||||
return global_request_context_;
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner> background_task_runner() const {
|
||||
return background_task_runner_;
|
||||
}
|
||||
scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner() const {
|
||||
return user_visible_task_runner_;
|
||||
}
|
||||
scoped_refptr<base::SingleThreadTaskRunner> user_blocking_task_runner()
|
||||
const {
|
||||
return user_blocking_task_runner_;
|
||||
}
|
||||
|
||||
private:
|
||||
// ChromeBrowserMainExtraParts overrides.
|
||||
void PostProfileInit() override;
|
||||
void PostMainMessageLoopRun() override;
|
||||
|
||||
CefRefPtr<CefRequestContextImpl> global_request_context_;
|
||||
|
||||
// Blocking task runners exposed via CefTaskRunner. For consistency with
|
||||
// previous named thread behavior always execute all pending tasks before
|
||||
// shutdown (e.g. to make sure critical data is saved to disk).
|
||||
scoped_refptr<base::SingleThreadTaskRunner> background_task_runner_;
|
||||
scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner_;
|
||||
scoped_refptr<base::SingleThreadTaskRunner> user_blocking_task_runner_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainExtraPartsCef);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_MAIN_EXTRA_PARTS_CEF_H_
|
68
libcef/browser/chrome/chrome_content_browser_client_cef.cc
Normal file
68
libcef/browser/chrome/chrome_content_browser_client_cef.cc
Normal file
@@ -0,0 +1,68 @@
|
||||
// Copyright 2020 The Chromium Embedded Framework Authors.
|
||||
// Portions copyright 2012 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/chrome/chrome_content_browser_client_cef.h"
|
||||
|
||||
#include "libcef/browser/chrome/chrome_browser_main_extra_parts_cef.h"
|
||||
#include "libcef/common/cef_switches.h"
|
||||
|
||||
#include "base/command_line.h"
|
||||
#include "base/path_service.h"
|
||||
#include "chrome/browser/chrome_browser_main.h"
|
||||
#include "chrome/common/chrome_paths.h"
|
||||
#include "chrome/common/chrome_switches.h"
|
||||
|
||||
ChromeContentBrowserClientCef::ChromeContentBrowserClientCef(
|
||||
StartupData* startup_data)
|
||||
: ChromeContentBrowserClient(startup_data) {}
|
||||
ChromeContentBrowserClientCef::~ChromeContentBrowserClientCef() = default;
|
||||
|
||||
std::unique_ptr<content::BrowserMainParts>
|
||||
ChromeContentBrowserClientCef::CreateBrowserMainParts(
|
||||
const content::MainFunctionParams& parameters) {
|
||||
auto main_parts =
|
||||
ChromeContentBrowserClient::CreateBrowserMainParts(parameters);
|
||||
browser_main_parts_ = new ChromeBrowserMainExtraPartsCef;
|
||||
static_cast<ChromeBrowserMainParts*>(main_parts.get())
|
||||
->AddParts(browser_main_parts_);
|
||||
return main_parts;
|
||||
}
|
||||
|
||||
void ChromeContentBrowserClientCef::AppendExtraCommandLineSwitches(
|
||||
base::CommandLine* command_line,
|
||||
int child_process_id) {
|
||||
ChromeContentBrowserClient::AppendExtraCommandLineSwitches(command_line,
|
||||
child_process_id);
|
||||
|
||||
// Necessary to launch sub-processes in the correct mode.
|
||||
command_line->AppendSwitch(switches::kEnableChromeRuntime);
|
||||
|
||||
// Necessary to populate DIR_USER_DATA in sub-processes.
|
||||
// See resource_util.cc GetUserDataPath.
|
||||
base::FilePath user_data_dir;
|
||||
if (base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) {
|
||||
command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir);
|
||||
}
|
||||
}
|
||||
|
||||
CefRefPtr<CefRequestContextImpl>
|
||||
ChromeContentBrowserClientCef::request_context() const {
|
||||
return browser_main_parts_->request_context();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner>
|
||||
ChromeContentBrowserClientCef::background_task_runner() const {
|
||||
return browser_main_parts_->background_task_runner();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner>
|
||||
ChromeContentBrowserClientCef::user_visible_task_runner() const {
|
||||
return browser_main_parts_->user_visible_task_runner();
|
||||
}
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner>
|
||||
ChromeContentBrowserClientCef::user_blocking_task_runner() const {
|
||||
return browser_main_parts_->user_blocking_task_runner();
|
||||
}
|
42
libcef/browser/chrome/chrome_content_browser_client_cef.h
Normal file
42
libcef/browser/chrome/chrome_content_browser_client_cef.h
Normal file
@@ -0,0 +1,42 @@
|
||||
// Copyright 2020 The Chromium Embedded Framework Authors.
|
||||
// Portions copyright 2012 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_CHROME_CHROME_CONTENT_BROWSER_CLIENT_CEF_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_CHROME_CONTENT_BROWSER_CLIENT_CEF_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "libcef/browser/request_context_impl.h"
|
||||
|
||||
#include "base/macros.h"
|
||||
#include "chrome/browser/chrome_content_browser_client.h"
|
||||
|
||||
class ChromeBrowserMainExtraPartsCef;
|
||||
|
||||
// CEF override of ChromeContentBrowserClient
|
||||
class ChromeContentBrowserClientCef : public ChromeContentBrowserClient {
|
||||
public:
|
||||
explicit ChromeContentBrowserClientCef(StartupData* startup_data = nullptr);
|
||||
~ChromeContentBrowserClientCef() override;
|
||||
|
||||
// ChromeContentBrowserClient overrides.
|
||||
std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
|
||||
const content::MainFunctionParams& parameters) override;
|
||||
void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
|
||||
int child_process_id) override;
|
||||
|
||||
CefRefPtr<CefRequestContextImpl> request_context() const;
|
||||
|
||||
scoped_refptr<base::SingleThreadTaskRunner> background_task_runner() const;
|
||||
scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner() const;
|
||||
scoped_refptr<base::SingleThreadTaskRunner> user_blocking_task_runner() const;
|
||||
|
||||
private:
|
||||
ChromeBrowserMainExtraPartsCef* browser_main_parts_ = nullptr;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeContentBrowserClientCef);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_CHROME_CONTENT_BROWSER_CLIENT_CEF_
|
@@ -3,48 +3,26 @@
|
||||
// be found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/context.h"
|
||||
#include "libcef/browser/browser_host_impl.h"
|
||||
#include "libcef/browser/browser_info.h"
|
||||
|
||||
#include "libcef/browser/browser_info_manager.h"
|
||||
#include "libcef/browser/browser_main.h"
|
||||
#include "libcef/browser/chrome_browser_process_stub.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
#include "libcef/browser/trace_subscriber.h"
|
||||
#include "libcef/common/cef_switches.h"
|
||||
#include "libcef/common/main_delegate.h"
|
||||
#include "libcef/common/widevine_loader.h"
|
||||
#include "libcef/renderer/content_renderer_client.h"
|
||||
|
||||
#include "base/base_switches.h"
|
||||
#include "base/bind.h"
|
||||
#include "base/command_line.h"
|
||||
#include "base/debug/debugger.h"
|
||||
#include "base/files/file_util.h"
|
||||
#include "base/message_loop/message_loop_current.h"
|
||||
#include "base/run_loop.h"
|
||||
#include "base/synchronization/waitable_event.h"
|
||||
#include "base/threading/thread_restrictions.h"
|
||||
#include "components/network_session_configurator/common/network_switches.h"
|
||||
#include "content/app/content_service_manager_main_delegate.h"
|
||||
#include "content/public/browser/notification_service.h"
|
||||
#include "content/public/browser/notification_types.h"
|
||||
#include "content/public/browser/render_process_host.h"
|
||||
#include "content/public/common/content_switches.h"
|
||||
#include "services/service_manager/embedder/main.h"
|
||||
#include "ui/base/resource/resource_bundle.h"
|
||||
#include "ui/base/ui_base_switches.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "chrome/chrome_elf/chrome_elf_main.h"
|
||||
#include "chrome/install_static/initialize_from_primary_module.h"
|
||||
#include "components/crash/core/app/crashpad.h"
|
||||
#include "content/public/app/sandbox_helper_win.h"
|
||||
#include "sandbox/win/src/sandbox_types.h"
|
||||
#endif
|
||||
|
||||
#if defined(OS_MACOSX) || defined(OS_WIN)
|
||||
#include "components/crash/core/app/crash_switches.h"
|
||||
#include "third_party/crashpad/crashpad/handler/handler_main.h"
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
@@ -95,54 +73,6 @@ void InitCrashReporter() {
|
||||
}
|
||||
#endif // defined(OS_WIN)
|
||||
|
||||
#if defined(OS_MACOSX) || defined(OS_WIN)
|
||||
|
||||
// Based on components/crash/core/app/run_as_crashpad_handler_win.cc
|
||||
// Remove the "--type=crashpad-handler" command-line flag that will otherwise
|
||||
// confuse the crashpad handler.
|
||||
// Chrome uses an embedded crashpad handler on Windows only and imports this
|
||||
// function via the existing "run_as_crashpad_handler" target defined in
|
||||
// components/crash/core/app/BUILD.gn. CEF uses an embedded handler on both
|
||||
// Windows and macOS so we define the function here instead of using the
|
||||
// existing target (because we can't use that target on macOS).
|
||||
int RunAsCrashpadHandler(const base::CommandLine& command_line) {
|
||||
base::CommandLine::StringVector argv = command_line.argv();
|
||||
const base::CommandLine::StringType process_type =
|
||||
FILE_PATH_LITERAL("--type=");
|
||||
argv.erase(
|
||||
std::remove_if(argv.begin(), argv.end(),
|
||||
[&process_type](const base::CommandLine::StringType& str) {
|
||||
return base::StartsWith(str, process_type,
|
||||
base::CompareCase::SENSITIVE) ||
|
||||
(!str.empty() && str[0] == L'/');
|
||||
}),
|
||||
argv.end());
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
// HandlerMain on macOS uses the system version of getopt_long which expects
|
||||
// the first argument to be the program name.
|
||||
argv.insert(argv.begin(), command_line.GetProgram().value());
|
||||
#endif
|
||||
|
||||
std::unique_ptr<char*[]> argv_as_utf8(new char*[argv.size() + 1]);
|
||||
std::vector<std::string> storage;
|
||||
storage.reserve(argv.size());
|
||||
for (size_t i = 0; i < argv.size(); ++i) {
|
||||
#if defined(OS_WIN)
|
||||
storage.push_back(base::UTF16ToUTF8(argv[i]));
|
||||
#else
|
||||
storage.push_back(argv[i]);
|
||||
#endif
|
||||
argv_as_utf8[i] = &storage[i][0];
|
||||
}
|
||||
argv_as_utf8[argv.size()] = nullptr;
|
||||
argv.clear();
|
||||
return crashpad::HandlerMain(static_cast<int>(storage.size()),
|
||||
argv_as_utf8.get(), nullptr);
|
||||
}
|
||||
|
||||
#endif // defined(OS_MACOSX) || defined(OS_WIN)
|
||||
|
||||
bool GetColor(const cef_color_t cef_in, bool is_windowless, SkColor* sk_out) {
|
||||
// Windowed browser colors must be fully opaque.
|
||||
if (!is_windowless && CefColorGetA(cef_in) != SK_AlphaOPAQUE)
|
||||
@@ -252,52 +182,8 @@ int CefExecuteProcess(const CefMainArgs& args,
|
||||
InitCrashReporter();
|
||||
#endif
|
||||
|
||||
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
|
||||
#if defined(OS_WIN)
|
||||
command_line.ParseFromString(::GetCommandLineW());
|
||||
#else
|
||||
command_line.InitFromArgv(args.argc, args.argv);
|
||||
#endif
|
||||
|
||||
// Wait for the debugger as early in process initialization as possible.
|
||||
if (command_line.HasSwitch(switches::kWaitForDebugger))
|
||||
base::debug::WaitForDebugger(60, true);
|
||||
|
||||
// If no process type is specified then it represents the browser process and
|
||||
// we do nothing.
|
||||
std::string process_type =
|
||||
command_line.GetSwitchValueASCII(switches::kProcessType);
|
||||
if (process_type.empty())
|
||||
return -1;
|
||||
|
||||
#if defined(OS_MACOSX) || defined(OS_WIN)
|
||||
if (process_type == crash_reporter::switches::kCrashpadHandler)
|
||||
return RunAsCrashpadHandler(command_line);
|
||||
#endif
|
||||
|
||||
CefMainDelegate main_delegate(application);
|
||||
|
||||
// Execute the secondary process.
|
||||
#if defined(OS_WIN)
|
||||
sandbox::SandboxInterfaceInfo sandbox_info = {0};
|
||||
if (windows_sandbox_info == nullptr) {
|
||||
content::InitializeSandboxInfo(&sandbox_info);
|
||||
windows_sandbox_info = &sandbox_info;
|
||||
}
|
||||
|
||||
content::ContentMainParams params(&main_delegate);
|
||||
params.instance = args.instance;
|
||||
params.sandbox_info =
|
||||
static_cast<sandbox::SandboxInterfaceInfo*>(windows_sandbox_info);
|
||||
|
||||
return content::ContentMain(params);
|
||||
#else
|
||||
content::ContentMainParams params(&main_delegate);
|
||||
params.argc = args.argc;
|
||||
params.argv = const_cast<const char**>(args.argv);
|
||||
|
||||
return content::ContentMain(params);
|
||||
#endif
|
||||
return CefMainRunner::RunAsHelperProcess(args, application,
|
||||
windows_sandbox_info);
|
||||
}
|
||||
|
||||
bool CefInitialize(const CefMainArgs& args,
|
||||
@@ -321,8 +207,6 @@ bool CefInitialize(const CefMainArgs& args,
|
||||
return false;
|
||||
}
|
||||
|
||||
g_browser_process = new ChromeBrowserProcessStub();
|
||||
|
||||
// Create the new global context object.
|
||||
g_context = new CefContext();
|
||||
|
||||
@@ -382,8 +266,7 @@ void CefRunMessageLoop() {
|
||||
return;
|
||||
}
|
||||
|
||||
base::RunLoop run_loop;
|
||||
run_loop.Run();
|
||||
g_context->RunMessageLoop();
|
||||
}
|
||||
|
||||
void CefQuitMessageLoop() {
|
||||
@@ -399,8 +282,7 @@ void CefQuitMessageLoop() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Quit the CefBrowserMessageLoop.
|
||||
base::RunLoop::QuitCurrentWhenIdleDeprecated();
|
||||
g_context->QuitMessageLoop();
|
||||
}
|
||||
|
||||
void CefSetOSModalLoop(bool osModalLoop) {
|
||||
@@ -436,6 +318,7 @@ bool CefContext::Initialize(const CefMainArgs& args,
|
||||
void* windows_sandbox_info) {
|
||||
init_thread_id_ = base::PlatformThread::CurrentId();
|
||||
settings_ = settings;
|
||||
application_ = application;
|
||||
|
||||
#if !(defined(OS_WIN) || defined(OS_LINUX))
|
||||
if (settings.multi_threaded_message_loop) {
|
||||
@@ -466,78 +349,29 @@ bool CefContext::Initialize(const CefMainArgs& args,
|
||||
NormalizePathAndSet(settings_.resources_dir_path, "resources_dir_path");
|
||||
NormalizePathAndSet(settings_.locales_dir_path, "locales_dir_path");
|
||||
|
||||
main_delegate_.reset(new CefMainDelegate(application));
|
||||
browser_info_manager_.reset(new CefBrowserInfoManager);
|
||||
|
||||
int exit_code;
|
||||
main_runner_.reset(new CefMainRunner(settings_.multi_threaded_message_loop,
|
||||
settings_.external_message_pump));
|
||||
return main_runner_->Initialize(
|
||||
&settings_, application, args, windows_sandbox_info, &initialized_,
|
||||
base::BindOnce(&CefContext::OnContextInitialized,
|
||||
base::Unretained(this)));
|
||||
}
|
||||
|
||||
// Initialize the content runner.
|
||||
content::ContentMainParams params(main_delegate_.get());
|
||||
#if defined(OS_WIN)
|
||||
sandbox::SandboxInterfaceInfo sandbox_info = {0};
|
||||
if (windows_sandbox_info == nullptr) {
|
||||
windows_sandbox_info = &sandbox_info;
|
||||
settings_.no_sandbox = true;
|
||||
}
|
||||
void CefContext::RunMessageLoop() {
|
||||
// Must always be called on the same thread as Initialize.
|
||||
DCHECK(OnInitThread());
|
||||
|
||||
params.instance = args.instance;
|
||||
params.sandbox_info =
|
||||
static_cast<sandbox::SandboxInterfaceInfo*>(windows_sandbox_info);
|
||||
#else
|
||||
params.argc = args.argc;
|
||||
params.argv = const_cast<const char**>(args.argv);
|
||||
#endif
|
||||
// Blocks until QuitMessageLoop() is called.
|
||||
main_runner_->RunMessageLoop();
|
||||
}
|
||||
|
||||
sm_main_delegate_.reset(
|
||||
new content::ContentServiceManagerMainDelegate(params));
|
||||
sm_main_params_.reset(
|
||||
new service_manager::MainParams(sm_main_delegate_.get()));
|
||||
void CefContext::QuitMessageLoop() {
|
||||
// Must always be called on the same thread as Initialize.
|
||||
DCHECK(OnInitThread());
|
||||
|
||||
#if defined(OS_POSIX) && !defined(OS_ANDROID)
|
||||
sm_main_params_->argc = params.argc;
|
||||
sm_main_params_->argv = params.argv;
|
||||
#endif
|
||||
|
||||
exit_code = service_manager::MainInitialize(*sm_main_params_);
|
||||
DCHECK_LT(exit_code, 0);
|
||||
if (exit_code >= 0)
|
||||
return false;
|
||||
|
||||
static_cast<ChromeBrowserProcessStub*>(g_browser_process)->Initialize();
|
||||
|
||||
if (settings.multi_threaded_message_loop) {
|
||||
base::WaitableEvent uithread_startup_event(
|
||||
base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
||||
base::WaitableEvent::InitialState::NOT_SIGNALED);
|
||||
|
||||
if (!main_delegate_->CreateUIThread(base::BindOnce(
|
||||
[](CefContext* context, base::WaitableEvent* event) {
|
||||
service_manager::MainRun(*context->sm_main_params_);
|
||||
event->Signal();
|
||||
},
|
||||
base::Unretained(this),
|
||||
base::Unretained(&uithread_startup_event)))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
initialized_ = true;
|
||||
|
||||
// We need to wait until service_manager::MainRun has finished.
|
||||
uithread_startup_event.Wait();
|
||||
} else {
|
||||
initialized_ = true;
|
||||
service_manager::MainRun(*sm_main_params_);
|
||||
}
|
||||
|
||||
if (CEF_CURRENTLY_ON_UIT()) {
|
||||
OnContextInitialized();
|
||||
} else {
|
||||
// Continue initialization on the UI thread.
|
||||
CEF_POST_TASK(CEF_UIT, base::Bind(&CefContext::OnContextInitialized,
|
||||
base::Unretained(this)));
|
||||
}
|
||||
|
||||
return true;
|
||||
main_runner_->QuitMessageLoop();
|
||||
}
|
||||
|
||||
void CefContext::Shutdown() {
|
||||
@@ -546,28 +380,9 @@ void CefContext::Shutdown() {
|
||||
|
||||
shutting_down_ = true;
|
||||
|
||||
if (settings_.multi_threaded_message_loop) {
|
||||
// Events that will be used to signal when shutdown is complete. Start in
|
||||
// non-signaled mode so that the event will block.
|
||||
base::WaitableEvent uithread_shutdown_event(
|
||||
base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
||||
base::WaitableEvent::InitialState::NOT_SIGNALED);
|
||||
|
||||
// Finish shutdown on the UI thread.
|
||||
CEF_POST_TASK(CEF_UIT,
|
||||
base::Bind(&CefContext::FinishShutdownOnUIThread,
|
||||
base::Unretained(this), &uithread_shutdown_event));
|
||||
|
||||
/// Block until UI thread shutdown is complete.
|
||||
uithread_shutdown_event.Wait();
|
||||
|
||||
FinalizeShutdown();
|
||||
} else {
|
||||
// Finish shutdown on the current thread, which should be the UI thread.
|
||||
FinishShutdownOnUIThread(nullptr);
|
||||
|
||||
FinalizeShutdown();
|
||||
}
|
||||
main_runner_->Shutdown(
|
||||
base::BindOnce(&CefContext::ShutdownOnUIThread, base::Unretained(this)),
|
||||
base::BindOnce(&CefContext::FinalizeShutdown, base::Unretained(this)));
|
||||
}
|
||||
|
||||
bool CefContext::OnInitThread() {
|
||||
@@ -654,25 +469,16 @@ bool CefContext::HasObserver(Observer* observer) const {
|
||||
void CefContext::OnContextInitialized() {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
static_cast<ChromeBrowserProcessStub*>(g_browser_process)
|
||||
->OnContextInitialized();
|
||||
|
||||
#if BUILDFLAG(ENABLE_WIDEVINE) && BUILDFLAG(ENABLE_LIBRARY_CDMS)
|
||||
CefWidevineLoader::GetInstance()->OnContextInitialized();
|
||||
#endif
|
||||
|
||||
// Notify the handler.
|
||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||
if (app.get()) {
|
||||
if (application_) {
|
||||
CefRefPtr<CefBrowserProcessHandler> handler =
|
||||
app->GetBrowserProcessHandler();
|
||||
if (handler.get())
|
||||
application_->GetBrowserProcessHandler();
|
||||
if (handler)
|
||||
handler->OnContextInitialized();
|
||||
}
|
||||
}
|
||||
|
||||
void CefContext::FinishShutdownOnUIThread(
|
||||
base::WaitableEvent* uithread_shutdown_event) {
|
||||
void CefContext::ShutdownOnUIThread() {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
browser_info_manager_->DestroyAllBrowsers();
|
||||
@@ -682,34 +488,9 @@ void CefContext::FinishShutdownOnUIThread(
|
||||
|
||||
if (trace_subscriber_.get())
|
||||
trace_subscriber_.reset(nullptr);
|
||||
|
||||
static_cast<ChromeBrowserProcessStub*>(g_browser_process)->Shutdown();
|
||||
|
||||
ui::ResourceBundle::GetSharedInstance().CleanupOnUIThread();
|
||||
|
||||
sm_main_delegate_->ShutdownOnUIThread();
|
||||
|
||||
if (uithread_shutdown_event)
|
||||
uithread_shutdown_event->Signal();
|
||||
}
|
||||
|
||||
void CefContext::FinalizeShutdown() {
|
||||
if (content::RenderProcessHost::run_renderer_in_process()) {
|
||||
// Blocks until RenderProcess cleanup is complete.
|
||||
CefContentRendererClient::Get()->RunSingleProcessCleanup();
|
||||
}
|
||||
|
||||
// Shut down the browser runner or UI thread.
|
||||
main_delegate_->ShutdownBrowser();
|
||||
|
||||
// Shut down the content runner.
|
||||
service_manager::MainShutdown(*sm_main_params_);
|
||||
|
||||
browser_info_manager_.reset(nullptr);
|
||||
sm_main_params_.reset(nullptr);
|
||||
sm_main_delegate_.reset(nullptr);
|
||||
main_delegate_.reset(nullptr);
|
||||
|
||||
delete g_browser_process;
|
||||
g_browser_process = nullptr;
|
||||
application_ = nullptr;
|
||||
}
|
||||
|
@@ -11,26 +11,14 @@
|
||||
#include <string>
|
||||
|
||||
#include "include/cef_app.h"
|
||||
#include "libcef/browser/main_runner.h"
|
||||
|
||||
#include "base/observer_list.h"
|
||||
#include "base/threading/platform_thread.h"
|
||||
#include "third_party/skia/include/core/SkColor.h"
|
||||
|
||||
namespace base {
|
||||
class WaitableEvent;
|
||||
}
|
||||
|
||||
namespace content {
|
||||
class ContentServiceManagerMainDelegate;
|
||||
}
|
||||
|
||||
namespace service_manager {
|
||||
struct MainParams;
|
||||
}
|
||||
|
||||
class CefBrowserHostImpl;
|
||||
class CefBrowserInfoManager;
|
||||
class CefMainDelegate;
|
||||
class CefTraceSubscriber;
|
||||
|
||||
class CefContext {
|
||||
@@ -59,6 +47,8 @@ class CefContext {
|
||||
const CefSettings& settings,
|
||||
CefRefPtr<CefApp> application,
|
||||
void* windows_sandbox_info);
|
||||
void RunMessageLoop();
|
||||
void QuitMessageLoop();
|
||||
void Shutdown();
|
||||
|
||||
// Returns true if the current thread is the initialization thread.
|
||||
@@ -105,7 +95,7 @@ class CefContext {
|
||||
|
||||
// Performs shutdown actions that need to occur on the UI thread before any
|
||||
// threads are destroyed.
|
||||
void FinishShutdownOnUIThread(base::WaitableEvent* uithread_shutdown_event);
|
||||
void ShutdownOnUIThread();
|
||||
|
||||
// Destroys the main runner and related objects.
|
||||
void FinalizeShutdown();
|
||||
@@ -118,10 +108,9 @@ class CefContext {
|
||||
base::PlatformThreadId init_thread_id_;
|
||||
|
||||
CefSettings settings_;
|
||||
CefRefPtr<CefApp> application_;
|
||||
|
||||
std::unique_ptr<CefMainDelegate> main_delegate_;
|
||||
std::unique_ptr<content::ContentServiceManagerMainDelegate> sm_main_delegate_;
|
||||
std::unique_ptr<service_manager::MainParams> sm_main_params_;
|
||||
std::unique_ptr<CefMainRunner> main_runner_;
|
||||
std::unique_ptr<CefTraceSubscriber> trace_subscriber_;
|
||||
std::unique_ptr<CefBrowserInfoManager> browser_info_manager_;
|
||||
|
||||
|
137
libcef/browser/devtools/devtools_controller.cc
Normal file
137
libcef/browser/devtools/devtools_controller.cc
Normal file
@@ -0,0 +1,137 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/devtools/devtools_controller.h"
|
||||
|
||||
#include "libcef/browser/devtools/devtools_util.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
|
||||
#include "base/json/json_reader.h"
|
||||
#include "base/json/json_writer.h"
|
||||
#include "content/public/browser/devtools_agent_host.h"
|
||||
|
||||
CefDevToolsController::CefDevToolsController(
|
||||
content::WebContents* inspected_contents)
|
||||
: inspected_contents_(inspected_contents), weak_ptr_factory_(this) {
|
||||
DCHECK(inspected_contents_);
|
||||
}
|
||||
|
||||
CefDevToolsController::~CefDevToolsController() {
|
||||
if (agent_host_) {
|
||||
agent_host_->DetachClient(this);
|
||||
AgentHostClosed(agent_host_.get());
|
||||
}
|
||||
|
||||
for (auto& observer : observers_) {
|
||||
observer.OnDevToolsControllerDestroyed();
|
||||
}
|
||||
}
|
||||
|
||||
bool CefDevToolsController::SendDevToolsMessage(
|
||||
const base::StringPiece& message) {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!EnsureAgentHost())
|
||||
return false;
|
||||
|
||||
agent_host_->DispatchProtocolMessage(
|
||||
this, base::as_bytes(base::make_span(message)));
|
||||
return true;
|
||||
}
|
||||
|
||||
int CefDevToolsController::ExecuteDevToolsMethod(
|
||||
int suggested_message_id,
|
||||
const std::string& method,
|
||||
const base::DictionaryValue* params) {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!EnsureAgentHost())
|
||||
return 0;
|
||||
|
||||
// Message IDs must always be increasing and unique.
|
||||
int message_id = suggested_message_id;
|
||||
if (message_id < next_message_id_)
|
||||
message_id = next_message_id_++;
|
||||
else
|
||||
next_message_id_ = message_id + 1;
|
||||
|
||||
base::DictionaryValue message;
|
||||
message.SetIntKey("id", message_id);
|
||||
message.SetStringKey("method", method);
|
||||
if (params)
|
||||
message.SetKey("params", params->Clone());
|
||||
|
||||
std::string protocol_message;
|
||||
if (!base::JSONWriter::Write(message, &protocol_message))
|
||||
return 0;
|
||||
|
||||
agent_host_->DispatchProtocolMessage(
|
||||
this, base::as_bytes(base::make_span(protocol_message)));
|
||||
return message_id;
|
||||
}
|
||||
|
||||
void CefDevToolsController::AgentHostClosed(
|
||||
content::DevToolsAgentHost* agent_host) {
|
||||
DCHECK(agent_host == agent_host_.get());
|
||||
agent_host_ = nullptr;
|
||||
for (auto& observer : observers_) {
|
||||
observer.OnDevToolsAgentDetached();
|
||||
}
|
||||
}
|
||||
|
||||
void CefDevToolsController::AddObserver(Observer* observer) {
|
||||
CEF_REQUIRE_UIT();
|
||||
observers_.AddObserver(observer);
|
||||
}
|
||||
|
||||
void CefDevToolsController::RemoveObserver(Observer* observer) {
|
||||
CEF_REQUIRE_UIT();
|
||||
observers_.RemoveObserver(observer);
|
||||
}
|
||||
|
||||
void CefDevToolsController::DispatchProtocolMessage(
|
||||
content::DevToolsAgentHost* agent_host,
|
||||
base::span<const uint8_t> message) {
|
||||
if (!observers_.might_have_observers())
|
||||
return;
|
||||
|
||||
base::StringPiece str_message(reinterpret_cast<const char*>(message.data()),
|
||||
message.size());
|
||||
if (!devtools_util::ProtocolParser::IsValidMessage(str_message)) {
|
||||
LOG(WARNING) << "Invalid message: " << str_message.substr(0, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
devtools_util::ProtocolParser parser;
|
||||
|
||||
for (auto& observer : observers_) {
|
||||
if (observer.OnDevToolsMessage(str_message)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Only perform parsing a single time.
|
||||
if (parser.Initialize(str_message) && parser.IsFailure()) {
|
||||
LOG(WARNING) << "Failed to parse message: " << str_message.substr(0, 100);
|
||||
}
|
||||
|
||||
if (parser.IsEvent()) {
|
||||
observer.OnDevToolsEvent(parser.method_, parser.params_);
|
||||
} else if (parser.IsResult()) {
|
||||
observer.OnDevToolsMethodResult(parser.message_id_, parser.success_,
|
||||
parser.params_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CefDevToolsController::EnsureAgentHost() {
|
||||
if (!agent_host_) {
|
||||
agent_host_ =
|
||||
content::DevToolsAgentHost::GetOrCreateFor(inspected_contents_);
|
||||
if (agent_host_) {
|
||||
agent_host_->AttachClient(this);
|
||||
for (auto& observer : observers_) {
|
||||
observer.OnDevToolsAgentAttached();
|
||||
}
|
||||
}
|
||||
}
|
||||
return !!agent_host_;
|
||||
}
|
79
libcef/browser/devtools/devtools_controller.h
Normal file
79
libcef/browser/devtools/devtools_controller.h
Normal file
@@ -0,0 +1,79 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_CONTROLLER_H_
|
||||
#define CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_CONTROLLER_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "content/public/browser/devtools_agent_host_client.h"
|
||||
|
||||
#include "base/containers/span.h"
|
||||
#include "base/memory/scoped_refptr.h"
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "base/observer_list.h"
|
||||
#include "base/values.h"
|
||||
|
||||
namespace content {
|
||||
class WebContents;
|
||||
}
|
||||
|
||||
class CefDevToolsController : public content::DevToolsAgentHostClient {
|
||||
public:
|
||||
class Observer : public base::CheckedObserver {
|
||||
public:
|
||||
// See CefDevToolsMessageObserver documentation.
|
||||
virtual bool OnDevToolsMessage(const base::StringPiece& message) = 0;
|
||||
virtual void OnDevToolsMethodResult(int message_id,
|
||||
bool success,
|
||||
const base::StringPiece& result) = 0;
|
||||
virtual void OnDevToolsEvent(const base::StringPiece& method,
|
||||
const base::StringPiece& params) = 0;
|
||||
virtual void OnDevToolsAgentAttached() = 0;
|
||||
virtual void OnDevToolsAgentDetached() = 0;
|
||||
|
||||
virtual void OnDevToolsControllerDestroyed() = 0;
|
||||
|
||||
protected:
|
||||
~Observer() override {}
|
||||
};
|
||||
|
||||
// |inspected_contents| will outlive this object.
|
||||
explicit CefDevToolsController(content::WebContents* inspected_contents);
|
||||
~CefDevToolsController() override;
|
||||
|
||||
// See CefBrowserHost methods of the same name for documentation.
|
||||
bool SendDevToolsMessage(const base::StringPiece& message);
|
||||
int ExecuteDevToolsMethod(int message_id,
|
||||
const std::string& method,
|
||||
const base::DictionaryValue* params);
|
||||
|
||||
// |observer| must outlive this object or be removed.
|
||||
void AddObserver(Observer* observer);
|
||||
void RemoveObserver(Observer* observer);
|
||||
|
||||
base::WeakPtr<CefDevToolsController> GetWeakPtr() {
|
||||
return weak_ptr_factory_.GetWeakPtr();
|
||||
}
|
||||
|
||||
private:
|
||||
// content::DevToolsAgentHostClient implementation:
|
||||
void AgentHostClosed(content::DevToolsAgentHost* agent_host) override;
|
||||
void DispatchProtocolMessage(content::DevToolsAgentHost* agent_host,
|
||||
base::span<const uint8_t> message) override;
|
||||
|
||||
bool EnsureAgentHost();
|
||||
|
||||
content::WebContents* const inspected_contents_;
|
||||
scoped_refptr<content::DevToolsAgentHost> agent_host_;
|
||||
int next_message_id_ = 1;
|
||||
|
||||
base::ObserverList<Observer> observers_;
|
||||
|
||||
base::WeakPtrFactory<CefDevToolsController> weak_ptr_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefDevToolsController);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_CONTROLLER_H_
|
@@ -16,7 +16,7 @@
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "base/task/post_task.h"
|
||||
#include "base/threading/sequenced_task_runner_handle.h"
|
||||
#include "base/value_conversions.h"
|
||||
#include "base/util/values/values_util.h"
|
||||
#include "base/values.h"
|
||||
#include "chrome/common/pref_names.h"
|
||||
#include "components/prefs/scoped_user_pref_update.h"
|
||||
@@ -81,9 +81,9 @@ void CefDevToolsFileManager::Save(const std::string& url,
|
||||
|
||||
const base::Value* path_value;
|
||||
if (file_map->Get(base::MD5String(url), &path_value)) {
|
||||
// Ignore base::GetValueAsFilePath() failure since we handle empty
|
||||
// |initial_path| below.
|
||||
ignore_result(base::GetValueAsFilePath(*path_value, &initial_path));
|
||||
base::Optional<base::FilePath> path = util::ValueToFilePath(*path_value);
|
||||
if (path)
|
||||
initial_path = std::move(*path);
|
||||
}
|
||||
|
||||
if (initial_path.empty()) {
|
||||
@@ -142,7 +142,7 @@ void CefDevToolsFileManager::SaveAsFileSelected(const std::string& url,
|
||||
|
||||
DictionaryPrefUpdate update(prefs_, prefs::kDevToolsEditedFiles);
|
||||
base::DictionaryValue* files_map = update.Get();
|
||||
files_map->SetKey(base::MD5String(url), base::CreateFilePathValue(path));
|
||||
files_map->SetKey(base::MD5String(url), util::FilePathToValue(path));
|
||||
std::string file_system_path = path.AsUTF8Unsafe();
|
||||
callback.Run(file_system_path);
|
||||
file_task_runner_->PostTask(FROM_HERE,
|
||||
|
@@ -6,13 +6,18 @@
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <iomanip>
|
||||
#include <utility>
|
||||
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/devtools/devtools_manager_delegate.h"
|
||||
#include "libcef/browser/net/devtools_scheme_handler.h"
|
||||
#include "libcef/common/cef_switches.h"
|
||||
#include "libcef/common/task_runner_manager.h"
|
||||
|
||||
#include "base/base64.h"
|
||||
#include "base/command_line.h"
|
||||
#include "base/files/file_util.h"
|
||||
#include "base/guid.h"
|
||||
#include "base/json/json_reader.h"
|
||||
#include "base/json/json_writer.h"
|
||||
@@ -24,6 +29,7 @@
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "base/task/post_task.h"
|
||||
#include "base/values.h"
|
||||
#include "chrome/browser/profiles/profile.h"
|
||||
#include "chrome/common/pref_names.h"
|
||||
#include "components/prefs/scoped_user_pref_update.h"
|
||||
#include "content/public/browser/browser_context.h"
|
||||
@@ -48,6 +54,13 @@
|
||||
#include "services/network/public/cpp/simple_url_loader.h"
|
||||
#include "services/network/public/cpp/simple_url_loader_stream_consumer.h"
|
||||
#include "services/network/public/mojom/url_response_head.mojom.h"
|
||||
#include "storage/browser/file_system/native_file_util.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include <windows.h>
|
||||
#elif defined(OS_POSIX)
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -86,6 +99,71 @@ std::unique_ptr<base::DictionaryValue> BuildObjectForResponse(
|
||||
return response;
|
||||
}
|
||||
|
||||
const int kMaxLogLineLength = 1024;
|
||||
|
||||
void WriteTimestamp(std::stringstream& stream) {
|
||||
#if defined(OS_WIN)
|
||||
SYSTEMTIME local_time;
|
||||
GetLocalTime(&local_time);
|
||||
stream << std::setfill('0') << std::setw(2) << local_time.wMonth
|
||||
<< std::setw(2) << local_time.wDay << '/' << std::setw(2)
|
||||
<< local_time.wHour << std::setw(2) << local_time.wMinute
|
||||
<< std::setw(2) << local_time.wSecond << '.' << std::setw(3)
|
||||
<< local_time.wMilliseconds;
|
||||
#elif defined(OS_POSIX)
|
||||
timeval tv;
|
||||
gettimeofday(&tv, nullptr);
|
||||
time_t t = tv.tv_sec;
|
||||
struct tm local_time;
|
||||
localtime_r(&t, &local_time);
|
||||
struct tm* tm_time = &local_time;
|
||||
stream << std::setfill('0') << std::setw(2) << 1 + tm_time->tm_mon
|
||||
<< std::setw(2) << tm_time->tm_mday << '/' << std::setw(2)
|
||||
<< tm_time->tm_hour << std::setw(2) << tm_time->tm_min << std::setw(2)
|
||||
<< tm_time->tm_sec << '.' << std::setw(6) << tv.tv_usec;
|
||||
#else
|
||||
#error Unsupported platform
|
||||
#endif
|
||||
}
|
||||
|
||||
void LogProtocolMessage(const base::FilePath& log_file,
|
||||
ProtocolMessageType type,
|
||||
std::string to_log) {
|
||||
// Track if logging has failed, in which case we don't keep trying.
|
||||
static bool log_error = false;
|
||||
if (log_error)
|
||||
return;
|
||||
|
||||
if (storage::NativeFileUtil::EnsureFileExists(log_file, nullptr) !=
|
||||
base::File::FILE_OK) {
|
||||
LOG(ERROR) << "Failed to create file " << log_file.value();
|
||||
log_error = true;
|
||||
return;
|
||||
}
|
||||
|
||||
std::string type_label;
|
||||
switch (type) {
|
||||
case ProtocolMessageType::METHOD:
|
||||
type_label = "METHOD";
|
||||
break;
|
||||
case ProtocolMessageType::RESULT:
|
||||
type_label = "RESULT";
|
||||
break;
|
||||
case ProtocolMessageType::EVENT:
|
||||
type_label = "EVENT";
|
||||
break;
|
||||
}
|
||||
|
||||
std::stringstream stream;
|
||||
WriteTimestamp(stream);
|
||||
stream << ": " << type_label << ": " << to_log << "\n";
|
||||
const std::string& str = stream.str();
|
||||
if (!base::AppendToFile(log_file, str.c_str(), str.size())) {
|
||||
LOG(ERROR) << "Failed to write file " << log_file.value();
|
||||
log_error = true;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
class CefDevToolsFrontend::NetworkResourceLoader
|
||||
@@ -156,11 +234,12 @@ const size_t kMaxMessageChunkSize = IPC::Channel::kMaximumMessageSize / 4;
|
||||
|
||||
// static
|
||||
CefDevToolsFrontend* CefDevToolsFrontend::Show(
|
||||
CefRefPtr<CefBrowserHostImpl> inspected_browser,
|
||||
CefBrowserHostImpl* inspected_browser,
|
||||
const CefWindowInfo& windowInfo,
|
||||
CefRefPtr<CefClient> client,
|
||||
const CefBrowserSettings& settings,
|
||||
const CefPoint& inspect_element_at) {
|
||||
const CefPoint& inspect_element_at,
|
||||
base::OnceClosure frontend_destroyed_callback) {
|
||||
CefBrowserSettings new_settings = settings;
|
||||
if (!windowInfo.windowless_rendering_enabled &&
|
||||
CefColorGetA(new_settings.background_color) != SK_AlphaOPAQUE) {
|
||||
@@ -187,7 +266,8 @@ CefDevToolsFrontend* CefDevToolsFrontend::Show(
|
||||
// destroyed.
|
||||
CefDevToolsFrontend* devtools_frontend = new CefDevToolsFrontend(
|
||||
static_cast<CefBrowserHostImpl*>(frontend_browser.get()),
|
||||
inspected_contents, inspect_element_at);
|
||||
inspected_contents, inspect_element_at,
|
||||
std::move(frontend_destroyed_callback));
|
||||
|
||||
// Need to load the URL after creating the DevTools objects.
|
||||
frontend_browser->GetMainFrame()->LoadURL(GetFrontendURL());
|
||||
@@ -216,23 +296,23 @@ void CefDevToolsFrontend::Close() {
|
||||
frontend_browser_.get(), true));
|
||||
}
|
||||
|
||||
void CefDevToolsFrontend::DisconnectFromTarget() {
|
||||
if (!agent_host_)
|
||||
return;
|
||||
agent_host_->DetachClient(this);
|
||||
agent_host_ = nullptr;
|
||||
}
|
||||
|
||||
CefDevToolsFrontend::CefDevToolsFrontend(
|
||||
CefRefPtr<CefBrowserHostImpl> frontend_browser,
|
||||
CefBrowserHostImpl* frontend_browser,
|
||||
content::WebContents* inspected_contents,
|
||||
const CefPoint& inspect_element_at)
|
||||
const CefPoint& inspect_element_at,
|
||||
base::OnceClosure frontend_destroyed_callback)
|
||||
: content::WebContentsObserver(frontend_browser->web_contents()),
|
||||
frontend_browser_(frontend_browser),
|
||||
inspected_contents_(inspected_contents),
|
||||
inspect_element_at_(inspect_element_at),
|
||||
file_manager_(frontend_browser.get(), GetPrefs()),
|
||||
weak_factory_(this) {}
|
||||
frontend_destroyed_callback_(std::move(frontend_destroyed_callback)),
|
||||
file_manager_(frontend_browser, GetPrefs()),
|
||||
protocol_log_file_(
|
||||
base::CommandLine::ForCurrentProcess()->GetSwitchValuePath(
|
||||
switches::kDevToolsProtocolLogFile)),
|
||||
weak_factory_(this) {
|
||||
DCHECK(!frontend_destroyed_callback_.is_null());
|
||||
}
|
||||
|
||||
CefDevToolsFrontend::~CefDevToolsFrontend() {}
|
||||
|
||||
@@ -279,6 +359,7 @@ void CefDevToolsFrontend::WebContentsDestroyed() {
|
||||
agent_host_->DetachClient(this);
|
||||
agent_host_ = nullptr;
|
||||
}
|
||||
std::move(frontend_destroyed_callback_).Run();
|
||||
delete this;
|
||||
}
|
||||
|
||||
@@ -300,6 +381,9 @@ void CefDevToolsFrontend::HandleMessageFromDevToolsFrontend(
|
||||
std::string protocol_message;
|
||||
if (!agent_host_ || !params->GetString(0, &protocol_message))
|
||||
return;
|
||||
if (ProtocolLoggingEnabled()) {
|
||||
LogProtocolMessage(ProtocolMessageType::METHOD, protocol_message);
|
||||
}
|
||||
agent_host_->DispatchProtocolMessage(
|
||||
this, base::as_bytes(base::make_span(protocol_message)));
|
||||
} else if (method == "loadCompleted") {
|
||||
@@ -451,6 +535,14 @@ void CefDevToolsFrontend::DispatchProtocolMessage(
|
||||
base::span<const uint8_t> message) {
|
||||
base::StringPiece str_message(reinterpret_cast<const char*>(message.data()),
|
||||
message.size());
|
||||
if (ProtocolLoggingEnabled()) {
|
||||
// Quick check to avoid parsing the JSON object. Events begin with a
|
||||
// "method" value whereas method results begin with an "id" value.
|
||||
LogProtocolMessage(str_message.starts_with("{\"method\":")
|
||||
? ProtocolMessageType::EVENT
|
||||
: ProtocolMessageType::RESULT,
|
||||
str_message);
|
||||
}
|
||||
if (str_message.length() < kMaxMessageChunkSize) {
|
||||
std::string param;
|
||||
base::EscapeJSONString(str_message, true, ¶m);
|
||||
@@ -504,6 +596,23 @@ void CefDevToolsFrontend::SendMessageAck(int request_id,
|
||||
CallClientFunction("DevToolsAPI.embedderMessageAck", &id_value, arg, nullptr);
|
||||
}
|
||||
|
||||
bool CefDevToolsFrontend::ProtocolLoggingEnabled() const {
|
||||
return !protocol_log_file_.empty();
|
||||
}
|
||||
|
||||
void CefDevToolsFrontend::LogProtocolMessage(ProtocolMessageType type,
|
||||
const base::StringPiece& message) {
|
||||
DCHECK(ProtocolLoggingEnabled());
|
||||
|
||||
std::string to_log = message.substr(0, kMaxLogLineLength).as_string();
|
||||
|
||||
// Execute in an ordered context that allows blocking.
|
||||
auto task_runner = CefTaskRunnerManager::Get()->GetBackgroundTaskRunner();
|
||||
task_runner->PostTask(
|
||||
FROM_HERE, base::BindOnce(::LogProtocolMessage, protocol_log_file_, type,
|
||||
std::move(to_log)));
|
||||
}
|
||||
|
||||
void CefDevToolsFrontend::AgentHostClosed(
|
||||
content::DevToolsAgentHost* agent_host) {
|
||||
DCHECK(agent_host == agent_host_.get());
|
||||
@@ -512,7 +621,8 @@ void CefDevToolsFrontend::AgentHostClosed(
|
||||
}
|
||||
|
||||
PrefService* CefDevToolsFrontend::GetPrefs() const {
|
||||
return static_cast<CefBrowserContext*>(
|
||||
return CefBrowserContext::FromBrowserContext(
|
||||
frontend_browser_->web_contents()->GetBrowserContext())
|
||||
->AsProfile()
|
||||
->GetPrefs();
|
||||
}
|
||||
|
@@ -11,6 +11,7 @@
|
||||
#include "libcef/browser/devtools/devtools_file_manager.h"
|
||||
|
||||
#include "base/compiler_specific.h"
|
||||
#include "base/files/file_path.h"
|
||||
#include "base/macros.h"
|
||||
#include "base/memory/ref_counted.h"
|
||||
#include "base/memory/weak_ptr.h"
|
||||
@@ -31,36 +32,38 @@ class WebContents;
|
||||
|
||||
class PrefService;
|
||||
|
||||
enum class ProtocolMessageType {
|
||||
METHOD,
|
||||
RESULT,
|
||||
EVENT,
|
||||
};
|
||||
|
||||
class CefDevToolsFrontend : public content::WebContentsObserver,
|
||||
public content::DevToolsAgentHostClient {
|
||||
public:
|
||||
static CefDevToolsFrontend* Show(
|
||||
CefRefPtr<CefBrowserHostImpl> inspected_browser,
|
||||
CefBrowserHostImpl* inspected_browser,
|
||||
const CefWindowInfo& windowInfo,
|
||||
CefRefPtr<CefClient> client,
|
||||
const CefBrowserSettings& settings,
|
||||
const CefPoint& inspect_element_at);
|
||||
const CefPoint& inspect_element_at,
|
||||
base::OnceClosure frontend_destroyed_callback);
|
||||
|
||||
void Activate();
|
||||
void Focus();
|
||||
void InspectElementAt(int x, int y);
|
||||
void Close();
|
||||
|
||||
void DisconnectFromTarget();
|
||||
|
||||
void CallClientFunction(const std::string& function_name,
|
||||
const base::Value* arg1,
|
||||
const base::Value* arg2,
|
||||
const base::Value* arg3);
|
||||
|
||||
CefRefPtr<CefBrowserHostImpl> frontend_browser() const {
|
||||
return frontend_browser_;
|
||||
}
|
||||
|
||||
private:
|
||||
CefDevToolsFrontend(CefRefPtr<CefBrowserHostImpl> frontend_browser,
|
||||
CefDevToolsFrontend(CefBrowserHostImpl* frontend_browser,
|
||||
content::WebContents* inspected_contents,
|
||||
const CefPoint& inspect_element_at);
|
||||
const CefPoint& inspect_element_at,
|
||||
base::OnceClosure destroyed_callback);
|
||||
~CefDevToolsFrontend() override;
|
||||
|
||||
// content::DevToolsAgentHostClient implementation.
|
||||
@@ -78,12 +81,17 @@ class CefDevToolsFrontend : public content::WebContentsObserver,
|
||||
|
||||
void SendMessageAck(int request_id, const base::Value* arg1);
|
||||
|
||||
bool ProtocolLoggingEnabled() const;
|
||||
void LogProtocolMessage(ProtocolMessageType type,
|
||||
const base::StringPiece& message);
|
||||
|
||||
PrefService* GetPrefs() const;
|
||||
|
||||
CefRefPtr<CefBrowserHostImpl> frontend_browser_;
|
||||
content::WebContents* inspected_contents_;
|
||||
scoped_refptr<content::DevToolsAgentHost> agent_host_;
|
||||
CefPoint inspect_element_at_;
|
||||
base::OnceClosure frontend_destroyed_callback_;
|
||||
std::unique_ptr<content::DevToolsFrontendHost> frontend_host_;
|
||||
|
||||
class NetworkResourceLoader;
|
||||
@@ -93,6 +101,9 @@ class CefDevToolsFrontend : public content::WebContentsObserver,
|
||||
using ExtensionsAPIs = std::map<std::string, std::string>;
|
||||
ExtensionsAPIs extensions_api_;
|
||||
CefDevToolsFileManager file_manager_;
|
||||
|
||||
const base::FilePath protocol_log_file_;
|
||||
|
||||
base::WeakPtrFactory<CefDevToolsFrontend> weak_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefDevToolsFrontend);
|
||||
|
200
libcef/browser/devtools/devtools_manager.cc
Normal file
200
libcef/browser/devtools/devtools_manager.cc
Normal file
@@ -0,0 +1,200 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/devtools/devtools_manager.h"
|
||||
|
||||
#include "libcef/browser/devtools/devtools_controller.h"
|
||||
#include "libcef/browser/devtools/devtools_frontend.h"
|
||||
|
||||
#include "content/public/browser/web_contents.h"
|
||||
|
||||
namespace {
|
||||
|
||||
// May be created on any thread but will be destroyed on the UI thread.
|
||||
class CefDevToolsRegistrationImpl : public CefRegistration,
|
||||
public CefDevToolsController::Observer {
|
||||
public:
|
||||
explicit CefDevToolsRegistrationImpl(
|
||||
CefRefPtr<CefDevToolsMessageObserver> observer)
|
||||
: observer_(observer) {
|
||||
DCHECK(observer_);
|
||||
}
|
||||
|
||||
~CefDevToolsRegistrationImpl() override {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
// May be null if OnDevToolsControllerDestroyed was called.
|
||||
if (!controller_)
|
||||
return;
|
||||
|
||||
controller_->RemoveObserver(this);
|
||||
}
|
||||
|
||||
void Initialize(CefBrowserHostImpl* browser,
|
||||
base::WeakPtr<CefDevToolsController> controller) {
|
||||
CEF_REQUIRE_UIT();
|
||||
DCHECK(browser && controller);
|
||||
DCHECK(!browser_ && !controller_);
|
||||
browser_ = browser;
|
||||
controller_ = controller;
|
||||
|
||||
controller_->AddObserver(this);
|
||||
}
|
||||
|
||||
private:
|
||||
// CefDevToolsController::Observer methods:
|
||||
bool OnDevToolsMessage(const base::StringPiece& message) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
return observer_->OnDevToolsMessage(browser_, message.data(),
|
||||
message.size());
|
||||
}
|
||||
|
||||
void OnDevToolsMethodResult(int message_id,
|
||||
bool success,
|
||||
const base::StringPiece& result) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
observer_->OnDevToolsMethodResult(browser_, message_id, success,
|
||||
result.data(), result.size());
|
||||
}
|
||||
|
||||
void OnDevToolsEvent(const base::StringPiece& method,
|
||||
const base::StringPiece& params) override {
|
||||
CEF_REQUIRE_UIT();
|
||||
observer_->OnDevToolsEvent(browser_, method.as_string(), params.data(),
|
||||
params.size());
|
||||
}
|
||||
|
||||
void OnDevToolsAgentAttached() override {
|
||||
CEF_REQUIRE_UIT();
|
||||
observer_->OnDevToolsAgentAttached(browser_);
|
||||
}
|
||||
|
||||
void OnDevToolsAgentDetached() override {
|
||||
CEF_REQUIRE_UIT();
|
||||
observer_->OnDevToolsAgentDetached(browser_);
|
||||
}
|
||||
|
||||
void OnDevToolsControllerDestroyed() override {
|
||||
CEF_REQUIRE_UIT();
|
||||
browser_ = nullptr;
|
||||
controller_.reset();
|
||||
}
|
||||
|
||||
CefRefPtr<CefDevToolsMessageObserver> observer_;
|
||||
|
||||
CefBrowserHostImpl* browser_ = nullptr;
|
||||
base::WeakPtr<CefDevToolsController> controller_;
|
||||
|
||||
IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefDevToolsRegistrationImpl);
|
||||
DISALLOW_COPY_AND_ASSIGN(CefDevToolsRegistrationImpl);
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
CefDevToolsManager::CefDevToolsManager(CefBrowserHostImpl* inspected_browser)
|
||||
: inspected_browser_(inspected_browser), weak_ptr_factory_(this) {
|
||||
CEF_REQUIRE_UIT();
|
||||
}
|
||||
|
||||
CefDevToolsManager::~CefDevToolsManager() {
|
||||
CEF_REQUIRE_UIT();
|
||||
}
|
||||
|
||||
void CefDevToolsManager::ShowDevTools(const CefWindowInfo& windowInfo,
|
||||
CefRefPtr<CefClient> client,
|
||||
const CefBrowserSettings& settings,
|
||||
const CefPoint& inspect_element_at) {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (devtools_frontend_) {
|
||||
if (!inspect_element_at.IsEmpty()) {
|
||||
devtools_frontend_->InspectElementAt(inspect_element_at.x,
|
||||
inspect_element_at.y);
|
||||
}
|
||||
devtools_frontend_->Focus();
|
||||
return;
|
||||
}
|
||||
|
||||
devtools_frontend_ = CefDevToolsFrontend::Show(
|
||||
inspected_browser_, windowInfo, client, settings, inspect_element_at,
|
||||
base::BindOnce(&CefDevToolsManager::OnFrontEndDestroyed,
|
||||
weak_ptr_factory_.GetWeakPtr()));
|
||||
}
|
||||
|
||||
void CefDevToolsManager::CloseDevTools() {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!devtools_frontend_)
|
||||
return;
|
||||
devtools_frontend_->Close();
|
||||
}
|
||||
|
||||
bool CefDevToolsManager::HasDevTools() {
|
||||
CEF_REQUIRE_UIT();
|
||||
return !!devtools_frontend_;
|
||||
}
|
||||
|
||||
bool CefDevToolsManager::SendDevToolsMessage(const void* message,
|
||||
size_t message_size) {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (!message || message_size == 0)
|
||||
return false;
|
||||
|
||||
if (!EnsureController())
|
||||
return false;
|
||||
|
||||
return devtools_controller_->SendDevToolsMessage(
|
||||
base::StringPiece(static_cast<const char*>(message), message_size));
|
||||
}
|
||||
|
||||
int CefDevToolsManager::ExecuteDevToolsMethod(
|
||||
int message_id,
|
||||
const CefString& method,
|
||||
CefRefPtr<CefDictionaryValue> params) {
|
||||
CEF_REQUIRE_UIT();
|
||||
if (method.empty())
|
||||
return 0;
|
||||
|
||||
if (!EnsureController())
|
||||
return 0;
|
||||
|
||||
if (params && params->IsValid()) {
|
||||
CefDictionaryValueImpl* impl =
|
||||
static_cast<CefDictionaryValueImpl*>(params.get());
|
||||
CefValueController::AutoLock lock_scope(impl->controller());
|
||||
return devtools_controller_->ExecuteDevToolsMethod(message_id, method,
|
||||
impl->GetValueUnsafe());
|
||||
} else {
|
||||
return devtools_controller_->ExecuteDevToolsMethod(message_id, method,
|
||||
nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
CefRefPtr<CefRegistration> CefDevToolsManager::CreateRegistration(
|
||||
CefRefPtr<CefDevToolsMessageObserver> observer) {
|
||||
DCHECK(observer);
|
||||
return new CefDevToolsRegistrationImpl(observer);
|
||||
}
|
||||
|
||||
void CefDevToolsManager::InitializeRegistrationOnUIThread(
|
||||
CefRefPtr<CefRegistration> registration) {
|
||||
CEF_REQUIRE_UIT();
|
||||
|
||||
if (!EnsureController())
|
||||
return;
|
||||
|
||||
static_cast<CefDevToolsRegistrationImpl*>(registration.get())
|
||||
->Initialize(inspected_browser_, devtools_controller_->GetWeakPtr());
|
||||
}
|
||||
|
||||
void CefDevToolsManager::OnFrontEndDestroyed() {
|
||||
devtools_frontend_ = nullptr;
|
||||
}
|
||||
|
||||
bool CefDevToolsManager::EnsureController() {
|
||||
if (!devtools_controller_) {
|
||||
devtools_controller_.reset(
|
||||
new CefDevToolsController(inspected_browser_->web_contents()));
|
||||
}
|
||||
return true;
|
||||
}
|
69
libcef/browser/devtools/devtools_manager.h
Normal file
69
libcef/browser/devtools/devtools_manager.h
Normal file
@@ -0,0 +1,69 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_MANAGER_H_
|
||||
#define CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_MANAGER_H_
|
||||
#pragma once
|
||||
|
||||
#include "include/cef_browser.h"
|
||||
|
||||
#include "base/memory/weak_ptr.h"
|
||||
|
||||
class CefBrowserHostImpl;
|
||||
class CefDevToolsController;
|
||||
class CefDevToolsFrontend;
|
||||
|
||||
namespace content {
|
||||
class WebContents;
|
||||
}
|
||||
|
||||
// Manages DevTools instances. Methods must be called on the UI thread unless
|
||||
// otherwise indicated.
|
||||
class CefDevToolsManager {
|
||||
public:
|
||||
// |inspected_browser| will outlive this object.
|
||||
explicit CefDevToolsManager(CefBrowserHostImpl* inspected_browser);
|
||||
~CefDevToolsManager();
|
||||
|
||||
// See CefBrowserHost methods of the same name for documentation.
|
||||
void ShowDevTools(const CefWindowInfo& windowInfo,
|
||||
CefRefPtr<CefClient> client,
|
||||
const CefBrowserSettings& settings,
|
||||
const CefPoint& inspect_element_at);
|
||||
void CloseDevTools();
|
||||
bool HasDevTools();
|
||||
bool SendDevToolsMessage(const void* message, size_t message_size);
|
||||
int ExecuteDevToolsMethod(int message_id,
|
||||
const CefString& method,
|
||||
CefRefPtr<CefDictionaryValue> param);
|
||||
|
||||
// These methods are used to implement
|
||||
// CefBrowserHost::AddDevToolsMessageObserver. CreateRegistration is safe to
|
||||
// call on any thread. InitializeRegistrationOnUIThread should be called
|
||||
// immediately afterwards on the UI thread.
|
||||
static CefRefPtr<CefRegistration> CreateRegistration(
|
||||
CefRefPtr<CefDevToolsMessageObserver> observer);
|
||||
void InitializeRegistrationOnUIThread(
|
||||
CefRefPtr<CefRegistration> registration);
|
||||
|
||||
private:
|
||||
void OnFrontEndDestroyed();
|
||||
|
||||
bool EnsureController();
|
||||
|
||||
CefBrowserHostImpl* const inspected_browser_;
|
||||
|
||||
// CefDevToolsFrontend will delete itself when the frontend WebContents is
|
||||
// destroyed.
|
||||
CefDevToolsFrontend* devtools_frontend_ = nullptr;
|
||||
|
||||
// Used for sending DevTools protocol messages without an active frontend.
|
||||
std::unique_ptr<CefDevToolsController> devtools_controller_;
|
||||
|
||||
base::WeakPtrFactory<CefDevToolsManager> weak_ptr_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefDevToolsManager);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_MANAGER_H_
|
@@ -132,9 +132,8 @@ CefDevToolsManagerDelegate::CreateNewTarget(const GURL& url) {
|
||||
}
|
||||
|
||||
std::string CefDevToolsManagerDelegate::GetDiscoveryPageHTML() {
|
||||
return ui::ResourceBundle::GetSharedInstance()
|
||||
.GetRawDataResource(IDR_CEF_DEVTOOLS_DISCOVERY_PAGE)
|
||||
.as_string();
|
||||
return ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
|
||||
IDR_CEF_DEVTOOLS_DISCOVERY_PAGE);
|
||||
}
|
||||
|
||||
bool CefDevToolsManagerDelegate::HasBundledFrontendResources() {
|
||||
|
131
libcef/browser/devtools/devtools_util.cc
Normal file
131
libcef/browser/devtools/devtools_util.cc
Normal file
@@ -0,0 +1,131 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/devtools/devtools_util.h"
|
||||
|
||||
#include "base/strings/string_number_conversions.h"
|
||||
|
||||
namespace devtools_util {
|
||||
|
||||
namespace {
|
||||
|
||||
bool IsValidDictionary(const base::StringPiece& str, bool allow_empty) {
|
||||
return str.length() >= (allow_empty ? 2 : 3) && str[0] == '{' &&
|
||||
str[str.length() - 1] == '}';
|
||||
}
|
||||
|
||||
// Example:
|
||||
// {"method":"Target.targetDestroyed","params":{"targetId":"1234..."}}
|
||||
bool ParseEvent(const base::StringPiece& message,
|
||||
base::StringPiece& method,
|
||||
base::StringPiece& params) {
|
||||
static const char kMethodStart[] = "{\"method\":\"";
|
||||
static const char kMethodEnd[] = "\"";
|
||||
static const char kParamsStart[] = ",\"params\":";
|
||||
|
||||
if (!message.starts_with(kMethodStart))
|
||||
return false;
|
||||
|
||||
const size_t method_start = sizeof(kMethodStart) - 1;
|
||||
const size_t method_end = message.find(kMethodEnd, method_start);
|
||||
if (method_end < 0U)
|
||||
return false;
|
||||
method = message.substr(method_start, method_end - method_start);
|
||||
if (method.empty())
|
||||
return false;
|
||||
|
||||
size_t remainder_start = method_end + sizeof(kMethodEnd) - 1;
|
||||
if (remainder_start == message.size() - 1) {
|
||||
// No more contents.
|
||||
params = base::StringPiece();
|
||||
} else {
|
||||
const base::StringPiece& remainder = message.substr(remainder_start);
|
||||
if (remainder.starts_with(kParamsStart)) {
|
||||
// Stop immediately before the message closing bracket.
|
||||
remainder_start += sizeof(kParamsStart) - 1;
|
||||
params =
|
||||
message.substr(remainder_start, message.size() - 1 - remainder_start);
|
||||
} else {
|
||||
// Invalid format.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!IsValidDictionary(params, /*allow_empty=*/true))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Examples:
|
||||
// {"id":3,"result":{}}
|
||||
// {"id":4,"result":{"debuggerId":"-2193881606781505058.81393575456727957"}}
|
||||
// {"id":5,"error":{"code":-32000,"message":"Not supported"}}
|
||||
bool ParseResult(const base::StringPiece& message,
|
||||
int& message_id,
|
||||
bool& success,
|
||||
base::StringPiece& result) {
|
||||
static const char kIdStart[] = "{\"id\":";
|
||||
static const char kIdEnd[] = ",";
|
||||
static const char kResultStart[] = "\"result\":";
|
||||
static const char kErrorStart[] = "\"error\":";
|
||||
|
||||
if (!message.starts_with(kIdStart))
|
||||
return false;
|
||||
|
||||
const size_t id_start = sizeof(kIdStart) - 1;
|
||||
const size_t id_end = message.find(kIdEnd, id_start);
|
||||
if (id_end < 0U)
|
||||
return false;
|
||||
const base::StringPiece& id_str = message.substr(id_start, id_end - id_start);
|
||||
if (id_str.empty() || !base::StringToInt(id_str, &message_id))
|
||||
return false;
|
||||
|
||||
size_t remainder_start = id_end + sizeof(kIdEnd) - 1;
|
||||
const base::StringPiece& remainder = message.substr(remainder_start);
|
||||
if (remainder.starts_with(kResultStart)) {
|
||||
// Stop immediately before the message closing bracket.
|
||||
remainder_start += sizeof(kResultStart) - 1;
|
||||
result =
|
||||
message.substr(remainder_start, message.size() - 1 - remainder_start);
|
||||
success = true;
|
||||
} else if (remainder.starts_with(kErrorStart)) {
|
||||
// Stop immediately before the message closing bracket.
|
||||
remainder_start += sizeof(kErrorStart) - 1;
|
||||
result =
|
||||
message.substr(remainder_start, message.size() - 1 - remainder_start);
|
||||
success = false;
|
||||
} else {
|
||||
// Invalid format.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!IsValidDictionary(result, /*allow_empty=*/true))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// static
|
||||
bool ProtocolParser::IsValidMessage(const base::StringPiece& message) {
|
||||
return IsValidDictionary(message, /*allow_empty=*/false);
|
||||
}
|
||||
|
||||
bool ProtocolParser::Initialize(const base::StringPiece& message) {
|
||||
if (status_ != UNINITIALIZED)
|
||||
return false;
|
||||
|
||||
if (ParseEvent(message, method_, params_)) {
|
||||
status_ = EVENT;
|
||||
} else if (ParseResult(message, message_id_, success_, params_)) {
|
||||
status_ = RESULT;
|
||||
} else {
|
||||
status_ = FAILURE;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace devtools_util
|
72
libcef/browser/devtools/devtools_util.h
Normal file
72
libcef/browser/devtools/devtools_util.h
Normal file
@@ -0,0 +1,72 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_UTIL_H_
|
||||
#define CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_UTIL_H_
|
||||
#pragma once
|
||||
|
||||
#include "base/strings/string_piece.h"
|
||||
|
||||
namespace devtools_util {
|
||||
|
||||
// Fast parser for DevTools JSON protocol messages. This implementation makes
|
||||
// certain assumptions about the JSON object structure (value order and
|
||||
// formatting) to avoid stateful parsing of messages that may be large
|
||||
// (sometimes > 1MB in size). The message must be a JSON dictionary that starts
|
||||
// with a "method" or "id" value which is non-empty and of the expected data
|
||||
// type. Messages that have a "method" value (event message) may optionally have
|
||||
// a "params" dictionary. Messages that have an "id" value (result message) must
|
||||
// have a "result" or "error" dictionary. The dictionary contents are not
|
||||
// validated and may be empty ("{}").
|
||||
//
|
||||
// Example event message:
|
||||
// {"method":"Target.targetDestroyed","params":{"targetId":"1234..."}}
|
||||
//
|
||||
// Example result messages:
|
||||
// {"id":3,"result":{}}
|
||||
// {"id":4,"result":{"debuggerId":"-2193881606781505058.81393575456727957"}}
|
||||
// {"id":5,"error":{"code":-32000,"message":"Not supported"}}
|
||||
struct ProtocolParser {
|
||||
ProtocolParser() = default;
|
||||
|
||||
// Checks for a non-empty JSON dictionary.
|
||||
static bool IsValidMessage(const base::StringPiece& message);
|
||||
|
||||
// Returns false if already initialized.
|
||||
bool Initialize(const base::StringPiece& message);
|
||||
|
||||
bool IsInitialized() const { return status_ != UNINITIALIZED; }
|
||||
bool IsEvent() const { return status_ == EVENT; }
|
||||
bool IsResult() const { return status_ == RESULT; }
|
||||
bool IsFailure() const { return status_ == FAILURE; }
|
||||
|
||||
void Reset() { status_ = UNINITIALIZED; }
|
||||
|
||||
// For event messages:
|
||||
// "method" string:
|
||||
base::StringPiece method_;
|
||||
|
||||
// For result messages:
|
||||
// "id" int:
|
||||
int message_id_ = 0;
|
||||
// true if "result" value, false if "error" value:
|
||||
bool success_ = false;
|
||||
|
||||
// For both:
|
||||
// "params", "result" or "error" dictionary:
|
||||
base::StringPiece params_;
|
||||
|
||||
private:
|
||||
enum Status {
|
||||
UNINITIALIZED,
|
||||
EVENT, // Event message.
|
||||
RESULT, // Result message.
|
||||
FAILURE, // Parsing failure.
|
||||
};
|
||||
Status status_ = UNINITIALIZED;
|
||||
};
|
||||
|
||||
} // namespace devtools_util
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_DEVTOOLS_UTIL_H_
|
204
libcef/browser/devtools/devtools_util_unittest.cc
Normal file
204
libcef/browser/devtools/devtools_util_unittest.cc
Normal file
@@ -0,0 +1,204 @@
|
||||
// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#include "libcef/browser/devtools/devtools_util.h"
|
||||
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
|
||||
using namespace devtools_util;
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_IsValidMessage) {
|
||||
// Empty dictionary is not valid.
|
||||
EXPECT_FALSE(ProtocolParser::IsValidMessage(""));
|
||||
EXPECT_FALSE(ProtocolParser::IsValidMessage("{}"));
|
||||
|
||||
// Incorrectly formatted dictionary is not valid.
|
||||
EXPECT_FALSE(ProtocolParser::IsValidMessage("{ ]"));
|
||||
|
||||
// Everything else is valid (we don't verify JSON structure).
|
||||
EXPECT_TRUE(ProtocolParser::IsValidMessage("{ }"));
|
||||
EXPECT_TRUE(ProtocolParser::IsValidMessage("{blah blah}"));
|
||||
EXPECT_TRUE(ProtocolParser::IsValidMessage("{method:\"foobar\"}"));
|
||||
}
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_Initialize_IsFailure_Unknown) {
|
||||
ProtocolParser parser;
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Empty message is invalid.
|
||||
EXPECT_TRUE(parser.Initialize(""));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Empty dictionary is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Unrecognized dictionary type is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{blah blah}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
}
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_Initialize_IsFailure_EventMalformed) {
|
||||
ProtocolParser parser;
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Empty method is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{\"method\":\"\"}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Unrecognized value is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{\"method\":\"foo\",oops:false}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Params must be a dictionary.
|
||||
EXPECT_TRUE(parser.Initialize("{\"method\":\",params:[]}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
}
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_Initialize_IsEvent) {
|
||||
ProtocolParser parser;
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Method without params is valid.
|
||||
std::string message = "{\"method\":\"Test.myMethod\"}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsEvent());
|
||||
EXPECT_STREQ("Test.myMethod", parser.method_.as_string().data());
|
||||
EXPECT_TRUE(parser.params_.empty());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Method with empty params dictionary is valid.
|
||||
message = "{\"method\":\"Test.myMethod2\",\"params\":{}}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsEvent());
|
||||
EXPECT_STREQ("Test.myMethod2", parser.method_.as_string().data());
|
||||
EXPECT_STREQ("{}", parser.params_.as_string().data());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Method with non-empty params dictionary is valid.
|
||||
message = "{\"method\":\"Test.myMethod3\",\"params\":{\"foo\":\"bar\"}}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsEvent());
|
||||
EXPECT_STREQ("Test.myMethod3", parser.method_.as_string().data());
|
||||
EXPECT_STREQ("{\"foo\":\"bar\"}", parser.params_.as_string().data());
|
||||
}
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_Initialize_IsFailure_ResultMalformed) {
|
||||
ProtocolParser parser;
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Empty ID is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{\"id\":,result:{}}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Missing result or error value is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{\"id\":1}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Unrecognized value is invalid.
|
||||
EXPECT_TRUE(parser.Initialize("{\"id\":1,oops:false}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Result must be a dictionary.
|
||||
EXPECT_TRUE(parser.Initialize("{\"id\":1,\"result\":[]}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Error must be a dictionary.
|
||||
EXPECT_TRUE(parser.Initialize("{\"id\":1,\"error\":[]}"));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsFailure());
|
||||
}
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_Initialize_IsResult_Result) {
|
||||
ProtocolParser parser;
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Id with empty result dictionary is valid.
|
||||
std::string message = "{\"id\":1,\"result\":{}}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsResult());
|
||||
EXPECT_EQ(1, parser.message_id_);
|
||||
EXPECT_TRUE(parser.success_);
|
||||
EXPECT_STREQ("{}", parser.params_.as_string().data());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Id with non-empty result dictionary is valid.
|
||||
message = "{\"id\":2,\"result\":{\"foo\":\"bar\"}}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsResult());
|
||||
EXPECT_EQ(2, parser.message_id_);
|
||||
EXPECT_TRUE(parser.success_);
|
||||
EXPECT_STREQ("{\"foo\":\"bar\"}", parser.params_.as_string().data());
|
||||
}
|
||||
|
||||
TEST(DevToolsUtil, ProtocolParser_Initialize_IsResult_Error) {
|
||||
ProtocolParser parser;
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Id with empty error dictionary is valid.
|
||||
std::string message = "{\"id\":1,\"error\":{}}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsResult());
|
||||
EXPECT_EQ(1, parser.message_id_);
|
||||
EXPECT_FALSE(parser.success_);
|
||||
EXPECT_STREQ("{}", parser.params_.as_string().data());
|
||||
|
||||
parser.Reset();
|
||||
EXPECT_FALSE(parser.IsInitialized());
|
||||
|
||||
// Id with non-empty error dictionary is valid.
|
||||
message = "{\"id\":2,\"error\":{\"foo\":\"bar\"}}";
|
||||
EXPECT_TRUE(parser.Initialize(message));
|
||||
EXPECT_TRUE(parser.IsInitialized());
|
||||
EXPECT_TRUE(parser.IsResult());
|
||||
EXPECT_EQ(2, parser.message_id_);
|
||||
EXPECT_FALSE(parser.success_);
|
||||
EXPECT_STREQ("{\"foo\":\"bar\"}", parser.params_.as_string().data());
|
||||
}
|
@@ -152,6 +152,7 @@ class CefBeforeDownloadCallbackImpl : public CefBeforeDownloadCallback {
|
||||
suggested_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
||||
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
||||
download::DownloadItem::MixedContentStatus::UNKNOWN, suggested_path,
|
||||
base::nullopt /*download_schedule*/,
|
||||
download::DOWNLOAD_INTERRUPT_REASON_NONE);
|
||||
}
|
||||
}
|
||||
@@ -170,7 +171,8 @@ class CefBeforeDownloadCallbackImpl : public CefBeforeDownloadCallback {
|
||||
std::move(callback).Run(path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
||||
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
||||
download::DownloadItem::MixedContentStatus::UNKNOWN,
|
||||
path, download::DOWNLOAD_INTERRUPT_REASON_NONE);
|
||||
path, base::nullopt /*download_schedule*/,
|
||||
download::DOWNLOAD_INTERRUPT_REASON_NONE);
|
||||
}
|
||||
|
||||
base::WeakPtr<DownloadManager> manager_;
|
||||
@@ -355,7 +357,8 @@ bool CefDownloadManagerDelegate::DetermineDownloadTarget(
|
||||
item->GetForcedFilePath(), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
||||
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
||||
download::DownloadItem::MixedContentStatus::UNKNOWN,
|
||||
item->GetForcedFilePath(), download::DOWNLOAD_INTERRUPT_REASON_NONE);
|
||||
item->GetForcedFilePath(), base::nullopt /*download_schedule*/,
|
||||
download::DOWNLOAD_INTERRUPT_REASON_NONE);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -4,7 +4,6 @@
|
||||
|
||||
#include "libcef/browser/extension_impl.h"
|
||||
|
||||
#include "libcef/browser/extensions/extension_system.h"
|
||||
#include "libcef/browser/request_context_impl.h"
|
||||
#include "libcef/browser/thread_util.h"
|
||||
#include "libcef/common/values_impl.h"
|
||||
@@ -89,7 +88,6 @@ void CefExtensionImpl::Unload() {
|
||||
|
||||
const bool result = static_cast<CefRequestContextImpl*>(loader_context_)
|
||||
->GetBrowserContext()
|
||||
->extension_system()
|
||||
->UnloadExtension(id_);
|
||||
ALLOW_UNUSED_LOCAL(result);
|
||||
DCHECK(result);
|
||||
|
@@ -149,16 +149,16 @@ CefRefPtr<CefBrowserHostImpl> GetBrowserForTabId(
|
||||
if (tab_id < 0 || !browser_context)
|
||||
return nullptr;
|
||||
|
||||
CefBrowserContext* browser_context_impl =
|
||||
CefBrowserContext::GetForContext(browser_context);
|
||||
auto cef_browser_context =
|
||||
CefBrowserContext::FromBrowserContext(browser_context);
|
||||
|
||||
for (const auto& browser_info :
|
||||
CefBrowserInfoManager::GetInstance()->GetBrowserInfoList()) {
|
||||
CefRefPtr<CefBrowserHostImpl> current_browser = browser_info->browser();
|
||||
if (current_browser && current_browser->GetIdentifier() == tab_id) {
|
||||
// Make sure we're operating in the same BrowserContextImpl.
|
||||
if (CefBrowserContext::GetForContext(
|
||||
current_browser->GetBrowserContext()) == browser_context_impl) {
|
||||
// Make sure we're operating in the same CefBrowserContext.
|
||||
if (CefBrowserContext::FromBrowserContext(
|
||||
current_browser->GetBrowserContext()) == cef_browser_context) {
|
||||
return current_browser;
|
||||
} else {
|
||||
LOG(WARNING) << "Browser with tabId " << tab_id
|
||||
|
@@ -45,7 +45,7 @@ CefRefPtr<CefBrowserHostImpl> GetOwnerBrowserForFrameRoute(
|
||||
// |is_guest_view| will be set to true if the host matches a guest view
|
||||
// associated with the returned browser instead of the browser itself.
|
||||
// TODO(cef): Delete the RVH variant once the remaining use case
|
||||
// (via CefContentBrowserClient::OverrideWebkitPrefs) has been removed.
|
||||
// (via AlloyContentBrowserClient::OverrideWebkitPrefs) has been removed.
|
||||
CefRefPtr<CefBrowserHostImpl> GetOwnerBrowserForHost(
|
||||
content::RenderViewHost* host,
|
||||
bool* is_guest_view);
|
||||
|
@@ -35,14 +35,6 @@ CefWindowHandle CefBrowserPlatformDelegateBackground::GetHostWindowHandle()
|
||||
return kNullWindowHandle;
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateBackground::CanUseSharedTexture() const {
|
||||
return native_delegate_->CanUseSharedTexture();
|
||||
}
|
||||
|
||||
bool CefBrowserPlatformDelegateBackground::CanUseExternalBeginFrame() const {
|
||||
return native_delegate_->CanUseExternalBeginFrame();
|
||||
}
|
||||
|
||||
SkColor CefBrowserPlatformDelegateBackground::GetBackgroundColor() const {
|
||||
return native_delegate_->GetBackgroundColor();
|
||||
}
|
||||
|
@@ -5,12 +5,12 @@
|
||||
#ifndef CEF_LIBCEF_BROWSER_VIEWS_BROWSER_PLATFORM_DELEGATE_BACKGROUND_H_
|
||||
#define CEF_LIBCEF_BROWSER_VIEWS_BROWSER_PLATFORM_DELEGATE_BACKGROUND_H_
|
||||
|
||||
#include "libcef/browser/browser_platform_delegate.h"
|
||||
#include "libcef/browser/alloy/browser_platform_delegate_alloy.h"
|
||||
#include "libcef/browser/native/browser_platform_delegate_native.h"
|
||||
|
||||
// Implementation of browser functionality for background script hosts.
|
||||
class CefBrowserPlatformDelegateBackground
|
||||
: public CefBrowserPlatformDelegate,
|
||||
: public CefBrowserPlatformDelegateAlloy,
|
||||
public CefBrowserPlatformDelegateNative::WindowlessHandler {
|
||||
public:
|
||||
// Platform-specific behaviors will be delegated to |native_delegate|.
|
||||
@@ -22,8 +22,6 @@ class CefBrowserPlatformDelegateBackground
|
||||
void CloseHostWindow() override;
|
||||
CefWindowHandle GetHostWindowHandle() const override;
|
||||
SkColor GetBackgroundColor() const override;
|
||||
bool CanUseSharedTexture() const override;
|
||||
bool CanUseExternalBeginFrame() const override;
|
||||
void WasResized() override;
|
||||
void SendKeyEvent(const CefKeyEvent& event) override;
|
||||
void SendMouseClickEvent(const CefMouseEvent& event,
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#include <map>
|
||||
|
||||
#include "base/files/file_path.h"
|
||||
#include "base/macros.h"
|
||||
#include "extensions/browser/component_extension_resource_manager.h"
|
||||
|
||||
struct GritResourceMap;
|
||||
|
@@ -15,13 +15,12 @@ CefExtensionBackgroundHost::CefExtensionBackgroundHost(
|
||||
CefBrowserHostImpl* browser,
|
||||
base::OnceClosure deleted_callback,
|
||||
const Extension* extension,
|
||||
content::BrowserContext* browser_context,
|
||||
content::WebContents* host_contents,
|
||||
const GURL& url,
|
||||
ViewType host_type)
|
||||
: ExtensionHost(new CefExtensionHostDelegate(browser),
|
||||
extension,
|
||||
browser_context,
|
||||
host_contents->GetBrowserContext(),
|
||||
host_contents,
|
||||
url,
|
||||
host_type),
|
||||
|
@@ -27,7 +27,6 @@ class CefExtensionBackgroundHost : public ExtensionHost {
|
||||
CefExtensionBackgroundHost(CefBrowserHostImpl* browser,
|
||||
base::OnceClosure deleted_callback,
|
||||
const Extension* extension,
|
||||
content::BrowserContext* browser_context,
|
||||
content::WebContents* host_contents,
|
||||
const GURL& url,
|
||||
ViewType host_type);
|
||||
|
@@ -166,9 +166,10 @@ CefRefPtr<CefBrowserHostImpl> CefExtensionFunctionDetails::GetCurrentBrowser()
|
||||
CefRefPtr<CefBrowserHostImpl> active_browser_impl =
|
||||
static_cast<CefBrowserHostImpl*>(active_browser.get());
|
||||
|
||||
// Make sure we're operating in the same BrowserContextImpl.
|
||||
if (CefBrowserContext::GetForContext(browser->GetBrowserContext()) ==
|
||||
CefBrowserContext::GetForContext(
|
||||
// Make sure we're operating in the same CefBrowserContext.
|
||||
if (CefBrowserContext::FromBrowserContext(
|
||||
browser->GetBrowserContext()) ==
|
||||
CefBrowserContext::FromBrowserContext(
|
||||
active_browser_impl->GetBrowserContext())) {
|
||||
browser = active_browser_impl;
|
||||
} else {
|
||||
@@ -347,13 +348,12 @@ base::DictionaryValue* CefExtensionFunctionDetails::OpenTab(
|
||||
if (params.index.get())
|
||||
index = *params.index;
|
||||
|
||||
CefBrowserContext* browser_context_impl =
|
||||
CefBrowserContext::GetForContext(active_browser->GetBrowserContext());
|
||||
auto cef_browser_context = CefBrowserContext::FromBrowserContext(
|
||||
active_browser->GetBrowserContext());
|
||||
|
||||
// A CEF representation should always exist.
|
||||
CefRefPtr<CefExtension> cef_extension =
|
||||
browser_context_impl->extension_system()->GetExtension(
|
||||
function()->extension()->id());
|
||||
cef_browser_context->GetExtension(function()->extension()->id());
|
||||
DCHECK(cef_extension);
|
||||
if (!cef_extension)
|
||||
return nullptr;
|
||||
@@ -466,8 +466,7 @@ CefExtensionFunctionDetails::CreateMutedInfo(content::WebContents* contents) {
|
||||
CefRefPtr<CefExtension> CefExtensionFunctionDetails::GetCefExtension() const {
|
||||
if (!cef_extension_) {
|
||||
cef_extension_ =
|
||||
static_cast<CefBrowserContext*>(function_->browser_context())
|
||||
->extension_system()
|
||||
CefBrowserContext::FromBrowserContext(function_->browser_context())
|
||||
->GetExtension(function_->extension_id());
|
||||
DCHECK(cef_extension_);
|
||||
}
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#include "base/path_service.h"
|
||||
#include "base/strings/string_tokenizer.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "base/task/post_task.h"
|
||||
#include "base/threading/thread_restrictions.h"
|
||||
#include "chrome/browser/profiles/profile.h"
|
||||
#include "chrome/common/chrome_paths.h"
|
||||
@@ -54,7 +53,6 @@
|
||||
#include "net/base/mime_util.h"
|
||||
|
||||
using content::BrowserContext;
|
||||
using content::BrowserThread;
|
||||
|
||||
namespace extensions {
|
||||
|
||||
@@ -179,10 +177,6 @@ void CefExtensionSystem::Init() {
|
||||
|
||||
// Inform the rest of the extensions system to start.
|
||||
ready_.Signal();
|
||||
content::NotificationService::current()->Notify(
|
||||
NOTIFICATION_EXTENSIONS_READY_DEPRECATED,
|
||||
content::Source<BrowserContext>(browser_context_),
|
||||
content::NotificationService::NoDetails());
|
||||
|
||||
// Add the internal PDF extension. PDF loading works as follows:
|
||||
// 1. The PDF PPAPI plugin is registered in libcef/common/content_client.cc
|
||||
@@ -224,7 +218,7 @@ void CefExtensionSystem::Init() {
|
||||
// WebContents routing IDs with the owner CefBrowser. MimeHandlerViewGuest
|
||||
// then loads the extension URL (index.html) in the guest WebContents.
|
||||
// 13.Creation of the RenderFrame in the guest renderer process triggers a
|
||||
// sync IPC call from CefContentRendererClient::MaybeCreateBrowser to
|
||||
// sync IPC call from AlloyContentRendererClient::MaybeCreateBrowser to
|
||||
// CefBrowserInfoManager::GetBrowserInfo in the browser process to retrieve
|
||||
// the CefBrowser information, which will be immediately available due to
|
||||
// step 12.
|
||||
@@ -248,7 +242,7 @@ void CefExtensionSystem::Init() {
|
||||
// 17.HTMLPlugInElement::RequestObject is called in the guest renderer process
|
||||
// and determines that the PDF PPAPI plugin should be handled internally
|
||||
// (handled_externally=false). A PluginDocument is created and
|
||||
// CefContentRendererClient::OverrideCreatePlugin is called to create a
|
||||
// AlloyContentRendererClient::OverrideCreatePlugin is called to create a
|
||||
// WebPlugin.
|
||||
// 18.The PDF extension and PDF plugin are now loaded. Print commands, if
|
||||
// any, are handled in the guest renderer process by ChromePDFPrintClient
|
||||
@@ -413,7 +407,7 @@ ServiceWorkerManager* CefExtensionSystem::service_worker_manager() {
|
||||
return service_worker_manager_.get();
|
||||
}
|
||||
|
||||
SharedUserScriptMaster* CefExtensionSystem::shared_user_script_master() {
|
||||
SharedUserScriptManager* CefExtensionSystem::shared_user_script_manager() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -450,8 +444,8 @@ void CefExtensionSystem::RegisterExtensionWithRequestContexts(
|
||||
base::OnceClosure callback) {
|
||||
// TODO(extensions): The |incognito_enabled| value should be set based on
|
||||
// manifest settings.
|
||||
base::PostTaskAndReply(
|
||||
FROM_HERE, {BrowserThread::IO},
|
||||
content::GetIOThreadTaskRunner({})->PostTaskAndReply(
|
||||
FROM_HERE,
|
||||
base::Bind(&InfoMap::AddExtension, info_map(),
|
||||
base::RetainedRef(extension), base::Time::Now(),
|
||||
true, // incognito_enabled
|
||||
@@ -464,8 +458,8 @@ void CefExtensionSystem::RegisterExtensionWithRequestContexts(
|
||||
void CefExtensionSystem::UnregisterExtensionWithRequestContexts(
|
||||
const std::string& extension_id,
|
||||
const UnloadedExtensionReason reason) {
|
||||
base::PostTask(
|
||||
FROM_HERE, {BrowserThread::IO},
|
||||
content::GetIOThreadTaskRunner({})->PostTask(
|
||||
FROM_HERE,
|
||||
base::Bind(&InfoMap::RemoveExtension, info_map(), extension_id, reason));
|
||||
}
|
||||
|
||||
@@ -473,6 +467,10 @@ const base::OneShotEvent& CefExtensionSystem::ready() const {
|
||||
return ready_;
|
||||
}
|
||||
|
||||
bool CefExtensionSystem::is_ready() const {
|
||||
return ready_.is_signaled();
|
||||
}
|
||||
|
||||
ContentVerifier* CefExtensionSystem::content_verifier() {
|
||||
return nullptr;
|
||||
}
|
||||
|
@@ -17,12 +17,9 @@
|
||||
#include "base/one_shot_event.h"
|
||||
#include "extensions/browser/extension_system.h"
|
||||
|
||||
class BrowserContextKeyedServiceFactory;
|
||||
|
||||
namespace base {
|
||||
class DictionaryValue;
|
||||
class FilePath;
|
||||
} // namespace base
|
||||
}
|
||||
|
||||
namespace content {
|
||||
class BrowserContext;
|
||||
@@ -31,11 +28,8 @@ class BrowserContext;
|
||||
namespace extensions {
|
||||
|
||||
class ExtensionRegistry;
|
||||
class InfoMap;
|
||||
class ProcessManager;
|
||||
class RendererStartupHelper;
|
||||
class SharedUserScriptMaster;
|
||||
class ValueStoreFactory;
|
||||
|
||||
// Used to manage extensions.
|
||||
class CefExtensionSystem : public ExtensionSystem {
|
||||
@@ -93,7 +87,7 @@ class CefExtensionSystem : public ExtensionSystem {
|
||||
RuntimeData* runtime_data() override;
|
||||
ManagementPolicy* management_policy() override;
|
||||
ServiceWorkerManager* service_worker_manager() override;
|
||||
SharedUserScriptMaster* shared_user_script_master() override;
|
||||
SharedUserScriptManager* shared_user_script_manager() override;
|
||||
StateStore* state_store() override;
|
||||
StateStore* rules_store() override;
|
||||
scoped_refptr<ValueStoreFactory> store_factory() override;
|
||||
@@ -107,6 +101,7 @@ class CefExtensionSystem : public ExtensionSystem {
|
||||
const std::string& extension_id,
|
||||
const UnloadedExtensionReason reason) override;
|
||||
const base::OneShotEvent& ready() const override;
|
||||
bool is_ready() const override;
|
||||
ContentVerifier* content_verifier() override;
|
||||
std::unique_ptr<ExtensionSet> GetDependentExtensions(
|
||||
const Extension* extension) override;
|
||||
|
@@ -21,16 +21,14 @@ using content::WebContentsObserver;
|
||||
|
||||
namespace extensions {
|
||||
|
||||
CefExtensionViewHost::CefExtensionViewHost(
|
||||
CefBrowserHostImpl* browser,
|
||||
const Extension* extension,
|
||||
content::BrowserContext* browser_context,
|
||||
content::WebContents* host_contents,
|
||||
const GURL& url,
|
||||
ViewType host_type)
|
||||
CefExtensionViewHost::CefExtensionViewHost(CefBrowserHostImpl* browser,
|
||||
const Extension* extension,
|
||||
content::WebContents* host_contents,
|
||||
const GURL& url,
|
||||
ViewType host_type)
|
||||
: ExtensionHost(new CefExtensionHostDelegate(browser),
|
||||
extension,
|
||||
browser_context,
|
||||
host_contents->GetBrowserContext(),
|
||||
host_contents,
|
||||
url,
|
||||
host_type) {
|
||||
|
@@ -29,7 +29,6 @@ class CefExtensionViewHost : public ExtensionHost,
|
||||
public:
|
||||
CefExtensionViewHost(CefBrowserHostImpl* browser,
|
||||
const Extension* extension,
|
||||
content::BrowserContext* browser_context,
|
||||
content::WebContents* host_contents,
|
||||
const GURL& url,
|
||||
ViewType host_type);
|
||||
|
@@ -36,8 +36,8 @@ CefExtensionsAPIClient::CreateGuestViewManagerDelegate(
|
||||
// The GuestViewManager instance associated with the returned Delegate, which
|
||||
// will be retrieved in the future via GuestViewManager::FromBrowserContext,
|
||||
// will be associated with the CefBrowserContext.
|
||||
return base::WrapUnique(new extensions::ExtensionsGuestViewManagerDelegate(
|
||||
CefBrowserContext::GetForContext(context)));
|
||||
return base::WrapUnique(
|
||||
new extensions::ExtensionsGuestViewManagerDelegate(context));
|
||||
}
|
||||
|
||||
std::unique_ptr<MimeHandlerViewGuestDelegate>
|
||||
|
@@ -138,7 +138,10 @@ BrowserContext* CefExtensionsBrowserClient::GetOffTheRecordContext(
|
||||
|
||||
BrowserContext* CefExtensionsBrowserClient::GetOriginalContext(
|
||||
BrowserContext* context) {
|
||||
return CefBrowserContext::GetForContext(context);
|
||||
auto cef_browser_context = CefBrowserContext::FromBrowserContext(context);
|
||||
if (cef_browser_context)
|
||||
return cef_browser_context->AsBrowserContext();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool CefExtensionsBrowserClient::IsGuestSession(BrowserContext* context) const {
|
||||
@@ -200,7 +203,9 @@ bool CefExtensionsBrowserClient::AllowCrossRendererResourceLoad(
|
||||
|
||||
PrefService* CefExtensionsBrowserClient::GetPrefServiceForContext(
|
||||
BrowserContext* context) {
|
||||
return static_cast<CefBrowserContext*>(context)->GetPrefs();
|
||||
return CefBrowserContext::FromBrowserContext(context)
|
||||
->AsProfile()
|
||||
->GetPrefs();
|
||||
}
|
||||
|
||||
void CefExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
|
||||
@@ -224,12 +229,12 @@ bool CefExtensionsBrowserClient::CreateBackgroundExtensionHost(
|
||||
content::BrowserContext* browser_context,
|
||||
const GURL& url,
|
||||
ExtensionHost** host) {
|
||||
CefBrowserContext* browser_context_impl =
|
||||
CefBrowserContext::GetForContext(browser_context);
|
||||
auto cef_browser_context =
|
||||
CefBrowserContext::FromBrowserContext(browser_context);
|
||||
|
||||
// A CEF representation should always exist.
|
||||
CefRefPtr<CefExtension> cef_extension =
|
||||
browser_context_impl->extension_system()->GetExtension(extension->id());
|
||||
cef_browser_context->GetExtension(extension->id());
|
||||
DCHECK(cef_extension);
|
||||
if (!cef_extension) {
|
||||
// Cancel the background host creation.
|
||||
@@ -267,7 +272,7 @@ bool CefExtensionsBrowserClient::CreateBackgroundExtensionHost(
|
||||
CefRefPtr<CefBrowserHostImpl> browser =
|
||||
CefBrowserHostImpl::Create(create_params);
|
||||
if (browser) {
|
||||
*host = browser->extension_host();
|
||||
*host = browser->GetExtensionHost();
|
||||
DCHECK(*host);
|
||||
}
|
||||
return true;
|
||||
|
@@ -5,10 +5,10 @@
|
||||
|
||||
#include "libcef/browser/extensions/mime_handler_view_guest_delegate.h"
|
||||
|
||||
#include "libcef/browser/alloy/alloy_content_browser_client.h"
|
||||
#include "libcef/browser/browser_context.h"
|
||||
#include "libcef/browser/browser_host_impl.h"
|
||||
#include "libcef/browser/browser_info.h"
|
||||
#include "libcef/browser/content_browser_client.h"
|
||||
#include "libcef/browser/osr/web_contents_view_osr.h"
|
||||
|
||||
#include "content/browser/browser_plugin/browser_plugin_guest.h"
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user