Import chromium-83.0.4103.61

This commit is contained in:
klzgrad 2020-05-20 20:33:54 +08:00
commit 21e78728f8
28552 changed files with 5656265 additions and 0 deletions

39
src/.clang-format Normal file
View File

@ -0,0 +1,39 @@
# Defines the Chromium style for automatic reformatting.
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
BasedOnStyle: Chromium
# This defaults to 'Auto'. Explicitly set it for a while, so that
# 'vector<vector<int> >' in existing files gets formatted to
# 'vector<vector<int>>'. ('Auto' means that clang-format will only use
# 'int>>' if the file already contains at least one such instance.)
Standard: Cpp11
# Make sure code like:
# IPC_BEGIN_MESSAGE_MAP()
# IPC_MESSAGE_HANDLER(WidgetHostViewHost_Update, OnUpdate)
# IPC_END_MESSAGE_MAP()
# gets correctly indented.
MacroBlockBegin: "^\
BEGIN_MSG_MAP|\
BEGIN_MSG_MAP_EX|\
BEGIN_SAFE_MSG_MAP_EX|\
CR_BEGIN_MSG_MAP_EX|\
IPC_BEGIN_MESSAGE_MAP|\
IPC_BEGIN_MESSAGE_MAP_WITH_PARAM|\
IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN|\
IPC_STRUCT_BEGIN|\
IPC_STRUCT_BEGIN_WITH_PARENT|\
IPC_STRUCT_TRAITS_BEGIN|\
POLPARAMS_BEGIN|\
PPAPI_BEGIN_MESSAGE_MAP$"
MacroBlockEnd: "^\
CR_END_MSG_MAP|\
END_MSG_MAP|\
IPC_END_MESSAGE_MAP|\
IPC_PROTOBUF_MESSAGE_TRAITS_END|\
IPC_STRUCT_END|\
IPC_STRUCT_TRAITS_END|\
POLPARAMS_END|\
PPAPI_END_MESSAGE_MAP$"
# TODO: Remove this once clang-format r357700 is rolled in.
JavaImportGroups: ['android', 'androidx', 'com', 'dalvik', 'junit', 'org', 'com.google.android.apps.chrome', 'org.chromium', 'java', 'javax']

54
src/.gitattributes vendored Normal file
View File

@ -0,0 +1,54 @@
# Stop Windows python license check presubmit errors by forcing LF checkout.
*.py text eol=lf
# Force LF checkout of the pins files to avoid transport_security_state_generator errors.
/net/http/*.pins text eol=lf
# Force LF checkout for all source files
*.bin binary
*.c text eol=lf
*.cc text eol=lf
*.cpp text eol=lf
*.csv text eol=lf
*.grd text eol=lf
*.grdp text eol=lf
*.gn text eol=lf
*.gni text eol=lf
*.h text eol=lf
*.html text eol=lf
*.idl text eol=lf
*.in text eol=lf
*.inc text eol=lf
*.java text eol=lf
*.js text eol=lf
*.json text eol=lf
*.json5 text eol=lf
*.md text eol=lf
*.mm text eol=lf
*.mojom text eol=lf
*.pdf -diff
*.sh text eol=lf
*.sql text eol=lf
*.txt text eol=lf
*.xml text eol=lf
*.xslt text eol=lf
.clang-format text eol=lf
.eslintrc.js text eol=lf
.git-blame-ignore-revs text eol=lf
.gitattributes text eol=lf
.gitignore text eol=lf
.vpython text eol=lf
codereview.settings text eol=lf
DEPS text eol=lf
ENG_REVIEW_OWNERS text eol=lf
LICENSE text eol=lf
LICENSE.* text eol=lf
MAJOR_BRANCH_DATE text eol=lf
OWNERS text eol=lf
README text eol=lf
README.* text eol=lf
WATCHLISTS text eol=lf
VERSION text eol=lf
# Skip Tricium by default on files in third_party.
third_party/** -tricium

659
src/.gn Normal file
View File

@ -0,0 +1,659 @@
# This file is used by the GN meta build system to find the root of the source
# tree and to set startup options. For documentation on the values set in this
# file, run "gn help dotfile" at the command line.
import("//build/dotfile_settings.gni")
import("//third_party/angle/dotfile_settings.gni")
# The location of the build configuration file.
buildconfig = "//build/config/BUILDCONFIG.gn"
# These arguments override the default values for items in a declare_args
# block. "gn args" in turn can override these.
#
# In general the value for a build arg in the declare_args block should be the
# default. In some cases, a DEPS-ed in project will want different defaults for
# being built as part of Chrome vs. being built standalone. In this case, the
# Chrome defaults should go here. There should be no overrides here for
# values declared in the main Chrome repository.
#
# Important note for defining defaults: This file is executed before the
# BUILDCONFIG.gn file. That file sets up the global variables like "is_ios".
# This means that the default_args can not depend on the platform,
# architecture, or other build parameters. If you really need that, the other
# repo should define a flag that toggles on a behavior that implements the
# additional logic required by Chrome to set the variables.
default_args = {
# TODO(brettw) bug 684096: Chrome on iOS does not build v8, so "gn gen" prints
# a warning that "Build argument has no effect". When adding a v8 variable, it
# also needs to be defined to src/ios/BUILD.gn (respectively removed from both
# location when it is removed).
v8_extra_library_files = []
v8_experimental_extra_library_files = []
v8_enable_gdbjit = false
v8_imminent_deprecation_warnings = false
# TODO(jochen): Remove this. http://crbug.com/v8/5830,
# http://crbug.com/728583.
v8_check_microtasks_scopes_consistency = false
# Don't include webrtc's builtin task queue implementation.
rtc_link_task_queue_impl = false
# Don't include the iLBC audio codec.
# TODO(bugs.webrtc.org/8396): Once WebRTC gets rid of its internal
# deps on codecs, we can remove this.
rtc_include_ilbc = false
# Changes some setup for the Crashpad build to set them to build against
# Chromium's zlib, base, etc.
crashpad_dependencies = "chromium"
}
# These are the targets to check headers for by default. The files in targets
# matching these patterns (see "gn help label_pattern" for format) will have
# their includes checked for proper dependencies when you run either
# "gn check" or "gn gen --check".
check_targets = [
"//android_webview/*",
"//apps/*",
"//ash/*",
"//base/*",
"//blink/*",
"//build/*",
"//buildtools/*",
"//cc/*",
#"//chrome/*", # Many errors: https://crbug.com/949535
"//chrome/android/*",
"//chrome/app/*",
"//chrome/app_shim/*",
#"//chrome/browser/*", # ~1300 errors
#"//chrome/browser:*", # ~600 errors
"//chrome/browser/accessibility/*",
"//chrome/browser/android/*",
"//chrome/browser/app_mode/*",
"//chrome/browser/apps/*",
"//chrome/browser/assist_ranker/*",
"//chrome/browser/autocomplete/*",
"//chrome/browser/autofill/*",
"//chrome/browser/background/*",
"//chrome/browser/background_fetch/*",
"//chrome/browser/background_sync/*",
"//chrome/browser/banners/*",
"//chrome/browser/bitmap_fetcher/*",
"//chrome/browser/bookmarks/*",
"//chrome/browser/browsing_data/*",
"//chrome/browser/budget_service/*",
"//chrome/browser/captive_portal/*",
"//chrome/browser/chooser_controller/*",
"//chrome/browser/chromeos/*",
"//chrome/browser/client_hints/*",
"//chrome/browser/clipboard/*",
"//chrome/browser/component_updater/*",
"//chrome/browser/consent_auditor/*",
"//chrome/browser/content_settings/*",
"//chrome/browser/crash_upload_list/*",
"//chrome/browser/custom_handlers/*",
"//chrome/browser/data_saver/*",
"//chrome/browser/data_use_measurement/*",
"//chrome/browser/dbus/*",
#"//chrome/browser/devtools/*", # 93 errors
"//chrome/browser/diagnostics/*",
"//chrome/browser/domain_reliability/*",
"//chrome/browser/dom_distiller/*",
"//chrome/browser/downgrade/*",
"//chrome/browser/download/*",
"//chrome/browser/drive/*",
"//chrome/browser/engagement/*",
"//chrome/browser/extensions/*",
"//chrome/browser/external_protocol/*",
"//chrome/browser/favicon/*",
"//chrome/browser/feature_engagement/*",
"//chrome/browser/feedback/*",
"//chrome/browser/first_run/*",
"//chrome/browser/gcm/*",
"//chrome/browser/generic_sensor/*",
"//chrome/browser/geolocation/*",
"//chrome/browser/google/*",
"//chrome/browser/gpu/*",
"//chrome/browser/guest_view/*",
"//chrome/browser/hang_monitor/*",
"//chrome/browser/history/*",
"//chrome/browser/importer/*",
"//chrome/browser/infobars/*",
"//chrome/browser/installable/*",
"//chrome/browser/install_verification/*",
"//chrome/browser/internal/*",
"//chrome/browser/interstitials/*",
"//chrome/browser/invalidation/*",
"//chrome/browser/language/*",
"//chrome/browser/lifetime/*",
#"//chrome/browser/loader/*", # 2 errors
"//chrome/browser/local_discovery/*",
"//chrome/browser/mac/*",
#"//chrome/browser/media/*", # 74 errors
"//chrome/browser/media_galleries/*",
"//chrome/browser/memory/*",
"//chrome/browser/metrics/*",
"//chrome/browser/nacl_host/*",
"//chrome/browser/navigation_predictor/*",
"//chrome/browser/net/*",
"//chrome/browser/notifications/*",
"//chrome/browser/ntp_snippets/*",
"//chrome/browser/ntp_tiles/*",
"//chrome/browser/obsolete_system/*",
"//chrome/browser/offline_items_collection/*",
"//chrome/browser/offline_pages/*",
"//chrome/browser/page_load_metrics/*",
"//chrome/browser/password_manager/*",
"//chrome/browser/payments/*",
"//chrome/browser/pdf/*",
"//chrome/browser/performance_monitor/*",
"//chrome/browser/permissions/*",
"//chrome/browser/picture_in_picture/*",
"//chrome/browser/plugins/*",
# "//chrome/browser/policy/*", # 1 error on Windows
"//chrome/browser/predictors/*",
"//chrome/browser/prefetch/*",
"//chrome/browser/prefs/*",
"//chrome/browser/prerender/*",
"//chrome/browser/previews/*",
"//chrome/browser/printing/*",
"//chrome/browser/profile_resetter/*",
"//chrome/browser/profiles/*",
#"//chrome/browser/profiling_host/*", # 16 errors
"//chrome/browser/push_messaging/*",
"//chrome/browser/recovery/*",
"//chrome/browser/renderer_context_menu/*",
"//chrome/browser/renderer_host/*",
"//chrome/browser/resource_coordinator/*",
#"//chrome/browser/resources/*", # 18 errors on ChromeOS
"//chrome/browser/rlz/*",
#"//chrome/browser/safe_browsing/*", # 239 errors
"//chrome/browser/search/*",
"//chrome/browser/search_engines/*",
"//chrome/browser/search_provider_logos/*",
"//chrome/browser/service_process/*",
"//chrome/browser/sessions/*",
"//chrome/browser/signin/*",
"//chrome/browser/speech/*",
"//chrome/browser/spellchecker/*",
"//chrome/browser/ssl/*",
"//chrome/browser/status_icons/*",
"//chrome/browser/storage/*",
"//chrome/browser/subresource_filter/*",
"//chrome/browser/supervised_user/*",
"//chrome/browser/sync/*",
"//chrome/browser/sync_file_system/*",
"//chrome/browser/tab_contents/*",
"//chrome/browser/task_manager/*",
"//chrome/browser/themes/*",
"//chrome/browser/tracing/*",
"//chrome/browser/translate/*",
"//chrome/browser/ui/*",
"//chrome/browser/undo/*",
"//chrome/browser/unified_consent/*",
"//chrome/browser/update_client/*",
"//chrome/browser/upgrade_detector/*",
"//chrome/browser/usb/*",
"//chrome/browser/vr/*",
"//chrome/browser/web_applications/*",
"//chrome/browser/webauthn/*",
"//chrome/browser/webshare/*",
"//chrome/browser/win/*",
"//chrome/build/*",
#"//chrome/child/*", # 1 error on Windows
"//chrome/chrome_elf/*",
"//chrome/chrome_cleaner/*",
"//chrome/common/*",
"//chrome/elevation_service/*",
#"//chrome/gpu/*", # 7 errors
"//chrome/installer/*",
#"//chrome/install_static/*", # 8 errors on Windows
"//chrome/nacl/*",
#"//chrome/notification_helper/*", # 4 errors on Windows
#"//chrome/renderer/*", # ~30 errors
#"//chrome/service/*", # 2 errors
#"//chrome/services/*", # ~30 errors
#"//chrome/test/*", # ~1900 errors
"//chrome/test/chromedriver",
"//chrome/third_party/*",
"//chrome/tools/*",
"//chrome/updater/*",
"//chrome/utility/*",
"//chromecast/*",
"//chromeos/*",
"//cloud_print/*",
"//components/*",
"//content/*",
"//courgette/*",
"//crypto/*",
"//data/*",
"//dbus/*",
"//device/*",
#"//extensions/*", # Lots of errors.
"//extensions:extensions_resources",
"//extensions:extensions_browsertests",
"//extensions:extensions_unittests",
"//extensions/browser",
"//extensions/browser:core_api_provider",
"//extensions/browser:browser_tests",
"//extensions/browser:test_support",
"//extensions/browser:unit_tests",
"//extensions/browser/api:api_registration",
"//extensions/browser/install:*",
"//extensions/browser/kiosk/*",
"//extensions/browser/guest_view/web_view/web_ui/*",
"//extensions/common/*",
"//extensions/components/javascript_dialog_extensions_client",
"//extensions/components/native_app_window",
"//extensions/renderer/*",
"//extensions/shell/*",
"//extensions/strings/*",
"//fuchsia/*",
"//gin/*",
"//google_apis/*",
"//google_update/*",
"//gpu/*",
"//ios/*",
"//ios_internal/*",
"//ipc/*",
#"//jingle/*",
"//libassistant/communication/*",
"//libinteraction/*",
"//media/*",
"//mojo/*",
#"//native_client/*",
"//net/*",
#"//pdf/*", # Medium-hard.
#"//ppapi/*", # Lots of errors.
"//ppapi/examples/*",
"//ppapi/tests/*",
"//printing/*",
#"//remoting/*", # Medium-hard.
"//rlz/*",
#"//sandbox/*", # Medium-hard.
"//services/*",
"//skia/*",
"//sql/*",
"//storage/*",
"//testing/*",
#"//third_party/*", # May not ever want this.
"//third_party:freetype_harfbuzz",
"//third_party/Python-Markdown/*",
"//third_party/SPIRV-Tools/*",
"//third_party/abseil-cpp/*",
"//third_party/accessibility-audit/*",
"//third_party/accessibility_test_framework/*",
"//third_party/adobe/*",
"//third_party/afl/*",
"//third_party/android_build_tools/*",
"//third_party/android_crazy_linker/*",
"//third_party/android_data_chart/*",
"//third_party/android_deps/*",
"//third_party/android_media/*",
"//third_party/android_ndk/*",
"//third_party/android_opengl/*",
"//third_party/android_platform/*",
"//third_party/android_protobuf/*",
"//third_party/android_sdk/*",
"//third_party/android_support_test_runner/*",
"//third_party/android_swipe_refresh/*",
"//third_party/android_system_sdk/*",
"//third_party/android_testrunner/*",
"//third_party/angle/*",
"//third_party/apache-portable-runtime/*",
"//third_party/apache_velocity/*",
"//third_party/apache-win32/*",
"//third_party/apk-patch-size-estimator/*",
"//third_party/apple_apsl/*",
"//third_party/appurify-python/*",
"//third_party/arcore-android-sdk/*",
"//third_party/ashmem/*",
"//third_party/axe-core/*",
"//third_party/bazel/*",
"//third_party/binutils/*",
"//third_party/blanketjs/*",
# "//third_party/blink/*", # Errors: https://crbug.com/800764
"//third_party/blink/public/*",
#"//third_party/breakpad/*", # Small errors.
"//third_party/boringssl/*",
"//third_party/bouncycastle/*",
"//third_party/brotli/*",
"//third_party/bspatch/*",
"//third_party/byte_buddy/*",
"//third_party/cacheinvalidation/*",
"//third_party/catapult/*",
# "//third_party/ced/*", # 6 errors
"//third_party/chaijs/*",
"//third_party/checkstyle/*",
"//third_party/chromevox/*",
"//third_party/chromite/*",
"//third_party/cld_2/*",
"//third_party/cld_3/*",
"//third_party/closure_compiler/*",
"//third_party/colorama/*",
# "//third_party/crashpad/*", 20ish errors
"//third_party/crc32c/*",
"//third_party/cros_system_api/*",
"//third_party/cython/*",
"//third_party/d3/*",
"//third_party/dawn/*",
"//third_party/decklink/*",
"//third_party/depot_tools/*",
"//third_party/deqp/*",
"//third_party/devscripts/*",
"//third_party/dom_distiller_js/*",
"//third_party/elfutils/*",
"//third_party/espresso/*",
"//third_party/expat/*",
"//third_party/eyesfree/*",
# "//third_party/ffmpeg/*", # android_cronet only https://crbug.com/898793
"//third_party/flac/*",
"//third_party/flatbuffers/*",
"//third_party/fontconfig/*",
"//third_party/freetype/*",
"//third_party/freetype2/*",
"//third_party/freetype-android/*",
"//third_party/fuchsia-sdk/*",
"//third_party/gif_player/*",
"//third_party/glfw/*",
"//third_party/glslang/*",
"//third_party/google_appengine_cloudstorage/*",
"//third_party/google_input_tools/*",
"//third_party/googletest/*",
"//third_party/google_toolbox_for_mac/*",
"//third_party/google-truth/*",
"//third_party/gradle_wrapper/*",
"//third_party/guava/*",
"//third_party/gvr-android-keyboard/*",
"//third_party/gvr-android-sdk/*",
"//third_party/hamcrest/*",
"//third_party/harfbuzz-ng/*",
"//third_party/hunspell/*",
"//third_party/hunspell/*",
"//third_party/hunspell_dictionaries/*",
"//third_party/iaccessible2/*",
"//third_party/iccjpeg/*",
# "//third_party/icu/*", # Many errors
"//third_party/icu4j/*",
"//third_party/ijar/*",
"//third_party/ink/*",
"//third_party/inspector_protocol/*",
"//third_party/instrumented_libraries/*",
"//third_party/isimpledom/*",
"//third_party/javax_inject/*",
"//third_party/jinja2/*",
"//third_party/jsoncpp/*",
"//third_party/jsr-305/*",
"//third_party/jstemplate/*",
"//third_party/junit/*",
"//third_party/khronos/*",
"//third_party/lcov/*",
"//third_party/leakcanary/*",
"//third_party/leveldatabase/*",
"//third_party/libFuzzer/*",
"//third_party/libXNVCtrl/*",
"//third_party/libaddressinput/*",
# "//third_party/libaom/*", # https://crbug.com/899771
"//third_party/libc++/*",
"//third_party/libc++abi/*",
"//third_party/libcxx-pretty-printers/*",
"//third_party/libdrm/*",
"//third_party/libgav1/*",
"//third_party/libjingle/*",
# "//third_party/libjingle_xmpp/*", # 30ish errors
"//third_party/libjpeg/*",
# "//third_party/libjpeg_turbo/*", # 3 errors
# "//third_party/liblouis/*", # Small errors
"//third_party/libovr/*",
"//third_party/libphonenumber/*",
"//third_party/libpng/*",
"//third_party/libprotobuf-mutator/*",
"//third_party/libsecret/*",
"//third_party/libsrtp/*",
"//third_party/libsync/*",
"//third_party/libudev/*",
"//third_party/libusb/*",
# "//third_party/libvpx/*", # Many errors
"//third_party/libvpx_new/*",
"//third_party/libwebm/*",
#"//third_party/libwebp/*", # Errors: https://crbug.com/800762
"//third_party/libxml/*",
"//third_party/libxslt/*",
"//third_party/libyuv/*",
"//third_party/llvm/*",
"//third_party/llvm-bootstrap/*",
"//third_party/llvm-bootstrap-install/*",
"//third_party/llvm-build-tools/*",
"//third_party/logilab/*",
"//third_party/lss/*",
"//third_party/lzma_sdk/*",
"//third_party/markdown/*",
"//third_party/markupsafe/*",
"//third_party/material_design_icons/*",
"//third_party/mesa_headers/*",
"//third_party/metrics_proto/*",
"//third_party/minigbm/*",
"//third_party/minizip/*",
"//third_party/mocha/*",
"//third_party/mockito/*",
"//third_party/modp_b64/*",
"//third_party/motemplate/*",
"//third_party/mozilla/*",
"//third_party/mtpd/*",
"//third_party/netty4/*",
"//third_party/netty-tcnative/*",
"//third_party/node/*",
"//third_party/nvml/*",
"//third_party/objenesis/*",
"//third_party/ocmock/*",
"//third_party/openh264/*",
"//third_party/openvr/*",
"//third_party/opus/*",
"//third_party/ots/*",
# "//third_party/pdfium/*", # 3 errors
"//third_party/perfetto/*",
"//third_party/pexpect/*",
"//third_party/ply/*",
"//third_party/polymer/*",
"//third_party/proguard/*",
"//third_party/protobuf/*",
"//third_party/pycoverage/*",
"//third_party/pyelftools/*",
"//third_party/pyjson5/*",
"//third_party/pylint/*",
"//third_party/pymock/*",
"//third_party/pystache/*",
"//third_party/py_trace_event/*",
"//third_party/pywebsocket3/*",
"//third_party/qcms/*",
"//third_party/quic_trace/*",
"//third_party/qunit/*",
"//third_party/r8/*",
"//third_party/re2/*",
"//third_party/requests/*",
"//third_party/retrolambda/*",
"//third_party/rnnoise/*",
"//third_party/robolectric/*",
"//third_party/s2cellid/*",
"//third_party/safe_browsing/*",
"//third_party/scan-build/*",
"//third_party/shaderc/*",
"//third_party/simplejson/*",
"//third_party/sinonjs/*",
"//third_party/skia/*",
"//third_party/smhasher/*",
"//third_party/snappy/*",
"//third_party/speech-dispatcher/*",
"//third_party/spirv-cross/*",
"//third_party/spirv-headers/*",
"//third_party/sqlite/*",
"//third_party/sqlite4java/*",
"//third_party/stp/*",
"//third_party/sudden_motion_sensor/*",
"//third_party/swiftshader/*",
"//third_party/swig/*",
"//third_party/tcmalloc/*",
"//third_party/test_fonts/*",
"//third_party/tlslite/*",
"//third_party/ub-uiautomator/*",
"//third_party/unrar/*",
"//third_party/usb_ids/*",
"//third_party/usrsctp/*",
"//third_party/v4l-utils/*",
"//third_party/valgrind/*",
"//third_party/vulkan/*",
"//third_party/vulkan-validation-layers/*",
# "//third_party/wayland/*", # Small errors
"//third_party/wayland-protocols/*",
"//third_party/wds/*",
"//third_party/web-animations-js/*",
"//third_party/webdriver/*",
"//third_party/webgl/*",
"//third_party/webpagereplay/*",
"//third_party/webrtc/*",
"//third_party/webrtc_overrides/*",
"//third_party/widevine/*",
"//third_party/win_build_output/*",
"//third_party/woff2/*",
"//third_party/wtl/*",
"//third_party/xdg-utils/*",
"//third_party/xstream/*",
"//third_party/yasm/*",
"//third_party/zlib/*",
"//third_party/woff2/*",
"//tools/*",
"//ui/*",
"//url/*",
#"//v8/*", # Errors: https://bugs.chromium.org/p/v8/issues/detail?id=7330
"//weblayer/*",
]
# These are the list of GN files that run exec_script. This whitelist exists
# to force additional review for new uses of exec_script, which is strongly
# discouraged.
#
# PLEASE READ
#
# You should almost never need to add new exec_script calls. exec_script is
# slow, especially on Windows, and can cause confusing effects. Although
# individually each call isn't slow or necessarily very confusing, at the scale
# of our repo things get out of hand quickly. By strongly pushing back on all
# additions, we keep the build fast and clean. If you think you need to add a
# new call, please consider:
#
# - Do not use a script to check for the existence of a file or directory to
# enable a different mode. Instead, use GN build args to enable or disable
# functionality and set options. An example is checking for a file in the
# src-internal repo to see if the corresponding src-internal feature should
# be enabled. There are several things that can go wrong with this:
#
# - It's mysterious what causes some things to happen. Although in many cases
# such behavior can be conveniently automatic, GN optimizes for explicit
# and obvious behavior so people can more easily diagnose problems.
#
# - The user can't enable a mode for one build and not another. With GN build
# args, the user can choose the exact configuration of multiple builds
# using one checkout. But implicitly basing flags on the state of the
# checkout, this functionality is broken.
#
# - It's easy to get stale files. If for example the user edits the gclient
# to stop checking out src-internal (or any other optional thing), it's
# easy to end up with stale files still mysteriously triggering build
# conditions that are no longer appropriate (yes, this happens in real
# life).
#
# - Do not use a script to iterate files in a directory (glob):
#
# - This has the same "stale file" problem as the above discussion. Various
# operations can leave untracked files in the source tree which can cause
# surprising effects.
#
# - It becomes impossible to use "git grep" to find where a certain file is
# referenced. This operation is very common and people really do get
# confused when things aren't listed.
#
# - It's easy to screw up. One common case is a build-time script that packs
# up a directory. The author notices that the script isn't re-run when the
# directory is updated, so adds a glob so all the files are listed as
# inputs. This seems to work great... until a file is deleted. When a
# file is deleted, all the inputs the glob lists will still be up to date
# and no command-lines will have been changed. The action will not be
# re-run and the build will be broken. It is possible to get this correct
# using glob, and it's possible to mess it up without glob, but globs make
# this situation much easier to create. if the build always lists the
# files and passes them to a script, it will always be correct.
exec_script_whitelist =
build_dotfile_settings.exec_script_whitelist +
angle_dotfile_settings.exec_script_whitelist +
[
# Whitelist entries for //build should go into
# //build/dotfile_settings.gni instead, so that they can be shared
# with other repos. The entries in this list should be only for files
# in the Chromium repo outside of //build.
"//build_overrides/build.gni",
"//chrome/android/webapk/shell_apk/prepare_upload_dir/BUILD.gn",
# TODO(dgn): Layer violation but breaks the build otherwise, see
# https://crbug.com/474506.
"//clank/java/BUILD.gn",
"//clank/native/BUILD.gn",
"//google_apis/BUILD.gn",
"//printing/BUILD.gn",
"//remoting/host/installer/linux/BUILD.gn",
"//remoting/remoting_version.gni",
"//remoting/host/installer/win/generate_clsids.gni",
"//tools/grit/grit_rule.gni",
"//tools/gritsettings/BUILD.gn",
]

1148
src/AUTHORS Normal file

File diff suppressed because it is too large Load Diff

1389
src/BUILD.gn Normal file

File diff suppressed because it is too large Load Diff

27
src/LICENSE Normal file
View File

@ -0,0 +1,27 @@
// Copyright 2015 The Chromium Authors. 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 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.

View File

@ -0,0 +1,909 @@
# Copyright 2015 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.
import("//android_webview/system_webview_apk_tmpl.gni")
import("//android_webview/system_webview_bundle.gni")
import("//android_webview/variables.gni")
import("//android_webview/webview_repack_locales.gni")
import("//build/android/resource_sizes.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//build/config/locales.gni")
import("//chrome/android/chrome_common_shared_library.gni")
import("//chrome/android/chrome_public_apk_tmpl.gni")
import("//chrome/android/trichrome.gni")
import("//components/spellcheck/spellcheck_build_features.gni")
import("//tools/grit/repack.gni")
import("//tools/resources/generate_resource_whitelist.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//weblayer/variables.gni")
if (enable_resource_whitelist_generation) {
system_webview_pak_whitelist =
"$target_gen_dir/system_webview_pak_whitelist.txt"
}
if (define_upstream_webview_targets) {
template("standalone_system_webview_apk_tmpl") {
system_webview_apk_or_module_tmpl(target_name) {
forward_variables_from(invoker, "*")
android_manifest = system_webview_android_manifest
android_manifest_dep =
"//android_webview/nonembedded:system_webview_manifest"
deps = upstream_only_webview_deps
min_sdk_version = 21
}
}
# Standalone WebView APK.
standalone_system_webview_apk_tmpl("system_webview_apk") {
apk_name = "SystemWebView"
}
# This version of the WebView APK doesn't include WebLayer java and resources.
# It's used to define the whitelist of resources to be pulled out of language
# splits. See |shared_resources_allowlist_target|.
standalone_system_webview_apk_tmpl("system_webview_no_weblayer_apk") {
exclude_weblayer_java = true
apk_name = "SystemWebViewNoWebLayer"
}
if (enable_webview_bundles) {
standalone_system_webview_apk_tmpl("system_webview_base_bundle_module") {
target_type = "android_app_bundle_module"
is_base_module = true
}
system_webview_bundle("system_webview_bundle") {
base_module_target = ":system_webview_base_bundle_module"
bundle_name = "SystemWebView"
min_sdk_version = 21
}
}
if (android_64bit_target_cpu) {
# These targets builds a 32-bit only Webview on a 64-bit config, analogous
# to what's built on a 32-bit config. This lets all Webviews build on a
# single configuration.
standalone_system_webview_apk_tmpl("system_webview_32_apk") {
apk_name = "SystemWebView32"
include_64_bit_webview = false
}
if (enable_webview_bundles) {
standalone_system_webview_apk_tmpl(
"system_webview_32_base_bundle_module") {
target_type = "android_app_bundle_module"
include_64_bit_webview = false
is_base_module = true
}
system_webview_bundle("system_webview_32_bundle") {
base_module_target = ":system_webview_32_base_bundle_module"
bundle_name = "SystemWebView32"
include_64_bit_webview = false
min_sdk_version = 21
}
}
}
android_resource_sizes_test("resource_sizes_system_webview_apk") {
apk_name = "SystemWebView"
data_deps = [ ":system_webview_apk" ]
}
# Trichrome WebView APK.
template("trichrome_webview_tmpl") {
system_webview_apk_or_module_tmpl(target_name) {
forward_variables_from(invoker, "*")
android_manifest = trichrome_webview_android_manifest
android_manifest_dep =
"//android_webview/nonembedded:trichrome_webview_manifest"
min_sdk_version = 29
deps = upstream_only_webview_deps
use_trichrome_library = true
if (android_64bit_target_cpu) {
is_64_bit_browser = false
include_64_bit_webview = true
}
static_library_provider = "//chrome/android:trichrome_library_apk"
}
}
trichrome_webview_tmpl("trichrome_webview_apk") {
apk_name = "TrichromeWebView"
uncompress_dex = true
if (!is_java_debug) {
static_library_synchronized_proguard = trichrome_synchronized_proguard
}
}
if (enable_webview_bundles) {
trichrome_webview_tmpl("trichrome_webview_base_bundle_module") {
target_type = "android_app_bundle_module"
is_base_module = true
}
system_webview_bundle("trichrome_webview_bundle") {
base_module_target = ":trichrome_webview_base_bundle_module"
bundle_name = "TrichromeWebView"
uncompress_dex = true
min_sdk_version = 29
static_library_provider = "//chrome/android:trichrome_library_apk"
}
}
# Trichrome WebView APK for a 64-bit Chrome.
if (android_64bit_target_cpu) {
template("trichrome_webview_64_32_tmpl") {
system_webview_apk_or_module_tmpl(target_name) {
forward_variables_from(invoker, "*")
android_manifest = trichrome_webview_64_32_android_manifest
android_manifest_dep =
"//android_webview/nonembedded:trichrome_webview_64_32_manifest"
use_trichrome_library = true
is_64_bit_browser = true
include_32_bit_webview = true
min_sdk_version = 29
deps = upstream_only_webview_deps
static_library_provider = "//chrome/android:trichrome_library_64_32_apk"
}
}
trichrome_webview_64_32_tmpl("trichrome_webview_64_32_apk") {
apk_name = "TrichromeWebView6432"
uncompress_dex = true
}
if (enable_webview_bundles) {
trichrome_webview_64_32_tmpl(
"trichrome_webview_64_32_base_bundle_module") {
target_type = "android_app_bundle_module"
is_base_module = true
}
system_webview_bundle("trichrome_webview_64_32_bundle") {
base_module_target = ":trichrome_webview_64_32_base_bundle_module"
bundle_name = "TrichromeWebView6432"
uncompress_dex = true
min_sdk_version = 29
static_library_provider = "//chrome/android:trichrome_library_64_32_apk"
}
}
template("trichrome_webview_32_tmpl") {
system_webview_apk_or_module_tmpl(target_name) {
forward_variables_from(invoker, "*")
android_manifest = trichrome_webview_32_android_manifest
android_manifest_dep =
"//android_webview/nonembedded:trichrome_webview_32_manifest"
use_trichrome_library = true
is_64_bit_browser = false
include_64_bit_webview = false
min_sdk_version = 29
deps = upstream_only_webview_deps
static_library_provider = "//chrome/android:trichrome_library_32_apk"
}
}
trichrome_webview_32_tmpl("trichrome_webview_32_apk") {
apk_name = "TrichromeWebView32"
uncompress_dex = true
}
if (enable_webview_bundles) {
trichrome_webview_32_tmpl("trichrome_webview_32_base_bundle_module") {
target_type = "android_app_bundle_module"
is_base_module = true
}
system_webview_bundle("trichrome_webview_32_bundle") {
base_module_target = ":trichrome_webview_32_base_bundle_module"
bundle_name = "TrichromeWebView32"
uncompress_dex = true
min_sdk_version = 29
static_library_provider = "//chrome/android:trichrome_library_32_apk"
}
}
}
}
# The shared library used by standalone WebView.
shared_library("libwebviewchromium") {
deps = [
"//android_webview/lib",
"//android_webview/lib:webview_entry_point",
"//android_webview/nonembedded",
]
configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
configs += [ "//build/config/android:hide_all_but_jni" ]
}
# This template is used to define WebView's alternate-ABI libraries, which are
# used by Monochrome and Trichrome on 64-bit devices which support both 32 and
# 64-bit ABIs. WebView's browser process must use the same ABI as the embedding
# app (renderer processes used the ABI defined in the WebView APK manifest),
# which requires us to have two copies of the library available, one for each
# ABI. The primary library is the one shared with Chrome, and the alternate is
# a WebView-specific library defined here for whichever ABI isn't used by
# Chrome.
#
# Note that this library only includes code needed for the embedded usecase,
# as all non-embedded code uses the primary library.
template("webview_alternate_library") {
chrome_common_shared_library(target_name) {
forward_variables_from(invoker, "*")
deps = [
"//android_webview/lib",
"//android_webview/lib:webview_entry_point",
]
is_webview = true
}
}
if (defined(android_secondary_abi_toolchain)) {
# Note here that on a given system, the webview-only library needs the same
# library name as the browser library, since the system webview factory will
# differentiate only by ABI.
if (current_toolchain == android_secondary_abi_toolchain) {
# This target is the 32-bit WebView library that pairs with a 64-bit
# browser. It is suffixed with _64 because its name must match the 64-bit
# browser library.
webview_alternate_library("monochrome_64") {
}
} else {
# Inverse of above, for the original 32-bit case.
webview_alternate_library("monochrome") {
}
}
} else {
# 32-bit WebView library used in 32-bit only builds of 64/32 targets.
webview_alternate_library("monochrome_64") {
}
}
java_group("android_webview_no_weblayer_java") {
deps = [
":browser_java",
# This includes AwResource, which may be called via JNI. We're including it
# here because there's currently no good way to enforce that it gets included
# when it's depended on via JNI.
":common_java",
"//android_webview/glue",
"//android_webview/nonembedded:nonembedded_java",
"//android_webview/support_library:support_lib_glue_java",
]
}
# Contains all Java dependencies used by WebView.
java_group("android_webview_java") {
deps = [ ":android_webview_no_weblayer_java" ]
if (webview_includes_weblayer) {
deps += [
"//components/viz/service:service_java",
"//weblayer/browser/java",
]
}
}
# An empty group included in //BUILD.gn to make this and other WebView build
# files reachable by GN.
group("empty_group") {
}
generate_jni("common_jni_headers") {
sources = [
"java/src/org/chromium/android_webview/common/AwResource.java",
"java/src/org/chromium/android_webview/common/crash/AwCrashReporterClient.java",
]
}
generate_jni("browser_jni_headers") {
sources = [
"java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
"java/src/org/chromium/android_webview/AwAutofillClient.java",
"java/src/org/chromium/android_webview/AwBrowserContext.java",
"java/src/org/chromium/android_webview/AwBrowserProcess.java",
"java/src/org/chromium/android_webview/AwContents.java",
"java/src/org/chromium/android_webview/AwContentsBackgroundThreadClient.java",
"java/src/org/chromium/android_webview/AwContentsClientBridge.java",
"java/src/org/chromium/android_webview/AwContentsIoThreadClient.java",
"java/src/org/chromium/android_webview/AwContentsLifecycleNotifier.java",
"java/src/org/chromium/android_webview/AwContentsStatics.java",
"java/src/org/chromium/android_webview/AwCookieManager.java",
"java/src/org/chromium/android_webview/AwDebug.java",
"java/src/org/chromium/android_webview/AwDevToolsServer.java",
"java/src/org/chromium/android_webview/AwFeatureList.java",
"java/src/org/chromium/android_webview/AwFormDatabase.java",
"java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
"java/src/org/chromium/android_webview/AwPacProcessor.java",
"java/src/org/chromium/android_webview/AwPdfExporter.java",
"java/src/org/chromium/android_webview/AwProxyController.java",
"java/src/org/chromium/android_webview/AwQuotaManagerBridge.java",
"java/src/org/chromium/android_webview/AwRenderProcess.java",
"java/src/org/chromium/android_webview/AwSettings.java",
"java/src/org/chromium/android_webview/AwTracingController.java",
"java/src/org/chromium/android_webview/AwVariationsSeedBridge.java",
"java/src/org/chromium/android_webview/AwWebContentsDelegate.java",
"java/src/org/chromium/android_webview/AwWebResourceInterceptResponse.java",
"java/src/org/chromium/android_webview/AwWebResourceResponse.java",
"java/src/org/chromium/android_webview/InputStreamUtil.java",
"java/src/org/chromium/android_webview/JsReplyProxy.java",
"java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java",
"java/src/org/chromium/android_webview/WebMessageListenerHolder.java",
"java/src/org/chromium/android_webview/WebMessageListenerInfo.java",
"java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java",
"java/src/org/chromium/android_webview/gfx/AwGLFunctor.java",
"java/src/org/chromium/android_webview/gfx/AwPicture.java",
"java/src/org/chromium/android_webview/gfx/JavaBrowserViewRendererHelper.java",
"java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java",
"java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java",
"java/src/org/chromium/android_webview/permission/AwPermissionRequest.java",
"java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java",
]
deps = [ ":cancellation_signal_android_jar_jni_headers" ]
}
generate_jar_jni("cancellation_signal_android_jar_jni_headers") {
classes = [ "android/os/CancellationSignal.class" ]
}
android_library("browser_java") {
sources = [
"java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
"java/src/org/chromium/android_webview/AwActionModeCallback.java",
"java/src/org/chromium/android_webview/AwAutofillClient.java",
"java/src/org/chromium/android_webview/AwBrowserContext.java",
"java/src/org/chromium/android_webview/AwBrowserProcess.java",
"java/src/org/chromium/android_webview/AwConsoleMessage.java",
"java/src/org/chromium/android_webview/AwContents.java",
"java/src/org/chromium/android_webview/AwContentsBackgroundThreadClient.java",
"java/src/org/chromium/android_webview/AwContentsClient.java",
"java/src/org/chromium/android_webview/AwContentsClientBridge.java",
"java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java",
"java/src/org/chromium/android_webview/AwContentsIoThreadClient.java",
"java/src/org/chromium/android_webview/AwContentsLifecycleNotifier.java",
"java/src/org/chromium/android_webview/AwContentsStatics.java",
"java/src/org/chromium/android_webview/AwCookieManager.java",
"java/src/org/chromium/android_webview/AwDataDirLock.java",
"java/src/org/chromium/android_webview/AwDebug.java",
"java/src/org/chromium/android_webview/AwDevToolsServer.java",
"java/src/org/chromium/android_webview/AwFeatureList.java",
"java/src/org/chromium/android_webview/AwFeatures.java",
"java/src/org/chromium/android_webview/AwFirebaseConfig.java",
"java/src/org/chromium/android_webview/AwFormDatabase.java",
"java/src/org/chromium/android_webview/AwGeolocationPermissions.java",
"java/src/org/chromium/android_webview/AwHistogramRecorder.java",
"java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
"java/src/org/chromium/android_webview/AwLayoutSizer.java",
"java/src/org/chromium/android_webview/AwNetworkChangeNotifierRegistrationPolicy.java",
"java/src/org/chromium/android_webview/AwPacProcessor.java",
"java/src/org/chromium/android_webview/AwPdfExporter.java",
"java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java",
"java/src/org/chromium/android_webview/AwProxyController.java",
"java/src/org/chromium/android_webview/AwQuotaManagerBridge.java",
"java/src/org/chromium/android_webview/AwRenderProcess.java",
"java/src/org/chromium/android_webview/AwRenderProcessGoneDetail.java",
"java/src/org/chromium/android_webview/AwScrollOffsetManager.java",
"java/src/org/chromium/android_webview/AwServiceWorkerClient.java",
"java/src/org/chromium/android_webview/AwServiceWorkerController.java",
"java/src/org/chromium/android_webview/AwServiceWorkerSettings.java",
"java/src/org/chromium/android_webview/AwSettings.java",
"java/src/org/chromium/android_webview/AwSupportLibIsomorphic.java",
"java/src/org/chromium/android_webview/AwTracingController.java",
"java/src/org/chromium/android_webview/AwVariationsSeedBridge.java",
"java/src/org/chromium/android_webview/AwViewAndroidDelegate.java",
"java/src/org/chromium/android_webview/AwViewMethods.java",
"java/src/org/chromium/android_webview/AwWebContentsDelegate.java",
"java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java",
"java/src/org/chromium/android_webview/AwWebContentsObserver.java",
"java/src/org/chromium/android_webview/AwWebResourceInterceptResponse.java",
"java/src/org/chromium/android_webview/AwWebResourceResponse.java",
"java/src/org/chromium/android_webview/AwZoomControls.java",
"java/src/org/chromium/android_webview/CleanupReference.java",
"java/src/org/chromium/android_webview/ClientCertLookupTable.java",
"java/src/org/chromium/android_webview/DefaultVideoPosterRequestHandler.java",
"java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java",
"java/src/org/chromium/android_webview/FindAddress.java",
"java/src/org/chromium/android_webview/FullScreenView.java",
"java/src/org/chromium/android_webview/HttpAuthDatabase.java",
"java/src/org/chromium/android_webview/InputStreamUtil.java",
"java/src/org/chromium/android_webview/JsPromptResultReceiver.java",
"java/src/org/chromium/android_webview/JsReplyProxy.java",
"java/src/org/chromium/android_webview/JsResultHandler.java",
"java/src/org/chromium/android_webview/JsResultReceiver.java",
"java/src/org/chromium/android_webview/NullAwViewMethods.java",
"java/src/org/chromium/android_webview/OverScrollGlow.java",
"java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java",
"java/src/org/chromium/android_webview/ScrollAccessibilityHelper.java",
"java/src/org/chromium/android_webview/SslUtil.java",
"java/src/org/chromium/android_webview/VariationsSeedLoader.java",
"java/src/org/chromium/android_webview/ViewPositionObserver.java",
"java/src/org/chromium/android_webview/WebMessageListener.java",
"java/src/org/chromium/android_webview/WebMessageListenerHolder.java",
"java/src/org/chromium/android_webview/WebMessageListenerInfo.java",
"java/src/org/chromium/android_webview/WebViewChromiumRunQueue.java",
"java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java",
"java/src/org/chromium/android_webview/gfx/AwFunctor.java",
"java/src/org/chromium/android_webview/gfx/AwGLFunctor.java",
"java/src/org/chromium/android_webview/gfx/AwPicture.java",
"java/src/org/chromium/android_webview/gfx/JavaBrowserViewRendererHelper.java",
"java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java",
"java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java",
"java/src/org/chromium/android_webview/permission/AwGeolocationCallback.java",
"java/src/org/chromium/android_webview/permission/AwPermissionRequest.java",
"java/src/org/chromium/android_webview/policy/AwPolicyProvider.java",
"java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java",
"java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConversionHelper.java",
"java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingResponse.java",
]
deps = [
":common_aidl_java",
":common_crash_java",
":common_java",
":common_platform_services_java",
":common_variations_java",
":resources",
"//android_webview/nonembedded:system_webview_manifest",
"//base:base_java",
"//base:jni_java",
"//components/autofill/android:autofill_java",
"//components/autofill/android:provider_java",
"//components/background_task_scheduler:background_task_scheduler_task_ids_java",
"//components/content_capture/android:java",
"//components/crash/android:handler_java",
"//components/crash/android:java",
"//components/embedder_support/android:util_java",
"//components/embedder_support/android:web_contents_delegate_java",
"//components/embedder_support/android/metrics:java",
"//components/minidump_uploader:minidump_uploader_java",
"//components/navigation_interception/android:navigation_interception_java",
"//components/policy/android:policy_java",
"//components/safe_browsing/android:safe_browsing_java",
"//components/variations:load_seed_result_enum_java",
"//components/variations/android:variations_java",
"//components/version_info/android:version_constants_java",
"//components/viz/common:common_java",
"//content/public/android:content_java",
"//device/gamepad:java",
"//mojo/public/java:system_java",
"//mojo/public/java/system:system_impl_java",
"//net/android:net_java",
"//services/network/public/mojom:mojom_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/blink/public:blink_headers_java",
"//ui/android:ui_java",
"//url:gurl_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
if (enable_spellcheck) {
deps += [ "//components/spellcheck/browser/android:java" ]
}
srcjar_deps = [
"//android_webview/browser:browser_enums",
"//components/safe_browsing/core/db:sb_threat_values",
]
android_manifest_for_lint = system_webview_android_manifest
min_sdk_version = 21
}
android_library("common_variations_java") {
sources = [
"java/src/org/chromium/android_webview/common/variations/VariationsServiceMetricsHelper.java",
"java/src/org/chromium/android_webview/common/variations/VariationsUtils.java",
]
deps = [
"//android_webview/proto:aw_variations_seed_proto_java",
"//base:base_java",
"//components/variations/android:variations_java",
"//third_party/android_deps:com_google_protobuf_protobuf_javalite_java",
]
}
# Separate target to allow for a dependency on GmsCore without pulling in all of
# android_webview_java. It compiles the abstract class; implementations are
# compiled separately.
android_library("common_platform_services_java") {
sources = [
"java/src/org/chromium/android_webview/common/PlatformServiceBridge.java",
"java/src/org/chromium/android_webview/common/PlatformServiceBridgeImpl.java",
]
deps = [
"//base:base_java",
"//components/embedder_support/android/metrics:java",
"//third_party/android_deps:androidx_annotation_annotation_java",
]
# The appropriate .class file will be loaded via a dependency to a library
# like :platform_service_bridge_upstream_implementation_java below. We only include the
# .java file because other files in the target depend on it.
jar_excluded_patterns = [ "*/PlatformServiceBridgeImpl.class" ]
}
# This target compiles the implementation of PlatformServiceBridge for AOSP targets.
android_library("platform_service_bridge_upstream_implementation_java") {
sources = [ "java/src/org/chromium/android_webview/common/PlatformServiceBridgeImpl.java" ]
deps = [ ":common_platform_services_java" ]
}
android_library("common_crash_java") {
sources = [
"java/src/org/chromium/android_webview/common/crash/AwCrashReporterClient.java",
"java/src/org/chromium/android_webview/common/crash/CrashInfo.java",
"java/src/org/chromium/android_webview/common/crash/CrashUploadUtil.java",
"java/src/org/chromium/android_webview/common/crash/SystemWideCrashDirectories.java",
]
deps = [
":common_java",
"//base:base_java",
"//base:jni_java",
"//components/background_task_scheduler:background_task_scheduler_task_ids_java",
"//components/minidump_uploader:minidump_uploader_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
min_sdk_version = 21
}
android_library("common_java") {
sources = [
"java/src/org/chromium/android_webview/common/AwResource.java",
"java/src/org/chromium/android_webview/common/AwSwitches.java",
"java/src/org/chromium/android_webview/common/CommandLineUtil.java",
"java/src/org/chromium/android_webview/common/DeveloperModeUtils.java",
"java/src/org/chromium/android_webview/common/Flag.java",
"java/src/org/chromium/android_webview/common/FlagOverrideHelper.java",
"java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java",
"java/src/org/chromium/android_webview/common/services/ServiceNames.java",
]
deps = [
"//base:base_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
]
}
android_aidl("common_aidl") {
import_include = [ "java/src" ]
sources = [
"java/src/org/chromium/android_webview/common/services/ICrashReceiverService.aidl",
"java/src/org/chromium/android_webview/common/services/IDeveloperUiService.aidl",
"java/src/org/chromium/android_webview/common/services/IVariationsSeedServer.aidl",
"java/src/org/chromium/android_webview/common/services/IVariationsSeedServerCallback.aidl",
]
}
android_library("common_aidl_java") {
srcjar_deps = [ ":common_aidl" ]
}
# Generate ProductConfig.java so that android_webview_product_config_java's
# compile step works.
generate_product_config_srcjar("webview_product_config") {
java_package = webview_product_config_java_package
}
# ProductConfig.java is excluded from the generated .jar
# (via. jar_excluded_patterns) and the final version is inserted at the APK
# level - with the list of pak locales populated by looking at the assets that
# are listed in the final APK's .build_config.
android_library("android_webview_product_config_java") {
sources = [ "java/src/org/chromium/android_webview/AwLocaleConfig.java" ]
srcjar_deps = [ ":webview_product_config" ]
jar_excluded_patterns = [ "*/ProductConfig.class" ]
}
if (enable_resource_whitelist_generation) {
generate_resource_whitelist("system_webview_pak_whitelist") {
deps = [ ":libwebviewchromium" ]
inputs =
[ "$root_out_dir/lib.unstripped/libwebviewchromium$shlib_extension" ]
output = system_webview_pak_whitelist
}
}
webview_repack_locales("repack_locales") {
input_locales = locales
output_locales = locales
if (enable_resource_whitelist_generation) {
repack_whitelist = system_webview_pak_whitelist
deps = [ ":system_webview_pak_whitelist" ]
}
}
android_assets("locale_pak_assets") {
disable_compression = true
renaming_sources = []
renaming_destinations = []
foreach(_locale, locales) {
renaming_sources += [ "$root_out_dir/android_webview/locales/$_locale.pak" ]
renaming_destinations += [ "stored-locales/$_locale.pak" ]
}
treat_as_locale_paks = true
deps = [ ":repack_locales" ]
}
repack("repack_pack") {
sources = [
"$root_gen_dir/content/content_resources.pak",
"$root_gen_dir/net/net_resources.pak",
"$root_gen_dir/third_party/blink/public/resources/blink_resources.pak",
"$target_gen_dir/aw_resources.pak",
"$target_gen_dir/components_resources.pak",
"$target_gen_dir/mojo_bindings_resources.pak",
"$target_gen_dir/webui_resources.pak",
]
deps = [
":generate_aw_resources",
":generate_components_resources",
":generate_mojo_resources",
":generate_webui_resources",
"//content:content_resources",
"//net:net_resources",
"//third_party/blink/public:resources",
]
output = "$target_gen_dir/resources.pak"
if (enable_resource_whitelist_generation) {
repack_whitelist = system_webview_pak_whitelist
deps += [ ":system_webview_pak_whitelist" ]
}
if (webview_includes_weblayer) {
sources += [ "$root_gen_dir/weblayer/weblayer_resources.pak" ]
deps += [ "//weblayer:resources" ]
}
}
repack("repack_100_percent") {
sources = [
"$root_gen_dir/content/app/resources/content_resources_100_percent.pak",
"$root_gen_dir/third_party/blink/public/resources/blink_scaled_resources_100_percent.pak",
"$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
]
deps = [
"//content/app/resources",
"//third_party/blink/public:scaled_resources_100_percent",
"//ui/resources",
]
output = "$target_gen_dir/chrome_100_percent.pak"
if (enable_resource_whitelist_generation) {
repack_whitelist = system_webview_pak_whitelist
deps += [ ":system_webview_pak_whitelist" ]
}
}
android_assets("pak_file_assets") {
sources = [
"$target_gen_dir/chrome_100_percent.pak",
"$target_gen_dir/resources.pak",
]
deps = [
":repack_100_percent",
":repack_pack",
]
disable_compression = true
}
if (android_64bit_target_cpu) {
android_assets("v8_snapshot_secondary_abi_assets") {
_secondary_abi_out_dir =
get_label_info("//v8($android_secondary_abi_toolchain)", "root_out_dir")
assert(android_64bit_target_cpu,
"32-bit targets shouldn't have secondary abi")
arch_suffix = "32"
if (use_v8_context_snapshot) {
renaming_sources = [ "$_secondary_abi_out_dir/v8_context_snapshot.bin" ]
renaming_destinations = [ "v8_context_snapshot_$arch_suffix.bin" ]
} else {
renaming_sources = [ "$_secondary_abi_out_dir/snapshot_blob.bin" ]
renaming_destinations = [ "snapshot_blob_$arch_suffix.bin" ]
}
disable_compression = true
deps = [
"//tools/v8_context_snapshot($android_secondary_abi_toolchain)",
"//v8($android_secondary_abi_toolchain)",
]
}
}
android_assets("webview_primary_abi_assets") {
if (use_v8_context_snapshot) {
deps = [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ]
} else {
deps = [ "//v8:v8_external_startup_data_assets" ]
}
}
android_assets("monochrome_webview_primary_abi_assets") {
deps = [ "//third_party/icu:icu_assets" ]
if (use_v8_context_snapshot) {
deps += [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ]
} else {
deps += [ "//v8:v8_external_startup_data_assets" ]
}
}
if (android_64bit_target_cpu) {
android_assets("webview_secondary_abi_assets") {
deps = [ ":v8_snapshot_secondary_abi_assets" ]
}
android_assets("monochrome_webview_secondary_abi_assets") {
deps = [ "//third_party/icu:icu_assets" ]
deps += [ ":v8_snapshot_secondary_abi_assets" ]
}
}
android_assets("weblayer_webview_assets") {
deps = [
":webview_primary_abi_assets",
"//third_party/icu:icu_assets",
]
if (android_64bit_target_cpu) {
deps += [ ":webview_secondary_abi_assets" ]
}
}
android_assets("stub_assets") {
renaming_sources = [ "$root_gen_dir/components/resources/about_credits.html" ]
renaming_destinations = [ "webview_licenses.notice" ]
deps = [ "//components/resources:about_credits" ]
}
android_resources("resources") {
sources = [
"java/res/drawable-hdpi/ic_play_circle_outline_black_48dp.png",
"java/res/drawable-mdpi/ic_play_circle_outline_black_48dp.png",
"java/res/drawable-xhdpi/ic_play_circle_outline_black_48dp.png",
"java/res/drawable-xxhdpi/ic_play_circle_outline_black_48dp.png",
"java/res/drawable-xxxhdpi/ic_play_circle_outline_black_48dp.png",
]
custom_package = "org.chromium.android_webview"
deps = [ ":strings_grd" ]
}
grit("generate_aw_resources") {
source = "ui/aw_resources.grd"
outputs = [
"grit/aw_resources.h",
"aw_resources.pak",
]
}
grit("generate_aw_strings") {
source = "ui/aw_strings.grd"
outputs = [ "grit/aw_strings.h" ]
foreach(_locale, locales) {
outputs += [ "aw_strings_${_locale}.pak" ]
}
}
grit("generate_webui_resources") {
source = "../ui/webui/resources/webui_resources.grd"
# webui/resources has way too many resources. The allowlist is trim this down
# to a reasonable size
_allowlist = "ui/grit_resources_allowlist.txt"
inputs = [ _allowlist ]
grit_flags = [
"-w",
rebase_path(_allowlist, root_build_dir),
"-E",
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
outputs = [
"grit/webui_resources.h",
"grit/webui_resources_map.cc",
"grit/webui_resources_map.h",
"webui_resources.pak",
]
deps = [
"//ui/webui/resources/js:modulize",
"//ui/webui/resources/js/cr:modulize",
"//ui/webui/resources/js/cr/ui:modulize",
]
}
grit("generate_mojo_resources") {
source = "../mojo/public/js/mojo_bindings_resources.grd"
# See :generate_webui_resources for an explanation of the allowlist
_allowlist = "ui/grit_resources_allowlist.txt"
inputs = [ _allowlist ]
grit_flags = [
"-w",
rebase_path(_allowlist, root_build_dir),
"-E",
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
outputs = [
"grit/mojo_bindings_resources.h",
"grit/mojo_bindings_resources_map.cc",
"grit/mojo_bindings_resources_map.h",
"mojo_bindings_resources.pak",
]
deps = [
"//mojo/public/js:bindings_lite",
"//mojo/public/mojom/base:base_js",
]
}
grit("generate_components_resources") {
# Note that dev_ui_components_resources.grd is Chrome-only, so excluded.
source = "../components/resources/components_resources.grd"
use_brotli = true
# See :generate_webui_resources for an explanation of the allowlist
_allowlist = "ui/grit_resources_allowlist.txt"
inputs = [ _allowlist ]
_about_credits_file = get_label_info("//components/resources",
"target_gen_dir") + "/about_credits.html"
grit_flags = [
"-w",
rebase_path(_allowlist, root_build_dir),
"-E",
"about_credits_file=" + rebase_path(_about_credits_file, root_build_dir),
"-E",
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
outputs = [
"grit/components_resources.h",
"components_resources.pak",
]
deps = [
"//components/resources:about_credits",
"//components/resources/ssl/ssl_error_assistant:make_ssl_error_assistant_protobuf",
]
}
grit("generate_components_strings") {
source = "../components/components_strings.grd"
# components_strings contains strings from all components. WebView
# will never display most of them, so we try to limit the included
# strings. This allowlist trims about 50% more than the compile-based
# allowlist generated by :system_webview_pak_whitelist.
_allowlist = rebase_path("ui/grit_strings_allowlist.txt", root_build_dir)
inputs = [ "//android_webview/ui/grit_strings_allowlist.txt" ]
grit_flags = [
"-w",
_allowlist,
]
outputs =
[
"grit/components_strings.h",
"java/res/values/components_strings.xml",
] +
process_file_template(
android_bundle_locales_as_resources,
[ "java/res/values-{{source_name_part}}/components_strings.xml" ]) +
process_file_template(locales_with_fake_bidi,
[ "components_strings_{{source_name_part}}.pak" ])
}
java_strings_grd("strings_grd") {
grd_file = "java/strings/android_webview_strings.grd"
outputs = [ "values/android_webview_strings.xml" ] +
process_file_template(
android_bundle_locales_as_resources,
[ "values-{{source_name_part}}/android_webview_strings.xml" ])
}

View File

@ -0,0 +1,268 @@
# 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.
import("//build/config/android/rules.gni")
import("//components/spellcheck/spellcheck_build_features.gni")
java_cpp_enum("browser_enums") {
sources = [
"aw_renderer_priority.h",
"aw_settings.h",
"permission/aw_permission_request.h",
"safe_browsing/aw_safe_browsing_blocking_page.h",
"safe_browsing/aw_url_checker_delegate_impl.h",
]
}
source_set("browser") {
sources = [
"android_protocol_handler.cc",
"android_protocol_handler.h",
"aw_autofill_client.cc",
"aw_autofill_client.h",
"aw_browser_context.cc",
"aw_browser_context.h",
"aw_browser_main_parts.cc",
"aw_browser_main_parts.h",
"aw_browser_permission_request_delegate.h",
"aw_browser_policy_connector.cc",
"aw_browser_policy_connector.h",
"aw_browser_process.cc",
"aw_browser_process.h",
"aw_browser_terminator.cc",
"aw_browser_terminator.h",
"aw_content_browser_client.cc",
"aw_content_browser_client.h",
"aw_content_browser_overlay_manifest.cc",
"aw_content_browser_overlay_manifest.h",
"aw_contents.cc",
"aw_contents.h",
"aw_contents_client_bridge.cc",
"aw_contents_client_bridge.h",
"aw_contents_io_thread_client.cc",
"aw_contents_io_thread_client.h",
"aw_contents_statics.cc",
"aw_cookie_access_policy.cc",
"aw_cookie_access_policy.h",
"aw_debug.cc",
"aw_devtools_manager_delegate.cc",
"aw_devtools_manager_delegate.h",
"aw_devtools_server.cc",
"aw_devtools_server.h",
"aw_download_manager_delegate.cc",
"aw_download_manager_delegate.h",
"aw_feature_list.cc",
"aw_feature_list_creator.cc",
"aw_feature_list_creator.h",
"aw_form_database.cc",
"aw_form_database_service.cc",
"aw_form_database_service.h",
"aw_http_auth_handler.cc",
"aw_http_auth_handler.h",
"aw_javascript_dialog_manager.cc",
"aw_javascript_dialog_manager.h",
"aw_media_url_interceptor.cc",
"aw_media_url_interceptor.h",
"aw_pac_processor.cc",
"aw_pac_processor.h",
"aw_pdf_exporter.cc",
"aw_pdf_exporter.h",
"aw_permission_manager.cc",
"aw_permission_manager.h",
"aw_pref_names.cc",
"aw_pref_names.h",
"aw_print_manager.cc",
"aw_print_manager.h",
"aw_proxy_controller.cc",
"aw_quota_manager_bridge.cc",
"aw_quota_manager_bridge.h",
"aw_quota_permission_context.cc",
"aw_quota_permission_context.h",
"aw_render_process.cc",
"aw_render_process.h",
"aw_render_process_gone_delegate.h",
"aw_renderer_priority.h",
"aw_resource_context.cc",
"aw_resource_context.h",
"aw_settings.cc",
"aw_settings.h",
"aw_speech_recognition_manager_delegate.cc",
"aw_speech_recognition_manager_delegate.h",
"aw_ssl_host_state_delegate.cc",
"aw_ssl_host_state_delegate.h",
"aw_variations_seed_bridge.cc",
"aw_variations_seed_bridge.h",
"aw_variations_service_client.cc",
"aw_variations_service_client.h",
"aw_web_contents_delegate.cc",
"aw_web_contents_delegate.h",
"aw_web_contents_view_delegate.cc",
"aw_web_contents_view_delegate.h",
"aw_web_ui_controller_factory.cc",
"aw_web_ui_controller_factory.h",
"cookie_manager.cc",
"cookie_manager.h",
"find_helper.cc",
"find_helper.h",
"icon_helper.cc",
"icon_helper.h",
"input_stream.cc",
"input_stream.h",
"js_java_interaction/js_java_configurator_host.cc",
"js_java_interaction/js_java_configurator_host.h",
"js_java_interaction/js_reply_proxy.cc",
"js_java_interaction/js_reply_proxy.h",
"js_java_interaction/js_to_java_messaging.cc",
"js_java_interaction/js_to_java_messaging.h",
"network_service/android_stream_reader_url_loader.cc",
"network_service/android_stream_reader_url_loader.h",
"network_service/aw_network_change_notifier.cc",
"network_service/aw_network_change_notifier.h",
"network_service/aw_network_change_notifier_factory.cc",
"network_service/aw_network_change_notifier_factory.h",
"network_service/aw_proxy_config_monitor.cc",
"network_service/aw_proxy_config_monitor.h",
"network_service/aw_proxying_restricted_cookie_manager.cc",
"network_service/aw_proxying_restricted_cookie_manager.h",
"network_service/aw_proxying_url_loader_factory.cc",
"network_service/aw_proxying_url_loader_factory.h",
"network_service/aw_url_loader_throttle.cc",
"network_service/aw_url_loader_throttle.h",
"network_service/aw_web_resource_intercept_response.cc",
"network_service/aw_web_resource_intercept_response.h",
"network_service/aw_web_resource_request.cc",
"network_service/aw_web_resource_request.h",
"network_service/aw_web_resource_response.cc",
"network_service/aw_web_resource_response.h",
"network_service/input_stream_reader.cc",
"network_service/input_stream_reader.h",
"network_service/net_helpers.cc",
"network_service/net_helpers.h",
"page_load_metrics/page_load_metrics_initialize.cc",
"page_load_metrics/page_load_metrics_initialize.h",
"permission/aw_permission_request.cc",
"permission/aw_permission_request.h",
"permission/aw_permission_request_delegate.cc",
"permission/aw_permission_request_delegate.h",
"permission/media_access_permission_request.cc",
"permission/media_access_permission_request.h",
"permission/permission_request_handler.cc",
"permission/permission_request_handler.h",
"permission/permission_request_handler_client.cc",
"permission/permission_request_handler_client.h",
"permission/simple_permission_request.cc",
"permission/simple_permission_request.h",
"popup_touch_handle_drawable.cc",
"popup_touch_handle_drawable.h",
"renderer_host/auto_login_parser.cc",
"renderer_host/auto_login_parser.h",
"renderer_host/aw_render_view_host_ext.cc",
"renderer_host/aw_render_view_host_ext.h",
"safe_browsing/aw_safe_browsing_blocking_page.cc",
"safe_browsing/aw_safe_browsing_blocking_page.h",
"safe_browsing/aw_safe_browsing_navigation_throttle.cc",
"safe_browsing/aw_safe_browsing_navigation_throttle.h",
"safe_browsing/aw_safe_browsing_subresource_helper.cc",
"safe_browsing/aw_safe_browsing_subresource_helper.h",
"safe_browsing/aw_safe_browsing_ui_manager.cc",
"safe_browsing/aw_safe_browsing_ui_manager.h",
"safe_browsing/aw_safe_browsing_whitelist_manager.cc",
"safe_browsing/aw_safe_browsing_whitelist_manager.h",
"safe_browsing/aw_url_checker_delegate_impl.cc",
"safe_browsing/aw_url_checker_delegate_impl.h",
"scoped_add_feature_flags.cc",
"scoped_add_feature_flags.h",
"state_serializer.cc",
"state_serializer.h",
"tracing/aw_trace_event_args_whitelist.cc",
"tracing/aw_trace_event_args_whitelist.h",
"tracing/aw_tracing_controller.cc",
"tracing/aw_tracing_controller.h",
"tracing/aw_tracing_delegate.cc",
"tracing/aw_tracing_delegate.h",
]
deps = [
"//android_webview:browser_jni_headers",
"//android_webview:generate_components_strings",
"//android_webview/browser/gfx",
"//android_webview/browser/lifecycle",
"//android_webview/browser/metrics",
"//android_webview/common",
"//android_webview/common:common_mojom",
"//base",
"//components/autofill/android:provider",
"//components/autofill/content/browser",
"//components/cdm/browser",
"//components/content_capture/android",
"//components/content_capture/browser",
# Called via JNI in CrashpadMain
"//components/crash/android:crashpad_main",
"//components/crash/content/browser",
"//components/crash/core/app",
"//components/embedder_support/android:web_contents_delegate",
"//components/embedder_support/android/metrics",
"//components/google/core/common",
"//components/heap_profiling",
"//components/metrics",
"//components/minidump_uploader",
"//components/navigation_interception",
"//components/page_load_metrics/browser",
"//components/policy/content/",
"//components/policy/core/browser",
"//components/pref_registry",
"//components/prefs",
"//components/printing/browser",
"//components/printing/common",
"//components/printing/common:mojo_interfaces",
"//components/safe_browsing/android:remote_database_manager",
"//components/safe_browsing/content",
"//components/safe_browsing/content/browser",
"//components/safe_browsing/content/common:interfaces",
"//components/safe_browsing/content/web_ui",
"//components/safe_browsing/core:features",
"//components/safe_browsing/core:ping_manager",
"//components/safe_browsing/core/browser",
"//components/safe_browsing/core/browser:network_context",
"//components/safe_browsing/core/common",
"//components/safe_browsing/core/db:database_manager",
"//components/safe_browsing/core/db:safebrowsing_proto",
"//components/safe_browsing/core/triggers",
"//components/safe_browsing/core/web_ui:constants",
"//components/security_interstitials/content:security_interstitial_page",
"//components/security_interstitials/core",
"//components/services/heap_profiling/public/cpp",
"//components/spellcheck:buildflags",
"//components/url_formatter",
"//components/user_prefs",
"//components/variations",
"//components/variations/net",
"//components/variations/service",
"//components/version_info",
"//components/version_info/android:channel_getter",
"//components/visitedlink/browser",
"//components/webdata/common",
"//content/public/browser",
"//media/mojo:buildflags",
"//printing",
"//services/preferences/tracked",
"//services/proxy_resolver:lib",
"//third_party/blink/public/mojom/frame",
"//third_party/crashpad/crashpad/client",
"//ui/android",
"//ui/gl",
"//ui/resources",
"//ui/touch_selection",
]
if (enable_spellcheck) {
deps += [ "//components/spellcheck/browser" ]
}
configs += [
"//tools/v8_context_snapshot:use_v8_context_snapshot",
"//v8:external_startup_data",
]
}

View File

@ -0,0 +1,101 @@
# 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.
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
source_set("gfx") {
sources = [
"aw_attaching_to_window_recorder.cc",
"aw_attaching_to_window_recorder.h",
"aw_draw_fn_impl.cc",
"aw_draw_fn_impl.h",
"aw_gl_functor.cc",
"aw_gl_functor.h",
"aw_gl_surface.cc",
"aw_gl_surface.h",
"aw_gl_surface_external_stencil.cc",
"aw_gl_surface_external_stencil.h",
"aw_picture.cc",
"aw_picture.h",
"aw_render_thread_context_provider.cc",
"aw_render_thread_context_provider.h",
"aw_vulkan_context_provider.cc",
"aw_vulkan_context_provider.h",
"begin_frame_source_webview.cc",
"begin_frame_source_webview.h",
"browser_view_renderer.cc",
"browser_view_renderer.h",
"browser_view_renderer_client.h",
"child_frame.cc",
"child_frame.h",
"compositor_frame_consumer.h",
"compositor_frame_producer.h",
"deferred_gpu_command_service.cc",
"deferred_gpu_command_service.h",
"display_scheduler_webview.cc",
"display_scheduler_webview.h",
"gpu_service_web_view.cc",
"gpu_service_web_view.h",
"hardware_renderer.cc",
"hardware_renderer.h",
"hardware_renderer_single_thread.cc",
"hardware_renderer_single_thread.h",
"hardware_renderer_viz.cc",
"hardware_renderer_viz.h",
"java_browser_view_renderer_helper.cc",
"java_browser_view_renderer_helper.h",
"output_surface_provider_webview.cc",
"output_surface_provider_webview.h",
"parent_compositor_draw_constraints.cc",
"parent_compositor_draw_constraints.h",
"parent_output_surface.cc",
"parent_output_surface.h",
"render_thread_manager.cc",
"render_thread_manager.h",
"root_frame_sink.cc",
"root_frame_sink.h",
"root_frame_sink_proxy.cc",
"root_frame_sink_proxy.h",
"scoped_app_gl_state_restore.cc",
"scoped_app_gl_state_restore.h",
"skia_output_surface_dependency_webview.cc",
"skia_output_surface_dependency_webview.h",
"surfaces_instance.cc",
"surfaces_instance.h",
"task_forwarding_sequence.cc",
"task_forwarding_sequence.h",
"task_queue_web_view.cc",
"task_queue_web_view.h",
"viz_compositor_thread_runner_webview.cc",
"viz_compositor_thread_runner_webview.h",
]
deps = [
"//android_webview:browser_jni_headers",
"//android_webview/common",
"//android_webview/public",
"//base",
"//components/ui_devtools:buildflags",
"//components/viz/service",
"//components/viz/service/main",
"//content/public/browser",
"//gpu/command_buffer/client:gles2_implementation",
"//gpu/command_buffer/service",
"//gpu/ipc:gl_in_process_context",
"//gpu/ipc/common:android_image_reader_utils",
"//gpu/ipc/common:common",
"//gpu/skia_bindings",
"//gpu/vulkan:vulkan",
"//gpu/vulkan/init",
"//services/viz/privileged/mojom",
"//services/viz/public/mojom",
"//skia",
"//ui/gfx",
"//ui/gl",
"//ui/gl/init",
]
libs = [ "jnigraphics" ]
}

View File

@ -0,0 +1,17 @@
# Copyright 2020 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.
source_set("lifecycle") {
sources = [
"aw_contents_lifecycle_notifier.cc",
"aw_contents_lifecycle_notifier.h",
"webview_app_state_observer.cc",
"webview_app_state_observer.h",
]
deps = [
"//android_webview:browser_jni_headers",
"//base",
"//content/public/browser",
]
}

View File

@ -0,0 +1,23 @@
# 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.
source_set("metrics") {
sources = [
"aw_metrics_service_client.cc",
"aw_metrics_service_client.h",
"aw_stability_metrics_provider.cc",
"aw_stability_metrics_provider.h",
]
deps = [
"//android_webview:browser_jni_headers",
"//android_webview/browser/lifecycle",
"//android_webview/common",
"//base",
"//components/embedder_support/android/metrics",
"//components/metrics",
"//components/prefs",
"//components/version_info/android:channel_getter",
"//content/public/browser",
]
}

View File

@ -0,0 +1,88 @@
# 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.
import("//build/config/android/rules.gni")
import("//mojo/public/tools/bindings/mojom.gni")
mojom("common_mojom") {
sources = [
"aw_origin_matcher.mojom",
"js_java_interaction/interfaces.mojom",
]
public_deps = [
"//mojo/public/mojom/base",
"//services/network/public/mojom:mojom",
]
cpp_typemaps = [
{
types = [
{
mojom = "android_webview.mojom.AwOriginMatcher"
cpp = "::android_webview::AwOriginMatcher"
},
]
traits_headers =
[ "//android_webview/common/aw_origin_matcher_mojom_traits.h" ]
},
]
}
source_set("common") {
sources = [
"android_webview_message_generator.cc",
"android_webview_message_generator.h",
"aw_content_client.cc",
"aw_content_client.h",
"aw_descriptors.h",
"aw_features.cc",
"aw_features.h",
"aw_hit_test_data.cc",
"aw_hit_test_data.h",
"aw_media_drm_bridge_client.cc",
"aw_media_drm_bridge_client.h",
"aw_origin_matcher.cc",
"aw_origin_matcher.h",
"aw_paths.cc",
"aw_paths.h",
"aw_resource.cc",
"aw_resource.h",
"aw_resource_bundle.cc",
"aw_resource_bundle.h",
"aw_switches.cc",
"aw_switches.h",
"crash_reporter/aw_crash_reporter_client.cc",
"crash_reporter/aw_crash_reporter_client.h",
"crash_reporter/crash_keys.cc",
"crash_reporter/crash_keys.h",
"devtools_instrumentation.h",
"render_view_messages.cc",
"render_view_messages.h",
"url_constants.cc",
"url_constants.h",
]
deps = [
"//android_webview:common_jni_headers",
"//base",
"//components/cdm/common",
"//components/crash/core/app",
"//components/crash/core/common:crash_key",
"//components/gwp_asan/common",
"//components/services/heap_profiling/public/cpp",
"//components/version_info",
"//components/version_info:generate_version_info",
"//components/version_info/android:channel_getter",
"//content/public/common",
"//gpu/config",
"//ipc",
"//mojo/public/cpp/bindings",
"//skia",
"//ui/base",
"//ui/gfx/geometry",
"//ui/gfx/ipc/geometry",
"//ui/gfx/ipc/skia",
"//url",
]
}

View File

@ -0,0 +1,10 @@
// Copyright 2020 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.
module android_webview.mojom;
// This corresponds to the string representation of AwOriginMatcher.
struct AwOriginMatcher {
array<string> rules;
};

View File

@ -0,0 +1,47 @@
// 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.
module android_webview.mojom;
import "android_webview/common/aw_origin_matcher.mojom";
import "mojo/public/mojom/base/string16.mojom";
// JsObject struct represents a JavaScript object we will inject in the main
// JavaScript world of a frame. |js_object_name| will be used as the name
// of the JavaScript object. We will inject the object if the frame's origin
// matches |origin_matcher|. |js_to_java_messaging| will be used for that
// JavaScript object to send message back to browser (hence Java) side.
struct JsObject {
mojo_base.mojom.String16 js_object_name;
pending_associated_remote<JsToJavaMessaging> js_to_java_messaging;
android_webview.mojom.AwOriginMatcher origin_matcher;
};
// For JavaScript postMessage() API, implemented by browser.
interface JsToJavaMessaging {
// Called from renderer, browser receives |message| and possible |ports|,
// The |message| is an opaque type and the contents are defined by the client
// of this API.
PostMessage(mojo_base.mojom.String16 message,
array<handle<message_pipe>> ports);
// When there is a new JavaToJsMessaging created in renderer, we need to send
// it to browser, so browser could send message back to Js.
SetJavaToJsMessaging(
pending_associated_remote<JavaToJsMessaging> java_to_js_messaging);
};
// For Java to reply back to injected JavaScript object. Implemented by
// renderer.
interface JavaToJsMessaging {
// Called from browser, to send message from Java to JavaScript.
OnPostMessage(mojo_base.mojom.String16 message);
};
// For browser to configure renderer, implemented by renderer.
interface JsJavaConfigurator {
// Called from browser, to tell renderer that if we need to inject
// JavaScript objects to the frame based on the |js_objects| array.
SetJsObjects(array<android_webview.mojom.JsObject> js_objects);
};

View File

@ -0,0 +1,84 @@
# Copyright 2015 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.
import("//android_webview/system_webview_apk_tmpl.gni")
import("//android_webview/variables.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
android_library("glue") {
deps = [
"//android_webview:android_webview_product_config_java",
"//android_webview:browser_java",
"//android_webview:common_java",
"//android_webview/nonembedded:system_webview_manifest",
"//android_webview/support_library/boundary_interfaces:boundary_interface_java",
"//android_webview/support_library/callback:callback_java",
"//base:base_java",
"//base:jni_java",
"//components/autofill/android:autofill_java",
"//components/autofill/android:provider_java",
"//components/content_capture/android:java",
"//components/embedder_support/android:application_java",
"//content/public/android:content_java",
"//net/android:net_java",
"//ui/android:ui_java",
"//url:gurl_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
alternative_android_sdk_dep =
"//third_party/android_sdk:public_framework_system_java"
sources = [
"java/src/com/android/webview/chromium/CallbackConverter.java",
"java/src/com/android/webview/chromium/ContentSettingsAdapter.java",
"java/src/com/android/webview/chromium/CookieManagerAdapter.java",
"java/src/com/android/webview/chromium/DrawFunctor.java",
"java/src/com/android/webview/chromium/DrawGLFunctor.java",
"java/src/com/android/webview/chromium/GeolocationPermissionsAdapter.java",
"java/src/com/android/webview/chromium/GlueApiHelperForM.java",
"java/src/com/android/webview/chromium/GlueApiHelperForN.java",
"java/src/com/android/webview/chromium/GlueApiHelperForO.java",
"java/src/com/android/webview/chromium/GlueApiHelperForOMR1.java",
"java/src/com/android/webview/chromium/GlueApiHelperForP.java",
"java/src/com/android/webview/chromium/GlueApiHelperForQ.java",
"java/src/com/android/webview/chromium/GraphicsUtils.java",
"java/src/com/android/webview/chromium/MonochromeLibraryPreloader.java",
"java/src/com/android/webview/chromium/SafeBrowsingResponseAdapter.java",
"java/src/com/android/webview/chromium/ServiceWorkerClientAdapter.java",
"java/src/com/android/webview/chromium/ServiceWorkerControllerAdapter.java",
"java/src/com/android/webview/chromium/ServiceWorkerSettingsAdapter.java",
"java/src/com/android/webview/chromium/SharedStatics.java",
"java/src/com/android/webview/chromium/SharedTracingControllerAdapter.java",
"java/src/com/android/webview/chromium/SharedWebViewChromium.java",
"java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java",
"java/src/com/android/webview/chromium/SharedWebViewRendererClientAdapter.java",
"java/src/com/android/webview/chromium/SplitApkWorkaround.java",
"java/src/com/android/webview/chromium/TracingControllerAdapter.java",
"java/src/com/android/webview/chromium/WebBackForwardListChromium.java",
"java/src/com/android/webview/chromium/WebHistoryItemChromium.java",
"java/src/com/android/webview/chromium/WebIconDatabaseAdapter.java",
"java/src/com/android/webview/chromium/WebMessagePortAdapter.java",
"java/src/com/android/webview/chromium/WebResourceErrorAdapter.java",
"java/src/com/android/webview/chromium/WebResourceRequestAdapter.java",
"java/src/com/android/webview/chromium/WebStorageAdapter.java",
"java/src/com/android/webview/chromium/WebViewChromium.java",
"java/src/com/android/webview/chromium/WebViewChromiumAwInit.java",
"java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java",
"java/src/com/android/webview/chromium/WebViewChromiumFactoryProviderForO.java",
"java/src/com/android/webview/chromium/WebViewChromiumFactoryProviderForOMR1.java",
"java/src/com/android/webview/chromium/WebViewChromiumFactoryProviderForP.java",
"java/src/com/android/webview/chromium/WebViewChromiumFactoryProviderForQ.java",
"java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java",
"java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java",
"java/src/com/android/webview/chromium/WebViewDelegateFactory.java",
"java/src/com/android/webview/chromium/WebViewRenderProcessAdapter.java",
"java/src/com/android/webview/chromium/WebViewRenderProcessClientAdapter.java",
"java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java",
]
android_manifest_for_lint = system_webview_android_manifest
min_sdk_version = 21
}

View File

@ -0,0 +1,15 @@
# 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.
source_set("gpu") {
sources = [
"aw_content_gpu_client.cc",
"aw_content_gpu_client.h",
]
deps = [
"//base",
"//content/public/gpu",
]
}

View File

@ -0,0 +1,68 @@
# 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.
import("//components/gwp_asan/buildflags/buildflags.gni")
import("//components/spellcheck/spellcheck_build_features.gni")
import("//weblayer/variables.gni")
source_set("lib") {
sources = [
"aw_main_delegate.cc",
"aw_main_delegate.h",
"webview_jni_onload.cc",
"webview_jni_onload.h",
]
deps = [
"//android_webview/browser",
"//android_webview/browser/gfx",
"//android_webview/common",
"//android_webview/gpu",
"//android_webview/renderer",
"//base",
"//cc/base",
"//components/autofill/core/common",
"//components/crash/core/common",
"//components/gwp_asan/buildflags",
"//components/safe_browsing/android:safe_browsing_api_handler",
"//components/services/heap_profiling/public/cpp",
"//components/spellcheck:buildflags",
"//components/version_info",
"//components/version_info/android:channel_getter",
"//components/viz/common",
"//content/public/app:both",
"//content/public/browser",
"//content/public/common",
"//content/public/common:content_descriptor_keys",
"//gin",
"//gpu/command_buffer/service",
"//gpu/config",
"//gpu/ipc:gl_in_process_context",
"//media",
"//media:media_buildflags",
"//ui/base",
"//ui/events:gesture_detection",
]
if (enable_gwp_asan) {
deps += [ "//components/gwp_asan/client" ]
}
if (enable_spellcheck) {
deps += [ "//components/spellcheck/common" ]
}
}
source_set("webview_entry_point") {
deps = [
":lib",
"//base",
]
sources = [ "webview_entry_point.cc" ]
if (webview_includes_weblayer) {
defines = [ "WEBVIEW_INCLUDES_WEBLAYER" ]
deps += [ "//weblayer:weblayer_lib_webview" ]
}
}

View File

@ -0,0 +1,195 @@
# Copyright 2017 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.
import("//android_webview/system_webview_apk_tmpl.gni")
import("//android_webview/variables.gni")
import("//build/config/android/rules.gni")
generate_jni("nonembedded_jni_headers") {
sources = [ "java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java" ]
}
# Contains classes needed by the webview apk, but not used when loading the apk
# as a library.
android_library("nonembedded_java") {
sources = [
"java/src/org/chromium/android_webview/nonembedded/LicenseActivity.java",
"java/src/org/chromium/android_webview/nonembedded/LicenseContentProvider.java",
"java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java",
]
deps = [
":devui_java",
":services_java",
"//android_webview:android_webview_product_config_java",
"//android_webview:common_java",
"//base:base_java",
"//base:jni_java",
"//components/about_ui/android:aboutui_java",
"//components/embedder_support/android:application_java",
"//ui/android:ui_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
android_library("devui_java") {
sources = [
"java/src/org/chromium/android_webview/devui/CrashesListFragment.java",
"java/src/org/chromium/android_webview/devui/FlagsFragment.java",
"java/src/org/chromium/android_webview/devui/HomeFragment.java",
"java/src/org/chromium/android_webview/devui/MainActivity.java",
"java/src/org/chromium/android_webview/devui/PersistentErrorView.java",
"java/src/org/chromium/android_webview/devui/WebViewPackageError.java",
"java/src/org/chromium/android_webview/devui/util/CrashInfoLoader.java",
"java/src/org/chromium/android_webview/devui/util/UnuploadedFilesStateLoader.java",
"java/src/org/chromium/android_webview/devui/util/UploadedCrashesInfoLoader.java",
"java/src/org/chromium/android_webview/devui/util/WebViewCrashInfoCollector.java",
"java/src/org/chromium/android_webview/devui/util/WebViewCrashLogParser.java",
"java/src/org/chromium/android_webview/devui/util/WebViewPackageHelper.java",
]
deps = [
":devui_resources",
":system_webview_manifest",
"//android_webview:common_aidl_java",
"//android_webview:common_crash_java",
"//android_webview:common_java",
"//android_webview:common_platform_services_java",
"//base:base_java",
"//components/minidump_uploader:minidump_uploader_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:com_android_support_support_fragment_java",
"//ui/android:ui_java",
]
android_manifest_for_lint = system_webview_android_manifest
min_sdk_version = 21
}
android_library("services_java") {
sources = [
"java/src/org/chromium/android_webview/services/AwMinidumpUploadJobService.java",
"java/src/org/chromium/android_webview/services/AwMinidumpUploaderDelegate.java",
"java/src/org/chromium/android_webview/services/AwVariationsSeedFetcher.java",
"java/src/org/chromium/android_webview/services/CrashReceiverService.java",
"java/src/org/chromium/android_webview/services/DeveloperModeContentProvider.java",
"java/src/org/chromium/android_webview/services/DeveloperUiService.java",
"java/src/org/chromium/android_webview/services/VariationsSeedHolder.java",
"java/src/org/chromium/android_webview/services/VariationsSeedServer.java",
]
deps = [
":system_webview_manifest",
"//android_webview:common_aidl_java",
"//android_webview:common_crash_java",
"//android_webview:common_java",
"//android_webview:common_platform_services_java",
"//android_webview:common_variations_java",
"//base:base_java",
"//components/background_task_scheduler:background_task_scheduler_task_ids_java",
"//components/minidump_uploader:minidump_uploader_java",
"//components/variations/android:variations_java",
"//components/version_info/android:version_constants_java",
]
android_manifest_for_lint = system_webview_android_manifest
min_sdk_version = 21
}
source_set("nonembedded") {
sources = [ "webview_apk_application.cc" ]
deps = [
":nonembedded_jni_headers",
"//android_webview/common",
"//base",
# Called via JNI by LicenseContentProvider in :nonembedded_java.
"//components/about_ui:about_ui_android",
]
}
# WebView icon used by upstream SystemWebView and Trichrome.
android_resources("icon_resources") {
sources = [
"java/res_icon/drawable-hdpi/icon_webview.png",
"java/res_icon/drawable-mdpi/icon_webview.png",
"java/res_icon/drawable-xhdpi/icon_webview.png",
"java/res_icon/drawable-xxhdpi/icon_webview.png",
]
custom_package = "org.chromium.android_webview.icon"
}
android_resources("devui_resources") {
sources = [
"java/res_devui/drawable/blue_circle.xml",
"java/res_devui/drawable/ic_action_home.xml",
"java/res_devui/drawable/ic_alert_error.xml",
"java/res_devui/drawable/ic_flag.xml",
"java/res_devui/layout/activity_main.xml",
"java/res_devui/layout/crashes_list_item_body.xml",
"java/res_devui/layout/crashes_list_item_header.xml",
"java/res_devui/layout/flag_states.xml",
"java/res_devui/layout/fragment_crashes_list.xml",
"java/res_devui/layout/fragment_flags.xml",
"java/res_devui/layout/fragment_home.xml",
"java/res_devui/layout/persistent_error_message.xml",
"java/res_devui/layout/toggleable_flag.xml",
"java/res_devui/layout/two_line_list_item.xml",
"java/res_devui/layout/two_line_sublist_item.xml",
"java/res_devui/menu/crashes_options_menu.xml",
"java/res_devui/menu/options_menu.xml",
"java/res_devui/values-night/colors.xml",
"java/res_devui/values-night/styles.xml",
"java/res_devui/values/colors.xml",
"java/res_devui/values/strings.xml",
"java/res_devui/values/styles.xml",
]
custom_package = "org.chromium.android_webview.devui"
}
android_resources("devui_launcher_icon_resources") {
sources = []
custom_package = "org.chromium.android_webview.devui.icon"
android_manifest = "java/DeveloperUiLauncherManifest.xml"
}
android_resources("monochrome_devui_launcher_icon_resources") {
sources = []
android_manifest = "java/MonochromeDeveloperUiLauncherManifest.xml"
custom_package = "org.chromium.android_webview.devui.icon"
}
jinja_template("system_webview_manifest") {
input = "java/AndroidManifest.xml"
output = system_webview_android_manifest
variables = [ "manifest_package=$system_webview_package_name" ]
}
jinja_template("trichrome_webview_manifest") {
input = "java/AndroidManifest.xml"
output = trichrome_webview_android_manifest
variables = trichrome_jinja_variables + [
"trichrome_version=$trichrome_version_code",
"manifest_package=$system_webview_package_name",
"library=libmonochrome.so",
]
}
if (android_64bit_target_cpu) {
jinja_template("trichrome_webview_64_32_manifest") {
input = "java/AndroidManifest.xml"
output = trichrome_webview_64_32_android_manifest
variables = trichrome_jinja_variables + [
"use32bitAbi=",
"trichrome_version=$trichrome_64_32_version_code",
"manifest_package=$system_webview_package_name",
"library=libmonochrome_64.so",
]
}
jinja_template("trichrome_webview_32_manifest") {
input = "java/AndroidManifest.xml"
output = trichrome_webview_32_android_manifest
variables = trichrome_jinja_variables + [
"trichrome_version=$trichrome_32_version_code",
"manifest_package=$system_webview_package_name",
"library=libmonochrome.so",
]
}
}

View File

@ -0,0 +1,10 @@
# Copyright 2018 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.
import("//build/config/android/rules.gni")
proto_java_library("aw_variations_seed_proto_java") {
proto_path = "."
sources = [ "aw_variations_seed.proto" ]
}

View File

@ -0,0 +1,11 @@
# 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.
source_set("public") {
sources = [
"browser/draw_fn.h",
"browser/draw_gl.h",
"browser/draw_sw.h",
]
}

View File

@ -0,0 +1,70 @@
# 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.
source_set("renderer") {
sources = [
"aw_content_renderer_client.cc",
"aw_content_renderer_client.h",
"aw_content_settings_client.cc",
"aw_content_settings_client.h",
"aw_key_systems.cc",
"aw_key_systems.h",
"aw_print_render_frame_helper_delegate.cc",
"aw_print_render_frame_helper_delegate.h",
"aw_render_frame_ext.cc",
"aw_render_frame_ext.h",
"aw_render_thread_observer.cc",
"aw_render_thread_observer.h",
"aw_render_view_ext.cc",
"aw_render_view_ext.h",
"aw_safe_browsing_error_page_controller_delegate_impl.cc",
"aw_safe_browsing_error_page_controller_delegate_impl.h",
"aw_url_loader_throttle_provider.cc",
"aw_url_loader_throttle_provider.h",
"aw_websocket_handshake_throttle_provider.cc",
"aw_websocket_handshake_throttle_provider.h",
"browser_exposed_renderer_interfaces.cc",
"browser_exposed_renderer_interfaces.h",
"js_java_interaction/js_binding.cc",
"js_java_interaction/js_binding.h",
"js_java_interaction/js_java_configurator.cc",
"js_java_interaction/js_java_configurator.h",
]
deps = [
"//android_webview:generate_aw_resources",
"//android_webview:generate_aw_strings",
"//android_webview/common",
"//android_webview/common:common_mojom",
"//base",
"//components/android_system_error_page",
"//components/autofill/content/renderer",
"//components/cdm/renderer",
"//components/content_capture/common",
"//components/content_capture/renderer",
"//components/page_load_metrics/renderer",
"//components/printing/common",
"//components/printing/renderer",
"//components/resources",
"//components/safe_browsing/content/common:interfaces",
"//components/safe_browsing/content/renderer:throttles",
"//components/safe_browsing/core:features",
"//components/safe_browsing/core/common",
"//components/security_interstitials/content/renderer:security_interstitial_page_controller",
"//components/security_interstitials/core",
"//components/security_interstitials/core/common/mojom",
"//components/spellcheck:buildflags",
"//components/spellcheck/renderer",
"//components/strings",
"//components/visitedlink/renderer",
"//content/public/child",
"//content/public/common",
"//content/public/renderer",
"//gin",
"//third_party/blink/public:blink",
"//ui/base",
"//url",
"//v8",
]
}

View File

@ -0,0 +1,39 @@
# Copyright 2018 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.
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
android_library("support_lib_glue_java") {
sources = [
"java/src/org/chromium/support_lib_glue/IsomorphicAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibJsReplyProxyAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibProxyControllerAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibReflectionUtil.java",
"java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerClientAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerSettingsAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibTracingControllerAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebMessageAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebMessageCallbackAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebMessageListenerAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebMessagePortAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebResourceRequest.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewChromium.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewRendererAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewRendererClientAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java",
]
deps = [
"//android_webview:browser_java",
"//android_webview/glue:glue",
"//android_webview/support_library/boundary_interfaces:boundary_interface_java",
"//android_webview/support_library/callback:callback_java",
"//base:base_java",
"//content/public/android:content_java",
]
}

View File

@ -0,0 +1,51 @@
# Copyright 2017 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.
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
android_library("boundary_interface_java") {
sources = [
"src/org/chromium/support_lib_boundary/FeatureFlagHolderBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/IsomorphicObjectBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/JsReplyProxyBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/ProxyControllerBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/SafeBrowsingResponseBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/ServiceWorkerClientBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/ServiceWorkerControllerBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/ServiceWorkerWebSettingsBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/StaticsBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/TracingControllerBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/VisualStateCallbackBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessageBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessageCallbackBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessageListenerBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessagePortBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebResourceErrorBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebResourceRequestBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewClientBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewProviderBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewProviderFactoryBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewRendererBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewRendererClientBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java",
"src/org/chromium/support_lib_boundary/util/Features.java",
]
proguard_configs = [ "proguard.flags" ]
# Our choice of deps is limited, because boundary_interfaces/ must continue to
# build when we mirror this into AndroidX. We are only permitted to depend on
# core Android classes and other AndroidX classes (must be in the androidx.*
# package name).
deps = [ "//third_party/android_deps:androidx_annotation_annotation_java" ]
# This is to verify the boundary interfaces compile and lint correctly against
# the minSdkVersion of the webkit support library module. As the minSdkVersion
# of the support library increases, so should this value. See
# http://crbug.com/828184 for more details.
min_sdk_version = 14
}

View File

@ -0,0 +1,20 @@
# Copyright 2018 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.
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
android_library("callback_java") {
sources = [
"java/src/org/chromium/support_lib_callback_glue/SupportLibSafeBrowsingResponse.java",
"java/src/org/chromium/support_lib_callback_glue/SupportLibWebResourceError.java",
"java/src/org/chromium/support_lib_callback_glue/SupportLibWebViewContentsClientAdapter.java",
]
deps = [
"//android_webview:browser_java",
"//android_webview/support_library/boundary_interfaces:boundary_interface_java",
"//base:base_java",
]
}

View File

@ -0,0 +1,253 @@
# Copyright 2015 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.
import("//android_webview/variables.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//build/config/locales.gni")
import("//build/util/version.gni")
import("//chrome/android/trichrome.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//weblayer/variables.gni")
declare_args() {
# Android package name to use when compiling the system_webview_apk and
# trichrome_webview_apk targets. This should be used if the Android build
# on which you are going to install WebView is configured to load a
# different package name than the default used in AOSP.
system_webview_package_name = "com.android.webview"
# Whether to enable standalone and trichrome WebView bundle build targets.
enable_webview_bundles = false
}
template("system_webview_apk_or_module_tmpl") {
if (!defined(invoker.target_type)) {
_is_bundle_module = false
_target_type = "android_apk"
} else {
_is_bundle_module = invoker.target_type == "android_app_bundle_module"
_target_type = invoker.target_type
}
_exclude_weblayer_java =
defined(invoker.exclude_weblayer_java) && invoker.exclude_weblayer_java
target(_target_type, target_name) {
forward_variables_from(invoker,
"*",
[
"is_64_bit_browser",
"include_32_bit_webview",
"include_64_bit_webview",
])
deps += [
"//android_webview:locale_pak_assets",
"//android_webview:pak_file_assets",
]
# If the R SDK isn't public yet, include the downstream code to support R.
if (!public_android_sdk && android_sdk_release == "r") {
deps += [ "//clank/android_webview/next:r_sdk_java" ]
}
if (_exclude_weblayer_java) {
deps += [ "//android_webview:android_webview_no_weblayer_java" ]
} else {
deps += [ "//android_webview:android_webview_java" ]
}
target_sdk_version = android_sdk_version
product_config_java_packages = [ webview_product_config_java_package ]
if (webview_includes_weblayer) {
if (_is_bundle_module) {
deps += [ "//weblayer:bundle_locale_pak_assets" ]
} else {
deps += [ "//weblayer:locale_pak_assets" ]
}
product_config_java_packages += [ weblayer_product_config_java_package ]
}
if (!defined(alternative_android_sdk_dep)) {
alternative_android_sdk_dep = webview_framework_dep
}
if (webview_devui_show_icon) {
deps += [ "//android_webview/nonembedded:devui_launcher_icon_resources" ]
}
_use_trichrome_library =
defined(use_trichrome_library) && use_trichrome_library
assert(
_use_trichrome_library == defined(invoker.static_library_provider),
"If trichrome library is used, static_library_provider must be set " +
"so that a dep can be added on the library APK.")
# Pure 32-bit implies a 32-bit only Webview built on a 64-bit configuration.
_pure_32_bit =
android_64bit_target_cpu && defined(invoker.include_64_bit_webview) &&
!invoker.include_64_bit_webview
not_needed([ "_pure_32_bit" ])
# Flag whether additional deps and libs should be included for each ABI.
_include_primary_support = false
_include_secondary_support = false
if (!_use_trichrome_library) {
shared_resources = true
if (!android_64bit_target_cpu || !_pure_32_bit) {
shared_libraries = [ "//android_webview:libwebviewchromium" ]
_include_primary_support = true
}
if (android_64bit_target_cpu) {
secondary_abi_shared_libraries = [ "//android_webview:libwebviewchromium($android_secondary_abi_toolchain)" ]
_include_secondary_support = true
}
deps += [ "//third_party/icu:icu_assets" ]
} else {
uncompress_shared_libraries = true
app_as_shared_lib = true
# Include placeholder libraries to ensure we are treated as the desired
# architecture.
if (android_64bit_target_cpu) {
if (invoker.is_64_bit_browser) {
native_lib_placeholders = [ "libdummy.so" ]
if (invoker.include_32_bit_webview) {
secondary_abi_shared_libraries = [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ]
_include_secondary_support = true
}
} else {
if (invoker.include_64_bit_webview) {
shared_libraries = [ "//android_webview:monochrome" ]
_include_primary_support = true
}
secondary_native_lib_placeholders = [ "libdummy.so" ]
}
} else {
native_lib_placeholders = [ "libdummy.so" ]
}
}
if (_include_primary_support) {
deps += [
"//android_webview:webview_primary_abi_assets",
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules = [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
if (webview_includes_weblayer) {
deps += [ "//base/android/linker:chromium_android_linker" ]
loadable_modules +=
[ "$root_out_dir/libchromium_android_linker$shlib_extension" ]
}
}
if (_include_secondary_support) {
_trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
deps += [
"//android_webview:webview_secondary_abi_assets",
_trampoline,
]
_secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
secondary_abi_loadable_modules =
[ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
if (webview_includes_weblayer) {
deps += [ "//base/android/linker:chromium_android_linker($android_secondary_abi_toolchain)" ]
secondary_abi_loadable_modules +=
[ "$_secondary_out_dir/libchromium_android_linker$shlib_extension" ]
}
}
if (!_use_trichrome_library || android_64bit_target_cpu) {
# 32-bit TrichromeWebView doesn't have a native library, so only do this
# for other configs.
native_lib_version_rule = "//build/util:chrome_version_json"
_native_lib_file =
rebase_path("$root_gen_dir/CHROME_VERSION.json", root_out_dir)
native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
}
aapt_locale_allowlist = locales
# Match drawables, but not mipmaps.
resource_exclusion_regex = "drawable[^/]*-xxxhdpi"
# Exception rationale in https://crbug.com/691733.
resource_exclusion_exceptions = [
"*shadow*", # Combination of gradient & transparency cause pixelation.
"*.9.*", # Most nine-patches contain shadows.
]
if (!_is_bundle_module) {
# Used as an additional apk in test scripts.
never_incremental = true
command_line_flags_file = "webview-command-line"
}
if (!is_java_debug) {
proguard_enabled = true
if (!defined(proguard_configs)) {
proguard_configs = []
}
proguard_configs += [
"//android_webview/nonembedded/java/proguard.flags",
"//base/android/proguard/chromium_apk.flags",
"//base/android/proguard/chromium_code.flags",
]
if (enable_proguard_obfuscation) {
proguard_configs +=
[ "//base/android/proguard/enable_obfuscation.flags" ]
} else {
proguard_configs +=
[ "//base/android/proguard/disable_all_obfuscation.flags" ]
}
png_to_webp = true
}
if (!defined(version_code)) {
if (_use_trichrome_library) {
if (android_64bit_target_cpu) {
if (invoker.is_64_bit_browser) {
if (invoker.include_32_bit_webview) {
version_code = trichrome_64_32_version_code
} else {
version_code = trichrome_64_version_code
}
} else {
if (invoker.include_64_bit_webview) {
version_code = trichrome_32_64_version_code
} else {
version_code = trichrome_32_version_code
}
}
} else {
version_code = trichrome_version_code
}
} else {
if (android_channel == "dev") {
if (_pure_32_bit) {
version_code = webview_32_dev_version_code
} else {
version_code = webview_dev_version_code
}
} else if (android_channel == "beta") {
if (_pure_32_bit) {
version_code = webview_32_beta_version_code
} else {
version_code = webview_beta_version_code
}
} else {
if (_pure_32_bit) {
version_code = webview_32_stable_version_code
} else {
version_code = webview_stable_version_code
}
}
}
}
if (!defined(version_name)) {
version_name = chrome_version_name
}
}
}

View 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.
import("//build/config/android/rules.gni")
import("//build/config/locales.gni")
template("system_webview_bundle") {
android_app_bundle(target_name) {
command_line_flags_file = "webview-command-line"
proguard_enabled = !is_java_debug
enable_language_splits = true
system_image_locale_allowlist = locales
is_multi_abi =
android_64bit_target_cpu && (!defined(invoker.include_64_bit_webview) ||
invoker.include_64_bit_webview) &&
(!defined(invoker.include_32_bit_webview) ||
invoker.include_32_bit_webview)
if (!defined(proguard_android_sdk_dep)) {
proguard_android_sdk_dep = webview_framework_dep
}
# NOTE: Only sign bundle for official builds since this is very slow.
if (enable_chrome_android_internal && use_signing_keys &&
is_official_build) {
sign_bundle = true
keystore_path = webview_keystore_path
keystore_name = webview_keystore_name
keystore_password = webview_keystore_password
}
forward_variables_from(invoker, "*")
}
}

View File

@ -0,0 +1,466 @@
# Copyright 2015 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.
import("//android_webview/variables.gni")
import("//build/config/android/rules.gni")
import("//build/config/python.gni")
import("//device/vr/buildflags/buildflags.gni")
import("//testing/test.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
# Mark all targets as test only.
testonly = true
group("test") {
deps = [
":android_webview_junit_tests",
":android_webview_unittests",
":webview_instrumentation_test_apk",
]
}
if (define_upstream_webview_targets) {
python_library("webview_cts_tests") {
pydeps_file = "//android_webview/tools/run_cts.pydeps"
deps = [ "//android_webview:system_webview_apk" ]
data_deps = [
"//build/android:logdog_wrapper_py",
"//build/android:test_runner_py",
"//testing/buildbot/filters:webview_cts_tests_filters",
]
data = [ "//android_webview/tools/cts_config/" ]
}
python_library("system_webview_wpt") {
testonly = true
pydeps_file = "//testing/scripts/run_android_wpt.pydeps"
data_deps = [
"//android_webview:system_webview_apk",
"//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk",
"//chrome/test/chromedriver:chromedriver($host_toolchain)",
"//third_party/blink/tools:wpt_tests_android_isolate",
]
}
}
android_apk("webview_instrumentation_apk") {
deps = [
":webview_instrumentation_apk_assets",
":webview_instrumentation_apk_resources",
":webview_instrumentation_test_utils_java",
"//android_webview:android_webview_java",
"//android_webview:android_webview_product_config_java",
"//android_webview:common_java",
"//android_webview:locale_pak_assets",
"//android_webview:platform_service_bridge_upstream_implementation_java",
"//base:base_java",
"//base:base_java_test_support",
"//components/heap_profiling:heap_profiling_java_test_support",
"//components/policy/android:policy_java_test_support",
"//content/public/android:content_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/junit",
"//ui/android:ui_java",
"//url:gurl_java",
]
apk_name = "WebViewInstrumentation"
android_manifest = "shell/AndroidManifest.xml"
sources = [
"shell/src/org/chromium/android_webview/shell/AwShellActivity.java",
"shell/src/org/chromium/android_webview/shell/AwShellApplication.java",
"shell/src/org/chromium/android_webview/shell/AwShellResourceProvider.java",
"shell/src/org/chromium/android_webview/shell/AwShellSwitches.java",
"shell/src/org/chromium/android_webview/shell/DrawFn.java",
"shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java",
"shell/src/org/chromium/android_webview/test/AwTestContainerView.java",
"shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java",
"shell/src/org/chromium/android_webview/test/NullContentsClient.java",
"shell/src/org/chromium/android_webview/test/OnlyRunIn.java",
"shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java",
"shell/src/org/chromium/android_webview/test/TestContentProvider.java",
]
product_config_java_packages = [ webview_product_config_java_package ]
shared_libraries = [ ":libstandalonelibwebviewchromium" ]
native_lib_version_rule = "//build/util:chrome_version_json"
_native_lib_file =
rebase_path("$root_gen_dir/CHROME_VERSION.json", root_build_dir)
native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
command_line_flags_file = "android-webview-command-line"
}
android_resources("webview_instrumentation_apk_resources") {
sources = [
"shell/res/layout/testshell_activity.xml",
"shell/res/raw/resource_file.html",
"shell/res/raw/resource_icon.png",
"shell/res/values/config.xml",
]
custom_package = "org.chromium.android_webview.shell"
}
android_assets("webview_instrumentation_apk_assets") {
deps = [
"//android_webview:pak_file_assets",
"//third_party/icu:icu_assets",
]
sources = [
"shell/assets/asset_file.html",
"shell/assets/asset_icon.png",
"shell/assets/autofill.html",
"shell/assets/cookie_test.html",
"shell/assets/full_screen_video.js",
"shell/assets/full_screen_video_inside_div_test.html",
"shell/assets/full_screen_video_test.html",
"shell/assets/full_screen_video_test_not_preloaded.html",
"shell/assets/key-system-test.html",
"shell/assets/platform-media-codec-test.html",
"shell/assets/star.svg",
"shell/assets/star.svgz",
"shell/assets/video.3gp",
"shell/assets/video.webm",
"shell/assets/visual_state_during_fullscreen_test.html",
"shell/assets/visual_state_on_page_commit_visible_test.html",
"shell/assets/visual_state_waits_for_js_detached_test.html",
"shell/assets/visual_state_waits_for_js_test.html",
]
if (use_v8_context_snapshot) {
deps += [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ]
} else {
deps += [ "//v8:v8_external_startup_data_assets" ]
}
}
shared_library("libstandalonelibwebviewchromium") {
testonly = true
sources = [ "shell/src/draw_gl/draw_fn.cc" ]
ldflags = [ "-Wl,-shared,-Bsymbolic" ]
deps = [
":webview_instrumentation_test_native_jni_impl",
"//android_webview/lib",
"//android_webview/lib:webview_entry_point",
"//android_webview/nonembedded",
"//android_webview/public",
"//base",
"//components/heap_profiling:test_support",
"//content/public/test/android:content_native_test_support",
]
configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
configs += [ "//build/config/android:hide_all_but_jni" ]
}
instrumentation_test_apk("webview_instrumentation_test_apk") {
apk_name = "WebViewInstrumentationTest"
apk_under_test = ":webview_instrumentation_apk"
android_manifest = "../javatests/AndroidManifest.xml"
min_sdk_version = 21
deps = [
":webview_instrumentation_test_utils_java",
"//android_webview:android_webview_java",
"//android_webview/test/embedded_test_server:aw_net_java_test_support",
"//base:base_java",
"//base:base_java_test_support",
"//components/autofill/android:provider_java",
"//components/embedder_support/android:web_contents_delegate_java",
"//components/metrics:metrics_java",
"//components/minidump_uploader:minidump_uploader_java",
"//components/minidump_uploader:minidump_uploader_javatests",
"//components/policy/android:policy_java",
"//components/policy/android:policy_java_test_support",
"//components/safe_browsing/android:safe_browsing_java",
"//content/public/android:content_java",
"//content/public/test/android:content_java_test_support",
"//mojo/public/java:bindings_java",
"//net/android:net_java",
"//net/android:net_java_test_support",
"//net/android:net_javatests",
"//services/device/public/java:geolocation_java",
"//services/device/public/java:geolocation_java_test_support",
"//third_party/android_support_test_runner:rules_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/junit",
"//third_party/metrics_proto:metrics_proto_java",
"//ui/android:ui_java",
"//url:gurl_java",
]
sources = [
"../javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java",
"../javatests/src/org/chromium/android_webview/test/AndroidProtocolHandlerTest.java",
"../javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java",
"../javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java",
"../javatests/src/org/chromium/android_webview/test/ArchiveTest.java",
"../javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java",
"../javatests/src/org/chromium/android_webview/test/AwAutocompleteTest.java",
"../javatests/src/org/chromium/android_webview/test/AwAutofillTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientAutoLoginTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientCallbackHelperTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientFaviconTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientGetDefaultVideoPosterTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientOnFormResubmissionTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientOnRenderProcessGoneTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientOnRendererUnresponsiveTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientOnScaleChangedTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientOnUnhandledKeyEventTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsClientVisitedHistoryTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsContainerViewTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsLifecycleNotifierTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsRenderTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsStaticsTest.java",
"../javatests/src/org/chromium/android_webview/test/AwContentsTest.java",
"../javatests/src/org/chromium/android_webview/test/AwDebugTest.java",
"../javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java",
"../javatests/src/org/chromium/android_webview/test/AwImeTest.java",
"../javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java",
"../javatests/src/org/chromium/android_webview/test/AwLegacyQuirksTest.java",
"../javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java",
"../javatests/src/org/chromium/android_webview/test/AwNetworkConfigurationTest.java",
"../javatests/src/org/chromium/android_webview/test/AwPageLoadMetricsTest.java",
"../javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java",
"../javatests/src/org/chromium/android_webview/test/AwProxyControllerTest.java",
"../javatests/src/org/chromium/android_webview/test/AwQuotaManagerBridgeTest.java",
"../javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java",
"../javatests/src/org/chromium/android_webview/test/AwServiceWorkerClientTest.java",
"../javatests/src/org/chromium/android_webview/test/AwSettingsTest.java",
"../javatests/src/org/chromium/android_webview/test/AwUncaughtExceptionTest.java",
"../javatests/src/org/chromium/android_webview/test/AwVariationsSeedFetcherTest.java",
"../javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java",
"../javatests/src/org/chromium/android_webview/test/AwZoomTest.java",
"../javatests/src/org/chromium/android_webview/test/CleanupReferenceTest.java",
"../javatests/src/org/chromium/android_webview/test/ClearHistoryTest.java",
"../javatests/src/org/chromium/android_webview/test/ClientAddMessageToConsoleTest.java",
"../javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java",
"../javatests/src/org/chromium/android_webview/test/ClientOnPageStartedTest.java",
"../javatests/src/org/chromium/android_webview/test/ClientOnReceivedError2Test.java",
"../javatests/src/org/chromium/android_webview/test/ClientOnReceivedErrorTest.java",
"../javatests/src/org/chromium/android_webview/test/ClientOnReceivedHttpErrorTest.java",
"../javatests/src/org/chromium/android_webview/test/ConsoleMessagesForBlockedLoadsTest.java",
"../javatests/src/org/chromium/android_webview/test/ContentViewMiscTest.java",
"../javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java",
"../javatests/src/org/chromium/android_webview/test/CookieManagerTest.java",
"../javatests/src/org/chromium/android_webview/test/DarkModeTest.java",
"../javatests/src/org/chromium/android_webview/test/DisableHardwareAccelerationForTest.java",
"../javatests/src/org/chromium/android_webview/test/FullScreenVideoTestAwContentsClient.java",
"../javatests/src/org/chromium/android_webview/test/GeolocationTest.java",
"../javatests/src/org/chromium/android_webview/test/GetTitleTest.java",
"../javatests/src/org/chromium/android_webview/test/HeapProfilingTest.java",
"../javatests/src/org/chromium/android_webview/test/HttpAuthDatabaseTest.java",
"../javatests/src/org/chromium/android_webview/test/JsJavaInteractionTest.java",
"../javatests/src/org/chromium/android_webview/test/KeySystemTest.java",
"../javatests/src/org/chromium/android_webview/test/LoadDataWithBaseUrlTest.java",
"../javatests/src/org/chromium/android_webview/test/LoadUrlTest.java",
"../javatests/src/org/chromium/android_webview/test/MediaAccessPermissionRequestTest.java",
"../javatests/src/org/chromium/android_webview/test/MemoryMetricsLoggerTest.java",
"../javatests/src/org/chromium/android_webview/test/NavigationHistoryTest.java",
"../javatests/src/org/chromium/android_webview/test/OnDiskFileTest.java",
"../javatests/src/org/chromium/android_webview/test/PlatformMediaCodecTest.java",
"../javatests/src/org/chromium/android_webview/test/PolicyUrlFilteringTest.java",
"../javatests/src/org/chromium/android_webview/test/PopupWindowTest.java",
"../javatests/src/org/chromium/android_webview/test/PostMessageTest.java",
"../javatests/src/org/chromium/android_webview/test/RenderProcessGoneHelper.java",
"../javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java",
"../javatests/src/org/chromium/android_webview/test/SaveRestoreStateTest.java",
"../javatests/src/org/chromium/android_webview/test/SslPreferencesTest.java",
"../javatests/src/org/chromium/android_webview/test/StandaloneAwQuotaManagerBridgeTest.java",
"../javatests/src/org/chromium/android_webview/test/TestAwContents.java",
"../javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java",
"../javatests/src/org/chromium/android_webview/test/TestAwServiceWorkerClient.java",
"../javatests/src/org/chromium/android_webview/test/UserAgentTest.java",
"../javatests/src/org/chromium/android_webview/test/VariationsSeedHolderTest.java",
"../javatests/src/org/chromium/android_webview/test/VariationsSeedLoaderTest.java",
"../javatests/src/org/chromium/android_webview/test/VisualStateTest.java",
"../javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java",
"../javatests/src/org/chromium/android_webview/test/WebViewAsynchronousFindApisTest.java",
"../javatests/src/org/chromium/android_webview/test/WebViewFindApisTestRule.java",
"../javatests/src/org/chromium/android_webview/test/WebViewModalDialogOverrideTest.java",
"../javatests/src/org/chromium/android_webview/test/common/variations/VariationsUtilsTest.java",
"../javatests/src/org/chromium/android_webview/test/devui/util/UnuploadedFilesStateLoaderTest.java",
"../javatests/src/org/chromium/android_webview/test/devui/util/UploadedCrashesInfoLoaderTest.java",
"../javatests/src/org/chromium/android_webview/test/devui/util/WebViewCrashInfoCollectorTest.java",
"../javatests/src/org/chromium/android_webview/test/devui/util/WebViewCrashLogParserTest.java",
"../javatests/src/org/chromium/android_webview/test/services/CrashReceiverServiceTest.java",
"../javatests/src/org/chromium/android_webview/test/services/MinidumpUploadJobTest.java",
"../javatests/src/org/chromium/android_webview/test/services/MockVariationsSeedServer.java",
"../javatests/src/org/chromium/android_webview/test/services/VariationsSeedServerTest.java",
"../javatests/src/org/chromium/android_webview/test/services/VisualStateCallbackTest.java",
"../javatests/src/org/chromium/android_webview/test/util/AwQuotaManagerBridgeTestUtil.java",
"../javatests/src/org/chromium/android_webview/test/util/AwTestTouchUtils.java",
"../javatests/src/org/chromium/android_webview/test/util/CommonResources.java",
"../javatests/src/org/chromium/android_webview/test/util/CookieUtils.java",
"../javatests/src/org/chromium/android_webview/test/util/GraphicsTestUtils.java",
"../javatests/src/org/chromium/android_webview/test/util/ImagePageGenerator.java",
"../javatests/src/org/chromium/android_webview/test/util/JSUtils.java",
"../javatests/src/org/chromium/android_webview/test/util/JavascriptEventObserver.java",
"../javatests/src/org/chromium/android_webview/test/util/VariationsTestUtils.java",
"../javatests/src/org/chromium/android_webview/test/util/VideoSurfaceViewUtils.java",
"../javatests/src/org/chromium/android_webview/test/util/VideoTestUtil.java",
"../javatests/src/org/chromium/android_webview/test/util/VideoTestWebServer.java",
]
if (!use_jacoco_coverage) {
# Jacoco requires strict mode to be turned off since it writes coverage data to files.
sources += [ "../javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java" ]
}
data = [ "data/" ]
data_deps =
[ "//testing/buildbot/filters:webview_instrumentation_test_apk_filters" ]
if (enable_chrome_android_internal) {
data_deps +=
[ "//clank/build/bot/filters:webview_instrumentation_test_apk_filters" ]
}
# We only want to bother including these on bots set up for VR testing
if (include_vr_data) {
data += [
"//chrome/android/shared_preference_files/test/",
"//third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk",
]
}
additional_apks = [
"//android_webview/test/embedded_test_server:aw_net_test_support_apk",
"//net/android:net_test_support_apk",
]
}
android_library("webview_instrumentation_test_utils_java") {
testonly = true
sources = [ "shell/src/org/chromium/android_webview/test/util/MemoryMetricsLoggerUtils.java" ]
deps = [
"//base:base_java",
"//base:jni_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
generate_jni("webview_instrumentation_test_native_jni") {
testonly = true
sources = [ "shell/src/org/chromium/android_webview/test/util/MemoryMetricsLoggerUtils.java" ]
}
source_set("webview_instrumentation_test_native_jni_impl") {
sources = [ "shell/memory_metrics_logger_utils.cc" ]
deps = [
":webview_instrumentation_test_native_jni",
"//base",
"//base/test:test_support",
"//components/embedder_support/android/metrics",
]
}
test("android_webview_unittests") {
deps = [
":android_webview_unittests_assets",
":android_webview_unittests_java",
":android_webview_unittests_jni",
"//android_webview/browser",
"//android_webview/browser/gfx",
"//android_webview/browser/lifecycle",
"//android_webview/browser/metrics",
"//android_webview/common",
"//base/test:test_support",
"//components/autofill/core/browser",
"//components/metrics",
"//components/prefs:prefs",
"//components/prefs:test_support",
"//content:content",
"//content/test:test_support",
"//mojo/core/embedder",
"//net:net",
"//net:test_support",
"//services/network:test_support",
"//ui/base:ui_base_jni_headers",
"//ui/gl",
"//ui/gl:test_support",
]
sources = [
"../browser/aw_browser_context_unittest.cc",
"../browser/aw_content_browser_client_unittest.cc",
"../browser/aw_contents_client_bridge_unittest.cc",
"../browser/aw_form_database_service_unittest.cc",
"../browser/aw_media_url_interceptor_unittest.cc",
"../browser/aw_pac_processor_unittest.cc",
"../browser/aw_permission_manager_unittest.cc",
"../browser/gfx/aw_attaching_to_window_recorder_unittest.cc",
"../browser/gfx/begin_frame_source_webview_unittest.cc",
"../browser/gfx/browser_view_renderer_unittest.cc",
"../browser/gfx/test/fake_window.cc",
"../browser/gfx/test/fake_window.h",
"../browser/gfx/test/rendering_test.cc",
"../browser/gfx/test/rendering_test.h",
"../browser/input_stream_unittest.cc",
"../browser/lifecycle/aw_contents_lifecycle_notifier_unittest.cc",
"../browser/metrics/aw_metrics_service_client_unittest.cc",
"../browser/metrics/aw_stability_metrics_provider_unittest.cc",
"../browser/network_service/android_stream_reader_url_loader_unittest.cc",
"../browser/network_service/input_stream_reader_unittest.cc",
"../browser/permission/media_access_permission_request_unittest.cc",
"../browser/permission/permission_request_handler_unittest.cc",
"../browser/renderer_host/auto_login_parser_unittest.cc",
"../browser/safe_browsing/aw_safe_browsing_whitelist_manager_unittest.cc",
"../browser/scoped_add_feature_flags_unittests.cc",
"../browser/state_serializer_unittest.cc",
"../common/aw_origin_matcher_unittest.cc",
"../lib/webview_tests.cc",
]
deps += [ "//v8:v8_external_startup_data_assets" ]
}
android_assets("android_webview_unittests_assets") {
sources = [ "unittest/assets/asset_file.ogg" ]
}
android_library("android_webview_unittests_java") {
testonly = true
deps = [
"//android_webview:android_webview_java",
"//base:base_java",
"//content/public/test/android:content_java_test_support",
]
sources = [
"../unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java",
"../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java",
]
}
generate_jni("android_webview_unittests_jni") {
testonly = true
sources = [
"../unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java",
"../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java",
]
}
# robolectric tests
junit_binary("android_webview_junit_tests") {
sources = [
"../junit/src/org/chromium/android_webview/robolectric/AwLayoutSizerTest.java",
"../junit/src/org/chromium/android_webview/robolectric/AwScrollOffsetManagerTest.java",
"../junit/src/org/chromium/android_webview/robolectric/FindAddressTest.java",
"../junit/src/org/chromium/android_webview/robolectric/common/FlagOverrideHelperTest.java",
"../junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java",
]
deps = [
"//android_webview:android_webview_java",
"//base:base_java_test_support",
"//content/public/test/android:content_java_test_support",
"//third_party/android_support_test_runner:runner_java",
]
package_name = "org.chromium.android_webview.robolectric"
}

View File

@ -0,0 +1,74 @@
# Copyright 2017 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.
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
android_library("aw_net_java_test_support") {
testonly = true
sources = [
"java/src/org/chromium/android_webview/test/AwEmbeddedTestServer.java",
"java/src/org/chromium/android_webview/test/AwEmbeddedTestServerImpl.java",
"java/src/org/chromium/android_webview/test/AwEmbeddedTestServerService.java",
]
deps = [
"//base:base_java",
"//base:base_java_test_support",
"//net/android:embedded_test_server_aidl_java",
"//net/android:net_java",
"//net/android:net_java_test_support",
"//net/android:net_java_test_support_provider",
]
}
generate_jni("aw_net_jni_headers") {
testonly = true
sources = [
"java/src/org/chromium/android_webview/test/AwEmbeddedTestServerImpl.java",
]
}
source_set("aw_java_test_native_support") {
testonly = true
sources = [
"../../../net/test/embedded_test_server/android/embedded_test_server_android.cc",
"../../../net/test/embedded_test_server/android/embedded_test_server_android.h",
"aw_embedded_test_server.cc",
"aw_test_entry_point.cc",
]
deps = [ "//net:test_support" ]
public_deps = [
":aw_net_jni_headers",
"//net:net_test_jni_headers",
]
}
shared_library("aw_net_java_test_native_support") {
testonly = true
deps = [
":aw_java_test_native_support",
"//net:test_support",
]
configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
configs += [ "//build/config/android:hide_all_but_jni" ]
}
android_apk("aw_net_test_support_apk") {
testonly = true
# Used as an additional_apk in test scripts.
never_incremental = true
# Multidex requires a custom Application class to initialize it. Simpler to
# just disable it.
enable_multidex = false
deps = [
":aw_net_java_test_support",
"//base:base_java",
]
android_manifest = "java/AndroidManifest.xml"
apk_name = "ChromiumNetTestAwSupport"
shared_libraries = [ ":aw_net_java_test_native_support" ]
}

View File

@ -0,0 +1,75 @@
# Copyright 2016 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.
import("//build/config/android/rules.gni")
import("//testing/test.gni")
group("webview_ui_test_app") {
testonly = true
deps = [
":webview_ui_test_app_apk",
":webview_ui_test_app_test_apk",
]
}
android_apk("webview_ui_test_app_apk") {
apk_name = "WebViewUiTestApp"
android_manifest = "java/AndroidManifest.xml"
deps = [
":webview_ui_test_app_apk_resources",
":webview_ui_test_app_java",
]
}
android_library("webview_ui_test_app_java") {
sources =
[ "java/src/org/chromium/webview_ui_test/WebViewUiTestActivity.java" ]
deps = [
":webview_ui_test_app_apk_resources",
"//base:base_java",
]
android_manifest_for_lint = "java/AndroidManifest.xml"
}
android_resources("webview_ui_test_app_apk_resources") {
sources = [
"java/res/layout/edittext_webview.xml",
"java/res/layout/fullscreen_webview.xml",
"java/res/values/strings.xml",
]
custom_package = "org.chromium.webview_ui_test"
}
instrumentation_test_apk("webview_ui_test_app_test_apk") {
apk_name = "WebViewUiTestAppTest"
apk_under_test = ":webview_ui_test_app_apk"
android_manifest = "javatests/AndroidManifest.xml"
sources = [
"javatests/src/org/chromium/webview_ui_test/test/ActionModeTest.java",
"javatests/src/org/chromium/webview_ui_test/test/DropDownListTest.java",
"javatests/src/org/chromium/webview_ui_test/test/WebViewJSTest.java",
"javatests/src/org/chromium/webview_ui_test/test/util/Actions.java",
"javatests/src/org/chromium/webview_ui_test/test/util/Atoms.java",
"javatests/src/org/chromium/webview_ui_test/test/util/UseLayout.java",
"javatests/src/org/chromium/webview_ui_test/test/util/WebViewSyncWrapper.java",
"javatests/src/org/chromium/webview_ui_test/test/util/WebViewUiTestRule.java",
]
deps = [
":webview_ui_test_app_apk_resources",
":webview_ui_test_app_java",
"//base:base_java",
"//base:base_java_test_support",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_sdk:android_test_base_java",
"//third_party/android_support_test_runner:rules_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/espresso:espresso_all_java",
"//third_party/hamcrest:hamcrest_java",
"//third_party/junit",
"//third_party/ub-uiautomator:ub_uiautomator_java",
]
data = [ "test/data/" ]
use_webview_provider = system_webview_apk_target
}

View File

@ -0,0 +1,77 @@
# Generated by running:
# build/print_python_deps.py --output android_webview/tools/run_cts.pydeps --gn-paths android_webview/tools/run_cts.py
//android_webview/tools/run_cts.py
//build/android/devil_chromium.py
//build/android/pylib/__init__.py
//build/android/pylib/constants/__init__.py
//build/android/pylib/constants/host_paths.py
//build/android/pylib/local/__init__.py
//build/android/pylib/local/emulator/__init__.py
//build/android/pylib/local/emulator/avd.py
//build/android/pylib/local/emulator/ini.py
//build/android/pylib/local/emulator/proto/__init__.py
//build/android/pylib/local/emulator/proto/avd_pb2.py
//build/android/pylib/utils/__init__.py
//build/android/pylib/utils/test_filter.py
//third_party/catapult/common/py_utils/py_utils/__init__.py
//third_party/catapult/common/py_utils/py_utils/cloud_storage.py
//third_party/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
//third_party/catapult/common/py_utils/py_utils/lock.py
//third_party/catapult/common/py_utils/py_utils/tempfile_ext.py
//third_party/catapult/dependency_manager/dependency_manager/__init__.py
//third_party/catapult/dependency_manager/dependency_manager/archive_info.py
//third_party/catapult/dependency_manager/dependency_manager/base_config.py
//third_party/catapult/dependency_manager/dependency_manager/cloud_storage_info.py
//third_party/catapult/dependency_manager/dependency_manager/dependency_info.py
//third_party/catapult/dependency_manager/dependency_manager/dependency_manager_util.py
//third_party/catapult/dependency_manager/dependency_manager/exceptions.py
//third_party/catapult/dependency_manager/dependency_manager/local_path_info.py
//third_party/catapult/dependency_manager/dependency_manager/manager.py
//third_party/catapult/dependency_manager/dependency_manager/uploader.py
//third_party/catapult/devil/devil/__init__.py
//third_party/catapult/devil/devil/android/__init__.py
//third_party/catapult/devil/devil/android/apk_helper.py
//third_party/catapult/devil/devil/android/constants/__init__.py
//third_party/catapult/devil/devil/android/constants/chrome.py
//third_party/catapult/devil/devil/android/constants/file_system.py
//third_party/catapult/devil/devil/android/decorators.py
//third_party/catapult/devil/devil/android/device_blacklist.py
//third_party/catapult/devil/devil/android/device_errors.py
//third_party/catapult/devil/devil/android/device_signal.py
//third_party/catapult/devil/devil/android/device_temp_file.py
//third_party/catapult/devil/devil/android/device_utils.py
//third_party/catapult/devil/devil/android/install_commands.py
//third_party/catapult/devil/devil/android/logcat_monitor.py
//third_party/catapult/devil/devil/android/md5sum.py
//third_party/catapult/devil/devil/android/ndk/__init__.py
//third_party/catapult/devil/devil/android/ndk/abis.py
//third_party/catapult/devil/devil/android/sdk/__init__.py
//third_party/catapult/devil/devil/android/sdk/aapt.py
//third_party/catapult/devil/devil/android/sdk/adb_wrapper.py
//third_party/catapult/devil/devil/android/sdk/build_tools.py
//third_party/catapult/devil/devil/android/sdk/bundletool.py
//third_party/catapult/devil/devil/android/sdk/intent.py
//third_party/catapult/devil/devil/android/sdk/keyevent.py
//third_party/catapult/devil/devil/android/sdk/split_select.py
//third_party/catapult/devil/devil/android/sdk/version_codes.py
//third_party/catapult/devil/devil/android/tools/__init__.py
//third_party/catapult/devil/devil/android/tools/script_common.py
//third_party/catapult/devil/devil/base_error.py
//third_party/catapult/devil/devil/constants/__init__.py
//third_party/catapult/devil/devil/constants/exit_codes.py
//third_party/catapult/devil/devil/devil_env.py
//third_party/catapult/devil/devil/utils/__init__.py
//third_party/catapult/devil/devil/utils/cmd_helper.py
//third_party/catapult/devil/devil/utils/host_utils.py
//third_party/catapult/devil/devil/utils/lazy/__init__.py
//third_party/catapult/devil/devil/utils/lazy/weak_constant.py
//third_party/catapult/devil/devil/utils/logging_common.py
//third_party/catapult/devil/devil/utils/lsusb.py
//third_party/catapult/devil/devil/utils/parallelizer.py
//third_party/catapult/devil/devil/utils/reraiser_thread.py
//third_party/catapult/devil/devil/utils/reset_usb.py
//third_party/catapult/devil/devil/utils/run_tests_helper.py
//third_party/catapult/devil/devil/utils/timeout_retry.py
//third_party/catapult/devil/devil/utils/watchdog_timer.py
//third_party/catapult/devil/devil/utils/zip_utils.py
//third_party/catapult/third_party/zipfile/zipfile_2_7_13.py

View File

@ -0,0 +1,134 @@
# Copyright 2015 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.
import("//build/config/android/rules.gni")
import("//testing/test.gni")
# Mark all targets as test only.
testonly = true
group("system_webview_shell") {
deps = [
":system_webview_shell_apk",
":system_webview_shell_layout_test_apk",
":system_webview_shell_page_cycler_apk",
]
}
declare_args() {
# Android package name to use for system_webview_shell_apk (the WebView shell
# browser). You can change this package name to work around signing key
# conflicts (INSTALL_FAILED_UPDATE_INCOMPATIBLE) on devices/emulators which
# have the shell browser preinstalled under the default package name.
system_webview_shell_package_name = "org.chromium.webview_shell"
}
system_webview_shell_android_manifest =
"$root_gen_dir/android_webview/system_webview_shell_apk/AndroidManifest.xml"
android_apk("system_webview_shell_apk") {
apk_name = "SystemWebViewShell"
sources = [
"apk/src/org/chromium/webview_shell/JankActivity.java",
"apk/src/org/chromium/webview_shell/PageCyclerTestActivity.java",
"apk/src/org/chromium/webview_shell/StartupTimeActivity.java",
"apk/src/org/chromium/webview_shell/TelemetryActivity.java",
"apk/src/org/chromium/webview_shell/TelemetryMemoryPressureActivity.java",
"apk/src/org/chromium/webview_shell/WebPlatformTestsActivity.java",
"apk/src/org/chromium/webview_shell/WebViewAnimationTestActivity.java",
"apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java",
"apk/src/org/chromium/webview_shell/WebViewBrowserSecondProcessActivity.java",
"apk/src/org/chromium/webview_shell/WebViewCreateDestroyActivity.java",
"apk/src/org/chromium/webview_shell/WebViewLayoutTestActivity.java",
"apk/src/org/chromium/webview_shell/WebViewPackageHelper.java",
"apk/src/org/chromium/webview_shell/WebViewThreadTestActivity.java",
"apk/src/org/chromium/webview_shell/WebViewTracingActivity.java",
"apk/src/org/chromium/webview_shell/WebViewWithClipPath.java",
]
android_manifest = system_webview_shell_android_manifest
android_manifest_dep = ":system_webview_shell_manifest"
target_sdk_version = 29
deps = [
":system_webview_shell_apk_resources",
"//base:base_java",
"//third_party/android_deps:android_support_v7_appcompat_java",
"//third_party/guava:guava_android_java",
]
}
jinja_template("system_webview_shell_manifest") {
input = "apk/AndroidManifest.xml"
output = system_webview_shell_android_manifest
variables = [ "manifest_package=$system_webview_shell_package_name" ]
}
android_resources("system_webview_shell_apk_resources") {
sources = [
"apk/res/drawable-mdpi/breadcrumb_arrow_black.png",
"apk/res/drawable-mdpi/ic_launcher.png",
"apk/res/layout/activity_empty.xml",
"apk/res/layout/activity_web_platform_tests.xml",
"apk/res/layout/activity_web_platform_tests_child.xml",
"apk/res/layout/activity_webview.xml",
"apk/res/layout/activity_webview_animation_test.xml",
"apk/res/layout/activity_webview_browser.xml",
"apk/res/menu/main_menu.xml",
"apk/res/values-night/colors.xml",
"apk/res/values-v17/styles.xml",
"apk/res/values-v29/styles.xml",
"apk/res/values/colors.xml",
"apk/res/values/strings.xml",
"apk/res/values/styles.xml",
"apk/res/xml/network_security_config.xml",
]
custom_package = "org.chromium.webview_shell"
deps = [ "//third_party/android_deps:android_support_v7_appcompat_java" ]
}
instrumentation_test_apk("system_webview_shell_page_cycler_apk") {
apk_name = "SystemWebViewShellPageCycler"
apk_under_test = ":system_webview_shell_apk"
android_manifest = "page_cycler/AndroidManifest.xml"
sources = [ "page_cycler/src/org/chromium/webview_shell/page_cycler/PageCyclerTest.java" ]
deps = [
"//base:base_java",
"//base:base_java_test_support",
"//content/public/android:content_java",
"//content/public/test/android:content_java_test_support",
"//testing/android/reporter:reporter_java",
"//third_party/android_support_test_runner:rules_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/junit",
]
}
instrumentation_test_apk("system_webview_shell_layout_test_apk") {
apk_name = "SystemWebViewShellLayoutTest"
apk_under_test = ":system_webview_shell_apk"
android_manifest = "layout_tests/AndroidManifest.xml"
sources = [
"layout_tests/src/org/chromium/webview_shell/test/WebPlatformTestsActivityTest.java",
"layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java",
"layout_tests/src/org/chromium/webview_shell/test/WebViewThreadTest.java",
]
deps = [
"//base:base_java",
"//base:base_java_test_support",
"//testing/android/reporter:reporter_java",
"//third_party/android_support_test_runner:rules_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/junit",
]
data = [
"test/data/",
"//third_party/blink/web_tests/platform/linux/virtual/stable/webexposed/",
"//third_party/blink/web_tests/platform/mac/virtual/stable/webexposed/",
"//third_party/blink/web_tests/platform/win/virtual/stable/webexposed/",
"//third_party/blink/web_tests/resources/global-interface-listing.js",
"//third_party/blink/web_tests/virtual/stable/webexposed/",
"//third_party/blink/web_tests/webexposed/global-interface-listing.html",
"//third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt",
]
use_webview_provider = system_webview_apk_target
}

View File

@ -0,0 +1,34 @@
# Copyright 2018 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.
import("//build/config/android/rules.gni")
android_apk("webview_log_verbosifier_apk") {
apk_name = "WebViewLogVerbosifier"
android_manifest = "AndroidManifest.xml"
deps = [ ":webview_log_verbosifier_resources" ]
min_sdk_version = 21
target_sdk_version = 28
}
android_resources("webview_log_verbosifier_resources") {
sources = [
"res/drawable-v24/ic_launcher_foreground.xml",
"res/drawable/ic_launcher_background.xml",
"res/mipmap-anydpi-v26/ic_launcher.xml",
"res/mipmap-anydpi-v26/ic_launcher_round.xml",
"res/mipmap-hdpi/ic_launcher.png",
"res/mipmap-hdpi/ic_launcher_round.png",
"res/mipmap-mdpi/ic_launcher.png",
"res/mipmap-mdpi/ic_launcher_round.png",
"res/mipmap-xhdpi/ic_launcher.png",
"res/mipmap-xhdpi/ic_launcher_round.png",
"res/mipmap-xxhdpi/ic_launcher.png",
"res/mipmap-xxhdpi/ic_launcher_round.png",
"res/mipmap-xxxhdpi/ic_launcher.png",
"res/mipmap-xxxhdpi/ic_launcher_round.png",
"res/values/ic_launcher_background.xml",
]
custom_package = "org.chromium.webview_log_verbosifier"
}

View File

@ -0,0 +1,41 @@
# Copyright 2018 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.
import("//build/config/android/channel.gni")
import("//build/config/android/config.gni")
import("//weblayer/variables.gni")
declare_args() {
# Show a launcher icon to open WebView developer UI. This is enabled by
# default for all prestable builds. The icon for Monochrome is shown
# dynamically at runtime if Monochrome is the current selected system WebView
# implementation or hidden otherwise.
webview_devui_show_icon = android_channel != "stable"
}
system_webview_android_manifest =
"$root_gen_dir/android_webview/system_webview_apk/AndroidManifest.xml"
trichrome_webview_android_manifest =
"$root_gen_dir/android_webview/trichrome_webview_apk/AndroidManifest.xml"
trichrome_webview_64_32_android_manifest = "$root_gen_dir/android_webview/trichrome_webview_64_32_apk/AndroidManifest.xml"
trichrome_webview_32_android_manifest =
"$root_gen_dir/android_webview/trichrome_webview_32_apk/AndroidManifest.xml"
# TODO(crbug/760187): We're in the process of migrating to always defining the
# WebView targets upstream. Remove this once it's always true.
if (!defined(define_upstream_webview_targets)) {
define_upstream_webview_targets = public_android_sdk
}
upstream_only_webview_deps = [
"//android_webview:platform_service_bridge_upstream_implementation_java",
"//android_webview/nonembedded:icon_resources",
]
if (webview_includes_weblayer) {
upstream_only_webview_deps +=
[ "//weblayer/browser/java:gms_bridge_upstream_impl_java" ]
}
webview_product_config_java_package = "org.chromium.android_webview"

View File

@ -0,0 +1,35 @@
# Copyright 2015 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.
import("//tools/grit/repack.gni")
import("webview_repack_locales_list.gni")
# Wraps repack_locales(), setting the source_patterns and deps required for
# Chrome.
template("webview_repack_locales") {
repack_locales(target_name) {
forward_variables_from(invoker, "*")
if (!defined(deps)) {
deps = []
}
# Adding webview specific pak file? You should add it to
# webview_repack_locales_source_patterns, so it is also included in
# Monochrome.
source_patterns = [
"${root_gen_dir}/android_webview/components_strings_",
"${root_gen_dir}/third_party/blink/public/strings/blink_strings_",
"${root_gen_dir}/ui/strings/app_locale_settings_",
]
deps += [
"//android_webview:generate_components_strings",
"//third_party/blink/public/strings",
"//ui/strings:app_locale_settings",
]
source_patterns += webview_repack_locales_source_patterns
deps += webview_repack_locales_deps
output_dir = "$root_out_dir/android_webview/locales"
}
}

View File

@ -0,0 +1,10 @@
# Copyright 2016 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.
# For how to add pattern, see additional_source_patterns argument of
# _repack_one_locale in chrome/chrome_repack_locales.gni.
webview_repack_locales_source_patterns =
[ "${root_gen_dir}/android_webview/aw_strings_" ]
webview_repack_locales_deps = [ "//android_webview:generate_aw_strings" ]

64
src/apps/BUILD.gn Normal file
View File

@ -0,0 +1,64 @@
# Copyright 2014 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.
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//extensions/buildflags/buildflags.gni")
assert(!is_android && !is_ios)
assert(enable_extensions,
"Cannot depend on extensions because enable_extensions=false.")
static_library("apps") {
sources = []
sources += [
"app_lifetime_monitor.cc",
"app_lifetime_monitor.h",
"app_lifetime_monitor_factory.cc",
"app_lifetime_monitor_factory.h",
"app_restore_service.cc",
"app_restore_service.h",
"app_restore_service_factory.cc",
"app_restore_service_factory.h",
"browser_context_keyed_service_factories.cc",
"browser_context_keyed_service_factories.h",
"launcher.cc",
"launcher.h",
"saved_files_service.cc",
"saved_files_service.h",
"saved_files_service_factory.cc",
"saved_files_service_factory.h",
"switches.cc",
"switches.h",
]
configs += [ "//build/config/compiler:wexit_time_destructors" ]
deps = [
"//components/keyed_service/content",
"//content/public/browser",
"//content/public/common",
"//extensions/browser",
"//extensions/common",
"//extensions/common/api",
]
if (is_chromeos) {
deps += [ "//components/user_manager" ]
}
}
static_library("test_support") {
testonly = true
sources = [
"test/app_window_waiter.cc",
"test/app_window_waiter.h",
]
public_deps = [
"//content/public/browser",
"//extensions/browser",
]
}

View File

@ -0,0 +1,26 @@
# Copyright 2017 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.
import("//build/config/ui.gni")
import("//extensions/buildflags/buildflags.gni")
assert(enable_extensions)
source_set("views") {
sources = [
"app_window_frame_view.cc",
"app_window_frame_view.h",
]
deps = [
"//cc/paint",
"//chrome/app/theme:theme_resources",
"//extensions/browser",
"//extensions/common",
"//skia",
"//ui/gfx",
"//ui/strings",
"//ui/views",
]
}

2544
src/ash/BUILD.gn Normal file

File diff suppressed because it is too large Load Diff

263
src/ash/app_list/BUILD.gn Normal file
View File

@ -0,0 +1,263 @@
# Copyright 2014 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.
import("//build/config/ui.gni")
import("//testing/test.gni")
assert(is_chromeos)
component("app_list") {
sources = [
"app_list_export.h",
"app_list_metrics.cc",
"app_list_metrics.h",
"app_list_presenter_delegate.h",
"app_list_presenter_impl.cc",
"app_list_presenter_impl.h",
"app_list_util.cc",
"app_list_util.h",
"app_list_view_delegate.h",
"paged_view_structure.cc",
"paged_view_structure.h",
"views/app_list_drag_and_drop_host.h",
"views/app_list_folder_view.cc",
"views/app_list_folder_view.h",
"views/app_list_item_view.cc",
"views/app_list_item_view.h",
"views/app_list_main_view.cc",
"views/app_list_main_view.h",
"views/app_list_menu_model_adapter.cc",
"views/app_list_menu_model_adapter.h",
"views/app_list_page.cc",
"views/app_list_page.h",
"views/app_list_view.cc",
"views/app_list_view.h",
"views/apps_container_view.cc",
"views/apps_container_view.h",
"views/apps_grid_view.cc",
"views/apps_grid_view.h",
"views/apps_grid_view_folder_delegate.h",
"views/assistant/assistant_dialog_plate.cc",
"views/assistant/assistant_dialog_plate.h",
"views/assistant/assistant_main_stage.cc",
"views/assistant/assistant_main_stage.h",
"views/assistant/assistant_main_view.cc",
"views/assistant/assistant_main_view.h",
"views/assistant/assistant_page_view.cc",
"views/assistant/assistant_page_view.h",
"views/assistant/privacy_info_view.cc",
"views/assistant/privacy_info_view.h",
"views/contents_view.cc",
"views/contents_view.h",
"views/expand_arrow_view.cc",
"views/expand_arrow_view.h",
"views/folder_background_view.cc",
"views/folder_background_view.h",
"views/folder_header_view.cc",
"views/folder_header_view.h",
"views/folder_header_view_delegate.h",
"views/ghost_image_view.cc",
"views/ghost_image_view.h",
"views/horizontal_page.cc",
"views/horizontal_page.h",
"views/horizontal_page_container.cc",
"views/horizontal_page_container.h",
"views/page_switcher.cc",
"views/page_switcher.h",
"views/pulsing_block_view.cc",
"views/pulsing_block_view.h",
"views/remove_query_confirmation_dialog.cc",
"views/remove_query_confirmation_dialog.h",
"views/result_selection_controller.cc",
"views/result_selection_controller.h",
"views/search_box_view.cc",
"views/search_box_view.h",
"views/search_result_actions_view.cc",
"views/search_result_actions_view.h",
"views/search_result_actions_view_delegate.h",
"views/search_result_answer_card_view.cc",
"views/search_result_answer_card_view.h",
"views/search_result_base_view.cc",
"views/search_result_base_view.h",
"views/search_result_container_view.cc",
"views/search_result_container_view.h",
"views/search_result_list_view.cc",
"views/search_result_list_view.h",
"views/search_result_page_view.cc",
"views/search_result_page_view.h",
"views/search_result_suggestion_chip_view.cc",
"views/search_result_suggestion_chip_view.h",
"views/search_result_tile_item_list_view.cc",
"views/search_result_tile_item_list_view.h",
"views/search_result_tile_item_view.cc",
"views/search_result_tile_item_view.h",
"views/search_result_view.cc",
"views/search_result_view.h",
"views/suggestion_chip_container_view.cc",
"views/suggestion_chip_container_view.h",
"views/top_icon_animation_view.cc",
"views/top_icon_animation_view.h",
]
defines = [ "APP_LIST_IMPLEMENTATION" ]
deps = [
"//ash/app_list/resources",
"//ash/app_menu",
"//ash/assistant/model",
"//ash/assistant/ui",
"//ash/assistant/ui:constants",
"//ash/assistant/util",
"//ash/keyboard/ui",
"//ash/public/cpp/app_list/vector_icons",
"//ash/resources/vector_icons",
"//ash/strings",
"//base",
"//base:i18n",
"//base/third_party/dynamic_annotations",
"//cc/paint",
"//chromeos:chromeos",
"//chromeos/services/assistant/public:feature_flags",
"//components/keyed_service/core",
"//components/sync",
"//mojo/public/cpp/bindings",
"//services/content/public/cpp",
"//skia",
"//third_party/icu",
"//ui/accessibility",
"//ui/aura",
"//ui/base",
"//ui/base/ime",
"//ui/base/ime/chromeos",
"//ui/chromeos/search_box",
"//ui/compositor",
"//ui/compositor_extra",
"//ui/display",
"//ui/events",
"//ui/gfx",
"//ui/gfx/geometry",
"//ui/resources",
"//ui/strings",
"//ui/views",
"//ui/wm",
"//ui/wm/public",
]
# TODO(hejq): Remove this once app_list is migrated. http://crbug.com/733662
public_deps = [
"//ash/app_list/model:app_list_model",
"//ash/app_list/model:search_model",
"//ash/public/cpp",
"//base",
"//mojo/public/cpp/bindings",
"//services/content/public/mojom",
"//ui/aura",
"//ui/compositor",
"//ui/gfx/geometry",
"//ui/views",
"//ui/wm",
"//ui/wm/public",
]
}
static_library("test_support") {
testonly = true
sources = [
"test/app_list_test_model.cc",
"test/app_list_test_model.h",
"test/app_list_test_view_delegate.cc",
"test/app_list_test_view_delegate.h",
"test/test_search_result.cc",
"test/test_search_result.h",
"views/test/apps_grid_view_test_api.cc",
"views/test/apps_grid_view_test_api.h",
]
deps = [
":app_list",
"//base",
"//services/content/public/cpp/test:test_support",
"//ui/base:base",
"//ui/events",
"//ui/gfx",
"//ui/gfx/geometry",
"//ui/views",
]
}
executable("app_list_demo") {
testonly = true
sources = [ "demo/app_list_demo_views.cc" ]
deps = [
":app_list",
":test_support",
"//base",
"//build/win:default_exe_manifest",
"//content",
"//content/public/browser",
"//skia",
"//ui/base",
"//ui/events",
"//ui/resources",
"//ui/resources:ui_test_pak",
"//ui/views",
"//ui/views_content_client",
"//url",
]
}
test("app_list_unittests") {
sources = [
"folder_image_unittest.cc",
"test/run_all_unittests.cc",
"views/app_list_main_view_unittest.cc",
"views/app_list_menu_model_adapter_unittest.cc",
"views/app_list_view_unittest.cc",
"views/apps_grid_view_unittest.cc",
"views/folder_header_view_unittest.cc",
"views/result_selection_controller_unittest.cc",
"views/search_box_view_unittest.cc",
"views/search_result_answer_card_view_unittest.cc",
"views/search_result_list_view_unittest.cc",
"views/search_result_page_view_unittest.cc",
"views/search_result_tile_item_list_view_unittest.cc",
]
configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
deps = [
":app_list",
":test_support",
"//ash/keyboard/ui",
"//ash/public/cpp/app_list/vector_icons",
"//base",
"//base/test:test_support",
"//chromeos/constants",
"//mojo/core/embedder",
"//mojo/public/cpp/bindings",
"//services/content/public/cpp",
"//services/content/public/cpp/test:test_support",
"//services/content/public/mojom",
"//skia",
"//testing/gtest",
"//ui/accessibility",
"//ui/base",
"//ui/chromeos/search_box",
"//ui/compositor",
"//ui/events:test_support",
"//ui/gfx:test_support",
"//ui/gl:test_support",
"//ui/resources",
"//ui/views",
"//ui/views:test_support",
]
data_deps = [
"//third_party/mesa_headers",
"//ui/resources:ui_test_pak_data",
]
}

View File

@ -0,0 +1,56 @@
# Copyright 2017 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.
component("app_list_model") {
sources = [
"app_list_folder_item.cc",
"app_list_folder_item.h",
"app_list_item.cc",
"app_list_item.h",
"app_list_item_list.cc",
"app_list_item_list.h",
"app_list_item_list_observer.h",
"app_list_item_observer.h",
"app_list_model.cc",
"app_list_model.h",
"app_list_model_observer.h",
"folder_image.cc",
"folder_image.h",
]
defines = [ "APP_LIST_MODEL_IMPLEMENTATION" ]
deps = [
"//ash/public/cpp:cpp",
"//base:i18n",
"//cc/paint",
"//components/sync",
"//skia",
"//third_party/icu",
"//ui/base",
"//ui/gfx",
]
}
component("search_model") {
sources = [
"search/search_box_model.cc",
"search/search_box_model.h",
"search/search_box_model_observer.h",
"search/search_model.cc",
"search/search_model.h",
"search/search_result.cc",
"search/search_result.h",
"search/search_result_observer.h",
]
defines = [ "APP_LIST_MODEL_IMPLEMENTATION" ]
deps = [
"//ash/public/cpp:cpp",
"//base:i18n",
"//ui/base",
"//ui/gfx",
]
}

View File

@ -0,0 +1,20 @@
# Copyright 2015 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.
import("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")
group("resources") {
public_deps = [ ":resources_grd" ]
}
grit("resources_grd") {
source = "app_list_resources.grd"
outputs = [
"grit/app_list_resources.h",
"app_list_resources_100_percent.pak",
"app_list_resources_200_percent.pak",
"app_list_resources_300_percent.pak",
]
}

36
src/ash/app_menu/BUILD.gn Normal file
View File

@ -0,0 +1,36 @@
# Copyright 2018 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.
import("//build/config/ui.gni")
assert(is_chromeos)
component("app_menu") {
sources = [
"app_menu_model_adapter.cc",
"app_menu_model_adapter.h",
"notification_item_view.cc",
"notification_item_view.h",
"notification_menu_controller.cc",
"notification_menu_controller.h",
"notification_menu_header_view.cc",
"notification_menu_header_view.h",
"notification_menu_view.cc",
"notification_menu_view.h",
"notification_overflow_view.cc",
"notification_overflow_view.h",
]
defines = [ "APP_MENU_IMPLEMENTATION" ]
deps = [
"//ash/public/cpp",
"//base",
"//ui/gfx",
"//ui/gfx/geometry",
"//ui/message_center",
"//ui/strings:ui_strings_grit",
"//ui/views",
]
}

View File

@ -0,0 +1,56 @@
# Copyright 2018 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.
assert(is_chromeos)
component("model") {
output_name = "assistant_model"
defines = [ "IS_ASSISTANT_MODEL_IMPL" ]
sources = [
"assistant_alarm_timer_model.cc",
"assistant_alarm_timer_model.h",
"assistant_alarm_timer_model_observer.h",
"assistant_interaction_model.cc",
"assistant_interaction_model.h",
"assistant_interaction_model_observer.h",
"assistant_notification_model.cc",
"assistant_notification_model.h",
"assistant_notification_model_observer.h",
"assistant_query.cc",
"assistant_query.h",
"assistant_query_history.cc",
"assistant_query_history.h",
"assistant_response.cc",
"assistant_response.h",
"assistant_response_observer.h",
"assistant_screen_context_model.cc",
"assistant_screen_context_model.h",
"assistant_screen_context_model_observer.h",
"assistant_suggestions_model.cc",
"assistant_suggestions_model.h",
"assistant_suggestions_model_observer.h",
"assistant_ui_model.cc",
"assistant_ui_model.h",
"assistant_ui_model_observer.h",
"ui/assistant_card_element.cc",
"ui/assistant_card_element.h",
"ui/assistant_text_element.cc",
"ui/assistant_text_element.h",
"ui/assistant_timers_element.cc",
"ui/assistant_timers_element.h",
"ui/assistant_ui_element.cc",
"ui/assistant_ui_element.h",
]
deps = [
"//ash/assistant/ui:constants",
"//ash/public/cpp",
"//chromeos/services/assistant/public:feature_flags",
"//chromeos/services/assistant/public/mojom",
"//services/content/public/cpp",
"//ui/gfx/geometry",
]
}

View File

@ -0,0 +1,123 @@
# Copyright 2018 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.
import("//build/config/ui.gni")
import("//chromeos/assistant/assistant.gni")
assert(is_chromeos)
component("constants") {
output_name = "assistant_ui_constants"
defines = [ "IS_ASSISTANT_UI_CONSTANTS_IMPL" ]
sources = [
"assistant_ui_constants.cc",
"assistant_ui_constants.h",
]
deps = [
"//base",
"//skia",
"//ui/aura",
"//ui/base",
"//ui/gfx",
]
}
component("ui") {
output_name = "assistant_ui"
defines = [ "IS_ASSISTANT_UI_IMPL" ]
sources = [
"assistant_view_delegate.h",
"assistant_view_ids.h",
"assistant_web_container_view.cc",
"assistant_web_container_view.h",
"assistant_web_view_delegate.h",
"base/assistant_button.cc",
"base/assistant_button.h",
"base/assistant_button_listener.h",
"base/assistant_scroll_view.cc",
"base/assistant_scroll_view.h",
"base/stack_layout.cc",
"base/stack_layout.h",
"dialog_plate/mic_view.cc",
"dialog_plate/mic_view.h",
"logo_view/logo_view.cc",
"logo_view/logo_view.h",
"main_stage/animated_container_view.cc",
"main_stage/animated_container_view.h",
"main_stage/assistant_card_element_view.cc",
"main_stage/assistant_card_element_view.h",
"main_stage/assistant_footer_view.cc",
"main_stage/assistant_footer_view.h",
"main_stage/assistant_header_view.cc",
"main_stage/assistant_header_view.h",
"main_stage/assistant_opt_in_view.cc",
"main_stage/assistant_opt_in_view.h",
"main_stage/assistant_progress_indicator.cc",
"main_stage/assistant_progress_indicator.h",
"main_stage/assistant_query_view.cc",
"main_stage/assistant_query_view.h",
"main_stage/assistant_text_element_view.cc",
"main_stage/assistant_text_element_view.h",
"main_stage/assistant_timers_element_view.cc",
"main_stage/assistant_timers_element_view.h",
"main_stage/assistant_ui_element_view.cc",
"main_stage/assistant_ui_element_view.h",
"main_stage/assistant_ui_element_view_factory.cc",
"main_stage/assistant_ui_element_view_factory.h",
"main_stage/element_animator.cc",
"main_stage/element_animator.h",
"main_stage/suggestion_chip_view.cc",
"main_stage/suggestion_chip_view.h",
"main_stage/suggestion_container_view.cc",
"main_stage/suggestion_container_view.h",
"main_stage/ui_element_container_view.cc",
"main_stage/ui_element_container_view.h",
"proactive_suggestions_rich_view.cc",
"proactive_suggestions_rich_view.h",
"proactive_suggestions_simple_view.cc",
"proactive_suggestions_simple_view.h",
"proactive_suggestions_view.cc",
"proactive_suggestions_view.h",
]
deps = [
"//ash/assistant/model",
"//ash/assistant/ui:constants",
"//ash/assistant/util",
"//ash/keyboard/ui",
"//ash/public/cpp",
"//ash/public/cpp/vector_icons",
"//ash/resources/vector_icons",
"//ash/strings",
"//base",
"//chromeos/assistant:buildflags",
"//chromeos/services/assistant/public:feature_flags",
"//chromeos/services/assistant/public/mojom",
"//services/content/public/cpp",
"//ui/aura",
"//ui/compositor",
"//ui/gfx",
"//ui/views",
"//ui/views/window/vector_icons",
"//ui/wm",
]
if (enable_cros_libassistant) {
sources += [
"logo_view/logo_view_impl.cc",
"logo_view/logo_view_impl.h",
"logo_view/shape/mic_part_shape.cc",
"logo_view/shape/mic_part_shape.h",
"logo_view/shape/shape.cc",
"logo_view/shape/shape.h",
]
deps += [ "//chromeos/assistant/internal/logo_view" ]
}
}

View File

@ -0,0 +1,37 @@
# 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.
assert(is_chromeos)
component("util") {
output_name = "assistant_util"
defines = [ "IS_ASSISTANT_UTIL_IMPL" ]
sources = [
"animation_util.cc",
"animation_util.h",
"assistant_util.cc",
"assistant_util.h",
"deep_link_util.cc",
"deep_link_util.h",
"histogram_util.cc",
"histogram_util.h",
"i18n_util.cc",
"i18n_util.h",
]
deps = [
"//ash/assistant/model",
"//base",
"//base:i18n",
"//chromeos/constants",
"//chromeos/services/assistant/public/mojom",
"//net",
"//ui/base",
"//ui/gfx",
"//ui/views",
"//url",
]
}

View File

@ -0,0 +1,22 @@
# Copyright 2018 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.
import("//build/config/ui.gni")
static_library("arc") {
sources = [
"arc_input_method_surface_manager.cc",
"arc_input_method_surface_manager.h",
"arc_virtual_keyboard_container_layout_manager.cc",
"arc_virtual_keyboard_container_layout_manager.h",
]
deps = [
"//ash/public/cpp",
"//base",
"//components/exo",
"//ui/aura",
"//ui/gfx/geometry",
]
}

View File

@ -0,0 +1,177 @@
# Copyright 2014 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.
import("//build/config/jumbo.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//testing/test.gni")
import("//third_party/google_input_tools/closure.gni")
import("//third_party/google_input_tools/inputview.gni")
import("//tools/grit/grit_rule.gni")
assert(is_chromeos)
jumbo_component("ui") {
sources = [
"container_behavior.cc",
"container_behavior.h",
"container_floating_behavior.cc",
"container_floating_behavior.h",
"container_full_width_behavior.cc",
"container_full_width_behavior.h",
"display_util.cc",
"display_util.h",
"drag_descriptor.h",
"keyboard_event_handler.cc",
"keyboard_event_handler.h",
"keyboard_export.h",
"keyboard_layout_delegate.h",
"keyboard_layout_manager.cc",
"keyboard_layout_manager.h",
"keyboard_ui.cc",
"keyboard_ui.h",
"keyboard_ui_controller.cc",
"keyboard_ui_controller.h",
"keyboard_ui_factory.cc",
"keyboard_ui_factory.h",
"keyboard_ui_model.cc",
"keyboard_ui_model.h",
"keyboard_ukm_recorder.cc",
"keyboard_ukm_recorder.h",
"keyboard_util.cc",
"keyboard_util.h",
"notification_manager.cc",
"notification_manager.h",
"queued_container_type.cc",
"queued_container_type.h",
"queued_display_change.cc",
"queued_display_change.h",
"resources/keyboard_resource_util.cc",
"resources/keyboard_resource_util.h",
"shaped_window_targeter.cc",
"shaped_window_targeter.h",
]
defines = [ "KEYBOARD_IMPLEMENTATION" ]
deps = [
":resources",
"//ash/public/cpp",
"//base",
"//services/metrics/public/cpp:ukm_builders",
"//ui/aura",
"//ui/base",
"//ui/base/ime",
"//ui/compositor",
"//ui/display:display",
"//ui/events",
"//ui/events:dom_keycode_converter",
"//ui/gfx",
"//ui/gfx/geometry",
"//ui/wm",
]
if (use_ozone) {
deps += [ "//ui/ozone" ]
}
data_deps = [ ":resources" ]
}
static_library("test_support") {
testonly = true
sources = [
"test/keyboard_test_util.cc",
"test/keyboard_test_util.h",
"test/test_keyboard_controller_observer.cc",
"test/test_keyboard_controller_observer.h",
"test/test_keyboard_layout_delegate.cc",
"test/test_keyboard_layout_delegate.h",
"test/test_keyboard_ui_factory.cc",
"test/test_keyboard_ui_factory.h",
]
deps = [
":ui",
"//ash/public/cpp",
"//base",
"//ui/aura",
"//ui/aura:test_support",
"//ui/base:test_support",
"//ui/display",
]
}
grit("resources_grit") {
source = "keyboard_resources.grd"
outputs = [
"grit/keyboard_resources.h",
"grit/keyboard_resources_map.h",
"keyboard_resources.pak",
]
input_tools_root_dir = "//third_party/google_input_tools/src/chrome/os"
inputview_gen_js = "$root_gen_dir/ash/keyboard/ui/resources/inputview.js"
grit_flags = [
"-E",
"input_tools_root_dir=" + rebase_path(input_tools_root_dir, "."),
"-E",
"inputview_gen_js=" + rebase_path(inputview_gen_js, root_build_dir),
]
deps = [ ":inputview" ]
}
copy("resources") {
sources = [ "$target_gen_dir/keyboard_resources.pak" ]
outputs = [ "$root_out_dir/keyboard_resources.pak" ]
public_deps = [ ":resources_grit" ]
}
build_closure("inputview") {
sources = inputview_sources
target = "$target_gen_dir/resources/inputview.js"
path = rebase_path("//third_party/google_input_tools")
}
test("keyboard_unittests") {
sources = [
"container_floating_behavior_unittest.cc",
"container_full_width_behavior_unittest.cc",
"keyboard_event_handler_unittest.cc",
"keyboard_ui_controller_unittest.cc",
"keyboard_ui_model_unittest.cc",
"keyboard_ukm_recorder_unittest.cc",
"keyboard_util_unittest.cc",
"notification_manager_unittest.cc",
"test/run_all_unittests.cc",
]
deps = [
":test_support",
":ui",
"//ash/public/cpp",
"//base",
"//base/test:test_support",
"//components/ukm:test_support",
"//mojo/core/embedder",
"//testing/gmock",
"//testing/gtest",
"//ui/aura:test_support",
"//ui/base",
"//ui/base:test_support",
"//ui/base/ime/init",
"//ui/compositor:test_support",
"//ui/events:test_support",
"//ui/gfx",
"//ui/gfx/geometry",
"//ui/gl:test_support",
"//ui/resources:ui_test_pak",
"//ui/wm",
]
data_deps = [ "//ui/resources:ui_test_pak_data" ]
if (use_ozone) {
deps += [ "//ui/ozone" ]
}
}

View File

@ -0,0 +1,17 @@
# Copyright 2018 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.
import("//tools/grit/grit_rule.gni")
grit("resources") {
source = "login_resources.grd"
outputs = [
"grit/login_resources.h",
"grit/login_resources_map.cc",
"grit/login_resources_map.h",
"login_resources_100_percent.pak",
"login_resources_200_percent.pak",
"login_resources_300_percent.pak",
]
}

343
src/ash/public/cpp/BUILD.gn Normal file
View File

@ -0,0 +1,343 @@
# Copyright 2016 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.
import("//mojo/public/tools/bindings/mojom.gni")
# C++ headers and sources that can be used outside ash.
component("cpp") {
sources = [
"accelerators.cc",
"accelerators.h",
"accessibility_controller.cc",
"accessibility_controller.h",
"accessibility_controller_client.h",
"accessibility_controller_enums.h",
"accessibility_focus_ring_controller.cc",
"accessibility_focus_ring_controller.h",
"accessibility_focus_ring_info.cc",
"accessibility_focus_ring_info.h",
"ambient/ambient_mode_state.cc",
"ambient/ambient_mode_state.h",
"ambient/ambient_prefs.cc",
"ambient/ambient_prefs.h",
"ambient/photo_controller.cc",
"ambient/photo_controller.h",
"android_intent_helper.cc",
"android_intent_helper.h",
"app_list/app_list_client.h",
"app_list/app_list_config.cc",
"app_list/app_list_config.h",
"app_list/app_list_config_provider.cc",
"app_list/app_list_config_provider.h",
"app_list/app_list_controller.cc",
"app_list/app_list_controller.h",
"app_list/app_list_controller_observer.h",
"app_list/app_list_features.cc",
"app_list/app_list_features.h",
"app_list/app_list_metrics.cc",
"app_list/app_list_metrics.h",
"app_list/app_list_switches.cc",
"app_list/app_list_switches.h",
"app_list/app_list_types.cc",
"app_list/app_list_types.h",
"app_list/internal_app_id_constants.h",
"app_menu_constants.h",
"app_types.h",
"arc_app_id_provider.cc",
"arc_app_id_provider.h",
"arc_notifications_host_initializer.cc",
"arc_notifications_host_initializer.h",
"ash_constants.h",
"ash_features.cc",
"ash_features.h",
"ash_pref_names.cc",
"ash_pref_names.h",
"ash_public_export.h",
"ash_switches.cc",
"ash_switches.h",
"ash_typography.cc",
"ash_typography.h",
"ash_view_ids.h",
"assistant/assistant_client.cc",
"assistant/assistant_client.h",
"assistant/assistant_image_downloader.cc",
"assistant/assistant_image_downloader.h",
"assistant/assistant_interface_binder.cc",
"assistant/assistant_interface_binder.h",
"assistant/assistant_setup.cc",
"assistant/assistant_setup.h",
"assistant/assistant_state.cc",
"assistant/assistant_state.h",
"assistant/assistant_state_base.cc",
"assistant/assistant_state_base.h",
"assistant/assistant_web_view.cc",
"assistant/assistant_web_view.h",
"assistant/assistant_web_view_factory.cc",
"assistant/assistant_web_view_factory.h",
"assistant/conversation_starter.cc",
"assistant/conversation_starter.h",
"assistant/conversation_starters_client.cc",
"assistant/conversation_starters_client.h",
"assistant/proactive_suggestions.cc",
"assistant/proactive_suggestions.h",
"assistant/proactive_suggestions_client.cc",
"assistant/proactive_suggestions_client.h",
"assistant/util/histogram_util.cc",
"assistant/util/histogram_util.h",
"back_gesture_contextual_nudge_controller.h",
"back_gesture_contextual_nudge_delegate.h",
"caption_buttons/caption_button_model.h",
"caption_buttons/frame_back_button.cc",
"caption_buttons/frame_back_button.h",
"caption_buttons/frame_caption_button_container_view.cc",
"caption_buttons/frame_caption_button_container_view.h",
"caption_buttons/frame_size_button.cc",
"caption_buttons/frame_size_button.h",
"caption_buttons/frame_size_button_delegate.h",
"caption_buttons/snap_controller.cc",
"caption_buttons/snap_controller.h",
"cast_config_controller.cc",
"cast_config_controller.h",
"default_frame_header.cc",
"default_frame_header.h",
"default_scale_factor_retriever.cc",
"default_scale_factor_retriever.h",
"desks_helper.cc",
"desks_helper.h",
"fps_counter.cc",
"fps_counter.h",
"frame_header.cc",
"frame_header.h",
"frame_utils.cc",
"frame_utils.h",
"gesture_action_type.h",
"ime_controller.cc",
"ime_controller.h",
"ime_controller_client.h",
"ime_info.cc",
"ime_info.h",
"immersive/immersive_context.cc",
"immersive/immersive_context.h",
"immersive/immersive_focus_watcher.cc",
"immersive/immersive_focus_watcher.h",
"immersive/immersive_fullscreen_controller.cc",
"immersive/immersive_fullscreen_controller.h",
"immersive/immersive_fullscreen_controller_delegate.h",
"immersive/immersive_revealed_lock.cc",
"immersive/immersive_revealed_lock.h",
"keyboard/keyboard_config.h",
"keyboard/keyboard_controller.cc",
"keyboard/keyboard_controller.h",
"keyboard/keyboard_controller_observer.h",
"keyboard/keyboard_switches.cc",
"keyboard/keyboard_switches.h",
"keyboard/keyboard_types.h",
"keyboard_shortcut_viewer.h",
"kiosk_app_menu.cc",
"kiosk_app_menu.h",
"locale_update_controller.cc",
"locale_update_controller.h",
"lock_screen_widget_factory.cc",
"lock_screen_widget_factory.h",
"login_constants.h",
"login_screen.cc",
"login_screen.h",
"login_screen_client.h",
"login_screen_model.cc",
"login_screen_model.h",
"login_screen_test_api.h",
"login_types.cc",
"login_types.h",
"media_client.h",
"media_controller.cc",
"media_controller.h",
"network_config_service.cc",
"network_config_service.h",
"network_icon_image_source.cc",
"network_icon_image_source.h",
"new_window_delegate.cc",
"new_window_delegate.h",
"night_light_controller.cc",
"night_light_controller.h",
"note_taking_client.cc",
"note_taking_client.h",
"notification_utils.cc",
"notification_utils.h",
"notifier_metadata.cc",
"notifier_metadata.h",
"notifier_settings_controller.cc",
"notifier_settings_controller.h",
"notifier_settings_observer.h",
"pagination/pagination_controller.cc",
"pagination/pagination_controller.h",
"pagination/pagination_model.cc",
"pagination/pagination_model.h",
"pagination/pagination_model_observer.h",
"power_utils.cc",
"power_utils.h",
"presentation_time_recorder.cc",
"presentation_time_recorder.h",
"quick_answers_controller.cc",
"quick_answers_controller.h",
"rounded_corner_decorator.cc",
"rounded_corner_decorator.h",
"scale_utility.cc",
"scale_utility.h",
"scoped_guest_button_blocker.h",
"select_to_speak_event_handler_delegate.h",
"session/session_activation_observer.h",
"session/session_controller.cc",
"session/session_controller.h",
"session/session_controller_client.h",
"session/session_types.cc",
"session/session_types.h",
"session/user_info.cc",
"session/user_info.h",
"shelf_item.cc",
"shelf_item.h",
"shelf_item_delegate.cc",
"shelf_item_delegate.h",
"shelf_model.cc",
"shelf_model.h",
"shelf_model_observer.h",
"shelf_prefs.cc",
"shelf_prefs.h",
"shelf_types.cc",
"shelf_types.h",
"shelf_ui_info.cc",
"shelf_ui_info.h",
"shell_window_ids.cc",
"shell_window_ids.h",
"shutdown_controller.cc",
"shutdown_controller.h",
"spoken_feedback_event_rewriter_delegate.h",
"stylus_utils.cc",
"stylus_utils.h",
"switch_access_event_handler_delegate.h",
"system_tray.cc",
"system_tray.h",
"system_tray_client.h",
"system_tray_focus_observer.h",
"tablet_mode.cc",
"tablet_mode.h",
"tablet_mode_observer.h",
"toast_data.cc",
"toast_data.h",
"toast_manager.cc",
"toast_manager.h",
"update_types.h",
"view_shadow.cc",
"view_shadow.h",
"wallpaper_controller.cc",
"wallpaper_controller.h",
"wallpaper_controller_client.h",
"wallpaper_controller_observer.cc",
"wallpaper_controller_observer.h",
"wallpaper_info.h",
"wallpaper_types.h",
"window_animation_types.h",
"window_backdrop.cc",
"window_backdrop.h",
"window_pin_type.cc",
"window_pin_type.h",
"window_properties.cc",
"window_properties.h",
"window_state_type.cc",
"window_state_type.h",
]
defines = [ "ASH_PUBLIC_IMPLEMENTATION" ]
deps = [
"//ash/public/cpp/vector_icons",
"//chromeos/constants",
"//chromeos/dbus/power:power_manager_proto",
"//chromeos/services/assistant/public/cpp:prefs",
"//chromeos/services/network_config:in_process_instance",
"//components/prefs",
"//components/sync:rest_of_sync",
"//mojo/public/cpp/bindings",
"//skia/public/mojom",
"//ui/aura",
"//ui/chromeos/strings",
"//ui/compositor_extra",
"//ui/display",
"//ui/events/devices",
"//ui/message_center/public/cpp",
"//ui/views",
"//ui/views/window/vector_icons",
"//ui/wm",
"//ui/wm/public",
]
public_deps = [
"//ash/public/mojom",
"//base",
"//chromeos/components/security_token_pin",
"//chromeos/services/assistant/public/mojom",
"//chromeos/services/network_config/public/mojom",
"//components/arc/mojom:notifications",
"//components/session_manager:base",
"//components/user_manager",
"//ui/base/ime/chromeos:ime_types",
"//ui/gfx",
]
output_name = "ash_public_cpp"
}
source_set("unit_tests") {
testonly = true
sources = [
"android_intent_helper_unittest.cc",
"app_list/app_list_config_provider_unittest.cc",
"default_scale_factor_retriever_unittest.cc",
"pagination/pagination_model_unittest.cc",
"power_utils_unittest.cc",
"rounded_corner_decorator_unittest.cc",
"shelf_model_unittest.cc",
"view_shadow_unittest.cc",
]
deps = [
":cpp",
"//base",
"//base/test:test_support",
"//mojo/public/cpp/bindings",
"//testing/gtest",
"//ui/aura:test_support",
"//ui/compositor_extra",
"//ui/gfx:test_support",
"//ui/views",
"//ui/views:test_support",
]
}
source_set("test_support") {
testonly = true
sources = [
"immersive/immersive_fullscreen_controller_test_api.cc",
"immersive/immersive_fullscreen_controller_test_api.h",
"test/test_keyboard_controller_observer.cc",
"test/test_keyboard_controller_observer.h",
"test/test_new_window_delegate.cc",
"test/test_new_window_delegate.h",
"test/test_photo_controller.cc",
"test/test_photo_controller.h",
"test/test_system_tray_client.cc",
"test/test_system_tray_client.h",
"test/test_tablet_mode.cc",
"test/test_tablet_mode.h",
]
deps = [
":cpp",
"//base",
"//ui/aura",
"//ui/aura:test_support",
"//ui/gfx",
"//ui/gfx:test_support",
"//ui/views",
]
}

View File

@ -0,0 +1,40 @@
# Copyright 2017 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.
import("//components/vector_icons/vector_icons.gni")
aggregate_vector_icons("app_list_vector_icons") {
icon_directory = "."
icons = [
"arrow_up.icon",
"badge_instant.icon",
"badge_play.icon",
"badge_rating.icon",
"bookmark.icon",
"domain.icon",
"equal.icon",
"google_black.icon",
"google_color.icon",
"history.icon",
"mic_black.icon",
"search.icon",
"search_engine_not_google.icon",
"search_result_append.icon",
"search_result_remove.icon",
"vertical_bar_end.icon",
"vertical_bar_middle.icon",
"vertical_bar_single.icon",
"vertical_bar_start.icon",
]
}
source_set("vector_icons") {
sources = get_target_outputs(":app_list_vector_icons")
deps = [
":app_list_vector_icons",
"//skia",
]
}

View File

@ -0,0 +1,13 @@
# Copyright 2018 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.
import("//tools/grit/grit_rule.gni")
grit("ash_public_unscaled_resources") {
source = "ash_public_unscaled_resources.grd"
outputs = [
"grit/ash_public_unscaled_resources.h",
"ash_public_unscaled_resources.pak",
]
}

View File

@ -0,0 +1,33 @@
# Copyright 2018 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.
import("//components/vector_icons/vector_icons.gni")
# The icons in this target, unlike those in //ash/resources/vector_icons, are ok to use from outside of ash/.
aggregate_vector_icons("ash_public_vector_icons") {
icon_directory = "."
icons = [
"notification_assistant.icon",
"notification_supervised_user.icon",
"notification_warning.icon",
"window_control_back.icon",
"window_control_dezoom.icon",
"window_control_left_snapped.icon",
"window_control_menu.icon",
"window_control_right_snapped.icon",
"window_control_zoom.icon",
]
}
source_set("vector_icons") {
sources = get_target_outputs(":ash_public_vector_icons")
deps = [
":ash_public_vector_icons",
"//base",
"//skia",
"//ui/gfx",
]
}

View File

@ -0,0 +1,39 @@
# Copyright 2015 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.
import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
disable_variants = true
sources = [
"assistant_controller.mojom",
"assistant_state_controller.mojom",
"assistant_volume_control.mojom",
"cros_display_config.mojom",
"tray_action.mojom",
"voice_interaction_controller.mojom",
]
public_deps = [
"//chromeos/components/proximity_auth/public/mojom",
"//chromeos/services/assistant/public/mojom:notification",
"//components/account_id/mojom",
"//components/sync/mojom",
"//mojo/public/mojom/base",
"//services/content/public/mojom",
"//services/preferences/public/mojom",
"//skia/public/mojom",
"//ui/display/mojom:mojom",
"//ui/gfx/geometry/mojom",
"//ui/gfx/image/mojom",
"//ui/gfx/range/mojom",
"//url/mojom:url_mojom_gurl",
]
component_output_prefix = "ash_public_interfaces"
export_class_attribute = "ASH_PUBLIC_EXPORT"
export_define = "ASH_PUBLIC_IMPLEMENTATION=1"
export_header = "ash/public/cpp/ash_public_export.h"
}

View File

@ -0,0 +1,79 @@
// Copyright 2018 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.
module ash.mojom;
import "chromeos/services/assistant/public/mojom/assistant_notification.mojom";
import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
// Represents the current state of an Assistant timer.
enum AssistantTimerState {
kUnknown,
// The timer is scheduled to fire at some future date.
kScheduled,
// The timer will not fire but is kept in the queue of scheduled events;
// it can be resumed after which it will fire in |remaining_time|.
kPaused,
// The timer has fired. In the simplest case this means the timer has
// begun ringing.
kFired,
};
// Models an Assistant timer.
struct AssistantTimer {
string id;
string label;
AssistantTimerState state;
mojo_base.mojom.Time fire_time;
mojo_base.mojom.TimeDelta remaining_time;
};
// Interface to the AssistantAlarmTimerController which is owned by the
// AssistantController. Currently used by the Assistant service to notify Ash
// of changes to the underlying alarm/timer state in LibAssistant.
interface AssistantAlarmTimerController {
// Invoked when timer state has changed. Note that |timers| may be empty.
OnTimerStateChanged(array<AssistantTimer> timers);
};
// Interface to the AssistantNotificationController which is owned by the
// AssistantController. Currently used by the Assistant service to modify
// Assistant notification state in Ash in response to LibAssistant events.
interface AssistantNotificationController {
// Requests that the specified |notification| be added or updated. If the
// |client_id| for |notification| matches that of an existing notification,
// an update will occur. Otherwise, a new notification will be added.
AddOrUpdateNotification(
chromeos.assistant.mojom.AssistantNotification notification);
// Requests that the notification uniquely identified by |id| be removed. If
// |from_server| is true the request to remove was initiated by the server.
RemoveNotificationById(string id, bool from_server);
// Requests that all notifications associated with the given |grouping_key|
// be removed. If |from_server| is true the request to remove was initiated
// by the server.
RemoveNotificationByGroupingKey(string grouping_key, bool from_server);
// Requests that all notifications be removed. If |from_server| is true the
// request was initiated by the server.
RemoveAllNotifications(bool from_server);
// Changes the quiet mode state in the message center.
SetQuietMode(bool enabled);
};
// Interface to the AssistantScreenContextController which is owned by the
// AssistantController. Currently used by the Assistant service to request
// screenshots.
interface AssistantScreenContextController {
// Requests a screenshot of the region enclosed by |rect| and returns the
// screenshot encoded in JPEG format. If |rect| is empty, it returns a
// fullscreen screenshot.
RequestScreenshot(gfx.mojom.Rect rect) => (array<uint8> screenshot);
};

View File

@ -0,0 +1,70 @@
// 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.
module ash.mojom;
// The initial state is NOT_READY, after Assistant service started it becomes
// READY. When Assistant UI shows up the state becomes VISIBLE.
enum AssistantState {
// The Assistant service is not ready yet.
NOT_READY = 0,
// The Assistant service is ready.
READY,
// The Assistant service is ready.
// TODO(b/142428671): This is set when the Assistant backend signals it is
// ready to handle queries, where |READY| is signaled when it is started.
// If this signal turns out to be reliable it should replace |READY| and be
// renamed to |READY|.
NEW_READY,
};
enum AssistantAllowedState {
// Assistant feature is allowed.
ALLOWED = 0,
// Disallowed because search and assistant is disabled by policy.
DISALLOWED_BY_POLICY,
// Disallowed because user's locale is not compatible.
DISALLOWED_BY_LOCALE,
// Disallowed because current user is not primary user.
DISALLOWED_BY_NONPRIMARY_USER,
// Disallowed because current user is supervised user.
DISALLOWED_BY_SUPERVISED_USER,
// Disallowed because incognito mode.
DISALLOWED_BY_INCOGNITO,
// Disallowed because the device is in demo mode.
DISALLOWED_BY_DEMO_MODE,
// Disallowed because the device is in public session.
DISALLOWED_BY_PUBLIC_SESSION,
// Disallowed because the user's account type is currently not supported.
DISALLOWED_BY_ACCOUNT_TYPE,
// Disallowed because the device is in Kiosk mode.
DISALLOWED_BY_KIOSK_MODE
};
// Allows observing changes to Assistant status and settings.
interface AssistantStateObserver {
// Called when Assistant state changes.
OnAssistantStatusChanged(AssistantState state);
// Called when assistant feature allowed state has changed.
OnAssistantFeatureAllowedChanged(AssistantAllowedState state);
// Called when Google Play Store is enabled/disabled.
OnArcPlayStoreEnabledChanged(bool enabled);
// Called when locale is changed in pref. The locale is in the format can be
// "en-US" or simply "en". When locale is not set in pref, it returns empty
// string.
OnLocaleChanged(string locale);
// Called when locked full screen state has changed.
OnLockedFullScreenStateChanged(bool enabled);
};
// Interface for ash client (Assistant service) to connect to state controller,
// which notifies changes of Assistant status and settings.
interface AssistantStateController {
// Add an observer.
AddMojomObserver(pending_remote<AssistantStateObserver> observer);
};

View File

@ -0,0 +1,27 @@
// Copyright 2018 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.
module ash.mojom;
// Interface to control system volume through Ash.
interface AssistantVolumeControl {
// Sets system volume to |volume|, which is between 0 - 100.
SetVolume(int32 volume, bool user_initiated);
// Sets mute state to |muted|.
SetMuted(bool muted);
// Adds volume observer. The observer will be immediately notified of volume
// and mute status when added.
AddVolumeObserver(pending_remote<VolumeObserver> observer);
};
// Observes volume state changes.
interface VolumeObserver {
// Called when volume is updated.
OnVolumeChanged(int32 volume);
// Called when mute state changed.
OnMuteStateChanged(bool muted);
};

View File

@ -0,0 +1,308 @@
// Copyright 2018 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.
module ash.mojom;
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/display/mojom/display.mojom";
// This API is used for communication between Settings WebUI and Ash C++ code.
// All points, bounds, and insets are in display pixels unless otherwise
// sepcified.
// SetDisplayLayoutInfo or SetDisplayProperties result.
enum DisplayConfigResult {
kSuccess = 0,
kInvalidOperationError,
kInvalidDisplayIdError,
kUnifiedNotEnabledError,
kPropertyValueOutOfRangeError,
kNotSupportedOnInternalDisplayError,
kNegativeValueError,
kSetDisplayModeError,
kInvalidDisplayLayoutError,
kMirrorModeSingleDisplayError,
kMirrorModeSourceIdError,
kMirrorModeDestIdError,
kCalibrationNotAvailableError,
kCalibrationNotStartedError,
kCalibrationInProgressError,
kCalibrationInvalidDataError,
kCalibrationFailedError,
};
// Describes how the displays are laid out.
enum DisplayLayoutMode {
// In normal mode displays are laid out as described by
// DisplayLayoutInfo.layouts.
kNormal = 0,
// In unified desktop mode, a single desktop will be stretched across all
// available displays.
kUnified,
// In mirrored mode, the display defined by DisplayLayoutInfo.mirrorSourceId
// will be mirrored in the displays defined by
// DisplayLayoutInfo.mirrorDestinationIds, or in all other displays if
// mirrorDestinationIds is empty.
kMirrored
};
// Describes a display edge.
enum DisplayLayoutPosition {
kTop = 0,
kRight,
kBottom,
kLeft
};
// Describes an overscan or touch calibration operation.
enum DisplayConfigOperation {
kStart = 0,
kAdjust,
kReset,
kComplete,
kShowNative,
};
// Describes who initiated configuration change.
enum DisplayConfigSource {
kUser = 0,
kPolicy
};
// Describes the options the DisplayConfigProperties.rotation and
// DisplayUnitInfo.rotation_options can be set to.
enum DisplayRotationOptions {
// In physical tablet state, enables auto-rotation and clears the user
// rotation lock. Otherwise, it behaves the same as kZeroDegrees.
kAutoRotate,
// In physical tablet state, Sets the user rotation lock to 0 degrees.
// Otherwise, it sets the display rotation to 0.
kZeroDegrees,
// In physical tablet state, Sets the user rotation lock to 90 degrees.
// Otherwise, it sets the display rotation 90.
k90Degrees,
// In physical tablet state, Sets the user rotation lock to 180 degrees.
// Otherwise, it sets the display rotation 180.
k180Degrees,
// In physical tablet state, Sets the user rotation lock to 270 degrees.
// Otherwise, it sets the display rotation 270.
k270Degrees,
};
// Defines a pair of display + touch points used for touch calibration.
struct TouchCalibrationPair {
// The coordinates of the display point.
gfx.mojom.Point display_point;
// The coordinates of the touch point corresponding to the display point.
gfx.mojom.Point touch_point;
};
// Defines the data required for touch calibration.
struct TouchCalibration {
// Must contain exactly four pairs of touch calibration points.
array<TouchCalibrationPair> pairs;
// Width and height of the display area when the touch calibration was
// performed.
gfx.mojom.Size bounds;
};
// Defines the layout of a single display.
struct DisplayLayout {
// The unique identifier of the display.
string id;
// The unique identifier of the parent display. Empty for the root display.
string parent_id;
// The edge of the display that is shared with the parent display. Ignored for
// the root display.
DisplayLayoutPosition position;
// The offset of the display along the connected edge. 0 indicates that
// the topmost or leftmost corner is aligned.
int32 offset;
};
// Defines the layout mode and details.
struct DisplayLayoutInfo {
// The layout mode to use, see DisplayLayoutMode for details.
DisplayLayoutMode layout_mode;
// Ignored if If layout_mode is not kMirrored. Otherwise, if provided,
// specifies the unique identifier of the source display for mirroring. If
// not provided, mirror_destination_ids will be ignored and default ('normal')
// mirrored mode will be enabled.
string? mirror_source_id;
// Ignored if layout_mode is not kMirrored. Otherwise, if provided, specifies
// the unique identifiers of the displays to mirror the source display. If not
// provided or empty, all displays will mirror the source display.
array<string>? mirror_destination_ids;
// An array of layouts describing a directed graph of displays. Required if
// layout_mode is kNormal or kMirrored and not all displays are mirrored
// ('mixed' mode). Ignored if layout_mode is kUnified.
array<DisplayLayout>? layouts;
};
// EDID extracted parameters. Field description refers to "VESA ENHANCED
// EXTENDED DISPLAY IDENTIFICATION DATA STANDARD (Defines EDID Structure
// Version 1, Revision 4)" Release A, Revision 2 September 25, 2006.
// https://www.vesa.org/vesa-standards
struct Edid {
// Three character manufacturer code, Sec. 3.4.1 page 21.
string manufacturer_id;
// Two byte manufacturer-assigned code, Sec. 3.4.2 page 21.
string product_id;
// Year of manufacture. Sec. 3.4.4 page 22.
int32 year_of_manufacture;
};
// Struct wrapper so that the property can be optional.
struct DisplayRotation {
DisplayRotationOptions rotation;
};
// Defines the properties for a display mode, i.e. a valid size and scale.
struct DisplayMode {
// The display mode size in device independent (user visible) pixels.
gfx.mojom.Size size;
// The display mode size in native pixels.
gfx.mojom.Size size_in_native_pixels;
// The display mode device scale factor.
double device_scale_factor;
// The display mode refresh rate in hertz.
double refresh_rate;
// True if the mode is the display's native mode.
bool is_native;
// True if the mode is interlaced.
bool is_interlaced;
};
// Defines the properties of an individual display, returned by
// GetDisplayLayoutInfo.
struct DisplayUnitInfo {
// The unique identifier of the display.
string id;
// The user-friendly name (e.g. "Acme LCD monitor").
string name;
// EDID properties when available.
Edid? edid;
// True if this is the primary display.
bool is_primary;
// True if this is an internal display.
bool is_internal;
// True if this display is enabled.
bool is_enabled;
// True when the device is in tablet physical state.
bool is_in_tablet_physical_state;
// True if this display has a touch input device associated with it.
bool has_touch_support;
// True if this display has an accelerometer associated with it.
bool has_accelerometer_support;
// The number of pixels per inch along the x-axis.
double dpi_x;
// The number of pixels per inch along the y-axis.
double dpi_y;
// The display rotation options.
DisplayRotationOptions rotation_options;
// The display's logical bounds.
gfx.mojom.Rect bounds;
// The display's ovserscan insets within its screen's bounds.
gfx.mojom.Insets overscan;
// The usable work area of the display within the display bounds. Excludes
// areas of the display reserved for the OS, e.g. the taskbar and launcher.
gfx.mojom.Rect work_area;
// The index of the selected display mode.
int32 selected_display_mode_index;
// The list of available display modes.
array<DisplayMode> available_display_modes;
// The ratio between the display's current and default zoom. i.e. 1.0 is
// is equivalent to 100% zoom, and value 1.5 is equivalent to 150% zoom.
double display_zoom_factor;
// The list of allowed zoom factor values for the display.
array<double> available_display_zoom_factors;
};
// Properties for configuring an individual display, used in
// SetDisplayProperties.
struct DisplayConfigProperties {
// If true, makes the display primary. No-op if set to false.
bool set_primary;
// If provided, sets the display's overscan insets to the provided value.
// Note: overscan values may not be negative or larger than a half of the
// screen's size. Overscan cannot be changed on the internal monitor.
gfx.mojom.Insets? overscan;
// If provided updates the display's rotation, or if the device is in a
// physical tablet state, it can be used to set or clear the user rotation
// lock, enabling or disabling auto-rotation.
DisplayRotation? rotation;
// If provided, updates the display's logical bounds origin. Note: when
// updating the display origin, some constraints will be applied. so the final
// bounds origin may be different than the one set. The actual bounds will be
// reflected in DisplayUnitInfo. Cannot be changed on the primary display (or
// if set_primary is true).
gfx.mojom.Point? bounds_origin;
// If non zero, updates the zoom associated with the display. This zoom
// performs relayout and repaint thus resulting in a better quality zoom than
// just performing a pixel by pixel stretch enlargement.
double display_zoom_factor;
// Optional DisplayMode properties to set. This should match one of the
// modes listed in DisplayUnitInfo.available_display_modes. Other custom
// modes may or may not be valid.
DisplayMode? display_mode;
};
// Interface for configuring displays in Chrome OS. Currently this is
// implemented in Ash through classes owned by ash::Shell, but the interface
// should not have any Ash specific dependencies.
interface CrosDisplayConfigController {
// Observers are notified when the display layout or any display properties
// change.
AddObserver(pending_associated_remote<CrosDisplayConfigObserver> observer);
// Returns the display layout info, including the list of layouts.
GetDisplayLayoutInfo() => (DisplayLayoutInfo info);
// Sets the layout mode, mirroring, and layouts. Returns kSuccess if the
// layout is valid or an error value otherwise.
SetDisplayLayoutInfo(DisplayLayoutInfo info) => (DisplayConfigResult result);
// Returns the properties for all displays. If |single_unified| is true, a
// single display will be returned if the display layout is in unifed mode.
GetDisplayUnitInfoList(bool single_unified) =>
(array<DisplayUnitInfo> info_list);
// Sets |properties| for individual display with identifier |id|. |source|
// should describe who initiated the change. Returns Success if the properties
// are valid or an error value otherwise.
SetDisplayProperties(string id,
DisplayConfigProperties properties,
DisplayConfigSource source) =>
(DisplayConfigResult result);
// Enables or disables unified desktop mode. If the current display mode is
// kMirrored the mode will not be changed, if it is kNormal then the mode will
// be set to kUnified.
SetUnifiedDesktopEnabled(bool enabled);
// Starts, updates, completes, or resets overscan calibration for the display
// with identifier |display_id|. If |op| is kAdjust, |delta| describes the
// amount to change the overscan value. Runs the callback after performing the
// operation or on error.
OverscanCalibration(string display_id,
DisplayConfigOperation op,
gfx.mojom.Insets? delta) => (DisplayConfigResult result);
// Starts, completes, or resets touch calibration for the display with
// identifier |display_id|. If |op| is kShowNative shows the native
// calibration UI. Runs the callback after performing the operation or on
// error.
TouchCalibration(string display_id,
DisplayConfigOperation op,
TouchCalibration? calibration) =>
(DisplayConfigResult result);
};
// Interface for clients needing to be informed when the display configuration
// changes.
interface CrosDisplayConfigObserver {
// Called any time the display configuration changes.
OnDisplayConfigChanged();
};

View File

@ -0,0 +1,103 @@
// Copyright 2017 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.
module ash.mojom;
// An action handler state.
enum TrayActionState {
// The action cannot be handled - due to no client being set, the client not
// supporting the action, user session not being locked etc.
kNotAvailable,
// The client supports the action and is not currently handling the action.
kAvailable,
// The client received the request for the action and it is launching the
// flow to handle it.
kLaunching,
// The client is currently handling the action.
kActive,
};
// The user action that triggered a request for a new note.
// Used in histograms - should be kept in sync with
// NewLockScreenNoteRequestType histogram enum, and assigned values should
// never be changed.
enum LockScreenNoteOrigin {
// The note request originated from the new note button in the system
// tray - note that this UI element is deprecated.
kTrayAction = 0,
// The user tapped the note action button shown on the lock screen.
kLockScreenButtonTap = 1,
// The user swiped from the note action button shown on the lock screen.
kLockScreenButtonSwipe = 2,
// The user activated the lock screen button shown on the lock screen using
// the keyboard.
kLockScreenButtonKeyboard = 3,
// The user ejected the stylus tool from the device.
kStylusEject = 4,
};
// Reason for closing a lock screen note, and consequentially closing any
// existing note handler app windows.
// Used primarily for metrics reporting.
// IMPORTANT: The values should be kept in sync with
// LockScreenNoteTakingExitReason histogram enum, and assigned values should
// never be changed.
enum CloseLockScreenNoteReason {
// The user session was unlocked.
kSessionUnlock = 0,
// The user session was shut down (e.g. due to user sign-out).
kShutdown = 1,
// The user display was completely dimmed (e.g. due to user inactivity).
kScreenDimmed = 2,
// Device suspended.
kSuspend = 3,
// The app window associated with the note was closed by the app.
kAppWindowClosed = 4,
// The note taking app's support for the lock screen note taking was disabled
// (e.g. because of a policy update).
kAppLockScreenSupportDisabled = 5,
// The user pressed "Unlock" button on the lock screen UI.
kUnlockButtonPressed = 6,
};
// Used by a client (e.g. Chrome) to set up a handler for a tray action, and
// notify ash on the action handler's state changes. A tray action is one of
// predefined actions (currently only the "new note on lock screen" action is
// supported) that appear as an ash status area button if the client declares
// the action as available. Clicking the button invokes a client method that
// requests the action associated with the button to be handled.
interface TrayAction {
// Sets the client to be used to handle action requests.
// |lock_screen_note_state|: The current lock screen note action state
// associated with the client.
SetClient(pending_remote<TrayActionClient> client,
TrayActionState lock_screen_note_state);
// Updates action state for the lock screen note action. If called with no
// client set, the state change will not take effect until a client is set.
// Null client is equivalent to kNotAvailable state.
UpdateLockScreenNoteState(TrayActionState state);
};
// Used by ash to request Chrome to handle an action.
interface TrayActionClient {
// Requests a lock screen note action to be handled.
RequestNewLockScreenNote(LockScreenNoteOrigin origin);
// Closes lock screen note.
CloseLockScreenNote(CloseLockScreenNoteReason reason);
};

View File

@ -0,0 +1,23 @@
// Copyright 2017 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.
module ash.mojom;
// There is another copy of the VoiceInteractionState definition in
// //components/arc/mojom/voice_interaction_framework.mojom
// Please also update the other one if you change it.
// The duplicate definition is because we do not use extensible widely
// (crbug.com/731893).
// The initial state is NOT_READY, then it will either becomes STOPPED or
// RUNNING. If the mojo connection is lost, the state will be set back to
// NOT_READY.
enum VoiceInteractionState {
// Voice interaction service is not ready yet, request sent will be waiting.
NOT_READY = 0,
// Voice interaction session is stopped.
STOPPED,
// Voice interaction session is currently running.
RUNNING
};

View File

@ -0,0 +1,88 @@
# Copyright 2014 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.
import("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")
import("//ui/base/ui_features.gni")
assert(is_chromeos)
assert(enable_hidpi)
# Repacks resources needed for ash_unittests, etc. at a given scale.
# TODO(msw): Use ui_test.pak instead of its pieces? (no 200% support?)
template("ash_test_resources") {
percent = invoker.percent
repack("ash_test_resources_${target_name}") {
output = "$root_build_dir/${target_name}.pak"
sources = [
"$root_gen_dir/ash/app_list/resources/app_list_resources_${percent}_percent.pak",
"$root_gen_dir/ash/login/resources/login_resources_${percent}_percent.pak",
"$root_gen_dir/ash/public/cpp/resources/ash_public_unscaled_resources.pak",
"$root_gen_dir/ui/chromeos/resources/ui_chromeos_resources_${percent}_percent.pak",
"$root_gen_dir/ui/resources/ui_resources_${percent}_percent.pak",
"$root_gen_dir/ui/views/resources/views_resources_${percent}_percent.pak",
]
if (percent == "100") {
sources += [
"$root_gen_dir/mojo/public/js/mojo_bindings_resources.pak",
"$root_gen_dir/ui/resources/webui_resources.pak",
]
}
if (defined(invoker.sources)) {
sources += invoker.sources
}
deps = [
"//ash/app_list/resources",
"//ash/login/resources",
"//ash/public/cpp/resources:ash_public_unscaled_resources",
"//mojo/public/js:resources",
"//ui/chromeos/resources",
"//ui/resources",
"//ui/views/resources",
]
if (defined(invoker.deps)) {
deps += invoker.deps
}
if (percent == "100") {
# TODO(msw): This seems bad, but follows repack_ui_test_pak's example.
deps += [ "//third_party/blink/public:resources_grit" ]
sources += [
"$root_gen_dir/third_party/blink/public/resources/blink_resources.pak",
]
}
}
}
ash_test_resources("100_percent") {
percent = "100"
}
ash_test_resources("200_percent") {
percent = "200"
}
# There is no with_content_200_percent as content resources are only available
# at 100%.
ash_test_resources("with_content_100_percent") {
percent = "100"
sources = [
"$root_gen_dir/content/content_resources.pak",
"$root_gen_dir/content/dev_ui_content_resources.pak",
"$root_gen_dir/third_party/blink/public/resources/blink_scaled_resources_100_percent.pak",
"$root_gen_dir/third_party/blink/public/strings/blink_strings_en-US.pak",
]
deps = [
"//content:content_resources",
"//content:dev_ui_content_resources",
"//third_party/blink/public:scaled_resources_100_percent",
"//third_party/blink/public/strings",
]
}

View File

@ -0,0 +1,286 @@
# Copyright 2016 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.
import("//build/config/chrome_build.gni")
import("//components/vector_icons/vector_icons.gni")
aggregate_vector_icons("ash_vector_icons") {
icon_directory = "."
icons = [
"always_show_shelf.icon",
"assistant.icon",
"auto_hide.icon",
"autoclick.icon",
"autoclick_close.icon",
"autoclick_double_click.icon",
"autoclick_drag.icon",
"autoclick_left_click.icon",
"autoclick_right_click.icon",
"autoclick_pause.icon",
"autoclick_position_bottom_left.icon",
"autoclick_position_bottom_right.icon",
"autoclick_position_top_left.icon",
"autoclick_position_top_right.icon",
"autoclick_scroll.icon",
"autoclick_scroll_down.icon",
"autoclick_scroll_left.icon",
"autoclick_scroll_right.icon",
"autoclick_scroll_up.icon",
"captive_portal.icon",
"check_circle.icon",
"desks_close_desk_button.icon",
"desks_new_desk_button.icon",
"dictation_menu.icon",
"dictation_off.icon",
"dictation_off_newui.icon",
"dictation_on.icon",
"dictation_on_newui.icon",
"dogfood.icon",
"hollow_check_circle.icon",
"ime_menu_emoticon.icon",
"ime_menu_microphone.icon",
"ime_menu_on_screen_keyboard.icon",
"ime_menu_write.icon",
"keyboard.icon",
"lock_screen_alert.icon",
"lock_screen_arrow.icon",
"lock_screen_arrow_back.icon",
"lock_screen_backspace.icon",
"lock_screen_caps_lock.icon",
"lock_screen_dropdown.icon",
"lock_screen_fingerprint.icon",
"lock_screen_password_invisible.icon",
"lock_screen_password_visible.icon",
"lock_screen_smart_card.icon",
"lock_screen_smart_card_failure.icon",
"lock_screen_fingerprint_success.icon",
"lock_screen_time_limit_lock.icon",
"lock_screen_time_limit_moon.icon",
"lock_screen_time_limit_timer.icon",
"login_screen_button_dropdown.icon",
"login_screen_menu_dropdown.icon",
"login_screen_enterprise.icon",
"mic.icon",
"muted_microphone.icon",
"network_badge_captive_portal.icon",
"network_badge_off.icon",
"network_badge_roaming.icon",
"network_badge_secure.icon",
"network_badge_technology_1x.icon",
"network_badge_technology_3g.icon",
"network_badge_technology_4g.icon",
"network_badge_technology_edge.icon",
"network_badge_technology_evdo.icon",
"network_badge_technology_gprs.icon",
"network_badge_technology_hspa.icon",
"network_badge_technology_hspa_plus.icon",
"network_badge_technology_lte.icon",
"network_badge_technology_lte_advanced.icon",
"network_badge_vpn.icon",
"network_ethernet.icon",
"network_mobile_not_connected_x.icon",
"network_vpn.icon",
"notification_accessibility.icon",
"notification_accessibility_braille.icon",
"notification_battery_critical.icon",
"notification_battery_fluctuating.icon",
"notification_battery_low.icon",
"notification_bluetooth_battery_warning.icon",
"notification_bluetooth.icon",
"notification_capslock.icon",
"notification_center_all_done.icon",
"notification_center_clear_all.icon",
"notification_center_collapse.icon",
"notification_center_do_not_disturb_off.icon",
"notification_center_do_not_disturb_on.icon",
"notification_center_empty.icon",
"notification_center_settings.icon",
"notification_charging_usb_c.icon",
"notification_chromevox.icon",
"notification_keyboard.icon",
"notification_low_power_charger.icon",
"notification_monitor_warning.icon",
"notification_multi_device_setup.icon",
"notification_screen.icon",
"notification_screenshare.icon",
"notification_sms_sync.icon",
"notification_stylus_battery_warning.icon",
"notification_timer.icon",
"overview_window_close.icon",
"overview_drop_target_plus.icon",
"overflow_shelf_left.icon",
"overflow_shelf_right.icon",
"palette_action_capture_region.icon",
"palette_action_capture_screen.icon",
"palette_action_create_note.icon",
"palette_mode_laser_pointer.icon",
"palette_mode_magnify.icon",
"palette_mode_metalayer.icon",
"palette_tray_icon_capture_region.icon",
"palette_tray_icon_default.icon",
"palette_tray_icon_default_newui.icon",
"palette_tray_icon_laser_pointer.icon",
"palette_tray_icon_magnify.icon",
"palette_tray_icon_metalayer.icon",
"pin_request_lock.icon",
"privacy_screen.icon",
"send.icon",
"settings.icon",
"shelf_add_person_button.icon",
"shelf_apps_button.icon",
"shelf_back.icon",
"shelf_browse_as_guest_button.icon",
"shelf_cancel_button.icon",
"shelf_globe.icon",
"shelf_keyboard.icon",
"shelf_keyboard_newui.icon",
"shelf_logout.icon",
"shelf_notifications.icon",
"shelf_overflow.icon",
"shelf_overflow_horizontal_dots.icon",
"shelf_overview.icon",
"shelf_position.icon",
"shelf_shutdown_button.icon",
"shelf_sign_out_button.icon",
"shelf_unlock_button.icon",
"switch_access.icon",
"system_menu_accessibility.icon",
"system_menu_accessibility_auto_click.icon",
"system_menu_accessibility_chromevox.icon",
"system_menu_accessibility_contrast.icon",
"system_menu_accessibility_docked_magnifier.icon",
"system_menu_accessibility_fullscreen_magnifier.icon",
"system_menu_accessibility_select_to_speak.icon",
"system_menu_audio_input.icon",
"system_menu_audio_output.icon",
"system_menu_add_connection.icon",
"system_menu_arrow_back.icon",
"system_menu_bluetooth.icon",
"system_menu_bluetooth_connected.icon",
"system_menu_bluetooth_disabled.icon",
"system_menu_brightness.icon",
"system_menu_business.icon",
"system_menu_caps_lock.icon",
"system_menu_cast.icon",
"system_menu_cast_audio.icon",
"system_menu_cast_audio_group.icon",
"system_menu_cast_enabled.icon",
"system_menu_cast_generic.icon",
"system_menu_cast_message.icon",
"system_menu_child_user.icon",
"system_menu_computer.icon",
"system_menu_gamepad.icon",
"system_menu_guest.icon",
"system_menu_hdmi.icon",
"system_menu_headset.icon",
"system_menu_help.icon",
"system_menu_info.icon",
"system_menu_keyboard.icon",
"system_menu_keyboard_brightness.icon",
"system_menu_lock.icon",
"system_menu_mouse.icon",
"system_menu_phone.icon",
"system_menu_power.icon",
"system_menu_rollback.icon",
"system_menu_rotation_lock_auto.icon",
"system_menu_rotation_lock_landscape.icon",
"system_menu_rotation_lock_portrait.icon",
"system_menu_screen_share.icon",
"system_menu_settings.icon",
"system_menu_supervised_user.icon",
"system_menu_tablet.icon",
"system_menu_tracing.icon",
"system_menu_timer.icon",
"system_menu_new_user.icon",
"system_menu_usb.icon",
"system_menu_videocam.icon",
"system_menu_volume_high.icon",
"system_menu_volume_low.icon",
"system_menu_volume_medium.icon",
"system_menu_volume_mute.icon",
"system_power_button_menu_feedback.icon",
"system_power_button_menu_lock_screen.icon",
"system_power_button_menu_power_off.icon",
"system_power_button_menu_sign_out.icon",
"system_tray_accessibility.icon",
"system_tray_caps_lock.icon",
"system_tray_cast.icon",
"system_tray_do_not_disturb.icon",
"system_tray_family_link.icon",
"system_tray_managed.icon",
"system_tray_notification_counter_plus.icon",
"system_tray_recording.icon",
"system_tray_rotation_lock_auto.icon",
"system_tray_rotation_lock_locked.icon",
"system_tray_select_to_speak.icon",
"system_tray_select_to_speak_newui.icon",
"system_tray_select_to_speak_active.icon",
"system_tray_select_to_speak_active_newui.icon",
"system_tray_screen_share.icon",
"system_tray_stop.icon",
"system_tray_stop_newui.icon",
"system_tray_tracing.icon",
"system_tray_update.icon",
"system_tray_volume_mute.icon",
"touch_calibration_complete_check.icon",
"touch_calibration_hand.icon",
"tray_action_new_lock_screen_note.icon",
"unified_menu_accessibility.icon",
"unified_menu_arrow_back.icon",
"unified_menu_battery_alert.icon",
"unified_menu_battery_bolt.icon",
"unified_menu_battery_unreliable.icon",
"unified_menu_battery_x.icon",
"unified_menu_bluetooth_connected.icon",
"unified_menu_bluetooth.icon",
"unified_menu_brightness.icon",
"unified_menu_cast.icon",
"unified_menu_do_not_disturb.icon",
"unified_menu_expand.icon",
"unified_menu_info.icon",
"unified_menu_keyboard_brightness.icon",
"unified_menu_keyboard.icon",
"unified_menu_locale.icon",
"unified_menu_lock.icon",
"unified_menu_managed.icon",
"unified_menu_more.icon",
"unified_menu_night_light.icon",
"unified_menu_power.icon",
"unified_menu_rotation_lock_auto.icon",
"unified_menu_rotation_lock_landscape.icon",
"unified_menu_rotation_lock_portrait.icon",
"unified_menu_settings.icon",
"unified_menu_volume_high.icon",
"unified_menu_volume_low.icon",
"unified_menu_volume_medium.icon",
"unified_menu_volume_mute.icon",
"unified_menu_vpn.icon",
"unified_menu_wifi_off.icon",
"unified_network_badge_captive_portal.icon",
"unified_network_badge_secure.icon",
"unified_network_badge_vpn.icon",
"wallpaper.icon",
]
if (is_chrome_branded) {
icons += [
"system_menu_cast_device.icon",
"system_menu_cast_education.icon",
"system_menu_cast_hangout.icon",
"system_menu_cast_meeting.icon",
]
}
}
source_set("vector_icons") {
sources = get_target_outputs(":ash_vector_icons")
deps = [
":ash_vector_icons",
"//base",
"//skia",
"//ui/gfx",
]
}

View File

@ -0,0 +1,58 @@
# Copyright 2018 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.
# KSV: Keyboard Shortcut Viewer
source_set("shortcut_viewer") {
sources = [
"keyboard_shortcut_item.cc",
"keyboard_shortcut_item.h",
"keyboard_shortcut_viewer_metadata.cc",
"keyboard_shortcut_viewer_metadata.h",
"ksv_export.h",
"views/bubble_view.cc",
"views/bubble_view.h",
"views/keyboard_shortcut_item_list_view.cc",
"views/keyboard_shortcut_item_list_view.h",
"views/keyboard_shortcut_item_view.cc",
"views/keyboard_shortcut_item_view.h",
"views/keyboard_shortcut_view.cc",
"views/keyboard_shortcut_view.h",
"views/ksv_search_box_view.cc",
"views/ksv_search_box_view.h",
]
defines = [ "KSV_IMPLEMENTATION" ]
deps = [
"//ash",
"//ash/public/cpp",
"//ash/public/cpp/resources:ash_public_unscaled_resources",
"//ash/shortcut_viewer/strings",
"//ash/shortcut_viewer/vector_icons",
"//cc/paint",
"//ui/accessibility",
"//ui/aura",
"//ui/chromeos/events",
"//ui/chromeos/search_box",
"//ui/events:events_base",
"//ui/events/devices",
"//ui/events/ozone/layout",
"//ui/views",
]
}
source_set("unit_tests") {
testonly = true
sources = [ "views/keyboard_shortcut_view_unittest.cc" ]
deps = [
":shortcut_viewer",
"//ash:test_support",
"//base/test:test_support",
"//testing/gtest",
"//ui/compositor:test_support",
"//ui/events:test_support",
"//ui/events/devices:test_support",
"//ui/views",
]
}

View File

@ -0,0 +1,66 @@
# Copyright 2018 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.
import("//tools/grit/grit_rule.gni")
grit("strings") {
source = "../ash_components_strings.grd"
outputs = [
"grit/ash_components_strings.h",
"ash_components_strings_am.pak",
"ash_components_strings_ar.pak",
"ash_components_strings_bg.pak",
"ash_components_strings_bn.pak",
"ash_components_strings_ca.pak",
"ash_components_strings_cs.pak",
"ash_components_strings_da.pak",
"ash_components_strings_de.pak",
"ash_components_strings_el.pak",
"ash_components_strings_en-GB.pak",
"ash_components_strings_en-US.pak",
"ash_components_strings_es-419.pak",
"ash_components_strings_es.pak",
"ash_components_strings_et.pak",
"ash_components_strings_fake-bidi.pak",
"ash_components_strings_fa.pak",
"ash_components_strings_fil.pak",
"ash_components_strings_fi.pak",
"ash_components_strings_fr.pak",
"ash_components_strings_gu.pak",
"ash_components_strings_he.pak",
"ash_components_strings_hi.pak",
"ash_components_strings_hr.pak",
"ash_components_strings_hu.pak",
"ash_components_strings_id.pak",
"ash_components_strings_it.pak",
"ash_components_strings_ja.pak",
"ash_components_strings_kn.pak",
"ash_components_strings_ko.pak",
"ash_components_strings_lt.pak",
"ash_components_strings_lv.pak",
"ash_components_strings_ml.pak",
"ash_components_strings_mr.pak",
"ash_components_strings_ms.pak",
"ash_components_strings_nb.pak",
"ash_components_strings_nl.pak",
"ash_components_strings_pl.pak",
"ash_components_strings_pt-BR.pak",
"ash_components_strings_pt-PT.pak",
"ash_components_strings_ro.pak",
"ash_components_strings_ru.pak",
"ash_components_strings_sk.pak",
"ash_components_strings_sl.pak",
"ash_components_strings_sr.pak",
"ash_components_strings_sv.pak",
"ash_components_strings_sw.pak",
"ash_components_strings_ta.pak",
"ash_components_strings_te.pak",
"ash_components_strings_th.pak",
"ash_components_strings_tr.pak",
"ash_components_strings_uk.pak",
"ash_components_strings_vi.pak",
"ash_components_strings_zh-CN.pak",
"ash_components_strings_zh-TW.pak",
]
}

View File

@ -0,0 +1,41 @@
# Copyright 2018 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.
import("//components/vector_icons/vector_icons.gni")
aggregate_vector_icons("ksv_vector_icons") {
icon_directory = "."
icons = [
"ksv_search_back.icon",
"ksv_search_bar.icon",
"ksv_search_close.icon",
"ksv_search_no_result.icon",
"ksv_separator_plus.icon",
"ksv_arrow_down.icon",
"ksv_arrow_left.icon",
"ksv_arrow_right.icon",
"ksv_arrow_up.icon",
"ksv_brightness_down.icon",
"ksv_brightness_up.icon",
"ksv_browser_back.icon",
"ksv_browser_forward.icon",
"ksv_fullscreen.icon",
"ksv_mute.icon",
"ksv_overview.icon",
"ksv_privacy_screen_toggle.icon",
"ksv_reload.icon",
"ksv_volume_down.icon",
"ksv_volume_up.icon",
]
}
source_set("vector_icons") {
sources = get_target_outputs(":ksv_vector_icons")
deps = [
":ksv_vector_icons",
"//skia",
]
}

109
src/ash/strings/BUILD.gn Normal file
View File

@ -0,0 +1,109 @@
# Copyright 2014 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.
import("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")
assert(is_chromeos)
grit("strings") {
source = "../ash_strings.grd"
defines = [ "is_chrome_branded=$is_chrome_branded" ]
outputs = [
"grit/ash_strings.h",
"ash_strings_am.pak",
"ash_strings_ar.pak",
"ash_strings_bg.pak",
"ash_strings_bn.pak",
"ash_strings_ca.pak",
"ash_strings_cs.pak",
"ash_strings_da.pak",
"ash_strings_de.pak",
"ash_strings_el.pak",
"ash_strings_en-GB.pak",
"ash_strings_en-US.pak",
"ash_strings_es.pak",
"ash_strings_es-419.pak",
"ash_strings_et.pak",
"ash_strings_fa.pak",
"ash_strings_fake-bidi.pak",
"ash_strings_fi.pak",
"ash_strings_fil.pak",
"ash_strings_fr.pak",
"ash_strings_gu.pak",
"ash_strings_he.pak",
"ash_strings_hi.pak",
"ash_strings_hr.pak",
"ash_strings_hu.pak",
"ash_strings_id.pak",
"ash_strings_it.pak",
"ash_strings_ja.pak",
"ash_strings_kn.pak",
"ash_strings_ko.pak",
"ash_strings_lt.pak",
"ash_strings_lv.pak",
"ash_strings_ml.pak",
"ash_strings_mr.pak",
"ash_strings_ms.pak",
"ash_strings_nl.pak",
"ash_strings_nb.pak",
"ash_strings_pl.pak",
"ash_strings_pt-BR.pak",
"ash_strings_pt-PT.pak",
"ash_strings_ro.pak",
"ash_strings_ru.pak",
"ash_strings_sk.pak",
"ash_strings_sl.pak",
"ash_strings_sr.pak",
"ash_strings_sv.pak",
"ash_strings_sw.pak",
"ash_strings_ta.pak",
"ash_strings_te.pak",
"ash_strings_th.pak",
"ash_strings_tr.pak",
"ash_strings_uk.pak",
"ash_strings_vi.pak",
"ash_strings_zh-CN.pak",
"ash_strings_zh-TW.pak",
]
}
# Creates locale-specific pak files with strings needed for ash_unittests, etc.
template("repack_one_locale_ash") {
locale = invoker.locale
output = invoker.output
repack(target_name) {
# Each input pak file should also have a deps line for completeness.
sources = [
"$root_gen_dir/ash/shortcut_viewer/strings/ash_components_strings_${locale}.pak",
"$root_gen_dir/ash/strings/ash_strings_${locale}.pak",
"$root_gen_dir/chromeos/strings/chromeos_strings_${locale}.pak",
"$root_gen_dir/components/strings/components_strings_${locale}.pak",
"$root_gen_dir/device/bluetooth/strings/bluetooth_strings_${locale}.pak",
"$root_gen_dir/ui/chromeos/strings/ui_chromeos_strings_${locale}.pak",
"$root_gen_dir/ui/strings/app_locale_settings_${locale}.pak",
"$root_gen_dir/ui/strings/ui_strings_${locale}.pak",
]
deps = [
"//ash/shortcut_viewer/strings",
"//ash/strings",
"//chromeos/strings",
"//components/strings",
"//device/bluetooth/strings",
"//ui/chromeos/strings",
"//ui/strings:app_locale_settings",
"//ui/strings:ui_strings",
]
}
}
# Creates a pak file containing en-US strings for ash_unittests, etc.
repack_one_locale_ash("ash_test_strings") {
output = "$root_build_dir/ash_test_strings.pak"
locale = "en-US"
}

View File

@ -0,0 +1,9 @@
# Copyright 2020 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.
import("//third_party/protobuf/proto_library.gni")
proto_library("user_settings_event_proto") {
sources = [ "user_settings_event.proto" ]
}

View File

@ -0,0 +1,72 @@
# Copyright 2016 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.
import("//build/config/ui.gni")
import("//testing/test.gni")
static_library("arc") {
sources = [
"arc_notification_constants.h",
"arc_notification_content_view.cc",
"arc_notification_content_view.h",
"arc_notification_delegate.cc",
"arc_notification_delegate.h",
"arc_notification_item.h",
"arc_notification_item_impl.cc",
"arc_notification_item_impl.h",
"arc_notification_manager.cc",
"arc_notification_manager.h",
"arc_notification_manager_delegate.h",
"arc_notification_surface.h",
"arc_notification_surface_impl.cc",
"arc_notification_surface_impl.h",
"arc_notification_surface_manager.cc",
"arc_notification_surface_manager.h",
"arc_notification_surface_manager_impl.cc",
"arc_notification_surface_manager_impl.h",
"arc_notification_view.cc",
"arc_notification_view.h",
]
deps = [
"//ash/public/cpp:cpp",
"//base",
"//components/account_id",
"//components/arc:arc_metrics_constants",
"//components/arc:connection_holder",
"//components/arc/mojom:notifications",
"//components/exo",
"//mojo/public/cpp/system",
"//skia",
"//ui/accessibility",
"//ui/aura",
"//ui/base",
"//ui/compositor",
"//ui/display",
"//ui/events",
"//ui/gfx",
"//ui/message_center",
"//ui/message_center/public/cpp",
"//ui/resources",
"//ui/strings",
"//ui/views",
"//ui/wm",
]
}
static_library("test_support") {
testonly = true
sources = [
"mock_arc_notification_item.cc",
"mock_arc_notification_item.h",
"mock_arc_notification_surface.cc",
"mock_arc_notification_surface.h",
]
deps = [
":arc",
"//ui/aura",
"//ui/gl:test_support",
]
}

22
src/ash/wayland/BUILD.gn Normal file
View File

@ -0,0 +1,22 @@
# Copyright 2017 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.
assert(is_chromeos)
source_set("wayland") {
sources = [
"wayland_server_controller.cc",
"wayland_server_controller.h",
]
deps = [
"//ash/keyboard/arc",
"//ash/public/cpp",
"//ash/system/message_center/arc",
"//base",
"//components/exo",
"//components/exo/wayland",
"//skia",
]
}

3750
src/base/BUILD.gn Normal file

File diff suppressed because it is too large Load Diff

19
src/base/DEPS Normal file
View File

@ -0,0 +1,19 @@
include_rules = [
"+third_party/ashmem",
"+third_party/apple_apsl",
"+third_party/boringssl/src/include",
"+third_party/ced",
"+third_party/lss",
"+third_party/modp_b64",
"+third_party/tcmalloc",
# These are implicitly brought in from the root, and we don't want them.
"-ipc",
"-url",
# ICU dependendencies must be separate from the rest of base.
"-i18n",
# //base/util can use //base but not vice versa.
"-util",
]

42
src/base/OWNERS Normal file
View File

@ -0,0 +1,42 @@
# See //base/README.md to find qualification for being an owner.
ajwong@chromium.org
danakj@chromium.org
dcheng@chromium.org
fdoray@chromium.org
gab@chromium.org
kylechar@chromium.org
mark@chromium.org
thakis@chromium.org
thestig@chromium.org
wez@chromium.org
# For Bind/Callback:
per-file bind*=tzik@chromium.org
per-file callback*=tzik@chromium.org
# For Android-specific changes:
per-file *android*=file://base/android/OWNERS
per-file BUILD.gn=file://base/android/OWNERS
# For Fuchsia-specific changes:
per-file *_fuchsia*=file://build/fuchsia/OWNERS
# For Windows-specific changes:
per-file *_win*=file://base/win/OWNERS
# For FeatureList API:
per-file feature_list*=asvitkine@chromium.org
per-file feature_list*=isherman@chromium.org
# Restricted since rand_util.h also backs the cryptographically secure RNG.
per-file rand_util*=set noparent
per-file rand_util*=file://ipc/SECURITY_OWNERS
# For TCMalloc tests:
per-file security_unittest.cc=jln@chromium.org
# For Value:
per-file values*=jdoerrie@chromium.org
# COMPONENT: Internals>Core

50
src/base/PRESUBMIT.py Normal file
View File

@ -0,0 +1,50 @@
# 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.
"""Chromium presubmit script for src/base.
See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details on the presubmit API built into depot_tools.
"""
def _CheckNoInterfacesInBase(input_api, output_api):
"""Checks to make sure no files in libbase.a have |@interface|."""
pattern = input_api.re.compile(r'^\s*@interface', input_api.re.MULTILINE)
files = []
for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
if (f.LocalPath().startswith('base/') and
not "/ios/" in f.LocalPath() and
not "/test/" in f.LocalPath() and
not f.LocalPath().endswith('.java') and
not f.LocalPath().endswith('_unittest.mm') and
not f.LocalPath().endswith('mac/sdk_forward_declarations.h')):
contents = input_api.ReadFile(f)
if pattern.search(contents):
files.append(f)
if len(files):
return [ output_api.PresubmitError(
'Objective-C interfaces or categories are forbidden in libbase. ' +
'See http://groups.google.com/a/chromium.org/group/chromium-dev/' +
'browse_thread/thread/efb28c10435987fd',
files) ]
return []
def _CommonChecks(input_api, output_api):
"""Checks common to both upload and commit."""
results = []
results.extend(_CheckNoInterfacesInBase(input_api, output_api))
return results
def CheckChangeOnUpload(input_api, output_api):
results = []
results.extend(_CommonChecks(input_api, output_api))
return results
def CheckChangeOnCommit(input_api, output_api):
results = []
results.extend(_CommonChecks(input_api, output_api))
return results

75
src/base/README.md Normal file
View File

@ -0,0 +1,75 @@
# What is this
Contains a written down set of principles and other information on //base.
Please add to it!
## About //base:
Chromium is a very mature project. Most things that are generally useful are
already here and things not here aren't generally useful.
Base is pulled into many projects. For example, various ChromeOS daemons. So
the bar for adding stuff is that it must have demonstrated wide
applicability. Prefer to add things closer to where they're used (i.e. "not
base"), and pull into base only when needed. In a project our size,
sometimes even duplication is OK and inevitable.
Adding a new logging macro `DPVELOG_NE` is not more clear than just
writing the stuff you want to log in a regular logging statement, even
if it makes your calling code longer. Just add it to your own code.
If the code in question does not need to be used inside base, but will have
multiple consumers across the codebase, consider placing it in a new directory
under components/ instead.
## Qualifications for being in //base OWNERS
* interest and ability to learn low level/high detail/complex c++ stuff
* inclination to always ask why and understand everything (including external
interactions like win32) rather than just hoping the author did it right
* mentorship/experience
* demonstrated good judgement (esp with regards to public APIs) over a length
of time
Owners are added when a contributor has shown the above qualifications and
when they express interest. There isn't an upper bound on the number of OWNERS.
## Design and naming
* Be sure to use the base namespace.
* STL-like constructs should adhere as closely to STL as possible. Functions
and behaviors not present in STL should only be added when they are related
to the specific data structure implemented by the container.
* For STL-like constructs our policy is that they should use STL-like naming
even when it may conflict with the style guide. So functions and class names
should be lower case with underscores. Non-STL-like classes and functions
should use Google naming.
## Performance testing
Since the primitives provided by //base are used very widely, it is important to
ensure they scale to the necessary workloads and perform well under all
supported platforms. The `base_perftests` target is a suite of
synthetic microbenchmarks that measure performance in various scenarios:
* BasicPostTaskPerfTest: Exercises MessageLoopTaskRunner's multi-threaded
queue in isolation.
* ConditionVariablePerfTest: Measures thread switching cost of condition
variables.
* IntegratedPostTaskPerfTest: Exercises the full MessageLoop/RunLoop
machinery.
* JSONPerfTest: Tests JSONWriter and JSONReader performance.
* MessageLoopPerfTest: Measures the speed of task posting in various
configurations.
* ObserverListPerfTest: Exercises adding, removing and signalling observers.
* PthreadEventPerfTest: Establishes the baseline thread switching cost using
pthreads.
* ScheduleWorkTest: Measures the overhead of MessagePump::ScheduleWork.
* SequenceManagerPerfTest: Benchmarks SequenceManager scheduling with various
underlying task runners.
* TaskObserverPerfTest: Measures the incremental cost of adding task
observers.
* TaskPerfTest: Checks the cost of posting tasks between threads.
* WaitableEvent{Thread,}PerfTest: Measures waitable events in single and
multithreaded scenarios.
Regressions in these benchmarks can generally by caused by 1) operating system
changes, 2) compiler version or flag changes or 3) changes in //base code
itself.

14
src/base/SECURITY_OWNERS Normal file
View File

@ -0,0 +1,14 @@
# Changes to code that runs at high privilege and which has a high risk of
# memory corruption, such as parsers for complex inputs, require a security
# review to avoid introducing sandbox escapes.
#
# Although this file is in base/, it may apply to more than just base, OWNERS
# files outside of base may also include this file.
#
# Security team: If you are uncomfortable reviewing a particular bit of code
# yourself, don't hesitate to seek help from another security team member!
# Nobody knows everything, and the only way to learn is from experience.
dcheng@chromium.org
palmer@chromium.org
rsesek@chromium.org
tsepez@chromium.org

299
src/base/allocator/BUILD.gn Normal file
View File

@ -0,0 +1,299 @@
# Copyright (c) 2013 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.
import("//base/allocator/allocator.gni")
import("//build/buildflag_header.gni")
import("//build/config/allocator.gni")
import("//build/config/compiler/compiler.gni")
declare_args() {
# Provide a way to force disable debugallocation in Debug builds,
# e.g. for profiling (it's more rare to profile Debug builds,
# but people sometimes need to do that).
enable_debugallocation = is_debug
# Provide a way to build tcmalloc with a low memory footprint.
use_tcmalloc_small_but_slow = false
}
# This "allocator" meta-target will forward to the default allocator according
# to the build settings.
group("allocator") {
public_deps = []
deps = []
if (use_allocator == "tcmalloc") {
deps += [ ":tcmalloc" ]
}
}
config("tcmalloc_flags") {
defines = [
"TCMALLOC_USE_DOUBLYLINKED_FREELIST",
"TCMALLOC_DISABLE_HUGE_ALLOCATIONS",
]
if (enable_debugallocation) {
defines += [
# Use debugallocation for Debug builds to catch problems early
# and cleanly, http://crbug.com/30715 .
"TCMALLOC_FOR_DEBUGALLOCATION",
]
}
if (use_allocator_shim) {
defines += [ "TCMALLOC_DONT_REPLACE_SYSTEM_ALLOC" ]
}
if (use_tcmalloc_small_but_slow) {
defines += [ "TCMALLOC_SMALL_BUT_SLOW" ]
}
if (is_clang) {
cflags = [
# tcmalloc initializes some fields in the wrong order.
"-Wno-reorder",
# tcmalloc contains some unused local template specializations.
"-Wno-unused-function",
# tcmalloc uses COMPILE_ASSERT without static_assert but with typedefs.
"-Wno-unused-local-typedefs",
# for magic2_ in debugallocation.cc (only built in Debug builds) typedefs.
"-Wno-unused-private-field",
]
} else {
cflags = []
}
if (is_linux || is_android) {
# We enable all warnings by default, but upstream disables a few.
# Keep "-Wno-*" flags in sync with upstream by comparing against:
# http://code.google.com/p/google-perftools/source/browse/trunk/Makefile.am
cflags += [
"-Wno-sign-compare",
"-Wno-unused-result",
]
}
}
if (use_allocator == "tcmalloc") {
# tcmalloc currently won't compile on Android.
source_set("tcmalloc") {
tcmalloc_dir = "//third_party/tcmalloc/chromium"
# Don't check tcmalloc's includes. These files include various files like
# base/foo.h and they actually refer to tcmalloc's forked copy of base
# rather than the regular one, which confuses the header checker.
check_includes = false
sources = [
# Generated for our configuration from tcmalloc's build
# and checked in.
"$tcmalloc_dir/src/config.h",
"$tcmalloc_dir/src/config_android.h",
"$tcmalloc_dir/src/config_linux.h",
"$tcmalloc_dir/src/config_win.h",
# tcmalloc native and forked files.
"$tcmalloc_dir/src/base/abort.cc",
"$tcmalloc_dir/src/base/abort.h",
"$tcmalloc_dir/src/base/arm_instruction_set_select.h",
"$tcmalloc_dir/src/base/atomicops-internals-arm-generic.h",
"$tcmalloc_dir/src/base/atomicops-internals-arm-v6plus.h",
"$tcmalloc_dir/src/base/atomicops-internals-linuxppc.h",
"$tcmalloc_dir/src/base/atomicops-internals-macosx.h",
"$tcmalloc_dir/src/base/atomicops-internals-windows.h",
"$tcmalloc_dir/src/base/atomicops-internals-x86.cc",
"$tcmalloc_dir/src/base/atomicops-internals-x86.h",
"$tcmalloc_dir/src/base/atomicops.h",
"$tcmalloc_dir/src/base/commandlineflags.h",
# We don't list dynamic_annotations.c since its copy is already
# present in the dynamic_annotations target.
"$tcmalloc_dir/src/base/elf_mem_image.cc",
"$tcmalloc_dir/src/base/elf_mem_image.h",
"$tcmalloc_dir/src/base/linuxthreads.cc",
"$tcmalloc_dir/src/base/linuxthreads.h",
"$tcmalloc_dir/src/base/logging.cc",
"$tcmalloc_dir/src/base/logging.h",
"$tcmalloc_dir/src/base/low_level_alloc.cc",
"$tcmalloc_dir/src/base/low_level_alloc.h",
"$tcmalloc_dir/src/base/spinlock.cc",
"$tcmalloc_dir/src/base/spinlock.h",
"$tcmalloc_dir/src/base/spinlock_internal.cc",
"$tcmalloc_dir/src/base/spinlock_internal.h",
"$tcmalloc_dir/src/base/sysinfo.cc",
"$tcmalloc_dir/src/base/sysinfo.h",
"$tcmalloc_dir/src/base/vdso_support.cc",
"$tcmalloc_dir/src/base/vdso_support.h",
"$tcmalloc_dir/src/central_freelist.cc",
"$tcmalloc_dir/src/central_freelist.h",
"$tcmalloc_dir/src/common.cc",
"$tcmalloc_dir/src/common.h",
# #included by debugallocation_shim.cc
#"$tcmalloc_dir/src/debugallocation.cc",
"$tcmalloc_dir/src/fake_stacktrace_scope.cc",
"$tcmalloc_dir/src/free_list.cc",
"$tcmalloc_dir/src/free_list.h",
"$tcmalloc_dir/src/gperftools/heap-profiler.h",
"$tcmalloc_dir/src/gperftools/malloc_extension.h",
"$tcmalloc_dir/src/gperftools/malloc_hook.h",
"$tcmalloc_dir/src/gperftools/stacktrace.h",
"$tcmalloc_dir/src/internal_logging.cc",
"$tcmalloc_dir/src/internal_logging.h",
"$tcmalloc_dir/src/linked_list.h",
"$tcmalloc_dir/src/malloc_extension.cc",
"$tcmalloc_dir/src/malloc_hook-inl.h",
"$tcmalloc_dir/src/malloc_hook.cc",
"$tcmalloc_dir/src/maybe_emergency_malloc.h",
"$tcmalloc_dir/src/maybe_threads.cc",
"$tcmalloc_dir/src/maybe_threads.h",
"$tcmalloc_dir/src/page_heap.cc",
"$tcmalloc_dir/src/page_heap.h",
"$tcmalloc_dir/src/raw_printer.cc",
"$tcmalloc_dir/src/raw_printer.h",
"$tcmalloc_dir/src/sampler.cc",
"$tcmalloc_dir/src/sampler.h",
"$tcmalloc_dir/src/span.cc",
"$tcmalloc_dir/src/span.h",
"$tcmalloc_dir/src/stack_trace_table.cc",
"$tcmalloc_dir/src/stack_trace_table.h",
"$tcmalloc_dir/src/stacktrace.cc",
"$tcmalloc_dir/src/static_vars.cc",
"$tcmalloc_dir/src/static_vars.h",
"$tcmalloc_dir/src/symbolize.cc",
"$tcmalloc_dir/src/symbolize.h",
"$tcmalloc_dir/src/system-alloc.cc",
"$tcmalloc_dir/src/system-alloc.h",
# #included by debugallocation_shim.cc
#"$tcmalloc_dir/src/tcmalloc.cc",
#"$tcmalloc_dir/src/tcmalloc.h",
"$tcmalloc_dir/src/thread_cache.cc",
"$tcmalloc_dir/src/thread_cache.h",
"$tcmalloc_dir/src/windows/port.cc",
"$tcmalloc_dir/src/windows/port.h",
"debugallocation_shim.cc",
# These are both #included by allocator_shim for maximal linking.
#"generic_allocators.cc",
#"win_allocator.cc",
]
# Not included on mips64el.
if (current_cpu == "mips64el") {
sources -= [
"$tcmalloc_dir/src/base/linuxthreads.cc",
"$tcmalloc_dir/src/base/linuxthreads.h",
]
}
# Disable the heap checker in tcmalloc.
defines = [ "NO_HEAP_CHECK" ]
include_dirs = [
".",
"$tcmalloc_dir/src/base",
"$tcmalloc_dir/src",
]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":tcmalloc_flags",
]
# Thumb mode disabled due to bug in clang integrated assembler
# TODO(https://llvm.org/bugs/show_bug.cgi?id=31058)
configs -= [ "//build/config/compiler:compiler_arm_thumb" ]
configs += [ "//build/config/compiler:compiler_arm" ]
# TODO(crbug.com/633719) Make tcmalloc work with AFDO on GCC if possible.
if (!is_clang) {
configs -= [ "//build/config/compiler:afdo" ]
}
deps = [ ":buildflags" ]
if (enable_profiling) {
sources += [
"$tcmalloc_dir/src/base/thread_lister.c",
"$tcmalloc_dir/src/base/thread_lister.h",
"$tcmalloc_dir/src/heap-profile-table.cc",
"$tcmalloc_dir/src/heap-profile-table.h",
"$tcmalloc_dir/src/heap-profiler.cc",
"$tcmalloc_dir/src/memory_region_map.cc",
"$tcmalloc_dir/src/memory_region_map.h",
"$tcmalloc_dir/src/profile-handler.cc",
"$tcmalloc_dir/src/profile-handler.h",
"$tcmalloc_dir/src/profiledata.cc",
"$tcmalloc_dir/src/profiledata.h",
"$tcmalloc_dir/src/profiler.cc",
]
defines += [ "ENABLE_PROFILING=1" ]
}
if (is_linux || is_android) {
sources -= [
"$tcmalloc_dir/src/system-alloc.h",
"$tcmalloc_dir/src/windows/port.cc",
"$tcmalloc_dir/src/windows/port.h",
]
# Compiling tcmalloc with -fvisibility=default is only necessary when
# not using the allocator shim, which provides the correct visibility
# annotations for those symbols which need to be exported (see
# //base/allocator/allocator_shim_override_glibc_weak_symbols.h and
# //base/allocator/allocator_shim_internals.h for the definition of
# SHIM_ALWAYS_EXPORT).
if (!use_allocator_shim) {
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
configs += [ "//build/config/gcc:symbol_visibility_default" ]
}
ldflags = [
# Don't let linker rip this symbol out, otherwise the heap&cpu
# profilers will not initialize properly on startup.
"-Wl,-uIsHeapProfilerRunning,-uProfilerStart",
# Do the same for heap leak checker.
"-Wl,-u_Z21InitialMallocHook_NewPKvj,-u_Z22InitialMallocHook_MMapPKvS0_jiiix,-u_Z22InitialMallocHook_SbrkPKvi",
"-Wl,-u_Z21InitialMallocHook_NewPKvm,-u_Z22InitialMallocHook_MMapPKvS0_miiil,-u_Z22InitialMallocHook_SbrkPKvl",
"-Wl,-u_ZN15HeapLeakChecker12IgnoreObjectEPKv,-u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv",
]
}
# Make sure the allocation library is optimized as much as possible when
# we"re in release mode.
if (!is_debug) {
configs -= [ "//build/config/compiler:default_optimization" ]
configs += [ "//build/config/compiler:optimize_max" ]
}
deps += [ "//base/third_party/dynamic_annotations" ]
}
} # use_allocator == "tcmalloc"
buildflag_header("buildflags") {
header = "buildflags.h"
flags = [ "USE_ALLOCATOR_SHIM=$use_allocator_shim" ]
if (use_allocator == "tcmalloc") {
flags += [ "USE_TCMALLOC=1" ]
} else {
flags += [ "USE_TCMALLOC=0" ]
}
}
# Used to shim malloc symbols on Android. see //base/allocator/README.md.
config("wrap_malloc_symbols") {
ldflags = [
"-Wl,-wrap,calloc",
"-Wl,-wrap,free",
"-Wl,-wrap,malloc",
"-Wl,-wrap,memalign",
"-Wl,-wrap,posix_memalign",
"-Wl,-wrap,pvalloc",
"-Wl,-wrap,realloc",
"-Wl,-wrap,valloc",
]
}

View File

@ -0,0 +1,4 @@
primiano@chromium.org
wfh@chromium.org
# COMPONENT: Internals

View File

@ -0,0 +1,197 @@
This document describes how malloc / new calls are routed in the various Chrome
platforms.
Bare in mind that the chromium codebase does not always just use `malloc()`.
Some examples:
- Large parts of the renderer (Blink) use two home-brewed allocators,
PartitionAlloc and BlinkGC (Oilpan).
- Some subsystems, such as the V8 JavaScript engine, handle memory management
autonomously.
- Various parts of the codebase use abstractions such as `SharedMemory` or
`DiscardableMemory` which, similarly to the above, have their own page-level
memory management.
Background
----------
The `allocator` target defines at compile-time the platform-specific choice of
the allocator and extra-hooks which services calls to malloc/new. The relevant
build-time flags involved are `use_allocator` and `use_allocator_shim`.
The default choices are as follows:
**Windows**
`use_allocator: winheap`, the default Windows heap.
Additionally, `static_library` (i.e. non-component) builds have a shim
layer wrapping malloc/new, which is controlled by `use_allocator_shim`.
The shim layer provides extra security features, such as preventing large
allocations that can hit signed vs. unsigned bugs in third_party code.
**Linux Desktop / CrOS**
`use_allocator: tcmalloc`, a forked copy of tcmalloc which resides in
`third_party/tcmalloc/chromium`. Setting `use_allocator: none` causes the build
to fall back to the system (Glibc) symbols.
**Android**
`use_allocator: none`, always use the allocator symbols coming from Android's
libc (Bionic). As it is developed as part of the OS, it is considered to be
optimized for small devices and more memory-efficient than other choices.
The actual implementation backing malloc symbols in Bionic is up to the board
config and can vary (typically *dlmalloc* or *jemalloc* on most Nexus devices).
**Mac/iOS**
`use_allocator: none`, we always use the system's allocator implementation.
In addition, when building for `asan` / `msan` both the allocator and the shim
layer are disabled.
Layering and build deps
-----------------------
The `allocator` target provides both the source files for tcmalloc (where
applicable) and the linker flags required for the Windows shim layer.
The `base` target is (almost) the only one depending on `allocator`. No other
targets should depend on it, with the exception of the very few executables /
dynamic libraries that don't depend, either directly or indirectly, on `base`
within the scope of a linker unit.
More importantly, **no other place outside of `/base` should depend on the
specific allocator** (e.g., directly include `third_party/tcmalloc`).
If such a functional dependency is required that should be achieved using
abstractions in `base` (see `/base/allocator/allocator_extension.h` and
`/base/memory/`)
**Why `base` depends on `allocator`?**
Because it needs to provide services that depend on the actual allocator
implementation. In the past `base` used to pretend to be allocator-agnostic
and get the dependencies injected by other layers. This ended up being an
inconsistent mess.
See the [allocator cleanup doc][url-allocator-cleanup] for more context.
Linker unit targets (executables and shared libraries) that depend in some way
on `base` (most of the targets in the codebase) get automatically the correct
set of linker flags to pull in tcmalloc or the Windows shim-layer.
Source code
-----------
This directory contains just the allocator (i.e. shim) layer that switches
between the different underlying memory allocation implementations.
The tcmalloc library originates outside of Chromium and exists in
`../../third_party/tcmalloc` (currently, the actual location is defined in the
allocator.gyp file). The third party sources use a vendor-branch SCM pattern to
track Chromium-specific changes independently from upstream changes.
The general intent is to push local changes upstream so that over
time we no longer need any forked files.
Unified allocator shim
----------------------
On most platforms, Chrome overrides the malloc / operator new symbols (and
corresponding free / delete and other variants). This is to enforce security
checks and lately to enable the
[memory-infra heap profiler][url-memory-infra-heap-profiler].
Historically each platform had its special logic for defining the allocator
symbols in different places of the codebase. The unified allocator shim is
a project aimed to unify the symbol definition and allocator routing logic in
a central place.
- Full documentation: [Allocator shim design doc][url-allocator-shim].
- Current state: Available and enabled by default on Android, CrOS, Linux,
Mac OS and Windows.
- Tracking bug: [https://crbug.com/550886][crbug.com/550886].
- Build-time flag: `use_allocator_shim`.
**Overview of the unified allocator shim**
The allocator shim consists of three stages:
```
+-------------------------+ +-----------------------+ +----------------+
| malloc & friends | -> | shim layer | -> | Routing to |
| symbols definition | | implementation | | allocator |
+-------------------------+ +-----------------------+ +----------------+
| - libc symbols (malloc, | | - Security checks | | - tcmalloc |
| calloc, free, ...) | | - Chain of dispatchers| | - glibc |
| - C++ symbols (operator | | that can intercept | | - Android |
| new, delete, ...) | | and override | | bionic |
| - glibc weak symbols | | allocations | | - WinHeap |
| (__libc_malloc, ...) | +-----------------------+ +----------------+
+-------------------------+
```
**1. malloc symbols definition**
This stage takes care of overriding the symbols `malloc`, `free`,
`operator new`, `operator delete` and friends and routing those calls inside the
allocator shim (next point).
This is taken care of by the headers in `allocator_shim_override_*`.
*On Linux/CrOS*: the allocator symbols are defined as exported global symbols
in `allocator_shim_override_libc_symbols.h` (for `malloc`, `free` and friends)
and in `allocator_shim_override_cpp_symbols.h` (for `operator new`,
`operator delete` and friends).
This enables proper interposition of malloc symbols referenced by the main
executable and any third party libraries. Symbol resolution on Linux is a breadth first search that starts from the root link unit, that is the executable
(see EXECUTABLE AND LINKABLE FORMAT (ELF) - Portable Formats Specification).
Additionally, when tcmalloc is the default allocator, some extra glibc symbols
are also defined in `allocator_shim_override_glibc_weak_symbols.h`, for subtle
reasons explained in that file.
The Linux/CrOS shim was introduced by
[crrev.com/1675143004](https://crrev.com/1675143004).
*On Android*: load-time symbol interposition (unlike the Linux/CrOS case) is not
possible. This is because Android processes are `fork()`-ed from the Android
zygote, which pre-loads libc.so and only later native code gets loaded via
`dlopen()` (symbols from `dlopen()`-ed libraries get a different resolution
scope).
In this case, the approach instead of wrapping symbol resolution at link time
(i.e. during the build), via the `--Wl,-wrap,malloc` linker flag.
The use of this wrapping flag causes:
- All references to allocator symbols in the Chrome codebase to be rewritten as
references to `__wrap_malloc` and friends. The `__wrap_malloc` symbols are
defined in the `allocator_shim_override_linker_wrapped_symbols.h` and
route allocator calls inside the shim layer.
- The reference to the original `malloc` symbols (which typically is defined by
the system's libc.so) are accessible via the special `__real_malloc` and
friends symbols (which will be relocated, at load time, against `malloc`).
In summary, this approach is transparent to the dynamic loader, which still sees
undefined symbol references to malloc symbols.
These symbols will be resolved against libc.so as usual.
More details in [crrev.com/1719433002](https://crrev.com/1719433002).
**2. Shim layer implementation**
This stage contains the actual shim implementation. This consists of:
- A singly linked list of dispatchers (structs with function pointers to `malloc`-like functions). Dispatchers can be dynamically inserted at runtime
(using the `InsertAllocatorDispatch` API). They can intercept and override
allocator calls.
- The security checks (suicide on malloc-failure via `std::new_handler`, etc).
This happens inside `allocator_shim.cc`
**3. Final allocator routing**
The final element of the aforementioned dispatcher chain is statically defined
at build time and ultimately routes the allocator calls to the actual allocator
(as described in the *Background* section above). This is taken care of by the
headers in `allocator_shim_default_dispatch_to_*` files.
Appendixes
----------
**How does the Windows shim layer replace the malloc symbols?**
The mechanism for hooking LIBCMT in Windows is rather tricky. The core
problem is that by default, the Windows library does not declare malloc and
free as weak symbols. Because of this, they cannot be overridden. To work
around this, we start with the LIBCMT.LIB, and manually remove all allocator
related functions from it using the visual studio library tool. Once removed,
we can now link against the library and provide custom versions of the
allocator related functionality.
See the script `preb_libc.py` in this folder.
Related links
-------------
- [Unified allocator shim doc - Feb 2016][url-allocator-shim]
- [Allocator cleanup doc - Jan 2016][url-allocator-cleanup]
- [Proposal to use PartitionAlloc as default allocator](https://crbug.com/339604)
- [Memory-Infra: Tools to profile memory usage in Chrome](/docs/memory-infra/README.md)
[url-allocator-cleanup]: https://docs.google.com/document/d/1V77Kgp_4tfaaWPEZVxNevoD02wXiatnAv7Ssgr0hmjg/edit?usp=sharing
[url-memory-infra-heap-profiler]: /docs/memory-infra/heap_profiler.md
[url-allocator-shim]: https://docs.google.com/document/d/1yKlO1AO4XjpDad9rjcBOI15EKdAGsuGO_IeZy0g0kxo/edit?usp=sharing

View File

@ -0,0 +1,47 @@
# 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.
import("//build/config/chromecast_build.gni")
import("//build/config/sanitizers/sanitizers.gni")
# Temporarily disable tcmalloc on arm64 linux to get rid of compilation errors.
if (is_android || is_mac || is_ios || is_asan || is_lsan || is_tsan ||
is_msan || is_win || is_fuchsia || (is_linux && target_cpu == "arm64") ||
(is_cast_audio_only && target_cpu == "arm")) {
_default_allocator = "none"
} else {
_default_allocator = "tcmalloc"
}
# The debug CRT on Windows has some debug features that are incompatible with
# the shim. NaCl in particular does seem to link some binaries statically
# against the debug CRT with "is_nacl=false".
if ((is_linux || is_android || is_mac ||
(is_win && !is_component_build && !is_debug)) && !is_asan && !is_hwasan &&
!is_lsan && !is_tsan && !is_msan) {
_default_use_allocator_shim = true
} else {
_default_use_allocator_shim = false
}
declare_args() {
# Memory allocator to use. Set to "none" to use default allocator.
use_allocator = _default_allocator
# Causes all the allocations to be routed via allocator_shim.cc.
use_allocator_shim = _default_use_allocator_shim
}
assert(use_allocator == "none" || use_allocator == "tcmalloc")
assert(!is_win || use_allocator == "none", "Tcmalloc doesn't work on Windows.")
assert(!is_mac || use_allocator == "none", "Tcmalloc doesn't work on macOS.")
assert(!use_allocator_shim || is_linux || is_android || is_win || is_mac,
"use_allocator_shim works only on Android, Linux, macOS, and Windows.")
if (is_win && use_allocator_shim) {
assert(!is_component_build,
"The allocator shim doesn't work for the component build on Windows.")
}

View File

@ -0,0 +1,46 @@
// Copyright 2016 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 "base/allocator/allocator_check.h"
#include "base/allocator/buildflags.h"
#include "build/build_config.h"
#if defined(OS_WIN)
#include "base/allocator/winheap_stubs_win.h"
#endif
#if defined(OS_LINUX)
#include <malloc.h>
#endif
#if defined(OS_MACOSX)
#include "base/allocator/allocator_interception_mac.h"
#endif
namespace base {
namespace allocator {
bool IsAllocatorInitialized() {
#if defined(OS_WIN) && BUILDFLAG(USE_ALLOCATOR_SHIM)
// Set by allocator_shim_override_ucrt_symbols_win.h when the
// shimmed _set_new_mode() is called.
return g_is_win_shim_layer_initialized;
#elif defined(OS_LINUX) && BUILDFLAG(USE_TCMALLOC) && \
!defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
// From third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h.
// TODO(primiano): replace with an include once base can depend on allocator.
#define TC_MALLOPT_IS_OVERRIDDEN_BY_TCMALLOC 0xbeef42
return (mallopt(TC_MALLOPT_IS_OVERRIDDEN_BY_TCMALLOC, 0) ==
TC_MALLOPT_IS_OVERRIDDEN_BY_TCMALLOC);
#elif defined(OS_MACOSX) && !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
// From allocator_interception_mac.mm.
return base::allocator::g_replaced_default_zone;
#else
return true;
#endif
}
} // namespace allocator
} // namespace base

View File

@ -0,0 +1,18 @@
// Copyright 2016 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 BASE_ALLOCATOR_ALLOCATOR_ALLOCATOR_CHECK_H_
#define BASE_ALLOCATOR_ALLOCATOR_ALLOCATOR_CHECK_H_
#include "base/base_export.h"
namespace base {
namespace allocator {
BASE_EXPORT bool IsAllocatorInitialized();
} // namespace allocator
} // namespace base
#endif // BASE_ALLOCATOR_ALLOCATOR_ALLOCATOR_CHECK_H_

View File

@ -0,0 +1,77 @@
// 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 "base/allocator/allocator_extension.h"
#include "base/allocator/buildflags.h"
#include "base/logging.h"
#if BUILDFLAG(USE_TCMALLOC)
#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h"
#include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h"
#include "third_party/tcmalloc/chromium/src/gperftools/malloc_hook.h"
#endif
namespace base {
namespace allocator {
void ReleaseFreeMemory() {
#if BUILDFLAG(USE_TCMALLOC)
::MallocExtension::instance()->ReleaseFreeMemory();
#endif
}
bool GetNumericProperty(const char* name, size_t* value) {
#if BUILDFLAG(USE_TCMALLOC)
return ::MallocExtension::instance()->GetNumericProperty(name, value);
#else
return false;
#endif
}
bool SetNumericProperty(const char* name, size_t value) {
#if BUILDFLAG(USE_TCMALLOC)
return ::MallocExtension::instance()->SetNumericProperty(name, value);
#else
return false;
#endif
}
void GetHeapSample(std::string* writer) {
#if BUILDFLAG(USE_TCMALLOC)
::MallocExtension::instance()->GetHeapSample(writer);
#endif
}
bool IsHeapProfilerRunning() {
#if BUILDFLAG(USE_TCMALLOC) && defined(ENABLE_PROFILING)
return ::IsHeapProfilerRunning();
#else
return false;
#endif
}
void SetHooks(AllocHookFunc alloc_hook, FreeHookFunc free_hook) {
// TODO(sque): Use allocator shim layer instead.
#if BUILDFLAG(USE_TCMALLOC)
// Make sure no hooks get overwritten.
auto prev_alloc_hook = MallocHook::SetNewHook(alloc_hook);
if (alloc_hook)
DCHECK(!prev_alloc_hook);
auto prev_free_hook = MallocHook::SetDeleteHook(free_hook);
if (free_hook)
DCHECK(!prev_free_hook);
#endif
}
int GetCallStack(void** stack, int max_stack_size) {
#if BUILDFLAG(USE_TCMALLOC)
return MallocHook::GetCallerStackTrace(stack, max_stack_size, 0);
#else
return 0;
#endif
}
} // namespace allocator
} // namespace base

View File

@ -0,0 +1,67 @@
// 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.
#ifndef BASE_ALLOCATOR_ALLOCATOR_EXTENSION_H_
#define BASE_ALLOCATOR_ALLOCATOR_EXTENSION_H_
#include <stddef.h> // for size_t
#include <string>
#include "base/base_export.h"
#include "build/build_config.h"
namespace base {
namespace allocator {
// Callback types for alloc and free.
using AllocHookFunc = void (*)(const void*, size_t);
using FreeHookFunc = void (*)(const void*);
// Request that the allocator release any free memory it knows about to the
// system.
BASE_EXPORT void ReleaseFreeMemory();
// Get the named property's |value|. Returns true if the property is known.
// Returns false if the property is not a valid property name for the current
// allocator implementation.
// |name| or |value| cannot be NULL
BASE_EXPORT bool GetNumericProperty(const char* name, size_t* value);
// Set the named property's |value|. Returns true if the property is known and
// writable. Returns false if the property is not a valid property name for the
// current allocator implementation, or is not writable. |name| cannot be NULL.
BASE_EXPORT bool SetNumericProperty(const char* name, size_t value);
// Outputs to |writer| a sample of live objects and the stack traces
// that allocated these objects. The format of the returned output
// is equivalent to the output of the heap profiler and can
// therefore be passed to "pprof".
// NOTE: by default, the allocator does not do any heap sampling, and this
// function will always return an empty sample. To get useful
// data from GetHeapSample, you must also set the numeric property
// "tcmalloc.sampling_period_bytes" to a value such as 524288.
BASE_EXPORT void GetHeapSample(std::string* writer);
BASE_EXPORT bool IsHeapProfilerRunning();
// Register callbacks for alloc and free. Can only store one callback at a time
// for each of alloc and free.
BASE_EXPORT void SetHooks(AllocHookFunc alloc_hook, FreeHookFunc free_hook);
// Attempts to unwind the call stack from the current location where this
// function is being called from. Must be called from a hook function registered
// by calling SetSingle{Alloc,Free}Hook, directly or indirectly.
//
// Arguments:
// stack: pointer to a pre-allocated array of void*'s.
// max_stack_size: indicates the size of the array in |stack|.
//
// Returns the number of call stack frames stored in |stack|, or 0 if no call
// stack information is available.
BASE_EXPORT int GetCallStack(void** stack, int max_stack_size);
} // namespace allocator
} // namespace base
#endif // BASE_ALLOCATOR_ALLOCATOR_EXTENSION_H_

View File

@ -0,0 +1,56 @@
// Copyright 2017 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 BASE_ALLOCATOR_ALLOCATOR_INTERCEPTION_MAC_H_
#define BASE_ALLOCATOR_ALLOCATOR_INTERCEPTION_MAC_H_
#include <stddef.h>
#include "base/base_export.h"
#include "third_party/apple_apsl/malloc.h"
namespace base {
namespace allocator {
struct MallocZoneFunctions;
// Saves the function pointers currently used by the default zone.
void StoreFunctionsForDefaultZone();
// Same as StoreFunctionsForDefaultZone, but for all malloc zones.
void StoreFunctionsForAllZones();
// For all malloc zones that have been stored, replace their functions with
// |functions|.
void ReplaceFunctionsForStoredZones(const MallocZoneFunctions* functions);
extern bool g_replaced_default_zone;
// Calls the original implementation of malloc/calloc prior to interception.
bool UncheckedMallocMac(size_t size, void** result);
bool UncheckedCallocMac(size_t num_items, size_t size, void** result);
// Intercepts calls to default and purgeable malloc zones. Intercepts Core
// Foundation and Objective-C allocations.
// Has no effect on the default malloc zone if the allocator shim already
// performs that interception.
BASE_EXPORT void InterceptAllocationsMac();
// Updates all malloc zones to use their original functions.
// Also calls ClearAllMallocZonesForTesting.
BASE_EXPORT void UninterceptMallocZonesForTesting();
// Periodically checks for, and shims new malloc zones. Stops checking after 1
// minute.
BASE_EXPORT void PeriodicallyShimNewMallocZones();
// Exposed for testing.
BASE_EXPORT void ShimNewMallocZones();
BASE_EXPORT void ReplaceZoneFunctions(ChromeMallocZone* zone,
const MallocZoneFunctions* functions);
} // namespace allocator
} // namespace base
#endif // BASE_ALLOCATOR_ALLOCATOR_INTERCEPTION_MAC_H_

View File

@ -0,0 +1,568 @@
// Copyright 2017 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.
// This file contains all the logic necessary to intercept allocations on
// macOS. "malloc zones" are an abstraction that allows the process to intercept
// all malloc-related functions. There is no good mechanism [short of
// interposition] to determine new malloc zones are added, so there's no clean
// mechanism to intercept all malloc zones. This file contains logic to
// intercept the default and purgeable zones, which always exist. A cursory
// review of Chrome seems to imply that non-default zones are almost never used.
//
// This file also contains logic to intercept Core Foundation and Objective-C
// allocations. The implementations forward to the default malloc zone, so the
// only reason to intercept these calls is to re-label OOM crashes with slightly
// more details.
#include "base/allocator/allocator_interception_mac.h"
#include <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#include <errno.h>
#include <mach/mach.h>
#include <mach/mach_vm.h>
#import <objc/runtime.h>
#include <stddef.h>
#include <new>
#include "base/allocator/buildflags.h"
#include "base/allocator/malloc_zone_functions_mac.h"
#include "base/bind.h"
#include "base/bits.h"
#include "base/logging.h"
#include "base/mac/mac_util.h"
#include "base/mac/mach_logging.h"
#include "base/process/memory.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "build/build_config.h"
#include "third_party/apple_apsl/CFBase.h"
namespace base {
namespace allocator {
bool g_replaced_default_zone = false;
namespace {
bool g_oom_killer_enabled;
// Starting with Mac OS X 10.7, the zone allocators set up by the system are
// read-only, to prevent them from being overwritten in an attack. However,
// blindly unprotecting and reprotecting the zone allocators fails with
// GuardMalloc because GuardMalloc sets up its zone allocator using a block of
// memory in its bss. Explicit saving/restoring of the protection is required.
//
// This function takes a pointer to a malloc zone, de-protects it if necessary,
// and returns (in the out parameters) a region of memory (if any) to be
// re-protected when modifications are complete. This approach assumes that
// there is no contention for the protection of this memory.
void DeprotectMallocZone(ChromeMallocZone* default_zone,
mach_vm_address_t* reprotection_start,
mach_vm_size_t* reprotection_length,
vm_prot_t* reprotection_value) {
mach_port_t unused;
*reprotection_start = reinterpret_cast<mach_vm_address_t>(default_zone);
struct vm_region_basic_info_64 info;
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;
kern_return_t result = mach_vm_region(
mach_task_self(), reprotection_start, reprotection_length,
VM_REGION_BASIC_INFO_64, reinterpret_cast<vm_region_info_t>(&info),
&count, &unused);
MACH_CHECK(result == KERN_SUCCESS, result) << "mach_vm_region";
// The kernel always returns a null object for VM_REGION_BASIC_INFO_64, but
// balance it with a deallocate in case this ever changes. See 10.9.2
// xnu-2422.90.20/osfmk/vm/vm_map.c vm_map_region.
mach_port_deallocate(mach_task_self(), unused);
// Does the region fully enclose the zone pointers? Possibly unwarranted
// simplification used: using the size of a full version 8 malloc zone rather
// than the actual smaller size if the passed-in zone is not version 8.
CHECK(*reprotection_start <=
reinterpret_cast<mach_vm_address_t>(default_zone));
mach_vm_size_t zone_offset =
reinterpret_cast<mach_vm_size_t>(default_zone) -
reinterpret_cast<mach_vm_size_t>(*reprotection_start);
CHECK(zone_offset + sizeof(ChromeMallocZone) <= *reprotection_length);
if (info.protection & VM_PROT_WRITE) {
// No change needed; the zone is already writable.
*reprotection_start = 0;
*reprotection_length = 0;
*reprotection_value = VM_PROT_NONE;
} else {
*reprotection_value = info.protection;
result = mach_vm_protect(mach_task_self(), *reprotection_start,
*reprotection_length, false,
info.protection | VM_PROT_WRITE);
MACH_CHECK(result == KERN_SUCCESS, result) << "mach_vm_protect";
}
}
#if !defined(ADDRESS_SANITIZER)
MallocZoneFunctions g_old_zone;
MallocZoneFunctions g_old_purgeable_zone;
void* oom_killer_malloc(struct _malloc_zone_t* zone, size_t size) {
void* result = g_old_zone.malloc(zone, size);
if (!result && size)
TerminateBecauseOutOfMemory(size);
return result;
}
void* oom_killer_calloc(struct _malloc_zone_t* zone,
size_t num_items,
size_t size) {
void* result = g_old_zone.calloc(zone, num_items, size);
if (!result && num_items && size)
TerminateBecauseOutOfMemory(num_items * size);
return result;
}
void* oom_killer_valloc(struct _malloc_zone_t* zone, size_t size) {
void* result = g_old_zone.valloc(zone, size);
if (!result && size)
TerminateBecauseOutOfMemory(size);
return result;
}
void oom_killer_free(struct _malloc_zone_t* zone, void* ptr) {
g_old_zone.free(zone, ptr);
}
void* oom_killer_realloc(struct _malloc_zone_t* zone, void* ptr, size_t size) {
void* result = g_old_zone.realloc(zone, ptr, size);
if (!result && size)
TerminateBecauseOutOfMemory(size);
return result;
}
void* oom_killer_memalign(struct _malloc_zone_t* zone,
size_t alignment,
size_t size) {
void* result = g_old_zone.memalign(zone, alignment, size);
// Only die if posix_memalign would have returned ENOMEM, since there are
// other reasons why NULL might be returned (see
// http://opensource.apple.com/source/Libc/Libc-583/gen/malloc.c ).
if (!result && size && alignment >= sizeof(void*) &&
base::bits::IsPowerOfTwo(alignment)) {
TerminateBecauseOutOfMemory(size);
}
return result;
}
void* oom_killer_malloc_purgeable(struct _malloc_zone_t* zone, size_t size) {
void* result = g_old_purgeable_zone.malloc(zone, size);
if (!result && size)
TerminateBecauseOutOfMemory(size);
return result;
}
void* oom_killer_calloc_purgeable(struct _malloc_zone_t* zone,
size_t num_items,
size_t size) {
void* result = g_old_purgeable_zone.calloc(zone, num_items, size);
if (!result && num_items && size)
TerminateBecauseOutOfMemory(num_items * size);
return result;
}
void* oom_killer_valloc_purgeable(struct _malloc_zone_t* zone, size_t size) {
void* result = g_old_purgeable_zone.valloc(zone, size);
if (!result && size)
TerminateBecauseOutOfMemory(size);
return result;
}
void oom_killer_free_purgeable(struct _malloc_zone_t* zone, void* ptr) {
g_old_purgeable_zone.free(zone, ptr);
}
void* oom_killer_realloc_purgeable(struct _malloc_zone_t* zone,
void* ptr,
size_t size) {
void* result = g_old_purgeable_zone.realloc(zone, ptr, size);
if (!result && size)
TerminateBecauseOutOfMemory(size);
return result;
}
void* oom_killer_memalign_purgeable(struct _malloc_zone_t* zone,
size_t alignment,
size_t size) {
void* result = g_old_purgeable_zone.memalign(zone, alignment, size);
// Only die if posix_memalign would have returned ENOMEM, since there are
// other reasons why NULL might be returned (see
// http://opensource.apple.com/source/Libc/Libc-583/gen/malloc.c ).
if (!result && size && alignment >= sizeof(void*) &&
base::bits::IsPowerOfTwo(alignment)) {
TerminateBecauseOutOfMemory(size);
}
return result;
}
#endif // !defined(ADDRESS_SANITIZER)
#if !defined(ADDRESS_SANITIZER)
// === Core Foundation CFAllocators ===
bool CanGetContextForCFAllocator() {
return !base::mac::IsOSLaterThan10_15_DontCallThis();
}
CFAllocatorContext* ContextForCFAllocator(CFAllocatorRef allocator) {
ChromeCFAllocatorLions* our_allocator = const_cast<ChromeCFAllocatorLions*>(
reinterpret_cast<const ChromeCFAllocatorLions*>(allocator));
return &our_allocator->_context;
}
CFAllocatorAllocateCallBack g_old_cfallocator_system_default;
CFAllocatorAllocateCallBack g_old_cfallocator_malloc;
CFAllocatorAllocateCallBack g_old_cfallocator_malloc_zone;
void* oom_killer_cfallocator_system_default(CFIndex alloc_size,
CFOptionFlags hint,
void* info) {
void* result = g_old_cfallocator_system_default(alloc_size, hint, info);
if (!result)
TerminateBecauseOutOfMemory(alloc_size);
return result;
}
void* oom_killer_cfallocator_malloc(CFIndex alloc_size,
CFOptionFlags hint,
void* info) {
void* result = g_old_cfallocator_malloc(alloc_size, hint, info);
if (!result)
TerminateBecauseOutOfMemory(alloc_size);
return result;
}
void* oom_killer_cfallocator_malloc_zone(CFIndex alloc_size,
CFOptionFlags hint,
void* info) {
void* result = g_old_cfallocator_malloc_zone(alloc_size, hint, info);
if (!result)
TerminateBecauseOutOfMemory(alloc_size);
return result;
}
#endif // !defined(ADDRESS_SANITIZER)
// === Cocoa NSObject allocation ===
typedef id (*allocWithZone_t)(id, SEL, NSZone*);
allocWithZone_t g_old_allocWithZone;
id oom_killer_allocWithZone(id self, SEL _cmd, NSZone* zone) {
id result = g_old_allocWithZone(self, _cmd, zone);
if (!result)
TerminateBecauseOutOfMemory(0);
return result;
}
void UninterceptMallocZoneForTesting(struct _malloc_zone_t* zone) {
ChromeMallocZone* chrome_zone = reinterpret_cast<ChromeMallocZone*>(zone);
if (!IsMallocZoneAlreadyStored(chrome_zone))
return;
MallocZoneFunctions& functions = GetFunctionsForZone(zone);
ReplaceZoneFunctions(chrome_zone, &functions);
}
} // namespace
bool UncheckedMallocMac(size_t size, void** result) {
#if defined(ADDRESS_SANITIZER)
*result = malloc(size);
#else
if (g_old_zone.malloc) {
*result = g_old_zone.malloc(malloc_default_zone(), size);
} else {
*result = malloc(size);
}
#endif // defined(ADDRESS_SANITIZER)
return *result != NULL;
}
bool UncheckedCallocMac(size_t num_items, size_t size, void** result) {
#if defined(ADDRESS_SANITIZER)
*result = calloc(num_items, size);
#else
if (g_old_zone.calloc) {
*result = g_old_zone.calloc(malloc_default_zone(), num_items, size);
} else {
*result = calloc(num_items, size);
}
#endif // defined(ADDRESS_SANITIZER)
return *result != NULL;
}
void StoreFunctionsForDefaultZone() {
ChromeMallocZone* default_zone = reinterpret_cast<ChromeMallocZone*>(
malloc_default_zone());
StoreMallocZone(default_zone);
}
void StoreFunctionsForAllZones() {
// This ensures that the default zone is always at the front of the array,
// which is important for performance.
StoreFunctionsForDefaultZone();
vm_address_t* zones;
unsigned int count;
kern_return_t kr = malloc_get_all_zones(mach_task_self(), 0, &zones, &count);
if (kr != KERN_SUCCESS)
return;
for (unsigned int i = 0; i < count; ++i) {
ChromeMallocZone* zone = reinterpret_cast<ChromeMallocZone*>(zones[i]);
StoreMallocZone(zone);
}
}
void ReplaceFunctionsForStoredZones(const MallocZoneFunctions* functions) {
// The default zone does not get returned in malloc_get_all_zones().
ChromeMallocZone* default_zone =
reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
if (DoesMallocZoneNeedReplacing(default_zone, functions)) {
ReplaceZoneFunctions(default_zone, functions);
}
vm_address_t* zones;
unsigned int count;
kern_return_t kr =
malloc_get_all_zones(mach_task_self(), nullptr, &zones, &count);
if (kr != KERN_SUCCESS)
return;
for (unsigned int i = 0; i < count; ++i) {
ChromeMallocZone* zone = reinterpret_cast<ChromeMallocZone*>(zones[i]);
if (DoesMallocZoneNeedReplacing(zone, functions)) {
ReplaceZoneFunctions(zone, functions);
}
}
g_replaced_default_zone = true;
}
void InterceptAllocationsMac() {
if (g_oom_killer_enabled)
return;
g_oom_killer_enabled = true;
// === C malloc/calloc/valloc/realloc/posix_memalign ===
// This approach is not perfect, as requests for amounts of memory larger than
// MALLOC_ABSOLUTE_MAX_SIZE (currently SIZE_T_MAX - (2 * PAGE_SIZE)) will
// still fail with a NULL rather than dying (see
// http://opensource.apple.com/source/Libc/Libc-583/gen/malloc.c for details).
// Unfortunately, it's the best we can do. Also note that this does not affect
// allocations from non-default zones.
#if !defined(ADDRESS_SANITIZER)
// Don't do anything special on OOM for the malloc zones replaced by
// AddressSanitizer, as modifying or protecting them may not work correctly.
ChromeMallocZone* default_zone =
reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
if (!IsMallocZoneAlreadyStored(default_zone)) {
StoreZoneFunctions(default_zone, &g_old_zone);
MallocZoneFunctions new_functions = {};
new_functions.malloc = oom_killer_malloc;
new_functions.calloc = oom_killer_calloc;
new_functions.valloc = oom_killer_valloc;
new_functions.free = oom_killer_free;
new_functions.realloc = oom_killer_realloc;
new_functions.memalign = oom_killer_memalign;
ReplaceZoneFunctions(default_zone, &new_functions);
g_replaced_default_zone = true;
}
ChromeMallocZone* purgeable_zone =
reinterpret_cast<ChromeMallocZone*>(malloc_default_purgeable_zone());
if (purgeable_zone && !IsMallocZoneAlreadyStored(purgeable_zone)) {
StoreZoneFunctions(purgeable_zone, &g_old_purgeable_zone);
MallocZoneFunctions new_functions = {};
new_functions.malloc = oom_killer_malloc_purgeable;
new_functions.calloc = oom_killer_calloc_purgeable;
new_functions.valloc = oom_killer_valloc_purgeable;
new_functions.free = oom_killer_free_purgeable;
new_functions.realloc = oom_killer_realloc_purgeable;
new_functions.memalign = oom_killer_memalign_purgeable;
ReplaceZoneFunctions(purgeable_zone, &new_functions);
}
#endif
// === C malloc_zone_batch_malloc ===
// batch_malloc is omitted because the default malloc zone's implementation
// only supports batch_malloc for "tiny" allocations from the free list. It
// will fail for allocations larger than "tiny", and will only allocate as
// many blocks as it's able to from the free list. These factors mean that it
// can return less than the requested memory even in a non-out-of-memory
// situation. There's no good way to detect whether a batch_malloc failure is
// due to these other factors, or due to genuine memory or address space
// exhaustion. The fact that it only allocates space from the "tiny" free list
// means that it's likely that a failure will not be due to memory exhaustion.
// Similarly, these constraints on batch_malloc mean that callers must always
// be expecting to receive less memory than was requested, even in situations
// where memory pressure is not a concern. Finally, the only public interface
// to batch_malloc is malloc_zone_batch_malloc, which is specific to the
// system's malloc implementation. It's unlikely that anyone's even heard of
// it.
#ifndef ADDRESS_SANITIZER
// === Core Foundation CFAllocators ===
// This will not catch allocation done by custom allocators, but will catch
// all allocation done by system-provided ones.
CHECK(!g_old_cfallocator_system_default && !g_old_cfallocator_malloc &&
!g_old_cfallocator_malloc_zone)
<< "Old allocators unexpectedly non-null";
bool cf_allocator_internals_known = CanGetContextForCFAllocator();
if (cf_allocator_internals_known) {
CFAllocatorContext* context =
ContextForCFAllocator(kCFAllocatorSystemDefault);
CHECK(context) << "Failed to get context for kCFAllocatorSystemDefault.";
g_old_cfallocator_system_default = context->allocate;
CHECK(g_old_cfallocator_system_default)
<< "Failed to get kCFAllocatorSystemDefault allocation function.";
context->allocate = oom_killer_cfallocator_system_default;
context = ContextForCFAllocator(kCFAllocatorMalloc);
CHECK(context) << "Failed to get context for kCFAllocatorMalloc.";
g_old_cfallocator_malloc = context->allocate;
CHECK(g_old_cfallocator_malloc)
<< "Failed to get kCFAllocatorMalloc allocation function.";
context->allocate = oom_killer_cfallocator_malloc;
context = ContextForCFAllocator(kCFAllocatorMallocZone);
CHECK(context) << "Failed to get context for kCFAllocatorMallocZone.";
g_old_cfallocator_malloc_zone = context->allocate;
CHECK(g_old_cfallocator_malloc_zone)
<< "Failed to get kCFAllocatorMallocZone allocation function.";
context->allocate = oom_killer_cfallocator_malloc_zone;
} else {
DLOG(WARNING) << "Internals of CFAllocator not known; out-of-memory "
"failures via CFAllocator will not result in termination. "
"http://crbug.com/45650";
}
#endif
// === Cocoa NSObject allocation ===
// Note that both +[NSObject new] and +[NSObject alloc] call through to
// +[NSObject allocWithZone:].
CHECK(!g_old_allocWithZone) << "Old allocator unexpectedly non-null";
Class nsobject_class = [NSObject class];
Method orig_method =
class_getClassMethod(nsobject_class, @selector(allocWithZone:));
g_old_allocWithZone =
reinterpret_cast<allocWithZone_t>(method_getImplementation(orig_method));
CHECK(g_old_allocWithZone)
<< "Failed to get allocWithZone allocation function.";
method_setImplementation(orig_method,
reinterpret_cast<IMP>(oom_killer_allocWithZone));
}
void UninterceptMallocZonesForTesting() {
UninterceptMallocZoneForTesting(malloc_default_zone());
vm_address_t* zones;
unsigned int count;
kern_return_t kr = malloc_get_all_zones(mach_task_self(), 0, &zones, &count);
CHECK(kr == KERN_SUCCESS);
for (unsigned int i = 0; i < count; ++i) {
UninterceptMallocZoneForTesting(
reinterpret_cast<struct _malloc_zone_t*>(zones[i]));
}
ClearAllMallocZonesForTesting();
}
namespace {
void ShimNewMallocZonesAndReschedule(base::Time end_time,
base::TimeDelta delay) {
ShimNewMallocZones();
if (base::Time::Now() > end_time)
return;
base::TimeDelta next_delay = delay * 2;
SequencedTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE,
base::BindOnce(&ShimNewMallocZonesAndReschedule, end_time, next_delay),
delay);
}
} // namespace
void PeriodicallyShimNewMallocZones() {
base::Time end_time = base::Time::Now() + base::TimeDelta::FromMinutes(1);
base::TimeDelta initial_delay = base::TimeDelta::FromSeconds(1);
ShimNewMallocZonesAndReschedule(end_time, initial_delay);
}
void ShimNewMallocZones() {
StoreFunctionsForAllZones();
// Use the functions for the default zone as a template to replace those
// new zones.
ChromeMallocZone* default_zone =
reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
DCHECK(IsMallocZoneAlreadyStored(default_zone));
MallocZoneFunctions new_functions;
StoreZoneFunctions(default_zone, &new_functions);
ReplaceFunctionsForStoredZones(&new_functions);
}
void ReplaceZoneFunctions(ChromeMallocZone* zone,
const MallocZoneFunctions* functions) {
// Remove protection.
mach_vm_address_t reprotection_start = 0;
mach_vm_size_t reprotection_length = 0;
vm_prot_t reprotection_value = VM_PROT_NONE;
DeprotectMallocZone(zone, &reprotection_start, &reprotection_length,
&reprotection_value);
CHECK(functions->malloc && functions->calloc && functions->valloc &&
functions->free && functions->realloc);
zone->malloc = functions->malloc;
zone->calloc = functions->calloc;
zone->valloc = functions->valloc;
zone->free = functions->free;
zone->realloc = functions->realloc;
if (functions->batch_malloc)
zone->batch_malloc = functions->batch_malloc;
if (functions->batch_free)
zone->batch_free = functions->batch_free;
if (functions->size)
zone->size = functions->size;
if (zone->version >= 5 && functions->memalign) {
zone->memalign = functions->memalign;
}
if (zone->version >= 6 && functions->free_definite_size) {
zone->free_definite_size = functions->free_definite_size;
}
// Restore protection if it was active.
if (reprotection_start) {
kern_return_t result =
mach_vm_protect(mach_task_self(), reprotection_start,
reprotection_length, false, reprotection_value);
MACH_CHECK(result == KERN_SUCCESS, result) << "mach_vm_protect";
}
}
} // namespace allocator
} // namespace base

View File

@ -0,0 +1,64 @@
// Copyright 2017 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 <mach/mach.h>
#include "base/allocator/allocator_interception_mac.h"
#include "base/allocator/allocator_shim.h"
#include "base/allocator/malloc_zone_functions_mac.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace base {
namespace allocator {
namespace {
void ResetMallocZone(ChromeMallocZone* zone) {
MallocZoneFunctions& functions = GetFunctionsForZone(zone);
ReplaceZoneFunctions(zone, &functions);
}
void ResetAllMallocZones() {
ChromeMallocZone* default_malloc_zone =
reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
ResetMallocZone(default_malloc_zone);
vm_address_t* zones;
unsigned int count;
kern_return_t kr = malloc_get_all_zones(mach_task_self(), 0, &zones, &count);
if (kr != KERN_SUCCESS)
return;
for (unsigned int i = 0; i < count; ++i) {
ChromeMallocZone* zone = reinterpret_cast<ChromeMallocZone*>(zones[i]);
ResetMallocZone(zone);
}
}
} // namespace
class AllocatorInterceptionTest : public testing::Test {
protected:
void TearDown() override {
ResetAllMallocZones();
ClearAllMallocZonesForTesting();
}
};
#if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
TEST_F(AllocatorInterceptionTest, ShimNewMallocZones) {
InitializeAllocatorShim();
ChromeMallocZone* default_malloc_zone =
reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
malloc_zone_t new_zone;
memset(&new_zone, 1, sizeof(malloc_zone_t));
malloc_zone_register(&new_zone);
EXPECT_NE(new_zone.malloc, default_malloc_zone->malloc);
ShimNewMallocZones();
EXPECT_EQ(new_zone.malloc, default_malloc_zone->malloc);
malloc_zone_unregister(&new_zone);
}
#endif
} // namespace allocator
} // namespace base

View File

@ -0,0 +1,386 @@
// Copyright 2016 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 "base/allocator/allocator_shim.h"
#include <errno.h>
#include <atomic>
#include <new>
#include "base/allocator/buildflags.h"
#include "base/atomicops.h"
#include "base/bits.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/process/process_metrics.h"
#include "base/threading/platform_thread.h"
#include "build/build_config.h"
#if !defined(OS_WIN)
#include <unistd.h>
#else
#include "base/allocator/winheap_stubs_win.h"
#endif
#if defined(OS_MACOSX)
#include <malloc/malloc.h>
#include "base/allocator/allocator_interception_mac.h"
#endif
// No calls to malloc / new in this file. They would would cause re-entrancy of
// the shim, which is hard to deal with. Keep this code as simple as possible
// and don't use any external C++ object here, not even //base ones. Even if
// they are safe to use today, in future they might be refactored.
namespace {
base::subtle::AtomicWord g_chain_head =
reinterpret_cast<base::subtle::AtomicWord>(
&base::allocator::AllocatorDispatch::default_dispatch);
bool g_call_new_handler_on_malloc_failure = false;
inline size_t GetCachedPageSize() {
static size_t pagesize = 0;
if (!pagesize)
pagesize = base::GetPageSize();
return pagesize;
}
// Calls the std::new handler thread-safely. Returns true if a new_handler was
// set and called, false if no new_handler was set.
bool CallNewHandler(size_t size) {
#if defined(OS_WIN)
return base::allocator::WinCallNewHandler(size);
#else
std::new_handler nh = std::get_new_handler();
if (!nh)
return false;
(*nh)();
// Assume the new_handler will abort if it fails. Exception are disabled and
// we don't support the case of a new_handler throwing std::bad_balloc.
return true;
#endif
}
inline const base::allocator::AllocatorDispatch* GetChainHead() {
// TODO(primiano): Just use NoBarrier_Load once crbug.com/593344 is fixed.
// Unfortunately due to that bug NoBarrier_Load() is mistakenly fully
// barriered on Linux+Clang, and that causes visible perf regressons.
return reinterpret_cast<const base::allocator::AllocatorDispatch*>(
#if defined(OS_LINUX) && defined(__clang__)
*static_cast<const volatile base::subtle::AtomicWord*>(&g_chain_head)
#else
base::subtle::NoBarrier_Load(&g_chain_head)
#endif
);
}
} // namespace
namespace base {
namespace allocator {
void SetCallNewHandlerOnMallocFailure(bool value) {
g_call_new_handler_on_malloc_failure = value;
}
void* UncheckedAlloc(size_t size) {
const allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->alloc_function(chain_head, size, nullptr);
}
void InsertAllocatorDispatch(AllocatorDispatch* dispatch) {
// Loop in case of (an unlikely) race on setting the list head.
size_t kMaxRetries = 7;
for (size_t i = 0; i < kMaxRetries; ++i) {
const AllocatorDispatch* chain_head = GetChainHead();
dispatch->next = chain_head;
// This function guarantees to be thread-safe w.r.t. concurrent
// insertions. It also has to guarantee that all the threads always
// see a consistent chain, hence the atomic_thread_fence() below.
// InsertAllocatorDispatch() is NOT a fastpath, as opposite to malloc(), so
// we don't really want this to be a release-store with a corresponding
// acquire-load during malloc().
std::atomic_thread_fence(std::memory_order_seq_cst);
subtle::AtomicWord old_value =
reinterpret_cast<subtle::AtomicWord>(chain_head);
// Set the chain head to the new dispatch atomically. If we lose the race,
// the comparison will fail, and the new head of chain will be returned.
if (subtle::NoBarrier_CompareAndSwap(
&g_chain_head, old_value,
reinterpret_cast<subtle::AtomicWord>(dispatch)) == old_value) {
// Success.
return;
}
}
CHECK(false); // Too many retries, this shouldn't happen.
}
void RemoveAllocatorDispatchForTesting(AllocatorDispatch* dispatch) {
DCHECK_EQ(GetChainHead(), dispatch);
subtle::NoBarrier_Store(&g_chain_head,
reinterpret_cast<subtle::AtomicWord>(dispatch->next));
}
} // namespace allocator
} // namespace base
// The Shim* functions below are the entry-points into the shim-layer and
// are supposed to be invoked by the allocator_shim_override_*
// headers to route the malloc / new symbols through the shim layer.
// They are defined as ALWAYS_INLINE in order to remove a level of indirection
// between the system-defined entry points and the shim implementations.
extern "C" {
// The general pattern for allocations is:
// - Try to allocate, if succeded return the pointer.
// - If the allocation failed:
// - Call the std::new_handler if it was a C++ allocation.
// - Call the std::new_handler if it was a malloc() (or calloc() or similar)
// AND SetCallNewHandlerOnMallocFailure(true).
// - If the std::new_handler is NOT set just return nullptr.
// - If the std::new_handler is set:
// - Assume it will abort() if it fails (very likely the new_handler will
// just suicide priting a message).
// - Assume it did succeed if it returns, in which case reattempt the alloc.
ALWAYS_INLINE void* ShimCppNew(size_t size) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr;
do {
void* context = nullptr;
#if defined(OS_MACOSX)
context = malloc_default_zone();
#endif
ptr = chain_head->alloc_function(chain_head, size, context);
} while (!ptr && CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void* ShimCppAlignedNew(size_t size, size_t alignment) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr;
do {
void* context = nullptr;
#if defined(OS_MACOSX)
context = malloc_default_zone();
#endif
ptr = chain_head->alloc_aligned_function(chain_head, alignment, size,
context);
} while (!ptr && CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void ShimCppDelete(void* address) {
void* context = nullptr;
#if defined(OS_MACOSX)
context = malloc_default_zone();
#endif
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->free_function(chain_head, address, context);
}
ALWAYS_INLINE void* ShimMalloc(size_t size, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr;
do {
ptr = chain_head->alloc_function(chain_head, size, context);
} while (!ptr && g_call_new_handler_on_malloc_failure &&
CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void* ShimCalloc(size_t n, size_t size, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr;
do {
ptr = chain_head->alloc_zero_initialized_function(chain_head, n, size,
context);
} while (!ptr && g_call_new_handler_on_malloc_failure &&
CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void* ShimRealloc(void* address, size_t size, void* context) {
// realloc(size == 0) means free() and might return a nullptr. We should
// not call the std::new_handler in that case, though.
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr;
do {
ptr = chain_head->realloc_function(chain_head, address, size, context);
} while (!ptr && size && g_call_new_handler_on_malloc_failure &&
CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void* ShimMemalign(size_t alignment, size_t size, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr;
do {
ptr = chain_head->alloc_aligned_function(chain_head, alignment, size,
context);
} while (!ptr && g_call_new_handler_on_malloc_failure &&
CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE int ShimPosixMemalign(void** res, size_t alignment, size_t size) {
// posix_memalign is supposed to check the arguments. See tc_posix_memalign()
// in tc_malloc.cc.
if (((alignment % sizeof(void*)) != 0) ||
!base::bits::IsPowerOfTwo(alignment)) {
return EINVAL;
}
void* ptr = ShimMemalign(alignment, size, nullptr);
*res = ptr;
return ptr ? 0 : ENOMEM;
}
ALWAYS_INLINE void* ShimValloc(size_t size, void* context) {
return ShimMemalign(GetCachedPageSize(), size, context);
}
ALWAYS_INLINE void* ShimPvalloc(size_t size) {
// pvalloc(0) should allocate one page, according to its man page.
if (size == 0) {
size = GetCachedPageSize();
} else {
size = (size + GetCachedPageSize() - 1) & ~(GetCachedPageSize() - 1);
}
// The third argument is nullptr because pvalloc is glibc only and does not
// exist on OSX/BSD systems.
return ShimMemalign(GetCachedPageSize(), size, nullptr);
}
ALWAYS_INLINE void ShimFree(void* address, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->free_function(chain_head, address, context);
}
ALWAYS_INLINE size_t ShimGetSizeEstimate(const void* address, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->get_size_estimate_function(
chain_head, const_cast<void*>(address), context);
}
ALWAYS_INLINE unsigned ShimBatchMalloc(size_t size,
void** results,
unsigned num_requested,
void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->batch_malloc_function(chain_head, size, results,
num_requested, context);
}
ALWAYS_INLINE void ShimBatchFree(void** to_be_freed,
unsigned num_to_be_freed,
void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->batch_free_function(chain_head, to_be_freed,
num_to_be_freed, context);
}
ALWAYS_INLINE void ShimFreeDefiniteSize(void* ptr, size_t size, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->free_definite_size_function(chain_head, ptr, size,
context);
}
ALWAYS_INLINE void* ShimAlignedMalloc(size_t size,
size_t alignment,
void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr = nullptr;
do {
ptr = chain_head->aligned_malloc_function(chain_head, size, alignment,
context);
} while (!ptr && g_call_new_handler_on_malloc_failure &&
CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void* ShimAlignedRealloc(void* address,
size_t size,
size_t alignment,
void* context) {
// _aligned_realloc(size == 0) means _aligned_free() and might return a
// nullptr. We should not call the std::new_handler in that case, though.
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
void* ptr = nullptr;
do {
ptr = chain_head->aligned_realloc_function(chain_head, address, size,
alignment, context);
} while (!ptr && size && g_call_new_handler_on_malloc_failure &&
CallNewHandler(size));
return ptr;
}
ALWAYS_INLINE void ShimAlignedFree(void* address, void* context) {
const base::allocator::AllocatorDispatch* const chain_head = GetChainHead();
return chain_head->aligned_free_function(chain_head, address, context);
}
} // extern "C"
#if !defined(OS_WIN) && !defined(OS_MACOSX)
// Cpp symbols (new / delete) should always be routed through the shim layer
// except on Windows and macOS where the malloc intercept is deep enough that it
// also catches the cpp calls.
#include "base/allocator/allocator_shim_override_cpp_symbols.h"
#endif
#if defined(OS_ANDROID)
// Android does not support symbol interposition. The way malloc symbols are
// intercepted on Android is by using link-time -wrap flags.
#include "base/allocator/allocator_shim_override_linker_wrapped_symbols.h"
#elif defined(OS_WIN)
// On Windows we use plain link-time overriding of the CRT symbols.
#include "base/allocator/allocator_shim_override_ucrt_symbols_win.h"
#elif defined(OS_MACOSX)
#include "base/allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.h"
#include "base/allocator/allocator_shim_override_mac_symbols.h"
#else
#include "base/allocator/allocator_shim_override_libc_symbols.h"
#endif
// In the case of tcmalloc we also want to plumb into the glibc hooks
// to avoid that allocations made in glibc itself (e.g., strdup()) get
// accidentally performed on the glibc heap instead of the tcmalloc one.
#if BUILDFLAG(USE_TCMALLOC)
#include "base/allocator/allocator_shim_override_glibc_weak_symbols.h"
#endif
#if defined(OS_MACOSX)
namespace base {
namespace allocator {
void InitializeAllocatorShim() {
// Prepares the default dispatch. After the intercepted malloc calls have
// traversed the shim this will route them to the default malloc zone.
InitializeDefaultDispatchToMacAllocator();
MallocZoneFunctions functions = MallocZoneFunctionsToReplaceDefault();
// This replaces the default malloc zone, causing calls to malloc & friends
// from the codebase to be routed to ShimMalloc() above.
base::allocator::ReplaceFunctionsForStoredZones(&functions);
}
} // namespace allocator
} // namespace base
#endif
// Cross-checks.
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
#error The allocator shim should not be compiled when building for memory tools.
#endif
#if (defined(__GNUC__) && defined(__EXCEPTIONS)) || \
(defined(_MSC_VER) && defined(_CPPUNWIND))
#error This code cannot be used when exceptions are turned on.
#endif

View File

@ -0,0 +1,152 @@
// Copyright 2016 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 BASE_ALLOCATOR_ALLOCATOR_SHIM_H_
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_H_
#include <stddef.h>
#include "base/base_export.h"
#include "build/build_config.h"
namespace base {
namespace allocator {
// Allocator Shim API. Allows to:
// - Configure the behavior of the allocator (what to do on OOM failures).
// - Install new hooks (AllocatorDispatch) in the allocator chain.
// When this shim layer is enabled, the route of an allocation is as-follows:
//
// [allocator_shim_override_*.h] Intercept malloc() / operator new calls:
// The override_* headers define the symbols required to intercept calls to
// malloc() and operator new (if not overridden by specific C++ classes).
//
// [allocator_shim.cc] Routing allocation calls to the shim:
// The headers above route the calls to the internal ShimMalloc(), ShimFree(),
// ShimCppNew() etc. methods defined in allocator_shim.cc.
// These methods will: (1) forward the allocation call to the front of the
// AllocatorDispatch chain. (2) perform security hardenings (e.g., might
// call std::new_handler on OOM failure).
//
// [allocator_shim_default_dispatch_to_*.cc] The AllocatorDispatch chain:
// It is a singly linked list where each element is a struct with function
// pointers (|malloc_function|, |free_function|, etc). Normally the chain
// consists of a single AllocatorDispatch element, herein called
// the "default dispatch", which is statically defined at build time and
// ultimately routes the calls to the actual allocator defined by the build
// config (tcmalloc, glibc, ...).
//
// It is possible to dynamically insert further AllocatorDispatch stages
// to the front of the chain, for debugging / profiling purposes.
//
// All the functions must be thread safe. The shim does not enforce any
// serialization. This is to route to thread-aware allocators (e.g, tcmalloc)
// wihout introducing unnecessary perf hits.
struct AllocatorDispatch {
using AllocFn = void*(const AllocatorDispatch* self,
size_t size,
void* context);
using AllocZeroInitializedFn = void*(const AllocatorDispatch* self,
size_t n,
size_t size,
void* context);
using AllocAlignedFn = void*(const AllocatorDispatch* self,
size_t alignment,
size_t size,
void* context);
using ReallocFn = void*(const AllocatorDispatch* self,
void* address,
size_t size,
void* context);
using FreeFn = void(const AllocatorDispatch* self,
void* address,
void* context);
// Returns the best available estimate for the actual amount of memory
// consumed by the allocation |address|. If possible, this should include
// heap overhead or at least a decent estimate of the full cost of the
// allocation. If no good estimate is possible, returns zero.
using GetSizeEstimateFn = size_t(const AllocatorDispatch* self,
void* address,
void* context);
using BatchMallocFn = unsigned(const AllocatorDispatch* self,
size_t size,
void** results,
unsigned num_requested,
void* context);
using BatchFreeFn = void(const AllocatorDispatch* self,
void** to_be_freed,
unsigned num_to_be_freed,
void* context);
using FreeDefiniteSizeFn = void(const AllocatorDispatch* self,
void* ptr,
size_t size,
void* context);
using AlignedMallocFn = void*(const AllocatorDispatch* self,
size_t size,
size_t alignment,
void* context);
using AlignedReallocFn = void*(const AllocatorDispatch* self,
void* address,
size_t size,
size_t alignment,
void* context);
using AlignedFreeFn = void(const AllocatorDispatch* self,
void* address,
void* context);
AllocFn* const alloc_function;
AllocZeroInitializedFn* const alloc_zero_initialized_function;
AllocAlignedFn* const alloc_aligned_function;
ReallocFn* const realloc_function;
FreeFn* const free_function;
GetSizeEstimateFn* const get_size_estimate_function;
// batch_malloc, batch_free, and free_definite_size are specific to the OSX
// and iOS allocators.
BatchMallocFn* const batch_malloc_function;
BatchFreeFn* const batch_free_function;
FreeDefiniteSizeFn* const free_definite_size_function;
// _aligned_malloc, _aligned_realloc, and _aligned_free are specific to the
// Windows allocator.
AlignedMallocFn* const aligned_malloc_function;
AlignedReallocFn* const aligned_realloc_function;
AlignedFreeFn* const aligned_free_function;
const AllocatorDispatch* next;
// |default_dispatch| is statically defined by one (and only one) of the
// allocator_shim_default_dispatch_to_*.cc files, depending on the build
// configuration.
static const AllocatorDispatch default_dispatch;
};
// When true makes malloc behave like new, w.r.t calling the new_handler if
// the allocation fails (see set_new_mode() in Windows).
BASE_EXPORT void SetCallNewHandlerOnMallocFailure(bool value);
// Allocates |size| bytes or returns nullptr. It does NOT call the new_handler,
// regardless of SetCallNewHandlerOnMallocFailure().
BASE_EXPORT void* UncheckedAlloc(size_t size);
// Inserts |dispatch| in front of the allocator chain. This method is
// thread-safe w.r.t concurrent invocations of InsertAllocatorDispatch().
// The callers have responsibility for inserting a single dispatch no more
// than once.
BASE_EXPORT void InsertAllocatorDispatch(AllocatorDispatch* dispatch);
// Test-only. Rationale: (1) lack of use cases; (2) dealing safely with a
// removal of arbitrary elements from a singly linked list would require a lock
// in malloc(), which we really don't want.
BASE_EXPORT void RemoveAllocatorDispatchForTesting(AllocatorDispatch* dispatch);
#if defined(OS_MACOSX)
// On macOS, the allocator shim needs to be turned on during runtime.
BASE_EXPORT void InitializeAllocatorShim();
#endif // defined(OS_MACOSX)
} // namespace allocator
} // namespace base
#endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_H_

View File

@ -0,0 +1,88 @@
// Copyright 2016 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 "base/allocator/allocator_shim.h"
#include "base/compiler_specific.h"
#include <dlfcn.h>
#include <malloc.h>
// This translation unit defines a default dispatch for the allocator shim which
// routes allocations to libc functions.
// The code here is strongly inspired from tcmalloc's libc_override_glibc.h.
extern "C" {
void* __libc_malloc(size_t size);
void* __libc_calloc(size_t n, size_t size);
void* __libc_realloc(void* address, size_t size);
void* __libc_memalign(size_t alignment, size_t size);
void __libc_free(void* ptr);
} // extern "C"
namespace {
using base::allocator::AllocatorDispatch;
void* GlibcMalloc(const AllocatorDispatch*, size_t size, void* context) {
return __libc_malloc(size);
}
void* GlibcCalloc(const AllocatorDispatch*,
size_t n,
size_t size,
void* context) {
return __libc_calloc(n, size);
}
void* GlibcRealloc(const AllocatorDispatch*,
void* address,
size_t size,
void* context) {
return __libc_realloc(address, size);
}
void* GlibcMemalign(const AllocatorDispatch*,
size_t alignment,
size_t size,
void* context) {
return __libc_memalign(alignment, size);
}
void GlibcFree(const AllocatorDispatch*, void* address, void* context) {
__libc_free(address);
}
NO_SANITIZE("cfi-icall")
size_t GlibcGetSizeEstimate(const AllocatorDispatch*,
void* address,
void* context) {
// glibc does not expose an alias to resolve malloc_usable_size. Dynamically
// resolve it instead. This should be safe because glibc (and hence dlfcn)
// does not use malloc_size internally and so there should not be a risk of
// recursion.
using MallocUsableSizeFunction = decltype(malloc_usable_size)*;
static MallocUsableSizeFunction fn_ptr =
reinterpret_cast<MallocUsableSizeFunction>(
dlsym(RTLD_NEXT, "malloc_usable_size"));
return fn_ptr(address);
}
} // namespace
const AllocatorDispatch AllocatorDispatch::default_dispatch = {
&GlibcMalloc, /* alloc_function */
&GlibcCalloc, /* alloc_zero_initialized_function */
&GlibcMemalign, /* alloc_aligned_function */
&GlibcRealloc, /* realloc_function */
&GlibcFree, /* free_function */
&GlibcGetSizeEstimate, /* get_size_estimate_function */
nullptr, /* batch_malloc_function */
nullptr, /* batch_free_function */
nullptr, /* free_definite_size_function */
nullptr, /* aligned_malloc_function */
nullptr, /* aligned_realloc_function */
nullptr, /* aligned_free_function */
nullptr, /* next */
};

View File

@ -0,0 +1,76 @@
// Copyright 2016 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 <malloc.h>
#include "base/allocator/allocator_shim.h"
#include "build/build_config.h"
// This translation unit defines a default dispatch for the allocator shim which
// routes allocations to the original libc functions when using the link-time
// -Wl,-wrap,malloc approach (see README.md).
// The __real_X functions here are special symbols that the linker will relocate
// against the real "X" undefined symbol, so that __real_malloc becomes the
// equivalent of what an undefined malloc symbol reference would have been.
// This is the counterpart of allocator_shim_override_linker_wrapped_symbols.h,
// which routes the __wrap_X functions into the shim.
extern "C" {
void* __real_malloc(size_t);
void* __real_calloc(size_t, size_t);
void* __real_realloc(void*, size_t);
void* __real_memalign(size_t, size_t);
void* __real_free(void*);
} // extern "C"
namespace {
using base::allocator::AllocatorDispatch;
void* RealMalloc(const AllocatorDispatch*, size_t size, void* context) {
return __real_malloc(size);
}
void* RealCalloc(const AllocatorDispatch*,
size_t n,
size_t size,
void* context) {
return __real_calloc(n, size);
}
void* RealRealloc(const AllocatorDispatch*,
void* address,
size_t size,
void* context) {
return __real_realloc(address, size);
}
void* RealMemalign(const AllocatorDispatch*,
size_t alignment,
size_t size,
void* context) {
return __real_memalign(alignment, size);
}
void RealFree(const AllocatorDispatch*, void* address, void* context) {
__real_free(address);
}
} // namespace
const AllocatorDispatch AllocatorDispatch::default_dispatch = {
&RealMalloc, /* alloc_function */
&RealCalloc, /* alloc_zero_initialized_function */
&RealMemalign, /* alloc_aligned_function */
&RealRealloc, /* realloc_function */
&RealFree, /* free_function */
nullptr, /* get_size_estimate_function */
nullptr, /* batch_malloc_function */
nullptr, /* batch_free_function */
nullptr, /* free_definite_size_function */
nullptr, /* aligned_malloc_function */
nullptr, /* aligned_realloc_function */
nullptr, /* aligned_free_function */
nullptr, /* next */
};

View File

@ -0,0 +1,112 @@
// Copyright 2017 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 "base/allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.h"
#include <utility>
#include "base/allocator/allocator_interception_mac.h"
#include "base/allocator/allocator_shim.h"
#include "base/allocator/malloc_zone_functions_mac.h"
namespace base {
namespace allocator {
namespace {
void* MallocImpl(const AllocatorDispatch*, size_t size, void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
return functions.malloc(reinterpret_cast<struct _malloc_zone_t*>(context),
size);
}
void* CallocImpl(const AllocatorDispatch*,
size_t n,
size_t size,
void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
return functions.calloc(reinterpret_cast<struct _malloc_zone_t*>(context), n,
size);
}
void* MemalignImpl(const AllocatorDispatch*,
size_t alignment,
size_t size,
void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
return functions.memalign(reinterpret_cast<struct _malloc_zone_t*>(context),
alignment, size);
}
void* ReallocImpl(const AllocatorDispatch*,
void* ptr,
size_t size,
void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
return functions.realloc(reinterpret_cast<struct _malloc_zone_t*>(context),
ptr, size);
}
void FreeImpl(const AllocatorDispatch*, void* ptr, void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
functions.free(reinterpret_cast<struct _malloc_zone_t*>(context), ptr);
}
size_t GetSizeEstimateImpl(const AllocatorDispatch*, void* ptr, void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
return functions.size(reinterpret_cast<struct _malloc_zone_t*>(context), ptr);
}
unsigned BatchMallocImpl(const AllocatorDispatch* self,
size_t size,
void** results,
unsigned num_requested,
void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
return functions.batch_malloc(
reinterpret_cast<struct _malloc_zone_t*>(context), size, results,
num_requested);
}
void BatchFreeImpl(const AllocatorDispatch* self,
void** to_be_freed,
unsigned num_to_be_freed,
void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
functions.batch_free(reinterpret_cast<struct _malloc_zone_t*>(context),
to_be_freed, num_to_be_freed);
}
void FreeDefiniteSizeImpl(const AllocatorDispatch* self,
void* ptr,
size_t size,
void* context) {
MallocZoneFunctions& functions = GetFunctionsForZone(context);
functions.free_definite_size(
reinterpret_cast<struct _malloc_zone_t*>(context), ptr, size);
}
} // namespace
void InitializeDefaultDispatchToMacAllocator() {
StoreFunctionsForAllZones();
}
const AllocatorDispatch AllocatorDispatch::default_dispatch = {
&MallocImpl, /* alloc_function */
&CallocImpl, /* alloc_zero_initialized_function */
&MemalignImpl, /* alloc_aligned_function */
&ReallocImpl, /* realloc_function */
&FreeImpl, /* free_function */
&GetSizeEstimateImpl, /* get_size_estimate_function */
&BatchMallocImpl, /* batch_malloc_function */
&BatchFreeImpl, /* batch_free_function */
&FreeDefiniteSizeImpl, /* free_definite_size_function */
nullptr, /* aligned_malloc_function */
nullptr, /* aligned_realloc_function */
nullptr, /* aligned_free_function */
nullptr, /* next */
};
} // namespace allocator
} // namespace base

View File

@ -0,0 +1,19 @@
// Copyright 2017 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 BASE_ALLOCATOR_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_ZONED_MALLOC_H_
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_ZONED_MALLOC_H_
namespace base {
namespace allocator {
// This initializes AllocatorDispatch::default_dispatch by saving pointers to
// the functions in the current default malloc zone. This must be called before
// the default malloc zone is changed to have its intended effect.
void InitializeDefaultDispatchToMacAllocator();
} // namespace allocator
} // namespace base
#endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_ZONED_MALLOC_H_

View File

@ -0,0 +1,84 @@
// Copyright 2016 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 "base/allocator/allocator_shim.h"
#include "base/allocator/allocator_shim_internals.h"
#include "third_party/tcmalloc/chromium/src/config.h"
#include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
namespace {
using base::allocator::AllocatorDispatch;
void* TCMalloc(const AllocatorDispatch*, size_t size, void* context) {
return tc_malloc(size);
}
void* TCCalloc(const AllocatorDispatch*, size_t n, size_t size, void* context) {
return tc_calloc(n, size);
}
void* TCMemalign(const AllocatorDispatch*,
size_t alignment,
size_t size,
void* context) {
return tc_memalign(alignment, size);
}
void* TCRealloc(const AllocatorDispatch*,
void* address,
size_t size,
void* context) {
return tc_realloc(address, size);
}
void TCFree(const AllocatorDispatch*, void* address, void* context) {
tc_free(address);
}
size_t TCGetSizeEstimate(const AllocatorDispatch*,
void* address,
void* context) {
return tc_malloc_size(address);
}
} // namespace
const AllocatorDispatch AllocatorDispatch::default_dispatch = {
&TCMalloc, /* alloc_function */
&TCCalloc, /* alloc_zero_initialized_function */
&TCMemalign, /* alloc_aligned_function */
&TCRealloc, /* realloc_function */
&TCFree, /* free_function */
&TCGetSizeEstimate, /* get_size_estimate_function */
nullptr, /* batch_malloc_function */
nullptr, /* batch_free_function */
nullptr, /* free_definite_size_function */
nullptr, /* aligned_malloc_function */
nullptr, /* aligned_realloc_function */
nullptr, /* aligned_free_function */
nullptr, /* next */
};
// In the case of tcmalloc we have also to route the diagnostic symbols,
// which are not part of the unified shim layer, to tcmalloc for consistency.
extern "C" {
SHIM_ALWAYS_EXPORT void malloc_stats(void) __THROW {
return tc_malloc_stats();
}
SHIM_ALWAYS_EXPORT int mallopt(int cmd, int value) __THROW {
return tc_mallopt(cmd, value);
}
#ifdef HAVE_STRUCT_MALLINFO
SHIM_ALWAYS_EXPORT struct mallinfo mallinfo(void) __THROW {
return tc_mallinfo();
}
#endif
} // extern "C"

View File

@ -0,0 +1,103 @@
// Copyright 2016 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 "base/allocator/allocator_shim.h"
#include "base/allocator/winheap_stubs_win.h"
#include "base/logging.h"
namespace {
using base::allocator::AllocatorDispatch;
void* DefaultWinHeapMallocImpl(const AllocatorDispatch*,
size_t size,
void* context) {
return base::allocator::WinHeapMalloc(size);
}
void* DefaultWinHeapCallocImpl(const AllocatorDispatch* self,
size_t n,
size_t elem_size,
void* context) {
// Overflow check.
const size_t size = n * elem_size;
if (elem_size != 0 && size / elem_size != n)
return nullptr;
void* result = DefaultWinHeapMallocImpl(self, size, context);
if (result) {
memset(result, 0, size);
}
return result;
}
void* DefaultWinHeapMemalignImpl(const AllocatorDispatch* self,
size_t alignment,
size_t size,
void* context) {
CHECK(false) << "The windows heap does not support memalign.";
return nullptr;
}
void* DefaultWinHeapReallocImpl(const AllocatorDispatch* self,
void* address,
size_t size,
void* context) {
return base::allocator::WinHeapRealloc(address, size);
}
void DefaultWinHeapFreeImpl(const AllocatorDispatch*,
void* address,
void* context) {
base::allocator::WinHeapFree(address);
}
size_t DefaultWinHeapGetSizeEstimateImpl(const AllocatorDispatch*,
void* address,
void* context) {
return base::allocator::WinHeapGetSizeEstimate(address);
}
void* DefaultWinHeapAlignedMallocImpl(const AllocatorDispatch*,
size_t size,
size_t alignment,
void* context) {
return base::allocator::WinHeapAlignedMalloc(size, alignment);
}
void* DefaultWinHeapAlignedReallocImpl(const AllocatorDispatch*,
void* ptr,
size_t size,
size_t alignment,
void* context) {
return base::allocator::WinHeapAlignedRealloc(ptr, size, alignment);
}
void DefaultWinHeapAlignedFreeImpl(const AllocatorDispatch*,
void* ptr,
void* context) {
base::allocator::WinHeapAlignedFree(ptr);
}
} // namespace
// Guarantee that default_dispatch is compile-time initialized to avoid using
// it before initialization (allocations before main in release builds with
// optimizations disabled).
constexpr AllocatorDispatch AllocatorDispatch::default_dispatch = {
&DefaultWinHeapMallocImpl,
&DefaultWinHeapCallocImpl,
&DefaultWinHeapMemalignImpl,
&DefaultWinHeapReallocImpl,
&DefaultWinHeapFreeImpl,
&DefaultWinHeapGetSizeEstimateImpl,
nullptr, /* batch_malloc_function */
nullptr, /* batch_free_function */
nullptr, /* free_definite_size_function */
&DefaultWinHeapAlignedMallocImpl,
&DefaultWinHeapAlignedReallocImpl,
&DefaultWinHeapAlignedFreeImpl,
nullptr, /* next */
};

View File

@ -0,0 +1,44 @@
// Copyright 2016 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 BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_
#if defined(__GNUC__)
#include <sys/cdefs.h> // for __THROW
#ifndef __THROW // Not a glibc system
#ifdef _NOEXCEPT // LLVM libc++ uses noexcept instead
#define __THROW _NOEXCEPT
#else
#define __THROW
#endif // !_NOEXCEPT
#endif
// Shim layer symbols need to be ALWAYS exported, regardless of component build.
//
// If an exported symbol is linked into a DSO, it may be preempted by a
// definition in the main executable. If this happens to an allocator symbol, it
// will mean that the DSO will use the main executable's allocator. This is
// normally relatively harmless -- regular allocations should all use the same
// allocator, but if the DSO tries to hook the allocator it will not see any
// allocations.
//
// However, if LLVM LTO is enabled, the compiler may inline the shim layer
// symbols into callers. The end result is that allocator calls in DSOs may use
// either the main executable's allocator or the DSO's allocator, depending on
// whether the call was inlined. This is arguably a bug in LLVM caused by its
// somewhat irregular handling of symbol interposition (see llvm.org/PR23501).
// To work around the bug we use noinline to prevent the symbols from being
// inlined.
//
// In the long run we probably want to avoid linking the allocator bits into
// DSOs altogether. This will save a little space and stop giving DSOs the false
// impression that they can hook the allocator.
#define SHIM_ALWAYS_EXPORT __attribute__((visibility("default"), noinline))
#endif // __GNUC__
#endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_

View File

@ -0,0 +1,152 @@
// Copyright 2016 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.
#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
#error This header is meant to be included only once by allocator_shim.cc
#endif
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
// Preempt the default new/delete C++ symbols so they call the shim entry
// points. This file is strongly inspired by tcmalloc's
// libc_override_redefine.h.
#include <new>
#include "base/allocator/allocator_shim_internals.h"
#include "build/build_config.h"
// std::align_val_t isn't available until C++17, but we want to override aligned
// new/delete anyway to prevent a possible situation where a library gets loaded
// in that uses the aligned operators. We want to avoid a situation where
// separate heaps are used.
// TODO(thomasanderson): Remove this once building with C++17 or later.
#if defined(__cpp_aligned_new) && __cpp_aligned_new >= 201606
#define ALIGN_VAL_T std::align_val_t
#define ALIGN_LINKAGE
#define ALIGN_NEW operator new
#define ALIGN_NEW_NOTHROW operator new
#define ALIGN_DEL operator delete
#define ALIGN_DEL_SIZED operator delete
#define ALIGN_DEL_NOTHROW operator delete
#define ALIGN_NEW_ARR operator new[]
#define ALIGN_NEW_ARR_NOTHROW operator new[]
#define ALIGN_DEL_ARR operator delete[]
#define ALIGN_DEL_ARR_SIZED operator delete[]
#define ALIGN_DEL_ARR_NOTHROW operator delete[]
#else
#define ALIGN_VAL_T size_t
#define ALIGN_LINKAGE extern "C"
#if defined(OS_MACOSX) || defined(OS_WIN)
#error "Mangling is different on these platforms."
#else
#define ALIGN_NEW _ZnwmSt11align_val_t
#define ALIGN_NEW_NOTHROW _ZnwmSt11align_val_tRKSt9nothrow_t
#define ALIGN_DEL _ZdlPvSt11align_val_t
#define ALIGN_DEL_SIZED _ZdlPvmSt11align_val_t
#define ALIGN_DEL_NOTHROW _ZdlPvSt11align_val_tRKSt9nothrow_t
#define ALIGN_NEW_ARR _ZnamSt11align_val_t
#define ALIGN_NEW_ARR_NOTHROW _ZnamSt11align_val_tRKSt9nothrow_t
#define ALIGN_DEL_ARR _ZdaPvSt11align_val_t
#define ALIGN_DEL_ARR_SIZED _ZdaPvmSt11align_val_t
#define ALIGN_DEL_ARR_NOTHROW _ZdaPvSt11align_val_tRKSt9nothrow_t
#endif
#endif
SHIM_ALWAYS_EXPORT void* operator new(size_t size) {
return ShimCppNew(size);
}
SHIM_ALWAYS_EXPORT void operator delete(void* p) __THROW {
ShimCppDelete(p);
}
SHIM_ALWAYS_EXPORT void* operator new[](size_t size) {
return ShimCppNew(size);
}
SHIM_ALWAYS_EXPORT void operator delete[](void* p) __THROW {
ShimCppDelete(p);
}
SHIM_ALWAYS_EXPORT void* operator new(size_t size,
const std::nothrow_t&) __THROW {
return ShimCppNew(size);
}
SHIM_ALWAYS_EXPORT void* operator new[](size_t size,
const std::nothrow_t&) __THROW {
return ShimCppNew(size);
}
SHIM_ALWAYS_EXPORT void operator delete(void* p, const std::nothrow_t&) __THROW {
ShimCppDelete(p);
}
SHIM_ALWAYS_EXPORT void operator delete[](void* p,
const std::nothrow_t&) __THROW {
ShimCppDelete(p);
}
SHIM_ALWAYS_EXPORT void operator delete(void* p, size_t) __THROW {
ShimCppDelete(p);
}
SHIM_ALWAYS_EXPORT void operator delete[](void* p, size_t) __THROW {
ShimCppDelete(p);
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void* ALIGN_NEW(std::size_t size,
ALIGN_VAL_T alignment) {
return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void* ALIGN_NEW_NOTHROW(
std::size_t size,
ALIGN_VAL_T alignment,
const std::nothrow_t&) __THROW {
return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void ALIGN_DEL(void* p, ALIGN_VAL_T) __THROW {
ShimCppDelete(p);
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void ALIGN_DEL_SIZED(void* p,
std::size_t size,
ALIGN_VAL_T) __THROW {
ShimCppDelete(p);
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void
ALIGN_DEL_NOTHROW(void* p, ALIGN_VAL_T, const std::nothrow_t&) __THROW {
ShimCppDelete(p);
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void* ALIGN_NEW_ARR(std::size_t size,
ALIGN_VAL_T alignment) {
return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void* ALIGN_NEW_ARR_NOTHROW(
std::size_t size,
ALIGN_VAL_T alignment,
const std::nothrow_t&) __THROW {
return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void ALIGN_DEL_ARR(void* p,
ALIGN_VAL_T) __THROW {
ShimCppDelete(p);
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void ALIGN_DEL_ARR_SIZED(void* p,
std::size_t size,
ALIGN_VAL_T) __THROW {
ShimCppDelete(p);
}
ALIGN_LINKAGE SHIM_ALWAYS_EXPORT void
ALIGN_DEL_ARR_NOTHROW(void* p, ALIGN_VAL_T, const std::nothrow_t&) __THROW {
ShimCppDelete(p);
}

View File

@ -0,0 +1,119 @@
// Copyright 2016 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.
#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_GLIBC_WEAK_SYMBOLS_H_
#error This header is meant to be included only once by allocator_shim.cc
#endif
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_GLIBC_WEAK_SYMBOLS_H_
// Alias the internal Glibc symbols to the shim entry points.
// This file is strongly inspired by tcmalloc's libc_override_glibc.h.
// Effectively this file does two things:
// 1) Re-define the __malloc_hook & co symbols. Those symbols are defined as
// weak in glibc and are meant to be defined strongly by client processes
// to hook calls initiated from within glibc.
// 2) Re-define Glibc-specific symbols (__libc_malloc). The historical reason
// is that in the past (in RedHat 9) we had instances of libraries that were
// allocating via malloc() and freeing using __libc_free().
// See tcmalloc's libc_override_glibc.h for more context.
#include <features.h> // for __GLIBC__
#include <malloc.h>
#include <unistd.h>
#include <new>
#include "base/allocator/allocator_shim_internals.h"
// __MALLOC_HOOK_VOLATILE not defined in all Glibc headers.
#if !defined(__MALLOC_HOOK_VOLATILE)
#define MALLOC_HOOK_MAYBE_VOLATILE /**/
#else
#define MALLOC_HOOK_MAYBE_VOLATILE __MALLOC_HOOK_VOLATILE
#endif
extern "C" {
// 1) Re-define malloc_hook weak symbols.
namespace {
void* GlibcMallocHook(size_t size, const void* caller) {
return ShimMalloc(size, nullptr);
}
void* GlibcReallocHook(void* ptr, size_t size, const void* caller) {
return ShimRealloc(ptr, size, nullptr);
}
void GlibcFreeHook(void* ptr, const void* caller) {
return ShimFree(ptr, nullptr);
}
void* GlibcMemalignHook(size_t align, size_t size, const void* caller) {
return ShimMemalign(align, size, nullptr);
}
} // namespace
__attribute__((visibility("default"))) void* (
*MALLOC_HOOK_MAYBE_VOLATILE __malloc_hook)(size_t,
const void*) = &GlibcMallocHook;
__attribute__((visibility("default"))) void* (
*MALLOC_HOOK_MAYBE_VOLATILE __realloc_hook)(void*, size_t, const void*) =
&GlibcReallocHook;
__attribute__((visibility("default"))) void (
*MALLOC_HOOK_MAYBE_VOLATILE __free_hook)(void*,
const void*) = &GlibcFreeHook;
__attribute__((visibility("default"))) void* (
*MALLOC_HOOK_MAYBE_VOLATILE __memalign_hook)(size_t, size_t, const void*) =
&GlibcMemalignHook;
// 2) Redefine libc symbols themselves.
SHIM_ALWAYS_EXPORT void* __libc_malloc(size_t size) {
return ShimMalloc(size, nullptr);
}
SHIM_ALWAYS_EXPORT void __libc_free(void* ptr) {
ShimFree(ptr, nullptr);
}
SHIM_ALWAYS_EXPORT void* __libc_realloc(void* ptr, size_t size) {
return ShimRealloc(ptr, size, nullptr);
}
SHIM_ALWAYS_EXPORT void* __libc_calloc(size_t n, size_t size) {
return ShimCalloc(n, size, nullptr);
}
SHIM_ALWAYS_EXPORT void __libc_cfree(void* ptr) {
return ShimFree(ptr, nullptr);
}
SHIM_ALWAYS_EXPORT void* __libc_memalign(size_t align, size_t s) {
return ShimMemalign(align, s, nullptr);
}
SHIM_ALWAYS_EXPORT void* __libc_valloc(size_t size) {
return ShimValloc(size, nullptr);
}
SHIM_ALWAYS_EXPORT void* __libc_pvalloc(size_t size) {
return ShimPvalloc(size);
}
SHIM_ALWAYS_EXPORT int __posix_memalign(void** r, size_t a, size_t s) {
return ShimPosixMemalign(r, a, s);
}
} // extern "C"
// Safety check.
#if !defined(__GLIBC__)
#error The target platform does not seem to use Glibc. Disable the allocator \
shim by setting use_allocator_shim=false in GN args.
#endif

View File

@ -0,0 +1,69 @@
// Copyright 2016 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.
// Its purpose is to preempt the Libc symbols for malloc/new so they call the
// shim layer entry points.
#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LIBC_SYMBOLS_H_
#error This header is meant to be included only once by allocator_shim.cc
#endif
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LIBC_SYMBOLS_H_
#include <malloc.h>
#include "base/allocator/allocator_shim_internals.h"
extern "C" {
SHIM_ALWAYS_EXPORT void* malloc(size_t size) __THROW {
return ShimMalloc(size, nullptr);
}
SHIM_ALWAYS_EXPORT void free(void* ptr) __THROW {
ShimFree(ptr, nullptr);
}
SHIM_ALWAYS_EXPORT void* realloc(void* ptr, size_t size) __THROW {
return ShimRealloc(ptr, size, nullptr);
}
SHIM_ALWAYS_EXPORT void* calloc(size_t n, size_t size) __THROW {
return ShimCalloc(n, size, nullptr);
}
SHIM_ALWAYS_EXPORT void cfree(void* ptr) __THROW {
ShimFree(ptr, nullptr);
}
SHIM_ALWAYS_EXPORT void* memalign(size_t align, size_t s) __THROW {
return ShimMemalign(align, s, nullptr);
}
SHIM_ALWAYS_EXPORT void* valloc(size_t size) __THROW {
return ShimValloc(size, nullptr);
}
SHIM_ALWAYS_EXPORT void* pvalloc(size_t size) __THROW {
return ShimPvalloc(size);
}
SHIM_ALWAYS_EXPORT int posix_memalign(void** r, size_t a, size_t s) __THROW {
return ShimPosixMemalign(r, a, s);
}
SHIM_ALWAYS_EXPORT size_t malloc_size(void* address) __THROW {
return ShimGetSizeEstimate(address, nullptr);
}
SHIM_ALWAYS_EXPORT size_t malloc_usable_size(void* address) __THROW {
return ShimGetSizeEstimate(address, nullptr);
}
// The default dispatch translation unit has to define also the following
// symbols (unless they are ultimately routed to the system symbols):
// void malloc_stats(void);
// int mallopt(int, int);
// struct mallinfo mallinfo(void);
} // extern "C"

View File

@ -0,0 +1,54 @@
// Copyright 2016 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.
#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LINKER_WRAPPED_SYMBOLS_H_
#error This header is meant to be included only once by allocator_shim.cc
#endif
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LINKER_WRAPPED_SYMBOLS_H_
// This header overrides the __wrap_X symbols when using the link-time
// -Wl,-wrap,malloc shim-layer approach (see README.md).
// All references to malloc, free, etc. within the linker unit that gets the
// -wrap linker flags (e.g., libchrome.so) will be rewritten to the
// linker as references to __wrap_malloc, __wrap_free, which are defined here.
#include "base/allocator/allocator_shim_internals.h"
extern "C" {
SHIM_ALWAYS_EXPORT void* __wrap_calloc(size_t n, size_t size) {
return ShimCalloc(n, size, nullptr);
}
SHIM_ALWAYS_EXPORT void __wrap_free(void* ptr) {
ShimFree(ptr, nullptr);
}
SHIM_ALWAYS_EXPORT void* __wrap_malloc(size_t size) {
return ShimMalloc(size, nullptr);
}
SHIM_ALWAYS_EXPORT void* __wrap_memalign(size_t align, size_t size) {
return ShimMemalign(align, size, nullptr);
}
SHIM_ALWAYS_EXPORT int __wrap_posix_memalign(void** res,
size_t align,
size_t size) {
return ShimPosixMemalign(res, align, size);
}
SHIM_ALWAYS_EXPORT void* __wrap_pvalloc(size_t size) {
return ShimPvalloc(size);
}
SHIM_ALWAYS_EXPORT void* __wrap_realloc(void* address, size_t size) {
return ShimRealloc(address, size, nullptr);
}
SHIM_ALWAYS_EXPORT void* __wrap_valloc(size_t size) {
return ShimValloc(size, nullptr);
}
} // extern "C"

View File

@ -0,0 +1,60 @@
// Copyright 2017 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.
#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_MAC_SYMBOLS_H_
#error This header is meant to be included only once by allocator_shim.cc
#endif
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_MAC_SYMBOLS_H_
#include "base/allocator/malloc_zone_functions_mac.h"
#include "third_party/apple_apsl/malloc.h"
namespace base {
namespace allocator {
MallocZoneFunctions MallocZoneFunctionsToReplaceDefault() {
MallocZoneFunctions new_functions;
memset(&new_functions, 0, sizeof(MallocZoneFunctions));
new_functions.size = [](malloc_zone_t* zone, const void* ptr) -> size_t {
return ShimGetSizeEstimate(ptr, zone);
};
new_functions.malloc = [](malloc_zone_t* zone, size_t size) -> void* {
return ShimMalloc(size, zone);
};
new_functions.calloc = [](malloc_zone_t* zone, size_t n,
size_t size) -> void* {
return ShimCalloc(n, size, zone);
};
new_functions.valloc = [](malloc_zone_t* zone, size_t size) -> void* {
return ShimValloc(size, zone);
};
new_functions.free = [](malloc_zone_t* zone, void* ptr) {
ShimFree(ptr, zone);
};
new_functions.realloc = [](malloc_zone_t* zone, void* ptr,
size_t size) -> void* {
return ShimRealloc(ptr, size, zone);
};
new_functions.batch_malloc = [](struct _malloc_zone_t* zone, size_t size,
void** results,
unsigned num_requested) -> unsigned {
return ShimBatchMalloc(size, results, num_requested, zone);
};
new_functions.batch_free = [](struct _malloc_zone_t* zone, void** to_be_freed,
unsigned num_to_be_freed) -> void {
ShimBatchFree(to_be_freed, num_to_be_freed, zone);
};
new_functions.memalign = [](malloc_zone_t* zone, size_t alignment,
size_t size) -> void* {
return ShimMemalign(alignment, size, zone);
};
new_functions.free_definite_size = [](malloc_zone_t* zone, void* ptr,
size_t size) {
ShimFreeDefiniteSize(ptr, size, zone);
};
return new_functions;
}
} // namespace allocator
} // namespace base

View File

@ -0,0 +1,174 @@
// Copyright 2016 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.
// This header defines symbols to override the same functions in the Visual C++
// CRT implementation.
#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_UCRT_SYMBOLS_WIN_H_
#error This header is meant to be included only once by allocator_shim.cc
#endif
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_UCRT_SYMBOLS_WIN_H_
#include <malloc.h>
#include <windows.h>
extern "C" {
void* (*malloc_unchecked)(size_t) = &base::allocator::UncheckedAlloc;
namespace {
int win_new_mode = 0;
} // namespace
// This function behaves similarly to MSVC's _set_new_mode.
// If flag is 0 (default), calls to malloc will behave normally.
// If flag is 1, calls to malloc will behave like calls to new,
// and the std_new_handler will be invoked on failure.
// Returns the previous mode.
//
// Replaces _set_new_mode in ucrt\heap\new_mode.cpp
int _set_new_mode(int flag) {
// The MS CRT calls this function early on in startup, so this serves as a low
// overhead proof that the allocator shim is in place for this process.
base::allocator::g_is_win_shim_layer_initialized = true;
int old_mode = win_new_mode;
win_new_mode = flag;
base::allocator::SetCallNewHandlerOnMallocFailure(win_new_mode != 0);
return old_mode;
}
// Replaces _query_new_mode in ucrt\heap\new_mode.cpp
int _query_new_mode() {
return win_new_mode;
}
// These symbols override the CRT's implementation of the same functions.
__declspec(restrict) void* malloc(size_t size) {
return ShimMalloc(size, nullptr);
}
void free(void* ptr) {
ShimFree(ptr, nullptr);
}
__declspec(restrict) void* realloc(void* ptr, size_t size) {
return ShimRealloc(ptr, size, nullptr);
}
__declspec(restrict) void* calloc(size_t n, size_t size) {
return ShimCalloc(n, size, nullptr);
}
// _msize() is the Windows equivalent of malloc_size().
size_t _msize(void* memblock) {
return ShimGetSizeEstimate(memblock, nullptr);
}
__declspec(restrict) void* _aligned_malloc(size_t size, size_t alignment) {
return ShimAlignedMalloc(size, alignment, nullptr);
}
__declspec(restrict) void* _aligned_realloc(void* address,
size_t size,
size_t alignment) {
return ShimAlignedRealloc(address, size, alignment, nullptr);
}
void _aligned_free(void* address) {
ShimAlignedFree(address, nullptr);
}
// _recalloc_base is called by CRT internally.
__declspec(restrict) void* _recalloc_base(void* block,
size_t count,
size_t size) {
const size_t old_block_size = (block != nullptr) ? _msize(block) : 0;
base::CheckedNumeric<size_t> new_block_size_checked = count;
new_block_size_checked *= size;
const size_t new_block_size = new_block_size_checked.ValueOrDie();
void* const new_block = realloc(block, new_block_size);
if (new_block != nullptr && old_block_size < new_block_size) {
memset(static_cast<char*>(new_block) + old_block_size, 0,
new_block_size - old_block_size);
}
return new_block;
}
__declspec(restrict) void* _recalloc(void* block, size_t count, size_t size) {
return _recalloc_base(block, count, size);
}
// The following uncommon _aligned_* routines are not used in Chromium and have
// been shimmed to immediately crash to ensure that implementations are added if
// uses are introduced.
__declspec(restrict) void* _aligned_recalloc(void* address,
size_t num,
size_t size,
size_t alignment) {
CHECK(false) << "This routine has not been implemented";
__builtin_unreachable();
}
size_t _aligned_msize(void* address, size_t alignment, size_t offset) {
CHECK(false) << "This routine has not been implemented";
__builtin_unreachable();
}
__declspec(restrict) void* _aligned_offset_malloc(size_t size,
size_t alignment,
size_t offset) {
CHECK(false) << "This routine has not been implemented";
__builtin_unreachable();
}
__declspec(restrict) void* _aligned_offset_realloc(void* address,
size_t size,
size_t alignment,
size_t offset) {
CHECK(false) << "This routine has not been implemented";
__builtin_unreachable();
}
__declspec(restrict) void* _aligned_offset_recalloc(void* address,
size_t num,
size_t size,
size_t alignment,
size_t offset) {
CHECK(false) << "This routine has not been implemented";
__builtin_unreachable();
}
// The symbols
// * __acrt_heap
// * __acrt_initialize_heap
// * __acrt_uninitialize_heap
// * _get_heap_handle
// must be overridden all or none, as they are otherwise supplied
// by heap_handle.obj in the ucrt.lib file.
HANDLE __acrt_heap = nullptr;
bool __acrt_initialize_heap() {
__acrt_heap = ::HeapCreate(0, 0, 0);
return true;
}
bool __acrt_uninitialize_heap() {
::HeapDestroy(__acrt_heap);
__acrt_heap = nullptr;
return true;
}
intptr_t _get_heap_handle(void) {
return reinterpret_cast<intptr_t>(__acrt_heap);
}
} // extern "C"

Some files were not shown because too many files have changed in this diff Show More