mirror of
https://github.com/electron/electron.git
synced 2026-02-19 03:14:51 -05:00
Compare commits
90 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e4c7527c6 | ||
|
|
4e0931dd0b | ||
|
|
fa3680050d | ||
|
|
8181f57c5f | ||
|
|
c83176c2dc | ||
|
|
3d4d645400 | ||
|
|
90173a015e | ||
|
|
13cf7b0bc0 | ||
|
|
2ed6e590a1 | ||
|
|
fa2059438c | ||
|
|
9f3650cc66 | ||
|
|
c70a41275a | ||
|
|
8de59b982b | ||
|
|
0b0f7ed7dc | ||
|
|
36ea114ac0 | ||
|
|
4fa8a866d4 | ||
|
|
da9a917482 | ||
|
|
979dfc7903 | ||
|
|
bc218c6176 | ||
|
|
bc93eed472 | ||
|
|
cdc11e1dc5 | ||
|
|
489e40f763 | ||
|
|
4e1c358d87 | ||
|
|
6a1d3e80c8 | ||
|
|
bfd7412b64 | ||
|
|
09f9c95f8f | ||
|
|
768b4c9757 | ||
|
|
b8162becd7 | ||
|
|
47f5fe6411 | ||
|
|
5bf76ea01a | ||
|
|
b9605cc602 | ||
|
|
b98e06e38e | ||
|
|
bd6a3dd79b | ||
|
|
71cd22605e | ||
|
|
4775c8ec7b | ||
|
|
188a92970b | ||
|
|
1826bbb684 | ||
|
|
21b7dc2717 | ||
|
|
dba476e18a | ||
|
|
e31e98d927 | ||
|
|
6a25f416e0 | ||
|
|
b18a012bfd | ||
|
|
8acf577efa | ||
|
|
52c76fcf11 | ||
|
|
a568e13642 | ||
|
|
65c53cc4fa | ||
|
|
4c468a9efd | ||
|
|
a24efe268d | ||
|
|
140bd753ca | ||
|
|
5f30c61c49 | ||
|
|
5d67ec3da5 | ||
|
|
993b70ee9e | ||
|
|
a35b6d3fa8 | ||
|
|
9e7390f128 | ||
|
|
690e94a329 | ||
|
|
1ae0d41025 | ||
|
|
2dd2566fd5 | ||
|
|
972d45dc09 | ||
|
|
87c0b54788 | ||
|
|
3f4f58130e | ||
|
|
b7c49f7940 | ||
|
|
c9b9a0cd9a | ||
|
|
ee6c91d491 | ||
|
|
b35e35f3ec | ||
|
|
cbc0e46617 | ||
|
|
a6f9b6f72b | ||
|
|
df60a800b9 | ||
|
|
49dc15469d | ||
|
|
0049cee96c | ||
|
|
bbeedafc6e | ||
|
|
3d3d97920e | ||
|
|
7d164b3bcd | ||
|
|
64f32a18f5 | ||
|
|
93ce710f28 | ||
|
|
e15672e13c | ||
|
|
79764942d1 | ||
|
|
ec2418ad7d | ||
|
|
a6117abf4c | ||
|
|
c1b5a1cfc8 | ||
|
|
79d41f5f96 | ||
|
|
2dd3d9ad1b | ||
|
|
86714c0b6f | ||
|
|
fb0c56c946 | ||
|
|
75d27c0810 | ||
|
|
02e325d1ab | ||
|
|
e77b6878a9 | ||
|
|
b763d81d79 | ||
|
|
7521454161 | ||
|
|
36f0583077 | ||
|
|
96391dbb3b |
@@ -35,6 +35,7 @@ env-debug-build: &env-debug-build
|
||||
|
||||
env-testing-build: &env-testing-build
|
||||
GN_CONFIG: //electron/build/args/testing.gn
|
||||
CHECK_DIST_MANIFEST: '1'
|
||||
|
||||
env-release-build: &env-release-build
|
||||
GN_CONFIG: //electron/build/args/release.gn
|
||||
@@ -253,6 +254,28 @@ step-electron-dist-build: &step-electron-dist-build
|
||||
command: |
|
||||
cd src
|
||||
ninja -C out/Default electron:electron_dist_zip
|
||||
if [ "$CHECK_DIST_MANIFEST" == "1" ]; then
|
||||
if [ "`uname`" == "Darwin" ]; then
|
||||
target_os=mac
|
||||
target_cpu=x64
|
||||
if [ x"$MAS_BUILD" == x"true" ]; then
|
||||
target_os=mac_mas
|
||||
fi
|
||||
elif [ "`uname`" == "Linux" ]; then
|
||||
target_os=linux
|
||||
if [ x"$TARGET_ARCH" == x ]; then
|
||||
target_cpu=x64
|
||||
elif [ "$TARGET_ARCH" == "ia32" ]; then
|
||||
target_cpu=x86
|
||||
else
|
||||
target_cpu="$TARGET_ARCH"
|
||||
fi
|
||||
else
|
||||
echo "Unknown system: `uname`"
|
||||
exit 1
|
||||
fi
|
||||
electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip electron/script/zip_manifests/dist_zip.$target_os.$target_cpu.manifest
|
||||
fi
|
||||
|
||||
step-electron-dist-store: &step-electron-dist-store
|
||||
store_artifacts:
|
||||
@@ -401,25 +424,13 @@ step-mksnapshot-store: &step-mksnapshot-store
|
||||
path: src/out/Default/mksnapshot.zip
|
||||
destination: mksnapshot.zip
|
||||
|
||||
step-maybe-build-dump-syms: &step-maybe-build-dump-syms
|
||||
run:
|
||||
name: Build dump_syms binary
|
||||
command: |
|
||||
if [ "$GENERATE_SYMBOLS" == "true" ]; then
|
||||
cd src
|
||||
# Build needed dump_syms executable
|
||||
ninja -C out/Default third_party/breakpad:dump_syms
|
||||
fi
|
||||
|
||||
step-maybe-generate-breakpad-symbols: &step-maybe-generate-breakpad-symbols
|
||||
run:
|
||||
name: Generate breakpad symbols
|
||||
command: |
|
||||
if [ "$GENERATE_SYMBOLS" == "true" ]; then
|
||||
cd src
|
||||
export BUILD_PATH="$PWD/out/Default"
|
||||
export DEST_PATH="$BUILD_PATH/breakpad_symbols"
|
||||
electron/script/dump-symbols.py -b $BUILD_PATH -d $DEST_PATH -v
|
||||
ninja -C out/Default electron:electron_symbols
|
||||
fi
|
||||
|
||||
step-maybe-zip-symbols: &step-maybe-zip-symbols
|
||||
@@ -490,6 +501,39 @@ step-maybe-generate-typescript-defs: &step-maybe-generate-typescript-defs
|
||||
fi
|
||||
|
||||
# Lists of steps.
|
||||
steps-lint: &steps-lint
|
||||
steps:
|
||||
- *step-checkout-electron
|
||||
- run:
|
||||
name: Setup third_party Depot Tools
|
||||
command: |
|
||||
# "depot_tools" has to be checkout into "//third_party/depot_tools" so pylint.py can a "pylintrc" file.
|
||||
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git src/third_party/depot_tools
|
||||
echo 'export PATH="$PATH:'"$PWD"'/src/third_party/depot_tools"' >> $BASH_ENV
|
||||
- run:
|
||||
name: Download GN Binary
|
||||
command: |
|
||||
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
||||
buildtools_revision="$(curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/DEPS?format=TEXT" | base64 -d | grep buildtools_revision -A1 | tr -d '\n' | cut -d\' -f4)"
|
||||
|
||||
git clone https://chromium.googlesource.com/chromium/buildtools "buildtools"
|
||||
(cd "buildtools" && git checkout "$buildtools_revision")
|
||||
echo 'export CHROMIUM_BUILDTOOLS_PATH="'"$PWD"'/buildtools"' >> $BASH_ENV
|
||||
|
||||
download_from_google_storage --bucket chromium-gn -s "buildtools/linux64/gn.sha1"
|
||||
- run:
|
||||
name: Run Lint
|
||||
command: |
|
||||
# gn.py tries to find a gclient root folder starting from the current dir.
|
||||
# When it fails and returns "None" path, the whole script fails. Let's "fix" it.
|
||||
touch .gclient
|
||||
# Another option would be to checkout "buildtools" inside the Electron checkout,
|
||||
# but then we would lint its contents (at least gn format), and it doesn't pass it.
|
||||
|
||||
cd src/electron
|
||||
npm install
|
||||
npm run lint
|
||||
|
||||
steps-checkout: &steps-checkout
|
||||
steps:
|
||||
- *step-checkout-electron
|
||||
@@ -594,7 +638,6 @@ steps-electron-build-for-tests: &steps-electron-build-for-tests
|
||||
# Save all data needed for a further tests run.
|
||||
- *step-persist-data-for-tests
|
||||
|
||||
- *step-maybe-build-dump-syms
|
||||
- *step-maybe-generate-breakpad-symbols
|
||||
- *step-maybe-zip-symbols
|
||||
|
||||
@@ -619,7 +662,6 @@ steps-electron-build-for-publish: &steps-electron-build-for-publish
|
||||
- *step-maybe-electron-dist-strip
|
||||
- *step-electron-dist-build
|
||||
- *step-electron-dist-store
|
||||
- *step-maybe-build-dump-syms
|
||||
- *step-maybe-generate-breakpad-symbols
|
||||
- *step-maybe-zip-symbols
|
||||
|
||||
@@ -776,6 +818,13 @@ chromium-upgrade-branches: &chromium-upgrade-branches
|
||||
# List of all jobs.
|
||||
version: 2
|
||||
jobs:
|
||||
# Layer 0: Lint. Standalone.
|
||||
lint:
|
||||
<<: *machine-linux-medium
|
||||
environment:
|
||||
<<: *env-linux-medium
|
||||
<<: *steps-lint
|
||||
|
||||
# Layer 1: Checkout.
|
||||
linux-checkout:
|
||||
<<: *machine-linux-2xlarge
|
||||
@@ -1300,6 +1349,10 @@ jobs:
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
lint:
|
||||
jobs:
|
||||
- lint
|
||||
|
||||
build-linux:
|
||||
jobs:
|
||||
- linux-checkout
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# These env vars are only necessary for creating Electron releases.
|
||||
# See docs/development/releasing.md
|
||||
|
||||
APPVEYOR_TOKEN=
|
||||
APPVEYOR_CLOUD_TOKEN=
|
||||
CIRCLE_TOKEN=
|
||||
ELECTRON_GITHUB_TOKEN=
|
||||
VSTS_TOKEN=
|
||||
33
.github/CODEOWNERS
vendored
33
.github/CODEOWNERS
vendored
@@ -3,19 +3,24 @@
|
||||
# https://help.github.com/articles/about-codeowners
|
||||
# https://git-scm.com/docs/gitignore
|
||||
|
||||
# Everything that falls through the cracks:
|
||||
* @electron/reviewers
|
||||
# Most stuff in here is owned by the Community & Safety WG...
|
||||
/.github/* @electron/wg-community
|
||||
|
||||
# filename patterns
|
||||
*browser_view* @electron/browserview
|
||||
*notification* @electron/notifications
|
||||
*pdf* @electron/printing
|
||||
*printing* @electron/printing
|
||||
*updater* @electron/updater
|
||||
# ...except the Admin WG maintains this file.
|
||||
/.github/CODEOWNERS @electron/wg-admin
|
||||
|
||||
# directories
|
||||
/.github/ @electron/electrocats
|
||||
/default_app/ @electron/docs
|
||||
/docs/ @electron/docs
|
||||
/docs-translations/ @electron/i18n
|
||||
/npm/ @electron/electrocats
|
||||
# Upgrades WG
|
||||
/patches/ @electron/wg-upgrades
|
||||
|
||||
# Releases WG
|
||||
/npm/ @electron/wg-releases
|
||||
/script/release-notes @electron/wg-releases
|
||||
/script/prepare-release.js @electron/wg-releases
|
||||
/script/bump-version.js @electron/wg-releases
|
||||
/script/ci-release-build.js @electron/wg-releases
|
||||
/script/release.js @electron/wg-releases
|
||||
/script/upload-to-github.js @electron/wg-releases
|
||||
/script/release-artifact-cleanup.js @electron/wg-releases
|
||||
/script/get-last-major-for-master.js @electron/wg-releases
|
||||
/script/find-release.js @electron/wg-releases
|
||||
/script/download-circleci-artifacts.js @electron/wg-releases
|
||||
@@ -1,31 +0,0 @@
|
||||
pool:
|
||||
vmImage: 'Ubuntu 16.04'
|
||||
|
||||
steps:
|
||||
- bash: |
|
||||
# "depot_tools" has to be checkout into "//third_party/depot_tools" so pylint.py can a "pylintrc" file.
|
||||
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git "${AGENT_BUILDDIRECTORY}/third_party/depot_tools"
|
||||
echo "##vso[task.setvariable variable=PATH]$PATH:${AGENT_BUILDDIRECTORY}/third_party/depot_tools"
|
||||
displayName: Setup Depot Tools
|
||||
|
||||
- bash: |
|
||||
chromium_revision="$(grep -A1 chromium_version DEPS | tr -d '\n' | cut -d\' -f4)"
|
||||
buildtools_revision="$(curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/DEPS?format=TEXT" | base64 -d | grep buildtools_revision -A1 | tr -d '\n' | cut -d\' -f4)"
|
||||
|
||||
git clone https://chromium.googlesource.com/chromium/buildtools "${AGENT_TEMPDIRECTORY}/buildtools"
|
||||
(cd "${AGENT_TEMPDIRECTORY}/buildtools" && git checkout "$buildtools_revision")
|
||||
echo "##vso[task.setvariable variable=CHROMIUM_BUILDTOOLS_PATH]$AGENT_TEMPDIRECTORY/buildtools"
|
||||
|
||||
download_from_google_storage --bucket chromium-gn -s "${AGENT_TEMPDIRECTORY}/buildtools/linux64/gn.sha1"
|
||||
displayName: Download gn binary
|
||||
|
||||
- bash: |
|
||||
# gn.py tries to find a gclient root folder starting from the current dir.
|
||||
# When it fails and returns "None" path, the whole script fails. Let's "fix" it.
|
||||
touch .gclient
|
||||
# Another option would be to checkout "buildtools" inside the Electron checkout,
|
||||
# but then we would lint its contents (at least gn format), and it doesn't pass it.
|
||||
|
||||
npm install
|
||||
npm run lint
|
||||
displayName: Run Lint
|
||||
100
BUILD.gn
100
BUILD.gn
@@ -13,6 +13,7 @@ import("//tools/grit/grit_rule.gni")
|
||||
import("//tools/grit/repack.gni")
|
||||
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
|
||||
import("//v8/snapshot_toolchain.gni")
|
||||
import("build/extract_symbols.gni")
|
||||
|
||||
if (is_mac) {
|
||||
import("//build/config/mac/rules.gni")
|
||||
@@ -478,6 +479,7 @@ if (is_mac) {
|
||||
electron_helper_name = "$electron_product_name Helper"
|
||||
electron_login_helper_name = "$electron_product_name Login Helper"
|
||||
electron_framework_version = "A"
|
||||
electron_version = read_file("VERSION", "trim string")
|
||||
|
||||
mac_xib_bundle_data("electron_xibs") {
|
||||
sources = [
|
||||
@@ -560,7 +562,6 @@ if (is_mac) {
|
||||
}
|
||||
info_plist = "atom/common/resources/mac/Info.plist"
|
||||
|
||||
electron_version = read_file("VERSION", "trim string")
|
||||
extra_substitutions = [
|
||||
"ATOM_BUNDLE_ID=$electron_mac_bundle_id.framework",
|
||||
"ELECTRON_VERSION=$electron_version",
|
||||
@@ -716,6 +717,56 @@ if (is_mac) {
|
||||
"@executable_path/../Frameworks",
|
||||
]
|
||||
}
|
||||
|
||||
if (enable_dsyms) {
|
||||
extract_symbols("electron_framework_syms") {
|
||||
binary = "$root_out_dir/$electron_framework_name.framework/Versions/$electron_framework_version/$electron_framework_name"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
dsym_file = "$root_out_dir/$electron_framework_name.dSYM/Contents/Resources/DWARF/$electron_framework_name"
|
||||
deps = [
|
||||
":electron_framework",
|
||||
]
|
||||
}
|
||||
|
||||
extract_symbols("electron_helper_syms") {
|
||||
binary = "$root_out_dir/$electron_helper_name.app/Contents/MacOS/$electron_helper_name"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
dsym_file = "$root_out_dir/$electron_helper_name.dSYM/Contents/Resources/DWARF/$electron_helper_name"
|
||||
deps = [
|
||||
":electron_helper_app",
|
||||
]
|
||||
}
|
||||
|
||||
extract_symbols("electron_app_syms") {
|
||||
binary = "$root_out_dir/$electron_product_name.app/Contents/MacOS/$electron_product_name"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
dsym_file = "$root_out_dir/$electron_product_name.dSYM/Contents/Resources/DWARF/$electron_product_name"
|
||||
deps = [
|
||||
":electron_app",
|
||||
]
|
||||
}
|
||||
|
||||
extract_symbols("crashpad_handler_syms") {
|
||||
binary = "$root_out_dir/crashpad_handler"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
dsym_file = "$root_out_dir/crashpad_handler.dSYM/Contents/Resources/DWARF/crashpad_handler"
|
||||
deps = [
|
||||
"//third_party/crashpad/crashpad/handler:crashpad_handler",
|
||||
]
|
||||
}
|
||||
|
||||
group("electron_symbols") {
|
||||
deps = [
|
||||
":crashpad_handler_syms",
|
||||
":electron_app_syms",
|
||||
":electron_framework_syms",
|
||||
":electron_helper_syms",
|
||||
]
|
||||
}
|
||||
} else {
|
||||
group("electron_symbols") {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
windows_manifest("electron_app_manifest") {
|
||||
sources = [
|
||||
@@ -813,6 +864,53 @@ if (is_mac) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (is_official_build) {
|
||||
if (is_linux) {
|
||||
_target_executable_suffix = ""
|
||||
_target_shared_library_suffix = ".so"
|
||||
} else if (is_win) {
|
||||
_target_executable_suffix = ".exe"
|
||||
_target_shared_library_suffix = ".dll"
|
||||
}
|
||||
|
||||
extract_symbols("electron_app_symbols") {
|
||||
binary = "$root_out_dir/$electron_project_name$_target_executable_suffix"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
deps = [
|
||||
":electron_app",
|
||||
]
|
||||
}
|
||||
|
||||
extract_symbols("swiftshader_egl_symbols") {
|
||||
binary = "$root_out_dir/swiftshader/libEGL$_target_shared_library_suffix"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
deps = [
|
||||
"//third_party/swiftshader/src/OpenGL/libEGL:swiftshader_libEGL",
|
||||
]
|
||||
}
|
||||
|
||||
extract_symbols("swiftshader_gles_symbols") {
|
||||
binary =
|
||||
"$root_out_dir/swiftshader/libGLESv2$_target_shared_library_suffix"
|
||||
symbol_dir = "$root_out_dir/breakpad_symbols"
|
||||
deps = [
|
||||
"//third_party/swiftshader/src/OpenGL/libGLESv2:swiftshader_libGLESv2",
|
||||
]
|
||||
}
|
||||
|
||||
group("electron_symbols") {
|
||||
deps = [
|
||||
":electron_app_symbols",
|
||||
]
|
||||
if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
deps += [
|
||||
":swiftshader_egl_symbols",
|
||||
":swiftshader_gles_symbols",
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
group("electron_tests") {
|
||||
|
||||
@@ -16,7 +16,7 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
||||
locales \
|
||||
lsb-release \
|
||||
nano \
|
||||
python-dbusmock \
|
||||
python-dbus \
|
||||
python-pip \
|
||||
python-setuptools \
|
||||
sudo \
|
||||
@@ -33,6 +33,9 @@ RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
|
||||
# crcmod is required by gsutil, which is used for filling the gclient git cache
|
||||
RUN pip install -U crcmod
|
||||
|
||||
# dbusmock is needed for Electron tests
|
||||
RUN pip install python-dbusmock
|
||||
|
||||
RUN mkdir /tmp/workspace
|
||||
RUN chown builduser:builduser /tmp/workspace
|
||||
|
||||
|
||||
@@ -68,14 +68,16 @@ build_script:
|
||||
- appveyor PushArtifact out/ffmpeg/ffmpeg.zip
|
||||
- ps: >-
|
||||
if ($env:GN_CONFIG -eq 'release') {
|
||||
ninja -C out/Default third_party/breakpad:dump_syms
|
||||
# Needed for msdia140.dll on 64-bit windows
|
||||
$env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin"
|
||||
ninja -C out/Default electron:electron_symbols
|
||||
}
|
||||
- if "%GN_CONFIG%"=="release" ( python electron\script\dump-symbols.py -d %cd%\out\Default\breakpad_symbols -v)
|
||||
- ps: >-
|
||||
if ($env:GN_CONFIG -eq 'release') {
|
||||
python electron\script\zip-symbols.py
|
||||
appveyor PushArtifact out/Default/symbols.zip
|
||||
}
|
||||
- python electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip electron/script/zip_manifests/dist_zip.win.%TARGET_ARCH%.manifest
|
||||
test_script:
|
||||
- ps: >-
|
||||
if ((-Not (Test-Path Env:\ELECTRON_RELEASE)) -And ($env:GN_CONFIG -in "testing", "release")) {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "atom/app/atom_content_client.h"
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "atom/browser/browser.h"
|
||||
@@ -166,14 +167,19 @@ void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
|
||||
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
|
||||
}
|
||||
|
||||
void ConvertStringWithSeparatorToVector(std::vector<std::string>* vec,
|
||||
const char* separator,
|
||||
const char* cmd_switch) {
|
||||
void AppendDelimitedSwitchToVector(const base::StringPiece cmd_switch,
|
||||
std::vector<std::string>* append_me) {
|
||||
auto* command_line = base::CommandLine::ForCurrentProcess();
|
||||
auto string_with_separator = command_line->GetSwitchValueASCII(cmd_switch);
|
||||
if (!string_with_separator.empty())
|
||||
*vec = base::SplitString(string_with_separator, separator,
|
||||
base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
|
||||
auto switch_value = command_line->GetSwitchValueASCII(cmd_switch);
|
||||
if (!switch_value.empty()) {
|
||||
constexpr base::StringPiece delimiter(",", 1);
|
||||
auto tokens =
|
||||
base::SplitString(switch_value, delimiter, base::TRIM_WHITESPACE,
|
||||
base::SPLIT_WANT_NONEMPTY);
|
||||
append_me->reserve(append_me->size() + tokens.size());
|
||||
std::move(std::begin(tokens), std::end(tokens),
|
||||
std::back_inserter(*append_me));
|
||||
}
|
||||
}
|
||||
|
||||
std::string RemoveWhitespace(const std::string& str) {
|
||||
@@ -244,18 +250,13 @@ base::string16 AtomContentClient::GetLocalizedString(int message_id) const {
|
||||
}
|
||||
|
||||
void AtomContentClient::AddAdditionalSchemes(Schemes* schemes) {
|
||||
AppendDelimitedSwitchToVector(switches::kRegisterServiceWorkerSchemes,
|
||||
&schemes->service_worker_schemes);
|
||||
AppendDelimitedSwitchToVector(switches::kSecureSchemes,
|
||||
&schemes->secure_schemes);
|
||||
|
||||
schemes->standard_schemes.push_back("chrome-extension");
|
||||
|
||||
std::vector<std::string> splited;
|
||||
ConvertStringWithSeparatorToVector(&splited, ",",
|
||||
switches::kRegisterServiceWorkerSchemes);
|
||||
for (const std::string& scheme : splited)
|
||||
schemes->service_worker_schemes.push_back(scheme);
|
||||
schemes->service_worker_schemes.push_back(url::kFileScheme);
|
||||
|
||||
ConvertStringWithSeparatorToVector(&splited, ",", switches::kSecureSchemes);
|
||||
for (const std::string& scheme : splited)
|
||||
schemes->secure_schemes.push_back(scheme);
|
||||
}
|
||||
|
||||
void AtomContentClient::AddPepperPlugins(
|
||||
|
||||
@@ -66,7 +66,7 @@ BrowserWindow::BrowserWindow(v8::Isolate* isolate,
|
||||
}
|
||||
|
||||
web_contents_.Reset(isolate, web_contents.ToV8());
|
||||
api_web_contents_ = web_contents.get();
|
||||
api_web_contents_ = web_contents->GetWeakPtr();
|
||||
api_web_contents_->AddObserver(this);
|
||||
Observe(api_web_contents_->web_contents());
|
||||
|
||||
@@ -88,8 +88,7 @@ BrowserWindow::BrowserWindow(v8::Isolate* isolate,
|
||||
InitWith(isolate, wrapper);
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
if (!window()->has_frame())
|
||||
OverrideNSWindowContentView(web_contents->managed_web_contents());
|
||||
OverrideNSWindowContentView(web_contents->managed_web_contents());
|
||||
#endif
|
||||
|
||||
// Init window after everything has been setup.
|
||||
@@ -97,7 +96,9 @@ BrowserWindow::BrowserWindow(v8::Isolate* isolate,
|
||||
}
|
||||
|
||||
BrowserWindow::~BrowserWindow() {
|
||||
api_web_contents_->RemoveObserver(this);
|
||||
// FIXME This is a hack rather than a proper fix preventing shutdown crashes.
|
||||
if (api_web_contents_)
|
||||
api_web_contents_->RemoveObserver(this);
|
||||
// Note that the OnWindowClosed will not be called after the destructor runs,
|
||||
// since the window object is managed by the TopLevelWindow class.
|
||||
if (web_contents())
|
||||
|
||||
@@ -113,7 +113,7 @@ class BrowserWindow : public TopLevelWindow,
|
||||
#endif
|
||||
|
||||
v8::Global<v8::Value> web_contents_;
|
||||
api::WebContents* api_web_contents_;
|
||||
base::WeakPtr<api::WebContents> api_web_contents_;
|
||||
|
||||
base::WeakPtrFactory<BrowserWindow> weak_factory_;
|
||||
|
||||
|
||||
@@ -52,6 +52,19 @@ std::vector<std::string> MetricsToArray(uint32_t metrics) {
|
||||
return array;
|
||||
}
|
||||
|
||||
void DelayEmit(Screen* screen,
|
||||
const base::StringPiece& name,
|
||||
const display::Display& display) {
|
||||
screen->Emit(name, display);
|
||||
}
|
||||
|
||||
void DelayEmitWithMetrics(Screen* screen,
|
||||
const base::StringPiece& name,
|
||||
const display::Display& display,
|
||||
const std::vector<std::string>& metrics) {
|
||||
screen->Emit(name, display, metrics);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Screen::Screen(v8::Isolate* isolate, display::Screen* screen)
|
||||
@@ -101,16 +114,23 @@ static gfx::Rect DIPToScreenRect(atom::NativeWindow* window,
|
||||
#endif
|
||||
|
||||
void Screen::OnDisplayAdded(const display::Display& new_display) {
|
||||
Emit("display-added", new_display);
|
||||
base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
|
||||
FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this), "display-added",
|
||||
new_display));
|
||||
}
|
||||
|
||||
void Screen::OnDisplayRemoved(const display::Display& old_display) {
|
||||
Emit("display-removed", old_display);
|
||||
base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
|
||||
FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this),
|
||||
"display-removed", old_display));
|
||||
}
|
||||
|
||||
void Screen::OnDisplayMetricsChanged(const display::Display& display,
|
||||
uint32_t changed_metrics) {
|
||||
Emit("display-metrics-changed", display, MetricsToArray(changed_metrics));
|
||||
base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
|
||||
FROM_HERE, base::Bind(&DelayEmitWithMetrics, base::Unretained(this),
|
||||
"display-metrics-changed", display,
|
||||
MetricsToArray(changed_metrics)));
|
||||
}
|
||||
|
||||
// static
|
||||
|
||||
@@ -419,6 +419,17 @@ void Session::ResolveProxy(
|
||||
browser_context_->GetResolveProxyHelper()->ResolveProxy(url, callback);
|
||||
}
|
||||
|
||||
void Session::GetCacheSize(const net::CompletionCallback& callback) {
|
||||
content::BrowserContext::GetDefaultStoragePartition(browser_context_.get())
|
||||
->GetNetworkContext()
|
||||
->ComputeHttpCacheSize(
|
||||
base::Time(), base::Time::Max(),
|
||||
base::BindOnce(
|
||||
[](const net::CompletionCallback& cb, bool is_upper_bound,
|
||||
int64_t size_or_error) { cb.Run(size_or_error); },
|
||||
callback));
|
||||
}
|
||||
|
||||
template <Session::CacheAction action>
|
||||
void Session::DoCacheAction(const net::CompletionCallback& callback) {
|
||||
BrowserThread::PostTask(
|
||||
@@ -747,7 +758,7 @@ void Session::BuildPrototype(v8::Isolate* isolate,
|
||||
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
|
||||
.MakeDestroyable()
|
||||
.SetMethod("resolveProxy", &Session::ResolveProxy)
|
||||
.SetMethod("getCacheSize", &Session::DoCacheAction<CacheAction::STATS>)
|
||||
.SetMethod("getCacheSize", &Session::GetCacheSize)
|
||||
.SetMethod("clearCache", &Session::DoCacheAction<CacheAction::CLEAR>)
|
||||
.SetMethod("clearStorageData", &Session::ClearStorageData)
|
||||
.SetMethod("flushStorageData", &Session::FlushStorageData)
|
||||
|
||||
@@ -66,6 +66,7 @@ class Session : public mate::TrackableObject<Session>,
|
||||
const ResolveProxyHelper::ResolveProxyCallback& callback);
|
||||
template <CacheAction action>
|
||||
void DoCacheAction(const net::CompletionCallback& callback);
|
||||
void GetCacheSize(const net::CompletionCallback& callback);
|
||||
void ClearStorageData(mate::Arguments* args);
|
||||
void FlushStorageData();
|
||||
void SetProxy(const mate::Dictionary& options, const base::Closure& callback);
|
||||
|
||||
@@ -54,11 +54,11 @@ struct Converter<NSAppearance*> {
|
||||
return v8::Null(isolate);
|
||||
}
|
||||
|
||||
if (val.name == NSAppearanceNameAqua) {
|
||||
if ([val.name isEqualToString:NSAppearanceNameAqua]) {
|
||||
return mate::ConvertToV8(isolate, "light");
|
||||
}
|
||||
if (@available(macOS 10.14, *)) {
|
||||
if (val.name == NSAppearanceNameDarkAqua) {
|
||||
if ([val.name isEqualToString:NSAppearanceNameDarkAqua]) {
|
||||
return mate::ConvertToV8(isolate, "dark");
|
||||
}
|
||||
}
|
||||
@@ -439,6 +439,10 @@ void SystemPreferences::RemoveUserDefault(const std::string& name) {
|
||||
}
|
||||
|
||||
bool SystemPreferences::IsDarkMode() {
|
||||
if (@available(macOS 10.14, *)) {
|
||||
return [[NSApplication sharedApplication].effectiveAppearance.name
|
||||
isEqualToString:NSAppearanceNameDarkAqua];
|
||||
}
|
||||
NSString* mode = [[NSUserDefaults standardUserDefaults]
|
||||
stringForKey:@"AppleInterfaceStyle"];
|
||||
return [mode isEqualToString:@"Dark"];
|
||||
|
||||
@@ -192,7 +192,7 @@ void Tray::DisplayBalloon(mate::Arguments* args,
|
||||
|
||||
#if defined(OS_WIN)
|
||||
tray_icon_->DisplayBalloon(
|
||||
icon.IsEmpty() ? NULL : icon->GetHICON(GetSystemMetrics(SM_CXSMICON)),
|
||||
icon.IsEmpty() ? NULL : icon->GetHICON(GetSystemMetrics(SM_CXICON)),
|
||||
title, content);
|
||||
#else
|
||||
tray_icon_->DisplayBalloon(icon.IsEmpty() ? gfx::Image() : icon->image(),
|
||||
|
||||
@@ -289,7 +289,9 @@ struct WebContents::FrameDispatchHelper {
|
||||
WebContents::WebContents(v8::Isolate* isolate,
|
||||
content::WebContents* web_contents,
|
||||
Type type)
|
||||
: content::WebContentsObserver(web_contents), type_(type) {
|
||||
: content::WebContentsObserver(web_contents),
|
||||
type_(type),
|
||||
weak_factory_(this) {
|
||||
const mate::Dictionary options = mate::Dictionary::CreateEmpty(isolate);
|
||||
if (type == REMOTE) {
|
||||
web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent(),
|
||||
@@ -304,8 +306,8 @@ WebContents::WebContents(v8::Isolate* isolate,
|
||||
}
|
||||
}
|
||||
|
||||
WebContents::WebContents(v8::Isolate* isolate,
|
||||
const mate::Dictionary& options) {
|
||||
WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
|
||||
: weak_factory_(this) {
|
||||
// Read options.
|
||||
options.Get("backgroundThrottling", &background_throttling_);
|
||||
|
||||
@@ -1688,6 +1690,19 @@ void WebContents::SendInputEvent(v8::Isolate* isolate,
|
||||
mouse_wheel_event);
|
||||
#endif
|
||||
} else {
|
||||
// Chromium expects phase info in wheel events (and applies a
|
||||
// DCHECK to verify it). See: https://crbug.com/756524.
|
||||
mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan;
|
||||
mouse_wheel_event.dispatch_type = blink::WebInputEvent::kBlocking;
|
||||
rwh->ForwardWheelEvent(mouse_wheel_event);
|
||||
|
||||
// Send a synthetic wheel event with phaseEnded to finish scrolling.
|
||||
mouse_wheel_event.has_synthetic_phase = true;
|
||||
mouse_wheel_event.delta_x = 0;
|
||||
mouse_wheel_event.delta_y = 0;
|
||||
mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
|
||||
mouse_wheel_event.dispatch_type =
|
||||
blink::WebInputEvent::kEventNonBlocking;
|
||||
rwh->ForwardWheelEvent(mouse_wheel_event);
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -99,6 +99,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||
static void BuildPrototype(v8::Isolate* isolate,
|
||||
v8::Local<v8::FunctionTemplate> prototype);
|
||||
|
||||
base::WeakPtr<WebContents> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
|
||||
|
||||
// Destroy the managed content::WebContents instance.
|
||||
//
|
||||
// Note: The |async| should only be |true| when users are expecting to use the
|
||||
@@ -291,7 +293,9 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||
observers_.AddObserver(obs);
|
||||
}
|
||||
void RemoveObserver(ExtendedWebContentsObserver* obs) {
|
||||
observers_.RemoveObserver(obs);
|
||||
// Trying to remove from an empty collection leads to an access violation
|
||||
if (observers_.might_have_observers())
|
||||
observers_.RemoveObserver(obs);
|
||||
}
|
||||
|
||||
bool EmitNavigationEvent(const std::string& event,
|
||||
@@ -515,6 +519,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||
// Observers of this WebContents.
|
||||
base::ObserverList<ExtendedWebContentsObserver> observers_;
|
||||
|
||||
base::WeakPtrFactory<WebContents> weak_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(WebContents);
|
||||
};
|
||||
|
||||
|
||||
@@ -466,11 +466,6 @@ bool AtomBrowserClient::CanCreateWindow(
|
||||
|
||||
int opener_render_process_id = opener->GetProcess()->GetID();
|
||||
|
||||
if (IsRendererSandboxed(opener_render_process_id)) {
|
||||
*no_javascript_access = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (RendererUsesNativeWindowOpen(opener_render_process_id)) {
|
||||
if (RendererDisablesPopups(opener_render_process_id)) {
|
||||
// <webview> without allowpopups attribute should return
|
||||
|
||||
@@ -183,12 +183,14 @@ int AtomPermissionManager::RequestPermissionsWithDetails(
|
||||
const auto callback =
|
||||
base::Bind(&AtomPermissionManager::OnPermissionResponse,
|
||||
base::Unretained(this), request_id, i);
|
||||
if (details == nullptr) {
|
||||
request_handler_.Run(web_contents, permission, callback,
|
||||
base::DictionaryValue());
|
||||
} else {
|
||||
request_handler_.Run(web_contents, permission, callback, *details);
|
||||
}
|
||||
auto mutable_details =
|
||||
details == nullptr ? base::DictionaryValue() : details->Clone();
|
||||
mutable_details.SetKey(
|
||||
"requestingUrl",
|
||||
base::Value(render_frame_host->GetLastCommittedURL().spec()));
|
||||
mutable_details.SetKey(
|
||||
"isMainFrame", base::Value(render_frame_host->GetParent() == nullptr));
|
||||
request_handler_.Run(web_contents, permission, callback, mutable_details);
|
||||
}
|
||||
|
||||
return request_id;
|
||||
@@ -241,8 +243,15 @@ bool AtomPermissionManager::CheckPermissionWithDetails(
|
||||
}
|
||||
auto* web_contents =
|
||||
content::WebContents::FromRenderFrameHost(render_frame_host);
|
||||
auto mutable_details =
|
||||
details == nullptr ? base::DictionaryValue() : details->Clone();
|
||||
mutable_details.SetKey(
|
||||
"requestingUrl",
|
||||
base::Value(render_frame_host->GetLastCommittedURL().spec()));
|
||||
mutable_details.SetKey(
|
||||
"isMainFrame", base::Value(render_frame_host->GetParent() == nullptr));
|
||||
return check_handler_.Run(web_contents, permission, requesting_origin,
|
||||
*details);
|
||||
mutable_details);
|
||||
}
|
||||
|
||||
blink::mojom::PermissionStatus
|
||||
|
||||
@@ -31,11 +31,11 @@ class AtomPermissionManager : public content::PermissionControllerDelegate {
|
||||
using RequestHandler = base::Callback<void(content::WebContents*,
|
||||
content::PermissionType,
|
||||
const StatusCallback&,
|
||||
const base::DictionaryValue&)>;
|
||||
const base::Value&)>;
|
||||
using CheckHandler = base::Callback<bool(content::WebContents*,
|
||||
content::PermissionType,
|
||||
const GURL& requesting_origin,
|
||||
const base::DictionaryValue&)>;
|
||||
const base::Value&)>;
|
||||
|
||||
// Handler to dispatch permission requests in JS.
|
||||
void SetPermissionRequestHandler(const RequestHandler& handler);
|
||||
|
||||
@@ -48,6 +48,8 @@ network::mojom::HttpAuthDynamicParamsPtr CreateHttpAuthDynamicParams(
|
||||
command_line.GetSwitchValueASCII(switches::kAuthServerWhitelist);
|
||||
auth_dynamic_params->delegate_whitelist = command_line.GetSwitchValueASCII(
|
||||
switches::kAuthNegotiateDelegateWhitelist);
|
||||
auth_dynamic_params->enable_negotiate_port =
|
||||
command_line.HasSwitch(atom::switches::kEnableAuthNegotiatePort);
|
||||
|
||||
return auth_dynamic_params;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
@class AtomPreviewItem;
|
||||
@class AtomTouchBar;
|
||||
@class CustomWindowButtonView;
|
||||
@class FullSizeContentView;
|
||||
|
||||
namespace atom {
|
||||
|
||||
@@ -164,7 +163,7 @@ class NativeWindowMac : public NativeWindow {
|
||||
|
||||
private:
|
||||
// Add custom layers to the content view.
|
||||
void AddContentViewLayers();
|
||||
void AddContentViewLayers(bool minimizable, bool closable);
|
||||
|
||||
void InternalSetParentWindow(NativeWindow* parent, bool attach);
|
||||
void ShowWindowButton(NSWindowButton button);
|
||||
@@ -181,10 +180,12 @@ class NativeWindowMac : public NativeWindow {
|
||||
// Event monitor for scroll wheel event.
|
||||
id wheel_event_monitor_;
|
||||
|
||||
// The view that will fill the whole frameless window.
|
||||
base::scoped_nsobject<FullSizeContentView> container_view_;
|
||||
// The NSView that used as contentView of window.
|
||||
//
|
||||
// For frameless window it would fill the whole window.
|
||||
base::scoped_nsobject<NSView> container_view_;
|
||||
|
||||
// The view that fills the client area.
|
||||
// The views::View that fills the client area.
|
||||
std::unique_ptr<RootViewMac> root_view_;
|
||||
|
||||
bool is_kiosk_ = false;
|
||||
|
||||
@@ -29,9 +29,56 @@
|
||||
#include "ui/gfx/skia_util.h"
|
||||
#include "ui/gl/gpu_switching_manager.h"
|
||||
#include "ui/views/background.h"
|
||||
#include "ui/views/cocoa/bridged_content_view.h"
|
||||
#include "ui/views/cocoa/bridged_native_widget.h"
|
||||
#include "ui/views/widget/widget.h"
|
||||
|
||||
// This view would inform Chromium to resize the hosted views::View.
|
||||
//
|
||||
// The overrided methods should behave the same with BridgedContentView.
|
||||
@interface ElectronAdapatedContentView : NSView {
|
||||
@private
|
||||
views::BridgedNativeWidget* bridged_widget_;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation ElectronAdapatedContentView
|
||||
|
||||
- (id)initWithShell:(atom::NativeWindowMac*)shell {
|
||||
if ((self = [self init])) {
|
||||
bridged_widget_ = views::NativeWidgetMac::GetBridgeForNativeWindow(
|
||||
shell->GetNativeWindow());
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)viewDidMoveToWindow {
|
||||
// When this view is added to a window, AppKit calls setFrameSize before it is
|
||||
// added to the window, so the behavior in setFrameSize is not triggered.
|
||||
NSWindow* window = [self window];
|
||||
if (window)
|
||||
[self setFrameSize:NSZeroSize];
|
||||
}
|
||||
|
||||
- (void)setFrameSize:(NSSize)newSize {
|
||||
// The size passed in here does not always use
|
||||
// -[NSWindow contentRectForFrameRect]. The following ensures that the
|
||||
// contentView for a frameless window can extend over the titlebar of the new
|
||||
// window containing it, since AppKit requires a titlebar to give frameless
|
||||
// windows correct shadows and rounded corners.
|
||||
NSWindow* window = [self window];
|
||||
if (window && [window contentView] == self)
|
||||
newSize = [window contentRectForFrameRect:[window frame]].size;
|
||||
|
||||
[super setFrameSize:newSize];
|
||||
|
||||
views::View* hostedView = [bridged_widget_->ns_view() hostedView];
|
||||
if (hostedView)
|
||||
hostedView->SetSize(gfx::Size(newSize.width, newSize.height));
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// This view always takes the size of its superview. It is intended to be used
|
||||
// as a NSWindow's contentView. It is needed because NSWindow's implementation
|
||||
// explicitly resizes the contentView at inopportune times.
|
||||
@@ -73,9 +120,11 @@
|
||||
NSButton* close_button =
|
||||
[NSWindow standardWindowButton:NSWindowCloseButton
|
||||
forStyleMask:NSWindowStyleMaskTitled];
|
||||
[close_button setTag:1];
|
||||
NSButton* miniaturize_button =
|
||||
[NSWindow standardWindowButton:NSWindowMiniaturizeButton
|
||||
forStyleMask:NSWindowStyleMaskTitled];
|
||||
[miniaturize_button setTag:2];
|
||||
|
||||
CGFloat x = 0;
|
||||
const CGFloat space_between = 20;
|
||||
@@ -466,7 +515,7 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
||||
|
||||
// Default content view.
|
||||
SetContentView(new views::View());
|
||||
AddContentViewLayers();
|
||||
AddContentViewLayers(minimizable, closable);
|
||||
|
||||
original_frame_ = [window_ frame];
|
||||
original_level_ = [window_ level];
|
||||
@@ -857,9 +906,9 @@ void NativeWindowMac::SetAlwaysOnTop(bool top,
|
||||
if (newLevel >= minWindowLevel && newLevel <= maxWindowLevel) {
|
||||
[window_ setLevel:newLevel];
|
||||
} else {
|
||||
*error = std::string([
|
||||
[NSString stringWithFormat:@"relativeLevel must be between %d and %d",
|
||||
minWindowLevel, maxWindowLevel] UTF8String]);
|
||||
*error = std::string([[NSString
|
||||
stringWithFormat:@"relativeLevel must be between %d and %d",
|
||||
minWindowLevel, maxWindowLevel] UTF8String]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -950,7 +999,13 @@ void NativeWindowMac::SetSimpleFullScreen(bool simple_fullscreen) {
|
||||
[[window standardWindowButton:NSWindowCloseButton] setHidden:YES];
|
||||
}
|
||||
|
||||
[window setFrame:fullscreenFrame display:YES animate:YES];
|
||||
// There is a bug with Chromium that, after setting window style, calling
|
||||
// setFrame with animation immediately would block window rendering for
|
||||
// a few seconds.
|
||||
// This Chromium bug is fixed in later versions, but it is hard to find
|
||||
// out how to backport the fix or how to work around it, disabling the
|
||||
// animation is the easist fix and most users would not even notice it.
|
||||
[window setFrame:fullscreenFrame display:YES animate:NO];
|
||||
|
||||
// Fullscreen windows can't be resized, minimized, maximized, or moved
|
||||
SetMinimizable(false);
|
||||
@@ -974,7 +1029,7 @@ void NativeWindowMac::SetSimpleFullScreen(bool simple_fullscreen) {
|
||||
[[window standardWindowButton:NSWindowCloseButton]
|
||||
setHidden:window_button_hidden];
|
||||
|
||||
[window setFrame:original_frame_ display:YES animate:YES];
|
||||
[window setFrame:original_frame_ display:YES animate:NO];
|
||||
window.level = original_level_;
|
||||
|
||||
[NSApp setPresentationOptions:simple_fullscreen_options_];
|
||||
@@ -1080,7 +1135,7 @@ void NativeWindowMac::SetBrowserView(NativeBrowserView* view) {
|
||||
|
||||
if (browser_view()) {
|
||||
[browser_view()->GetInspectableWebContentsView()->GetNativeView()
|
||||
removeFromSuperview];
|
||||
removeFromSuperview];
|
||||
set_browser_view(nullptr);
|
||||
}
|
||||
|
||||
@@ -1379,7 +1434,7 @@ views::View* NativeWindowMac::GetContentsView() {
|
||||
return root_view_.get();
|
||||
}
|
||||
|
||||
void NativeWindowMac::AddContentViewLayers() {
|
||||
void NativeWindowMac::AddContentViewLayers(bool minimizable, bool closable) {
|
||||
// Make sure the bottom corner is rounded for non-modal windows:
|
||||
// http://crbug.com/396264. But do not enable it on OS X 10.9 for transparent
|
||||
// window, otherwise a semi-transparent frame would show.
|
||||
@@ -1420,6 +1475,12 @@ void NativeWindowMac::AddContentViewLayers() {
|
||||
[[CustomWindowButtonView alloc] initWithFrame:NSZeroRect]);
|
||||
// NSWindowStyleMaskFullSizeContentView does not work with zoom button
|
||||
SetFullScreenable(false);
|
||||
|
||||
if (!minimizable)
|
||||
[[buttons_view_ viewWithTag:2] removeFromSuperview];
|
||||
if (!closable)
|
||||
[[buttons_view_ viewWithTag:1] removeFromSuperview];
|
||||
|
||||
[[window_ contentView] addSubview:buttons_view_];
|
||||
} else {
|
||||
if (title_bar_style_ != NORMAL) {
|
||||
@@ -1479,12 +1540,17 @@ void NativeWindowMac::OverrideNSWindowContentView() {
|
||||
// `BridgedContentView` as content view, which does not support draggable
|
||||
// regions. In order to make draggable regions work, we have to replace the
|
||||
// content view with a simple NSView.
|
||||
container_view_.reset([[FullSizeContentView alloc] init]);
|
||||
if (has_frame()) {
|
||||
container_view_.reset(
|
||||
[[ElectronAdapatedContentView alloc] initWithShell:this]);
|
||||
} else {
|
||||
container_view_.reset([[FullSizeContentView alloc] init]);
|
||||
[container_view_ setFrame:[[[window_ contentView] superview] bounds]];
|
||||
}
|
||||
[container_view_
|
||||
setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
||||
[container_view_ setFrame:[[[window_ contentView] superview] bounds]];
|
||||
[window_ setContentView:container_view_];
|
||||
AddContentViewLayers();
|
||||
AddContentViewLayers(IsMinimizable(), IsClosable());
|
||||
}
|
||||
|
||||
void NativeWindowMac::SetStyleMask(bool on, NSUInteger flag) {
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>electron.icns</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>4.2.0</string>
|
||||
<string>4.2.10</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.2.0</string>
|
||||
<string>4.2.10</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.developer-tools</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
|
||||
@@ -50,8 +50,8 @@ END
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 4,2,0,0
|
||||
PRODUCTVERSION 4,2,0,0
|
||||
FILEVERSION 4,2,10,0
|
||||
PRODUCTVERSION 4,2,10,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -68,12 +68,12 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "GitHub, Inc."
|
||||
VALUE "FileDescription", "Electron"
|
||||
VALUE "FileVersion", "4.2.0"
|
||||
VALUE "FileVersion", "4.2.10"
|
||||
VALUE "InternalName", "electron.exe"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved."
|
||||
VALUE "OriginalFilename", "electron.exe"
|
||||
VALUE "ProductName", "Electron"
|
||||
VALUE "ProductVersion", "4.2.0"
|
||||
VALUE "ProductVersion", "4.2.10"
|
||||
VALUE "SquirrelAwareVersion", "1"
|
||||
END
|
||||
END
|
||||
|
||||
@@ -353,8 +353,11 @@ static NSString* const ImageScrubberItemIdentifier = @"scrubber.image.item";
|
||||
NSButton* button = (NSButton*)item.view;
|
||||
|
||||
std::string backgroundColor;
|
||||
if (settings.Get("backgroundColor", &backgroundColor)) {
|
||||
if (settings.Get("backgroundColor", &backgroundColor) &&
|
||||
!backgroundColor.empty()) {
|
||||
button.bezelColor = [self colorFromHexColorString:backgroundColor];
|
||||
} else {
|
||||
button.bezelColor = nil;
|
||||
}
|
||||
|
||||
std::string label;
|
||||
|
||||
@@ -29,6 +29,7 @@ class TrayIconCocoa : public TrayIcon, public AtomMenuModel::Observer {
|
||||
void SetHighlightMode(TrayIcon::HighlightMode mode) override;
|
||||
void SetIgnoreDoubleClickEvents(bool ignore) override;
|
||||
bool GetIgnoreDoubleClickEvents() override;
|
||||
void PopUpOnUI(AtomMenuModel* menu_model);
|
||||
void PopUpContextMenu(const gfx::Point& pos,
|
||||
AtomMenuModel* menu_model) override;
|
||||
void SetContextMenu(AtomMenuModel* menu_model) override;
|
||||
@@ -48,6 +49,8 @@ class TrayIconCocoa : public TrayIcon, public AtomMenuModel::Observer {
|
||||
// Used for unregistering observer.
|
||||
AtomMenuModel* menu_model_ = nullptr; // weak ref.
|
||||
|
||||
base::WeakPtrFactory<TrayIconCocoa> weak_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(TrayIconCocoa);
|
||||
};
|
||||
|
||||
|
||||
@@ -4,9 +4,14 @@
|
||||
|
||||
#include "atom/browser/ui/tray_icon_cocoa.h"
|
||||
|
||||
#include "atom/browser/mac/atom_application.h"
|
||||
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
|
||||
#include "atom/browser/ui/cocoa/atom_menu_controller.h"
|
||||
#include "base/mac/sdk_forward_declarations.h"
|
||||
#include "base/message_loop/message_loop.h"
|
||||
#include "base/strings/sys_string_conversions.h"
|
||||
#include "base/task_scheduler/post_task.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "ui/display/screen.h"
|
||||
#include "ui/events/cocoa/cocoa_event_utils.h"
|
||||
#include "ui/gfx/image/image.h"
|
||||
@@ -143,6 +148,10 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||
}
|
||||
|
||||
- (BOOL)isDarkMode {
|
||||
if (@available(macOS 10.14, *)) {
|
||||
return [[NSApplication sharedApplication].effectiveAppearance.name
|
||||
isEqualToString:NSAppearanceNameDarkAqua];
|
||||
}
|
||||
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString* mode = [defaults stringForKey:@"AppleInterfaceStyle"];
|
||||
return mode && [mode isEqualToString:@"Dark"];
|
||||
@@ -320,13 +329,17 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||
}
|
||||
|
||||
- (void)popUpContextMenu:(atom::AtomMenuModel*)menu_model {
|
||||
// Make sure events can be pumped while the menu is up.
|
||||
base::MessageLoopCurrent::ScopedNestableTaskAllower allow;
|
||||
|
||||
// Show a custom menu.
|
||||
if (menu_model) {
|
||||
base::scoped_nsobject<AtomMenuController> menuController([
|
||||
[AtomMenuController alloc] initWithModel:menu_model
|
||||
useDefaultAccelerator:NO]);
|
||||
base::scoped_nsobject<AtomMenuController> menuController(
|
||||
[[AtomMenuController alloc] initWithModel:menu_model
|
||||
useDefaultAccelerator:NO]);
|
||||
forceHighlight_ = YES; // Should highlight when showing menu.
|
||||
[self setNeedsDisplay:YES];
|
||||
|
||||
[statusItem_ popUpStatusItemMenu:[menuController menu]];
|
||||
forceHighlight_ = NO;
|
||||
[self setNeedsDisplay:YES];
|
||||
@@ -334,8 +347,12 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||
}
|
||||
|
||||
if (menuController_ && ![menuController_ isMenuOpen]) {
|
||||
// Ensure the UI can update while the menu is fading out.
|
||||
base::ScopedPumpMessagesInPrivateModes pump_private;
|
||||
|
||||
// Redraw the tray icon to show highlight if it is enabled.
|
||||
[self setNeedsDisplay:YES];
|
||||
|
||||
[statusItem_ popUpStatusItemMenu:[menuController_ menu]];
|
||||
// The popUpStatusItemMenu returns only after the showing menu is closed.
|
||||
// When it returns, we need to redraw the tray icon to not show highlight.
|
||||
@@ -433,7 +450,7 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||
|
||||
namespace atom {
|
||||
|
||||
TrayIconCocoa::TrayIconCocoa() {
|
||||
TrayIconCocoa::TrayIconCocoa() : weak_factory_(this) {
|
||||
status_item_view_.reset([[StatusItemView alloc] initWithIcon:this]);
|
||||
}
|
||||
|
||||
@@ -471,9 +488,16 @@ bool TrayIconCocoa::GetIgnoreDoubleClickEvents() {
|
||||
return [status_item_view_ getIgnoreDoubleClickEvents];
|
||||
}
|
||||
|
||||
void TrayIconCocoa::PopUpOnUI(AtomMenuModel* menu_model) {
|
||||
[status_item_view_ popUpContextMenu:menu_model];
|
||||
}
|
||||
|
||||
void TrayIconCocoa::PopUpContextMenu(const gfx::Point& pos,
|
||||
AtomMenuModel* menu_model) {
|
||||
[status_item_view_ popUpContextMenu:menu_model];
|
||||
content::BrowserThread::PostTask(
|
||||
content::BrowserThread::UI, FROM_HERE,
|
||||
base::BindOnce(&TrayIconCocoa::PopUpOnUI, weak_factory_.GetWeakPtr(),
|
||||
base::Unretained(menu_model)));
|
||||
}
|
||||
|
||||
void TrayIconCocoa::SetContextMenu(AtomMenuModel* menu_model) {
|
||||
|
||||
@@ -136,6 +136,8 @@ WebContentsPreferences::WebContentsPreferences(
|
||||
#endif
|
||||
SetDefaultBoolIfUndefined(options::kOffscreen, false);
|
||||
|
||||
SetDefaults();
|
||||
|
||||
last_preference_ = preference_.Clone();
|
||||
}
|
||||
|
||||
@@ -144,6 +146,12 @@ WebContentsPreferences::~WebContentsPreferences() {
|
||||
instances_.end());
|
||||
}
|
||||
|
||||
void WebContentsPreferences::SetDefaults() {
|
||||
if (IsEnabled(options::kSandbox)) {
|
||||
SetBool(options::kNativeWindowOpen, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool WebContentsPreferences::SetDefaultBoolIfUndefined(
|
||||
const base::StringPiece& key,
|
||||
bool val) {
|
||||
@@ -157,6 +165,10 @@ bool WebContentsPreferences::SetDefaultBoolIfUndefined(
|
||||
}
|
||||
}
|
||||
|
||||
void WebContentsPreferences::SetBool(const base::StringPiece& key, bool value) {
|
||||
preference_.SetKey(key, base::Value(value));
|
||||
}
|
||||
|
||||
bool WebContentsPreferences::IsEnabled(const base::StringPiece& name,
|
||||
bool default_value) const {
|
||||
auto* current_value =
|
||||
@@ -169,6 +181,8 @@ bool WebContentsPreferences::IsEnabled(const base::StringPiece& name,
|
||||
void WebContentsPreferences::Merge(const base::DictionaryValue& extend) {
|
||||
if (preference_.is_dict())
|
||||
static_cast<base::DictionaryValue*>(&preference_)->MergeDictionary(&extend);
|
||||
|
||||
SetDefaults();
|
||||
}
|
||||
|
||||
void WebContentsPreferences::Clear() {
|
||||
|
||||
@@ -36,6 +36,9 @@ class WebContentsPreferences
|
||||
const mate::Dictionary& web_preferences);
|
||||
~WebContentsPreferences() override;
|
||||
|
||||
// Set WebPreferences defaults onto the JS object.
|
||||
void SetDefaults();
|
||||
|
||||
// A simple way to know whether a Boolean property is enabled.
|
||||
bool IsEnabled(const base::StringPiece& name,
|
||||
bool default_value = false) const;
|
||||
@@ -75,6 +78,9 @@ class WebContentsPreferences
|
||||
// Set preference value to given bool if user did not provide value
|
||||
bool SetDefaultBoolIfUndefined(const base::StringPiece& key, bool val);
|
||||
|
||||
// Set preference value to given bool
|
||||
void SetBool(const base::StringPiece& key, bool value);
|
||||
|
||||
static std::vector<WebContentsPreferences*> instances_;
|
||||
|
||||
content::WebContents* web_contents_;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#define ATOM_MAJOR_VERSION 4
|
||||
#define ATOM_MINOR_VERSION 2
|
||||
#define ATOM_PATCH_VERSION 0
|
||||
#define ATOM_PATCH_VERSION 10
|
||||
// clang-format off
|
||||
// #define ATOM_PRE_RELEASE_VERSION
|
||||
// clang-format on
|
||||
|
||||
@@ -247,6 +247,9 @@ const char kAuthServerWhitelist[] = "auth-server-whitelist";
|
||||
const char kAuthNegotiateDelegateWhitelist[] =
|
||||
"auth-negotiate-delegate-whitelist";
|
||||
|
||||
// If set, include the port in generated Kerberos SPNs.
|
||||
const char kEnableAuthNegotiatePort[] = "enable-auth-negotiate-port";
|
||||
|
||||
} // namespace switches
|
||||
|
||||
} // namespace atom
|
||||
|
||||
@@ -118,6 +118,7 @@ extern const char kDiskCacheSize[];
|
||||
extern const char kIgnoreConnectionsLimit[];
|
||||
extern const char kAuthServerWhitelist[];
|
||||
extern const char kAuthNegotiateDelegateWhitelist[];
|
||||
extern const char kEnableAuthNegotiatePort[];
|
||||
|
||||
} // namespace switches
|
||||
|
||||
|
||||
53
build/dump_syms.py
Normal file
53
build/dump_syms.py
Normal file
@@ -0,0 +1,53 @@
|
||||
from __future__ import print_function
|
||||
|
||||
import collections
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import errno
|
||||
|
||||
# The BINARY_INFO tuple describes a binary as dump_syms identifies it.
|
||||
BINARY_INFO = collections.namedtuple('BINARY_INFO',
|
||||
['platform', 'arch', 'hash', 'name'])
|
||||
|
||||
def get_module_info(header_info):
|
||||
# header info is of the form "MODULE $PLATFORM $ARCH $HASH $BINARY"
|
||||
info_split = header_info.strip().split(' ', 4)
|
||||
if len(info_split) != 5 or info_split[0] != 'MODULE':
|
||||
return None
|
||||
return BINARY_INFO(*info_split[1:])
|
||||
|
||||
def get_symbol_path(symbol_data):
|
||||
module_info = get_module_info(symbol_data[:symbol_data.index('\n')])
|
||||
if not module_info:
|
||||
raise Exception("Couldn't get module info for binary '{}'".format(binary))
|
||||
exe_name = module_info.name.replace('.pdb', '')
|
||||
return os.path.join(module_info.name, module_info.hash, exe_name + ".sym")
|
||||
|
||||
def mkdir_p(path):
|
||||
"""Simulates mkdir -p."""
|
||||
try:
|
||||
os.makedirs(path)
|
||||
except OSError as e:
|
||||
if e.errno == errno.EEXIST and os.path.isdir(path):
|
||||
pass
|
||||
else: raise
|
||||
|
||||
def main(dump_syms, binary, out_dir, stamp_file, dsym_file=None):
|
||||
args = [dump_syms]
|
||||
if dsym_file:
|
||||
args += ["-g", dsym_file]
|
||||
args += [binary]
|
||||
|
||||
symbol_data = subprocess.check_output(args)
|
||||
symbol_path = os.path.join(out_dir, get_symbol_path(symbol_data))
|
||||
mkdir_p(os.path.dirname(symbol_path))
|
||||
|
||||
with open(symbol_path, 'w') as out:
|
||||
out.write(symbol_data)
|
||||
|
||||
with open(stamp_file, 'w'):
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(*sys.argv[1:])
|
||||
55
build/extract_symbols.gni
Normal file
55
build/extract_symbols.gni
Normal file
@@ -0,0 +1,55 @@
|
||||
import("//build/toolchain/toolchain.gni")
|
||||
|
||||
# Extracts symbols from a binary into a symbol file using dump_syms.
|
||||
#
|
||||
# Args:
|
||||
# binary: Path to the binary containing symbols to extract, e.g.:
|
||||
# "$root_out_dir/electron"
|
||||
# symbol_dir: Desired output directory for symbols, e.g.:
|
||||
# "$root_out_dir/breakpad_symbols"
|
||||
|
||||
if (host_os == "win") {
|
||||
_host_executable_suffix = ".exe"
|
||||
} else {
|
||||
_host_executable_suffix = ""
|
||||
}
|
||||
|
||||
template("extract_symbols") {
|
||||
action(target_name) {
|
||||
forward_variables_from(invoker,
|
||||
[
|
||||
"deps",
|
||||
"testonly",
|
||||
])
|
||||
assert(defined(invoker.binary), "Need binary to dump")
|
||||
assert(defined(invoker.symbol_dir), "Need directory for symbol output")
|
||||
|
||||
dump_syms_label = "//third_party/breakpad:dump_syms($host_toolchain)"
|
||||
dump_syms_binary = get_label_info(dump_syms_label, "root_out_dir") +
|
||||
"/dump_syms$_host_executable_suffix"
|
||||
|
||||
script = "//electron/build/dump_syms.py"
|
||||
inputs = [
|
||||
invoker.binary,
|
||||
dump_syms_binary,
|
||||
]
|
||||
stamp_file = "${target_gen_dir}/${target_name}.stamp"
|
||||
outputs = [
|
||||
stamp_file,
|
||||
]
|
||||
args = [
|
||||
"./" + rebase_path(dump_syms_binary, root_build_dir),
|
||||
rebase_path(invoker.binary, root_build_dir),
|
||||
rebase_path(invoker.symbol_dir, root_build_dir),
|
||||
rebase_path(stamp_file, root_build_dir),
|
||||
]
|
||||
if (defined(invoker.dsym_file)) {
|
||||
args += [ rebase_path(invoker.dsym_file, root_build_dir) ]
|
||||
}
|
||||
|
||||
if (!defined(deps)) {
|
||||
deps = []
|
||||
}
|
||||
deps += [ dump_syms_label ]
|
||||
}
|
||||
}
|
||||
@@ -5,13 +5,15 @@ import sys
|
||||
import zipfile
|
||||
|
||||
EXTENSIONS_TO_SKIP = [
|
||||
'.pdb'
|
||||
'.pdb',
|
||||
'.mojom.externs.js',
|
||||
'.mojom.js',
|
||||
]
|
||||
|
||||
PATHS_TO_SKIP = [
|
||||
'angledata', #Skipping because it is an output of //ui/gl that we don't need
|
||||
'./libVkLayer_', #Skipping because these are outputs that we don't need
|
||||
'./VkLayerLayer_', #Skipping because these are outputs that we don't need
|
||||
'./libVkICD_mock_', #Skipping because these are outputs that we don't need
|
||||
'./VkICD_mock_', #Skipping because these are outputs that we don't need
|
||||
|
||||
# //chrome/browser:resources depends on this via
|
||||
# //chrome/browser/resources/ssl/ssl_error_assistant, but we don't need to
|
||||
|
||||
@@ -86,6 +86,7 @@ function loadApplicationPackage (packagePath) {
|
||||
// Override app name and version.
|
||||
packagePath = path.resolve(packagePath)
|
||||
const packageJsonPath = path.join(packagePath, 'package.json')
|
||||
let appPath
|
||||
if (fs.existsSync(packageJsonPath)) {
|
||||
let packageJson
|
||||
try {
|
||||
@@ -105,11 +106,12 @@ function loadApplicationPackage (packagePath) {
|
||||
}
|
||||
app.setPath('userData', path.join(app.getPath('appData'), app.getName()))
|
||||
app.setPath('userCache', path.join(app.getPath('cache'), app.getName()))
|
||||
app.setAppPath(packagePath)
|
||||
appPath = packagePath
|
||||
}
|
||||
|
||||
try {
|
||||
Module._resolveFilename(packagePath, module, true)
|
||||
const filePath = Module._resolveFilename(packagePath, module, true)
|
||||
app.setAppPath(appPath || path.dirname(filePath))
|
||||
} catch (e) {
|
||||
showErrorMessage(`Unable to find Electron app at ${packagePath}\n\n${e.message}`)
|
||||
return
|
||||
|
||||
@@ -26,11 +26,18 @@ function initialize () {
|
||||
link.addEventListener('auxclick', openLinkExternally)
|
||||
}
|
||||
|
||||
document.querySelector('.electron-version').innerText = `Electron v${process.versions.electron}`
|
||||
document.querySelector('.chrome-version').innerText = `Chromium v${process.versions.chrome}`
|
||||
document.querySelector('.node-version').innerText = `Node v${process.versions.node}`
|
||||
document.querySelector('.v8-version').innerText = `v8 v${process.versions.v8}`
|
||||
document.querySelector('.command-example').innerText = `${electronPath} path-to-app`
|
||||
function replaceText (selector, text) {
|
||||
const element = document.querySelector(selector)
|
||||
if (element) {
|
||||
element.innerText = text
|
||||
}
|
||||
}
|
||||
|
||||
replaceText('.electron-version', `Electron v${process.versions.electron}`)
|
||||
replaceText('.chrome-version', `Chromium v${process.versions.chrome}`)
|
||||
replaceText('.node-version', `Node v${process.versions.node}`)
|
||||
replaceText('.v8-version', `v8 v${process.versions.v8}`)
|
||||
replaceText('.command-example', `${electronPath} path-to-app`)
|
||||
|
||||
function getOcticonSvg (name) {
|
||||
const octiconPath = path.resolve(__dirname, 'node_modules', 'octicons', 'build', 'svg', `${name}.svg`)
|
||||
|
||||
@@ -406,9 +406,11 @@ Returns:
|
||||
|
||||
* `event` Event
|
||||
* `title` String
|
||||
* `explicitSet` Boolean
|
||||
|
||||
Emitted when the document changed its title, calling `event.preventDefault()`
|
||||
will prevent the native window's title from changing.
|
||||
`explicitSet` is false when title is synthesized from file url.
|
||||
|
||||
#### Event: 'close'
|
||||
|
||||
@@ -901,17 +903,17 @@ Resizes and moves the window to the supplied bounds. Any properties that are not
|
||||
```javascript
|
||||
const { BrowserWindow } = require('electron')
|
||||
const win = new BrowserWindow()
|
||||
// set all bounds properties
|
||||
// set all bounds properties
|
||||
win.setBounds({ x: 440, y: 225, width: 800, height: 600 })
|
||||
// set a single bounds property
|
||||
// set a single bounds property
|
||||
win.setBounds({ width: 200 })
|
||||
// { x: 440, y: 225, width: 200, height: 600 }
|
||||
// { x: 440, y: 225, width: 200, height: 600 }
|
||||
console.log(win.getBounds())
|
||||
```
|
||||
|
||||
#### `win.getBounds()`
|
||||
|
||||
Returns [`Rectangle`](structures/rectangle.md)
|
||||
Returns [`Rectangle`](structures/rectangle.md) - The `bounds` of the window as `Object`.
|
||||
|
||||
#### `win.setContentBounds(bounds[, animate])`
|
||||
|
||||
@@ -923,7 +925,7 @@ the supplied bounds.
|
||||
|
||||
#### `win.getContentBounds()`
|
||||
|
||||
Returns [`Rectangle`](structures/rectangle.md)
|
||||
Returns [`Rectangle`](structures/rectangle.md) - The `bounds` of the window's client area as `Object`.
|
||||
|
||||
#### `win.getNormalBounds()`
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ Emitted as soon as the systems screen is unlocked.
|
||||
|
||||
The `powerMonitor` module has the following methods:
|
||||
|
||||
#### `powerMonitor.querySystemIdleState(idleThreshold, callback)`
|
||||
### `powerMonitor.querySystemIdleState(idleThreshold, callback)`
|
||||
|
||||
* `idleThreshold` Integer
|
||||
* `callback` Function
|
||||
@@ -70,7 +70,7 @@ before considered idle. `callback` will be called synchronously on some systems
|
||||
and with an `idleState` argument that describes the system's state. `locked` is
|
||||
available on supported systems only.
|
||||
|
||||
#### `powerMonitor.querySystemIdleTime(callback)`
|
||||
### `powerMonitor.querySystemIdleTime(callback)`
|
||||
|
||||
* `callback` Function
|
||||
* `idleTime` Integer - Idle time in seconds
|
||||
|
||||
@@ -288,15 +288,17 @@ win.webContents.session.setCertificateVerifyProc((request, callback) => {
|
||||
#### `ses.setPermissionRequestHandler(handler)`
|
||||
|
||||
* `handler` Function | null
|
||||
* `webContents` [WebContents](web-contents.md) - WebContents requesting the permission.
|
||||
* `webContents` [WebContents](web-contents.md) - WebContents requesting the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin.
|
||||
* `permission` String - Enum of 'media', 'geolocation', 'notifications', 'midiSysex',
|
||||
'pointerLock', 'fullscreen', 'openExternal'.
|
||||
* `callback` Function
|
||||
* `permissionGranted` Boolean - Allow or deny the permission.
|
||||
* `details` Object - Some properties are only available on certain permission types.
|
||||
* `externalURL` String - The url of the `openExternal` request.
|
||||
* `mediaTypes` String[] - The types of media access being requested, elements can be `video`
|
||||
* `externalURL` String (Optional) - The url of the `openExternal` request.
|
||||
* `mediaTypes` String[] (Optional) - The types of media access being requested, elements can be `video`
|
||||
or `audio`
|
||||
* `requestingUrl` String - The last URL the requesting frame loaded
|
||||
* `isMainFrame` Boolean - Whether the frame making the request is the main frame
|
||||
|
||||
Sets the handler which can be used to respond to permission requests for the `session`.
|
||||
Calling `callback(true)` will allow the permission and `callback(false)` will reject it.
|
||||
@@ -316,13 +318,15 @@ session.fromPartition('some-partition').setPermissionRequestHandler((webContents
|
||||
#### `ses.setPermissionCheckHandler(handler)`
|
||||
|
||||
* `handler` Function<Boolean> | null
|
||||
* `webContents` [WebContents](web-contents.md) - WebContents checking the permission.
|
||||
* `webContents` [WebContents](web-contents.md) - WebContents checking the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin.
|
||||
* `permission` String - Enum of 'media'.
|
||||
* `requestingOrigin` String - The origin URL of the permission check
|
||||
* `details` Object - Some properties are only available on certain permission types.
|
||||
* `securityOrigin` String - The security orign of the `media` check.
|
||||
* `mediaType` String - The type of media access being requested, can be `video`,
|
||||
`audio` or `unknown`
|
||||
* `requestingUrl` String - The last URL the requesting frame loaded
|
||||
* `isMainFrame` Boolean - Whether the frame making the request is the main frame
|
||||
|
||||
Sets the handler which can be used to respond to permission checks for the `session`.
|
||||
Returning `true` will allow the permission and `false` will reject it.
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
# MemoryInfo Object
|
||||
|
||||
* `pid` Integer - Process id of the process.
|
||||
* `workingSetSize` Integer - The amount of memory currently pinned to actual physical RAM.
|
||||
* `peakWorkingSetSize` Integer - The maximum amount of memory that has ever been pinned
|
||||
to actual physical RAM. On macOS its value will always be 0.
|
||||
* `privateBytes` Integer - The amount of memory not shared by other processes, such as
|
||||
JS heap or HTML content.
|
||||
* `sharedBytes` Integer - The amount of memory shared between processes, typically
|
||||
memory consumed by the Electron code itself
|
||||
|
||||
Note that all statistics are reported in Kilobytes.
|
||||
@@ -35,14 +35,6 @@ Returns:
|
||||
* `invertedColorScheme` Boolean - `true` if an inverted color scheme, such as
|
||||
a high contrast theme, is being used, `false` otherwise.
|
||||
|
||||
### Event: 'appearance-changed' _macOS_
|
||||
|
||||
Returns:
|
||||
|
||||
* `newAppearance` String - Can be `dark` or `light`
|
||||
|
||||
**NOTE:** This event is only emitted after you have called `startAppLevelAppearanceTrackingOS`
|
||||
|
||||
## Methods
|
||||
|
||||
### `systemPreferences.isDarkMode()` _macOS_
|
||||
|
||||
@@ -101,6 +101,17 @@ Returns:
|
||||
|
||||
Emitted when the document in the given frame is loaded.
|
||||
|
||||
#### Event: 'page-title-updated'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `title` String
|
||||
* `explicitSet` Boolean
|
||||
|
||||
Fired when page title is set during navigation. `explicitSet` is false when
|
||||
title is synthesized from file url.
|
||||
|
||||
#### Event: 'page-favicon-updated'
|
||||
|
||||
Returns:
|
||||
|
||||
@@ -36,7 +36,7 @@ Electron is used together with the installation and update framework Squirrel,
|
||||
[shortcuts will automatically be set correctly][squirrel-events]. Furthermore,
|
||||
Electron will detect that Squirrel was used and will automatically call
|
||||
`app.setAppUserModelId()` with the correct value. During development, you may have
|
||||
to call [`app.setAppUserModelId()`][[set-app-user-model-id]] yourself.
|
||||
to call [`app.setAppUserModelId()`][set-app-user-model-id] yourself.
|
||||
|
||||
Furthermore, in Windows 8, the maximum length for the notification body is 250
|
||||
characters, with the Windows team recommending that notifications should be kept
|
||||
|
||||
@@ -33,9 +33,26 @@ tools and resources.
|
||||
|
||||
## Supported Versions
|
||||
|
||||
The latest three release branches are supported by the Electron team.
|
||||
For example, if the latest release is 2.0.x, then the 2-0-x series
|
||||
is supported, as are the two previous release series 1-7-x and 1-8-x.
|
||||
The latest three major versions are supported by the Electron team.
|
||||
For example, if the latest release is 5.0.x, then the 4.x.y series
|
||||
is supported, as are the two previous release series 3.x.y and 2.x.y.
|
||||
|
||||
The latest stable release unilaterally receives all fixes from `master`,
|
||||
and the version prior to that receives the vast majority of those fixes
|
||||
as time and bandwidth warrants. The oldest supported release line will receive
|
||||
only security fixes directly.
|
||||
|
||||
All supported release lines will accept external pull requests to backport
|
||||
fixes previously merged to `master`, though this may be on a case-by-case
|
||||
basis for some older supported lines. All contested decisions around release
|
||||
line backports will be resolved by the [Releases Working Group](https://github.com/electron/governance/tree/master/wg-releases) as an agenda item at their weekly meeting the week the backport PR is raised.
|
||||
|
||||
### Currently supported versions
|
||||
- 5.x
|
||||
- 4.x
|
||||
- 3.x
|
||||
|
||||
### End-of-life
|
||||
|
||||
When a release branch reaches the end of its support cycle, the series
|
||||
will be deprecated in NPM and a final end-of-support release will be
|
||||
|
||||
@@ -40,18 +40,6 @@ Object.assign(app, {
|
||||
}
|
||||
})
|
||||
|
||||
const nativeFn = app.getAppMetrics
|
||||
app.getAppMetrics = () => {
|
||||
const metrics = nativeFn.call(app)
|
||||
for (const metric of metrics) {
|
||||
if ('memory' in metric) {
|
||||
deprecate.removeProperty(metric, 'memory')
|
||||
}
|
||||
}
|
||||
|
||||
return metrics
|
||||
}
|
||||
|
||||
app.isPackaged = (() => {
|
||||
const execFile = path.basename(process.execPath).toLowerCase()
|
||||
if (process.platform === 'win32') {
|
||||
|
||||
@@ -39,9 +39,9 @@ BrowserWindow.prototype._init = function () {
|
||||
})
|
||||
|
||||
// Change window title to page title.
|
||||
this.webContents.on('page-title-updated', (event, title) => {
|
||||
this.webContents.on('page-title-updated', (event, title, ...args) => {
|
||||
// Route the event to BrowserWindow.
|
||||
this.emit('page-title-updated', event, title)
|
||||
this.emit('page-title-updated', event, title, ...args)
|
||||
if (!this.isDestroyed() && !event.defaultPrevented) this.setTitle(title)
|
||||
})
|
||||
|
||||
|
||||
@@ -118,7 +118,6 @@ const createGuest = function (embedder, params) {
|
||||
}
|
||||
this.loadURL(params.src, opts)
|
||||
}
|
||||
guest.allowPopups = params.allowpopups
|
||||
embedder.emit('did-attach-webview', event, guest)
|
||||
})
|
||||
|
||||
@@ -220,6 +219,7 @@ const attachGuest = function (event, embedderFrameId, elementInstanceId, guestIn
|
||||
enableRemoteModule: params.enableremotemodule,
|
||||
plugins: params.plugins,
|
||||
zoomFactor: embedder._getZoomFactor(),
|
||||
disablePopups: !params.allowpopups,
|
||||
webSecurity: !params.disablewebsecurity,
|
||||
enableBlinkFeatures: params.blinkfeatures,
|
||||
disableBlinkFeatures: params.disableblinkfeatures
|
||||
@@ -241,11 +241,6 @@ const attachGuest = function (event, embedderFrameId, elementInstanceId, guestIn
|
||||
webPreferences.preloadURL = params.preload
|
||||
}
|
||||
|
||||
// Return null from native window.open if allowpopups is unset
|
||||
if (webPreferences.nativeWindowOpen === true && !params.allowpopups) {
|
||||
webPreferences.disablePopups = true
|
||||
}
|
||||
|
||||
// Security options that guest will always inherit from embedder
|
||||
const inheritedWebPreferences = new Map([
|
||||
['contextIsolation', true],
|
||||
|
||||
@@ -171,20 +171,27 @@ const getGuestWindow = function (guestContents) {
|
||||
return guestWindow
|
||||
}
|
||||
|
||||
const isChildWindow = function (sender, target) {
|
||||
return target.getLastWebPreferences().openerId === sender.id
|
||||
}
|
||||
|
||||
const isRelatedWindow = function (sender, target) {
|
||||
return isChildWindow(sender, target) || isChildWindow(target, sender)
|
||||
}
|
||||
|
||||
const isScriptableWindow = function (sender, target) {
|
||||
return isRelatedWindow(sender, target) && isSameOrigin(sender.getURL(), target.getURL())
|
||||
}
|
||||
|
||||
const isNodeIntegrationEnabled = function (sender) {
|
||||
return sender.getLastWebPreferences().nodeIntegration === true
|
||||
}
|
||||
|
||||
// Checks whether |sender| can access the |target|:
|
||||
// 1. Check whether |sender| is the parent of |target|.
|
||||
// 2. Check whether |sender| has node integration, if so it is allowed to
|
||||
// do anything it wants.
|
||||
// 3. Check whether the origins match.
|
||||
//
|
||||
// However it allows a child window without node integration but with same
|
||||
// origin to do anything it wants, when its opener window has node integration.
|
||||
// The W3C does not have anything on this, but from my understanding of the
|
||||
// security model of |window.opener|, this should be fine.
|
||||
const canAccessWindow = function (sender, target) {
|
||||
return (target.getLastWebPreferences().openerId === sender.id) ||
|
||||
(sender.getLastWebPreferences().nodeIntegration === true) ||
|
||||
isSameOrigin(sender.getURL(), target.getURL())
|
||||
return isChildWindow(sender, target) ||
|
||||
isScriptableWindow(sender, target) ||
|
||||
isNodeIntegrationEnabled(sender)
|
||||
}
|
||||
|
||||
// Routed window.open messages with raw options
|
||||
@@ -259,7 +266,7 @@ ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', function (event
|
||||
options = mergeBrowserWindowOptions(event.sender, options)
|
||||
event.sender.emit('new-window', event, url, frameName, disposition, options, additionalFeatures, referrer)
|
||||
const { newGuest } = event
|
||||
if ((event.sender.isGuest() && !event.sender.allowPopups) || event.defaultPrevented) {
|
||||
if ((event.sender.isGuest() && event.sender.getLastWebPreferences().disablePopups) || event.defaultPrevented) {
|
||||
if (newGuest != null) {
|
||||
if (options.webContents === newGuest.webContents) {
|
||||
// the webContents is not changed, so set defaultPrevented to false to
|
||||
|
||||
@@ -30,16 +30,20 @@ function wrap (func, wrapper) {
|
||||
|
||||
process.nextTick = wrapWithActivateUvLoop(process.nextTick)
|
||||
|
||||
global.setImmediate = wrapWithActivateUvLoop(timers.setImmediate)
|
||||
global.setImmediate = timers.setImmediate = wrapWithActivateUvLoop(timers.setImmediate)
|
||||
global.clearImmediate = timers.clearImmediate
|
||||
|
||||
// setTimeout needs to update the polling timeout of the event loop, when
|
||||
// called under Chromium's event loop the node's event loop won't get a chance
|
||||
// to update the timeout, so we have to force the node's event loop to
|
||||
// recalculate the timeout in browser process.
|
||||
timers.setTimeout = wrapWithActivateUvLoop(timers.setTimeout)
|
||||
timers.setInterval = wrapWithActivateUvLoop(timers.setInterval)
|
||||
|
||||
// Only override the global setTimeout/setInterval impls in the browser process
|
||||
if (process.type === 'browser') {
|
||||
// setTimeout needs to update the polling timeout of the event loop, when
|
||||
// called under Chromium's event loop the node's event loop won't get a chance
|
||||
// to update the timeout, so we have to force the node's event loop to
|
||||
// recalculate the timeout in browser process.
|
||||
global.setTimeout = wrapWithActivateUvLoop(timers.setTimeout)
|
||||
global.setInterval = wrapWithActivateUvLoop(timers.setInterval)
|
||||
global.setTimeout = timers.setTimeout
|
||||
global.setInterval = timers.setInterval
|
||||
}
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
|
||||
9
package-lock.json
generated
9
package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "electron",
|
||||
"version": "4.2.0",
|
||||
"version": "4.2.10",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -244,6 +244,7 @@
|
||||
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2",
|
||||
"longest": "^1.0.1",
|
||||
@@ -2142,7 +2143,8 @@
|
||||
"version": "0.3.4",
|
||||
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
|
||||
"integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"cssstyle": {
|
||||
"version": "0.2.37",
|
||||
@@ -6600,7 +6602,8 @@
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"longest-streak": {
|
||||
"version": "2.0.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "electron",
|
||||
"version": "4.2.0",
|
||||
"version": "4.2.10",
|
||||
"repository": "https://github.com/electron/electron",
|
||||
"description": "Build cross platform desktop apps with JavaScript, HTML, and CSS",
|
||||
"devDependencies": {
|
||||
|
||||
@@ -100,3 +100,14 @@ make_--explicitly-allowed-ports_work_with_networkservice.patch
|
||||
fix_crashes_in_renderframeimpl_onselectpopupmenuitem_s.patch
|
||||
fix_re-entracy_problem_with_invalidateframesinkid.patch
|
||||
chore_expose_getcontentclient_to_embedders.patch
|
||||
tabbed_window_lagging.patch
|
||||
restore_live_region_changed_events_for_processing_by_jaws_focus_mode.patch
|
||||
enable_quic_proxies_for_https_urls.patch
|
||||
fix_svg_crash_for_v0_distribution_into_foreignobject.patch
|
||||
filesystem_harden_against_overflows_of_operationid_a_bit_better.patch
|
||||
fix_uap_in_imagebitmaploader_filereaderloader.patch
|
||||
fire_caret_location_change_when_focus_moves_from_ui_to_content.patch
|
||||
do_not_show_virtual_keyboard_for_all_mouse_inputs.patch
|
||||
setup_the_observer_before_calling_displayvirtualkeyboard.patch
|
||||
workaround_apparent_data_corruption_in_blockfile_on_os_x_10_14_by.patch
|
||||
mediacontrols_disconnect_observers_when_controls_are_hidden.patch
|
||||
|
||||
@@ -0,0 +1,253 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Lan Wei <lanwei@chromium.org>
|
||||
Date: Tue, 11 Sep 2018 19:41:33 +0000
|
||||
Subject: Do not show virtual keyboard for all mouse inputs
|
||||
|
||||
We have an issue that Windows virtual Keyboard appears whenever a text
|
||||
area is selected with the mouse or keyboard. Since we decide to only
|
||||
show the virtual keyboard when the input type is touch.
|
||||
|
||||
Bug: 871756
|
||||
Change-Id: Ia804afad907341ed478409d223b67f09c6b7f8f3
|
||||
Reviewed-on: https://chromium-review.googlesource.com/1194406
|
||||
Reviewed-by: Pavel Feldman <pfeldman@chromium.org>
|
||||
Reviewed-by: Marc Treib <treib@chromium.org>
|
||||
Reviewed-by: Keigo Oka <oka@chromium.org>
|
||||
Reviewed-by: Lei Zhang <thestig@chromium.org>
|
||||
Reviewed-by: Navid Zolghadr <nzolghadr@chromium.org>
|
||||
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
|
||||
Commit-Queue: Lan Wei <lanwei@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#590440}
|
||||
|
||||
diff --git a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
||||
index 5c8bdc8c73dc2047175f16c658428c9f2c038412..f7c8c33b3d6764116e0713244e446356873e015f 100644
|
||||
--- a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
||||
+++ b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
||||
@@ -1154,6 +1154,9 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessTextInputManagerTest,
|
||||
|
||||
// Set |TextInputState.show_ime_if_needed| to true. Expect IME.
|
||||
sender.SetShowVirtualKeyboardIfEnabled(true);
|
||||
+#if defined(OS_WIN)
|
||||
+ sender.SetLastPointerType(ui::EventPointerType::POINTER_TYPE_TOUCH);
|
||||
+#endif
|
||||
EXPECT_TRUE(send_and_check_show_ime());
|
||||
|
||||
// Send the same message. Expect IME (no change).
|
||||
@@ -1171,6 +1174,12 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessTextInputManagerTest,
|
||||
sender.SetShowVirtualKeyboardIfEnabled(true);
|
||||
EXPECT_TRUE(send_and_check_show_ime());
|
||||
|
||||
+#if defined(OS_WIN)
|
||||
+ // Set input type to mouse. Expect no IME.
|
||||
+ sender.SetLastPointerType(ui::EventPointerType::POINTER_TYPE_MOUSE);
|
||||
+ EXPECT_FALSE(send_and_check_show_ime());
|
||||
+#endif
|
||||
+
|
||||
// Set |TextInputState.type| to ui::TEXT_INPUT_TYPE_NONE. Expect no IME.
|
||||
sender.SetType(ui::TEXT_INPUT_TYPE_NONE);
|
||||
EXPECT_FALSE(send_and_check_show_ime());
|
||||
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
|
||||
index 1445829a89caaeeea602cd050b9c3bf0161f5881..0bb77fbfee6a4c08ce261bbc4846c8ec0755b01a 100644
|
||||
--- a/chrome/browser/ui/search/search_tab_helper.cc
|
||||
+++ b/chrome/browser/ui/search/search_tab_helper.cc
|
||||
@@ -271,7 +271,9 @@ void SearchTabHelper::FocusOmnibox(OmniboxFocusState state) {
|
||||
// visual cue to users who really understand selection state about what
|
||||
// will happen if they start typing.
|
||||
omnibox_view->SelectAll(false);
|
||||
+#if !defined(OS_WIN)
|
||||
omnibox_view->ShowVirtualKeyboardIfEnabled();
|
||||
+#endif
|
||||
break;
|
||||
case OMNIBOX_FOCUS_NONE:
|
||||
// Remove focus only if the popup is closed. This will prevent someone
|
||||
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
index 0eec5c7a6861f189192ab0cf8b3dbb3b452292e0..de9490d94d98afa6812e81b0cf50fb4adc81887c 100644
|
||||
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
@@ -756,9 +756,11 @@ void RenderWidgetHostViewAura::FocusedNodeTouched(bool editable) {
|
||||
return;
|
||||
auto* controller = input_method->GetInputMethodKeyboardController();
|
||||
if (editable && host()->GetView() && host()->delegate()) {
|
||||
- keyboard_observer_.reset(new WinScreenKeyboardObserver(this));
|
||||
- if (!controller->DisplayVirtualKeyboard())
|
||||
- keyboard_observer_.reset(nullptr);
|
||||
+ keyboard_observer_.reset(nullptr);
|
||||
+ if (last_pointer_type_ == ui::EventPointerType::POINTER_TYPE_TOUCH &&
|
||||
+ controller->DisplayVirtualKeyboard()) {
|
||||
+ keyboard_observer_.reset(new WinScreenKeyboardObserver(this));
|
||||
+ }
|
||||
virtual_keyboard_requested_ = keyboard_observer_.get();
|
||||
} else {
|
||||
virtual_keyboard_requested_ = false;
|
||||
@@ -2341,9 +2343,16 @@ void RenderWidgetHostViewAura::OnUpdateTextInputStateCalled(
|
||||
const TextInputState* state = text_input_manager_->GetTextInputState();
|
||||
if (state && state->type != ui::TEXT_INPUT_TYPE_NONE &&
|
||||
state->mode != ui::TEXT_INPUT_MODE_NONE) {
|
||||
+ bool show_virtual_keyboard = true;
|
||||
+#if defined(OS_WIN)
|
||||
+ show_virtual_keyboard =
|
||||
+ last_pointer_type_ == ui::EventPointerType::POINTER_TYPE_TOUCH;
|
||||
+#endif
|
||||
if (state->show_ime_if_needed &&
|
||||
- GetInputMethod()->GetTextInputClient() == this)
|
||||
+ GetInputMethod()->GetTextInputClient() == this &&
|
||||
+ show_virtual_keyboard) {
|
||||
GetInputMethod()->ShowVirtualKeyboardIfEnabled();
|
||||
+ }
|
||||
// Ensure that accessibility events are fired when the selection location
|
||||
// moves from UI back to content.
|
||||
text_input_manager->NotifySelectionBoundsChanged(updated_view);
|
||||
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
|
||||
index 5f75e19c4a9fa8aaa57882dcbb094a73199f50d0..2257552851e933a06cb9addbee00e511573561ec 100644
|
||||
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
|
||||
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
|
||||
@@ -342,6 +342,12 @@ class CONTENT_EXPORT RenderWidgetHostViewAura
|
||||
|
||||
void ScrollFocusedEditableNodeIntoRect(const gfx::Rect& rect);
|
||||
|
||||
+ // TODO(lanwei): Use TestApi interface to write functions that are used in
|
||||
+ // tests and remove FRIEND_TEST_ALL_PREFIXES.
|
||||
+ void SetLastPointerType(ui::EventPointerType last_pointer_type) {
|
||||
+ last_pointer_type_ = last_pointer_type;
|
||||
+ }
|
||||
+
|
||||
protected:
|
||||
~RenderWidgetHostViewAura() override;
|
||||
|
||||
@@ -408,6 +414,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAura
|
||||
DiscardDelegatedFramesWithMemoryPressure);
|
||||
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraKeyboardTest,
|
||||
KeyboardObserverDestroyed);
|
||||
+ FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraKeyboardTest,
|
||||
+ KeyboardObserverForOnlyTouchInput);
|
||||
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraSurfaceSynchronizationTest,
|
||||
DropFallbackWhenHidden);
|
||||
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraSurfaceSynchronizationTest,
|
||||
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
||||
index 9aac9b4c740245727124991a750a36b54f3d7ac5..f7b9e13226b1896028044d389ace5383554b5dce 100644
|
||||
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
||||
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
||||
@@ -6735,6 +6735,7 @@ class RenderWidgetHostViewAuraKeyboardTest
|
||||
};
|
||||
|
||||
TEST_F(RenderWidgetHostViewAuraKeyboardTest, KeyboardObserverDestroyed) {
|
||||
+ parent_view_->SetLastPointerType(ui::EventPointerType::POINTER_TYPE_TOUCH);
|
||||
parent_view_->FocusedNodeTouched(true);
|
||||
EXPECT_NE(parent_view_->keyboard_observer_.get(), nullptr);
|
||||
EXPECT_EQ(keyboard_controller_observer_count(), 1u);
|
||||
@@ -6744,6 +6745,20 @@ TEST_F(RenderWidgetHostViewAuraKeyboardTest, KeyboardObserverDestroyed) {
|
||||
EXPECT_EQ(keyboard_controller_observer_count(), 0u);
|
||||
}
|
||||
|
||||
+TEST_F(RenderWidgetHostViewAuraKeyboardTest,
|
||||
+ KeyboardObserverForOnlyTouchInput) {
|
||||
+ // Show virtual keyboard for touch inputs.
|
||||
+ parent_view_->SetLastPointerType(ui::EventPointerType::POINTER_TYPE_TOUCH);
|
||||
+ parent_view_->FocusedNodeTouched(true);
|
||||
+ EXPECT_NE(parent_view_->keyboard_observer_.get(), nullptr);
|
||||
+ EXPECT_EQ(keyboard_controller_observer_count(), 1u);
|
||||
+ // Do not show virtual keyboard for mouse inputs.
|
||||
+ parent_view_->SetLastPointerType(ui::EventPointerType::POINTER_TYPE_MOUSE);
|
||||
+ parent_view_->FocusedNodeTouched(true);
|
||||
+ EXPECT_EQ(parent_view_->keyboard_observer_.get(), nullptr);
|
||||
+ EXPECT_EQ(keyboard_controller_observer_count(), 0u);
|
||||
+}
|
||||
+
|
||||
#endif // defined(OS_WIN)
|
||||
|
||||
} // namespace content
|
||||
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc
|
||||
index 3d27041d9cfae4d87e4b2b26983f7a004ffc31d9..2d724b57c213052b184fc3b4c012bb0d8ad25b50 100644
|
||||
--- a/content/public/test/text_input_test_utils.cc
|
||||
+++ b/content/public/test/text_input_test_utils.cc
|
||||
@@ -186,7 +186,7 @@ class TestRenderWidgetHostViewDestructionObserver::InternalObserver
|
||||
DISALLOW_COPY_AND_ASSIGN(InternalObserver);
|
||||
};
|
||||
|
||||
-#ifdef USE_AURA
|
||||
+#if defined(USE_AURA)
|
||||
class InputMethodObserverAura : public TestInputMethodObserver,
|
||||
public ui::InputMethodObserver {
|
||||
public:
|
||||
@@ -453,6 +453,15 @@ void TextInputStateSender::SetShowVirtualKeyboardIfEnabled(
|
||||
text_input_state_->show_ime_if_needed = show_ime_if_needed;
|
||||
}
|
||||
|
||||
+#if defined(USE_AURA)
|
||||
+void TextInputStateSender::SetLastPointerType(
|
||||
+ ui::EventPointerType last_pointer_type) {
|
||||
+ RenderWidgetHostViewAura* rwhva =
|
||||
+ static_cast<RenderWidgetHostViewAura*>(view_);
|
||||
+ rwhva->SetLastPointerType(last_pointer_type);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
TestInputMethodObserver::TestInputMethodObserver() {}
|
||||
|
||||
TestInputMethodObserver::~TestInputMethodObserver() {}
|
||||
@@ -462,7 +471,7 @@ std::unique_ptr<TestInputMethodObserver> TestInputMethodObserver::Create(
|
||||
WebContents* web_contents) {
|
||||
std::unique_ptr<TestInputMethodObserver> observer;
|
||||
|
||||
-#ifdef USE_AURA
|
||||
+#if defined(USE_AURA)
|
||||
RenderWidgetHostViewAura* view = static_cast<RenderWidgetHostViewAura*>(
|
||||
web_contents->GetRenderWidgetHostView());
|
||||
observer.reset(new InputMethodObserverAura(view->GetInputMethod()));
|
||||
diff --git a/content/public/test/text_input_test_utils.h b/content/public/test/text_input_test_utils.h
|
||||
index d438b72e176adbcb1240848c223596ffef2c558d..2bb337c19de138a106f8f3fe8c631aa8ca717df5 100644
|
||||
--- a/content/public/test/text_input_test_utils.h
|
||||
+++ b/content/public/test/text_input_test_utils.h
|
||||
@@ -17,6 +17,10 @@
|
||||
#include "content/public/browser/browser_message_filter.h"
|
||||
#endif
|
||||
|
||||
+#if defined(USE_AURA)
|
||||
+#include "ui/events/event_constants.h"
|
||||
+#endif
|
||||
+
|
||||
namespace ipc {
|
||||
class Message;
|
||||
}
|
||||
@@ -194,6 +198,9 @@ class TextInputStateSender {
|
||||
void SetFlags(int flags);
|
||||
void SetCanComposeInline(bool can_compose_inline);
|
||||
void SetShowVirtualKeyboardIfEnabled(bool show_ime_if_needed);
|
||||
+#if defined(USE_AURA)
|
||||
+ void SetLastPointerType(ui::EventPointerType last_pointer_type);
|
||||
+#endif
|
||||
|
||||
private:
|
||||
std::unique_ptr<TextInputState> text_input_state_;
|
||||
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
|
||||
index c9a96b43788835476310c96b71b1ced21737a3c3..7963a4d1912eb8ba03d46dd353665f977680a2c5 100644
|
||||
--- a/ui/views/controls/textfield/textfield.cc
|
||||
+++ b/ui/views/controls/textfield/textfield.cc
|
||||
@@ -666,7 +666,9 @@ bool Textfield::OnMousePressed(const ui::MouseEvent& event) {
|
||||
(event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton())) {
|
||||
if (!had_focus)
|
||||
RequestFocusWithPointer(ui::EventPointerType::POINTER_TYPE_MOUSE);
|
||||
+#if !defined(OS_WIN)
|
||||
ShowVirtualKeyboardIfEnabled();
|
||||
+#endif
|
||||
}
|
||||
|
||||
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
||||
@@ -743,10 +745,16 @@ bool Textfield::OnKeyReleased(const ui::KeyEvent& event) {
|
||||
}
|
||||
|
||||
void Textfield::OnGestureEvent(ui::GestureEvent* event) {
|
||||
+ bool show_virtual_keyboard = true;
|
||||
+#if defined(OS_WIN)
|
||||
+ show_virtual_keyboard = event->details().primary_pointer_type() ==
|
||||
+ ui::EventPointerType::POINTER_TYPE_TOUCH;
|
||||
+#endif
|
||||
switch (event->type()) {
|
||||
case ui::ET_GESTURE_TAP_DOWN:
|
||||
RequestFocusWithPointer(event->details().primary_pointer_type());
|
||||
- ShowVirtualKeyboardIfEnabled();
|
||||
+ if (show_virtual_keyboard)
|
||||
+ ShowVirtualKeyboardIfEnabled();
|
||||
event->SetHandled();
|
||||
break;
|
||||
case ui::ET_GESTURE_TAP:
|
||||
143
patches/common/chromium/enable_quic_proxies_for_https_urls.patch
Normal file
143
patches/common/chromium/enable_quic_proxies_for_https_urls.patch
Normal file
@@ -0,0 +1,143 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Burda <milan.burda@gmail.com>
|
||||
Date: Sun, 31 Mar 2019 21:12:59 +0200
|
||||
Subject: Enable support for sending HTTPS URLs via QUIC proxies only when the
|
||||
finch param enable_quic_proxies_for_https_urls is set.
|
||||
|
||||
Backports:
|
||||
- https://chromium-review.googlesource.com/c/chromium/src/+/1377709
|
||||
- https://chromium-review.googlesource.com/c/chromium/src/+/1375112
|
||||
- https://chromium-review.googlesource.com/c/chromium/src/+/1417356
|
||||
|
||||
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
index 39fd430aafb358d465ba30120c30580672f95aa8..21d34cfab2c426ae367148433d21916fcd92c757 100644
|
||||
--- a/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
@@ -143,6 +143,14 @@ bool ShouldEnableQuic(base::StringPiece quic_trial_group,
|
||||
GetVariationParam(quic_trial_params, "enable_quic"), "true");
|
||||
}
|
||||
|
||||
+bool ShouldEnableQuicProxiesForHttpsUrls(
|
||||
+ const VariationParameters& quic_trial_params) {
|
||||
+ return base::LowerCaseEqualsASCII(
|
||||
+ GetVariationParam(quic_trial_params,
|
||||
+ "enable_quic_proxies_for_https_urls"),
|
||||
+ "true");
|
||||
+}
|
||||
+
|
||||
bool ShouldMarkQuicBrokenWhenNetworkBlackholes(
|
||||
const VariationParameters& quic_trial_params) {
|
||||
return base::LowerCaseEqualsASCII(
|
||||
@@ -367,6 +375,8 @@ void ConfigureQuicParams(base::StringPiece quic_trial_group,
|
||||
ShouldSupportIetfFormatQuicAltSvc(quic_trial_params);
|
||||
|
||||
if (params->enable_quic) {
|
||||
+ params->enable_quic_proxies_for_https_urls =
|
||||
+ ShouldEnableQuicProxiesForHttpsUrls(quic_trial_params);
|
||||
params->quic_connection_options =
|
||||
GetQuicConnectionOptions(quic_trial_params);
|
||||
params->quic_client_connection_options =
|
||||
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
|
||||
index 6235f7d927a82ebcc7a04792bc44e0675c8ced54..1e3f7b89c3c1ef5b3da2c89516acd13ac1ad283f 100644
|
||||
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
|
||||
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
|
||||
@@ -67,6 +67,7 @@ TEST_F(NetworkSessionConfiguratorTest, Defaults) {
|
||||
EXPECT_FALSE(params_.enable_websocket_over_http2);
|
||||
|
||||
EXPECT_FALSE(params_.enable_quic);
|
||||
+ EXPECT_FALSE(params_.enable_quic_proxies_for_https_urls);
|
||||
EXPECT_EQ("Chrome/52.0.2709.0 Linux x86_64", params_.quic_user_agent_id);
|
||||
EXPECT_EQ(0u, params_.origins_to_force_quic_on.size());
|
||||
}
|
||||
@@ -146,6 +147,17 @@ TEST_F(NetworkSessionConfiguratorTest, EnableQuicForDataReductionProxy) {
|
||||
EXPECT_TRUE(params_.enable_quic);
|
||||
}
|
||||
|
||||
+TEST_F(NetworkSessionConfiguratorTest, EnableQuicProxiesForHttpsUrls) {
|
||||
+ std::map<std::string, std::string> field_trial_params;
|
||||
+ field_trial_params["enable_quic_proxies_for_https_urls"] = "true";
|
||||
+ variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
|
||||
+ base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
|
||||
+
|
||||
+ ParseFieldTrials();
|
||||
+
|
||||
+ EXPECT_TRUE(params_.enable_quic_proxies_for_https_urls);
|
||||
+}
|
||||
+
|
||||
TEST_F(NetworkSessionConfiguratorTest,
|
||||
MarkQuicBrokenWhenNetworkBlackholesFromFieldTrialParams) {
|
||||
std::map<std::string, std::string> field_trial_params;
|
||||
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
|
||||
index 3bcaca68145012fe11374044e4dddf2b4c3d0b5c..d997e092d56c43222b491b27740cecead2ec3947 100644
|
||||
--- a/net/http/http_network_session.cc
|
||||
+++ b/net/http/http_network_session.cc
|
||||
@@ -112,6 +112,7 @@ HttpNetworkSession::Params::Params()
|
||||
enable_http2_alternative_service(false),
|
||||
enable_websocket_over_http2(false),
|
||||
enable_quic(false),
|
||||
+ enable_quic_proxies_for_https_urls(false),
|
||||
quic_max_packet_length(quic::kDefaultMaxPacketSize),
|
||||
quic_max_server_configs_stored_in_properties(0u),
|
||||
quic_enable_socket_recv_optimization(false),
|
||||
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
|
||||
index 3392c846d577da239466b74f9de6fd076bb2ea84..03fbf1c253b01c6d503c02f56c1854ea59ae69ab 100644
|
||||
--- a/net/http/http_network_session.h
|
||||
+++ b/net/http/http_network_session.h
|
||||
@@ -124,6 +124,9 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
|
||||
// Enables QUIC support.
|
||||
bool enable_quic;
|
||||
|
||||
+ // If true, HTTPS URLs can be sent to QUIC proxies.
|
||||
+ bool enable_quic_proxies_for_https_urls;
|
||||
+
|
||||
// QUIC runtime configuration options.
|
||||
|
||||
// Versions of QUIC which may be used.
|
||||
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
|
||||
index ab66394c2023e5db037897853d9d86b29c78d72d..3cfc627225e4f531c06c66d5de5f1f075187cf92 100644
|
||||
--- a/net/http/http_stream_factory_job.cc
|
||||
+++ b/net/http/http_stream_factory_job.cc
|
||||
@@ -221,6 +221,10 @@ HttpStreamFactory::Job::Job(Delegate* delegate,
|
||||
stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM),
|
||||
init_connection_already_resumed_(false),
|
||||
ptr_factory_(this) {
|
||||
+ // QUIC can only be spoken to servers, never to proxies.
|
||||
+ if (alternative_protocol == kProtoQUIC)
|
||||
+ DCHECK(proxy_info_.is_direct());
|
||||
+
|
||||
// The Job is forced to use QUIC without a designated version, try the
|
||||
// preferred QUIC version that is supported by default.
|
||||
if (quic_version_ == quic::QUIC_VERSION_UNSUPPORTED &&
|
||||
@@ -769,6 +773,11 @@ int HttpStreamFactory::Job::DoStart() {
|
||||
return ERR_UNSAFE_PORT;
|
||||
}
|
||||
|
||||
+ if (!session_->params().enable_quic_proxies_for_https_urls &&
|
||||
+ proxy_info_.is_quic() && !request_info_.url.SchemeIs(url::kHttpScheme)) {
|
||||
+ return ERR_NOT_IMPLEMENTED;
|
||||
+ }
|
||||
+
|
||||
next_state_ = STATE_WAIT;
|
||||
return OK;
|
||||
}
|
||||
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc
|
||||
index d632aabbdc155c10e1bd04a091e816a8231ab30c..91d4ba7446c2fd63976887c075aad9ff7a8e42c8 100644
|
||||
--- a/net/http/http_stream_factory_job_controller.cc
|
||||
+++ b/net/http/http_stream_factory_job_controller.cc
|
||||
@@ -793,9 +793,13 @@ int HttpStreamFactory::JobController::DoCreateJobs() {
|
||||
HostPortPair destination(HostPortPair::FromURL(request_info_.url));
|
||||
GURL origin_url = ApplyHostMappingRules(request_info_.url, &destination);
|
||||
|
||||
- // Create an alternative job if alternative service is set up for this domain.
|
||||
- alternative_service_info_ =
|
||||
- GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_);
|
||||
+ // Create an alternative job if alternative service is set up for this domain,
|
||||
+ // but only if we'll be speaking directly to the server, since QUIC through
|
||||
+ // proxies is not supported.
|
||||
+ if (proxy_info_.is_direct()) {
|
||||
+ alternative_service_info_ =
|
||||
+ GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_);
|
||||
+ }
|
||||
quic::QuicTransportVersion quic_version = quic::QUIC_VERSION_UNSUPPORTED;
|
||||
if (alternative_service_info_.protocol() == kProtoQUIC) {
|
||||
quic_version =
|
||||
@@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Marijn Kruisselbrink <mek@chromium.org>
|
||||
Date: Tue, 29 Jan 2019 19:51:07 +0000
|
||||
Subject: Harden against overflows of OperationID a bit better.
|
||||
|
||||
Rather than having a UAF when OperationID overflows instead overwrite
|
||||
the old operation with the new one. Can still cause weirdness, but at
|
||||
least won't result in UAF. Also update OperationID to uint64_t to
|
||||
make sure we don't overflow to begin with.
|
||||
|
||||
Bug: 925864
|
||||
Change-Id: Ifdf3fa0935ab5ea8802d91bba39601f02b0dbdc9
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1441498
|
||||
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
|
||||
Reviewed-by: Victor Costan <pwnall@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#627115}
|
||||
|
||||
diff --git a/storage/browser/fileapi/file_system_operation_runner.cc b/storage/browser/fileapi/file_system_operation_runner.cc
|
||||
index fbda72b3cdf851947aa697776e54e0b5092e729b..09af7c0c8c9099489286152009f05ad49d968174 100644
|
||||
--- a/storage/browser/fileapi/file_system_operation_runner.cc
|
||||
+++ b/storage/browser/fileapi/file_system_operation_runner.cc
|
||||
@@ -701,7 +701,7 @@ FileSystemOperationRunner::BeginOperation(
|
||||
base::WeakPtr<BeginOperationScoper> scope) {
|
||||
OperationHandle handle;
|
||||
handle.id = next_operation_id_++;
|
||||
- operations_.emplace(handle.id, std::move(operation));
|
||||
+ operations_[handle.id] = std::move(operation);
|
||||
handle.scope = scope;
|
||||
return handle;
|
||||
}
|
||||
diff --git a/storage/browser/fileapi/file_system_operation_runner.h b/storage/browser/fileapi/file_system_operation_runner.h
|
||||
index a330f4802d5d5c721d8bba460f25edc2f8e1340a..97f9e0d81163d08644f0cee5b9da21ac24b300af 100644
|
||||
--- a/storage/browser/fileapi/file_system_operation_runner.h
|
||||
+++ b/storage/browser/fileapi/file_system_operation_runner.h
|
||||
@@ -53,7 +53,7 @@ class STORAGE_EXPORT FileSystemOperationRunner
|
||||
using CopyOrMoveOption = FileSystemOperation::CopyOrMoveOption;
|
||||
using GetMetadataField = FileSystemOperation::GetMetadataField;
|
||||
|
||||
- using OperationID = int;
|
||||
+ using OperationID = uint64_t;
|
||||
|
||||
virtual ~FileSystemOperationRunner();
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Aaron Leventhal <aleventhal@chromium.org>
|
||||
Date: Wed, 25 Jul 2018 14:05:53 +0000
|
||||
Subject: Fire caret location change when focus moves from UI to content
|
||||
|
||||
When focus moves from UI back into content, but the same content element
|
||||
is focused as was previously, an accessibility event must be fired for
|
||||
the caret location change, as it is no longer in the UI.
|
||||
|
||||
This fix assists screen magnification software that must track the caret
|
||||
location.
|
||||
|
||||
Bug: 864563
|
||||
Change-Id: Ie9cc745288c124ddd73a54906c41dc16e07b9ff6
|
||||
Reviewed-on: https://chromium-review.googlesource.com/1140199
|
||||
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
|
||||
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
|
||||
Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
|
||||
Commit-Queue: Aaron Leventhal <aleventhal@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#577868}
|
||||
|
||||
diff --git a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
||||
index c06ff416d83c943731166501260a7a4d9b36b078..5c8bdc8c73dc2047175f16c658428c9f2c038412 100644
|
||||
--- a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
||||
+++ b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
||||
@@ -10,6 +10,8 @@
|
||||
#include "build/build_config.h"
|
||||
#include "chrome/browser/chrome_content_browser_client.h"
|
||||
#include "chrome/browser/ui/browser.h"
|
||||
+#include "chrome/browser/ui/browser_window.h"
|
||||
+#include "chrome/browser/ui/location_bar/location_bar.h"
|
||||
#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
||||
#include "chrome/test/base/in_process_browser_test.h"
|
||||
#include "chrome/test/base/interactive_test_utils.h"
|
||||
@@ -639,6 +641,41 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessTextInputManagerTest,
|
||||
reset_state_observer.Wait();
|
||||
}
|
||||
|
||||
+#if defined(USE_AURA)
|
||||
+// This test creates a blank page and adds an <input> to it. Then, the <input>
|
||||
+// is focused, UI is focused, then the input is refocused. The test verifies
|
||||
+// that selection bounds change with the refocus (see https://crbug.com/864563).
|
||||
+IN_PROC_BROWSER_TEST_F(SitePerProcessTextInputManagerTest,
|
||||
+ SelectionBoundsChangeAfterRefocusInput) {
|
||||
+ CreateIframePage("a()");
|
||||
+ content::RenderFrameHost* main_frame = GetFrame(IndexVector{});
|
||||
+ content::RenderWidgetHostView* view = main_frame->GetView();
|
||||
+ content::WebContents* web_contents = active_contents();
|
||||
+ AddInputFieldToFrame(main_frame, "text", "", false);
|
||||
+
|
||||
+ auto focus_input_and_wait_for_selection_bounds_change =
|
||||
+ [&main_frame, &web_contents, &view]() {
|
||||
+ ViewSelectionBoundsChangedObserver bounds_observer(web_contents, view);
|
||||
+ // SimulateKeyPress(web_contents, ui::DomKey::TAB, ui::DomCode::TAB,
|
||||
+ // ui::VKEY_TAB, false, true, false, false);
|
||||
+ EXPECT_TRUE(ExecuteScript(main_frame,
|
||||
+ "document.querySelector('input').focus();"));
|
||||
+ bounds_observer.Wait();
|
||||
+ };
|
||||
+
|
||||
+ focus_input_and_wait_for_selection_bounds_change();
|
||||
+
|
||||
+ // Focus location bar.
|
||||
+ BrowserWindow* window = browser()->window();
|
||||
+ ASSERT_TRUE(window);
|
||||
+ LocationBar* location_bar = window->GetLocationBar();
|
||||
+ ASSERT_TRUE(location_bar);
|
||||
+ location_bar->FocusLocation(true);
|
||||
+
|
||||
+ focus_input_and_wait_for_selection_bounds_change();
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
// This test verifies that if we have a focused <input> in the main frame and
|
||||
// the tab is closed, TextInputManager handles unregistering itself and
|
||||
// notifying the observers properly (see https://crbug.com/669375).
|
||||
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
index 09168578786f9ecfa3e1c44b134d7fe76af9504c..0eec5c7a6861f189192ab0cf8b3dbb3b452292e0 100644
|
||||
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
@@ -2339,11 +2339,14 @@ void RenderWidgetHostViewAura::OnUpdateTextInputStateCalled(
|
||||
GetInputMethod()->OnTextInputTypeChanged(this);
|
||||
|
||||
const TextInputState* state = text_input_manager_->GetTextInputState();
|
||||
- if (state && state->show_ime_if_needed &&
|
||||
- state->type != ui::TEXT_INPUT_TYPE_NONE &&
|
||||
- state->mode != ui::TEXT_INPUT_MODE_NONE &&
|
||||
- GetInputMethod()->GetTextInputClient() == this) {
|
||||
- GetInputMethod()->ShowVirtualKeyboardIfEnabled();
|
||||
+ if (state && state->type != ui::TEXT_INPUT_TYPE_NONE &&
|
||||
+ state->mode != ui::TEXT_INPUT_MODE_NONE) {
|
||||
+ if (state->show_ime_if_needed &&
|
||||
+ GetInputMethod()->GetTextInputClient() == this)
|
||||
+ GetInputMethod()->ShowVirtualKeyboardIfEnabled();
|
||||
+ // Ensure that accessibility events are fired when the selection location
|
||||
+ // moves from UI back to content.
|
||||
+ text_input_manager->NotifySelectionBoundsChanged(updated_view);
|
||||
}
|
||||
|
||||
if (auto* render_widget_host = updated_view->host()) {
|
||||
diff --git a/content/browser/renderer_host/text_input_manager.cc b/content/browser/renderer_host/text_input_manager.cc
|
||||
index 24f32e7228aa2b7ece229312a79cc0c95251a31f..ce3a5ff83cf2e0ca9e3cda56308b3b00f6471f16 100644
|
||||
--- a/content/browser/renderer_host/text_input_manager.cc
|
||||
+++ b/content/browser/renderer_host/text_input_manager.cc
|
||||
@@ -209,6 +209,11 @@ void TextInputManager::SelectionBoundsChanged(
|
||||
selection_region_map_[view].first_selection_rect.set_size(
|
||||
params.anchor_rect.size());
|
||||
|
||||
+ NotifySelectionBoundsChanged(view);
|
||||
+}
|
||||
+
|
||||
+void TextInputManager::NotifySelectionBoundsChanged(
|
||||
+ RenderWidgetHostViewBase* view) {
|
||||
for (auto& observer : observer_list_)
|
||||
observer.OnSelectionBoundsChanged(this, view);
|
||||
}
|
||||
diff --git a/content/browser/renderer_host/text_input_manager.h b/content/browser/renderer_host/text_input_manager.h
|
||||
index 8e4ecfe5be2defa1578eec9be3c713be0b07e84d..d145a992144079401817e2e24f664576c493b3fb 100644
|
||||
--- a/content/browser/renderer_host/text_input_manager.h
|
||||
+++ b/content/browser/renderer_host/text_input_manager.h
|
||||
@@ -184,6 +184,10 @@ class CONTENT_EXPORT TextInputManager {
|
||||
void SelectionBoundsChanged(RenderWidgetHostViewBase* view,
|
||||
const ViewHostMsg_SelectionBounds_Params& params);
|
||||
|
||||
+ // Notify observers that the selection bounds have been updated. This is also
|
||||
+ // called when a view with a selection is reactivated.
|
||||
+ void NotifySelectionBoundsChanged(RenderWidgetHostViewBase* view);
|
||||
+
|
||||
// Called when the composition range and/or character bounds have changed.
|
||||
void ImeCompositionRangeChanged(
|
||||
RenderWidgetHostViewBase* view,
|
||||
@@ -0,0 +1,63 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Rune Lillesveen <futhark@chromium.org>
|
||||
Date: Tue, 18 Dec 2018 14:45:19 +0000
|
||||
Subject: Fix SVG crash for v0 distribution into foreignObject.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
We require a parent element to be an SVG element for non-svg-root
|
||||
elements in order to create a LayoutObject for them. However, we checked
|
||||
the light tree parent element, not the flat tree one which is the parent
|
||||
for the layout tree construction. Note that this is just an issue in
|
||||
Shadow DOM v0 since v1 does not allow shadow roots on SVG elements.
|
||||
|
||||
Bug: 915469
|
||||
Change-Id: Id81843abad08814fae747b5bc81c09666583f130
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1382494
|
||||
Reviewed-by: Fredrik Söderquist <fs@opera.com>
|
||||
Commit-Queue: Rune Lillesveen <futhark@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#617487}
|
||||
|
||||
diff --git a/third_party/WebKit/LayoutTests/svg/foreignObject/shadow-dom-v0-crash.html b/third_party/WebKit/LayoutTests/svg/foreignObject/shadow-dom-v0-crash.html
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..44ac3b0540b8f5a816a67b5be382b179623bd0cd
|
||||
--- /dev/null
|
||||
+++ b/third_party/WebKit/LayoutTests/svg/foreignObject/shadow-dom-v0-crash.html
|
||||
@@ -0,0 +1,11 @@
|
||||
+<!DOCTYPE html>
|
||||
+<script src="../../resources/testharness.js"></script>
|
||||
+<script src="../../resources/testharnessreport.js"></script>
|
||||
+<p>PASS if no crash or DCHECK failure.</p>
|
||||
+<svg id="svg"><g /></svg>
|
||||
+<script>
|
||||
+ test(() => {
|
||||
+ const root = svg.createShadowRoot();
|
||||
+ root.innerHTML = '<foreignObject><div><content></content></div></foreignObject>';
|
||||
+ }, "Rendering an svg g element distributed into a foreignObject will crash.");
|
||||
+</script>
|
||||
diff --git a/third_party/blink/renderer/core/svg/svg_element.cc b/third_party/blink/renderer/core/svg/svg_element.cc
|
||||
index e9a1fd9dd0ef6975cbc3e0967e8b0e9c8362b7a1..6af7df47e3502903346c4509c6fd080ef6d071ef 100644
|
||||
--- a/third_party/blink/renderer/core/svg/svg_element.cc
|
||||
+++ b/third_party/blink/renderer/core/svg/svg_element.cc
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "third_party/blink/renderer/core/dom/document.h"
|
||||
#include "third_party/blink/renderer/core/dom/element_traversal.h"
|
||||
#include "third_party/blink/renderer/core/dom/events/event.h"
|
||||
+#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
|
||||
#include "third_party/blink/renderer/core/dom/node_computed_style.h"
|
||||
#include "third_party/blink/renderer/core/dom/shadow_root.h"
|
||||
#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
|
||||
@@ -1047,10 +1048,8 @@ bool SVGElement::LayoutObjectIsNeeded(const ComputedStyle& style) const {
|
||||
}
|
||||
|
||||
bool SVGElement::HasSVGParent() const {
|
||||
- // Should we use the flat tree parent instead? If so, we should probably fix a
|
||||
- // few other checks.
|
||||
- return ParentOrShadowHostElement() &&
|
||||
- ParentOrShadowHostElement()->IsSVGElement();
|
||||
+ Element* parent = FlatTreeTraversal::ParentElement(*this);
|
||||
+ return parent && parent->IsSVGElement();
|
||||
}
|
||||
|
||||
MutableCSSPropertyValueSet* SVGElement::AnimatedSMILStyleProperties() const {
|
||||
@@ -0,0 +1,134 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Marijn Kruisselbrink <mek@chromium.org>
|
||||
Date: Thu, 13 Dec 2018 17:09:55 +0000
|
||||
Subject: Fix UAP in ImageBitmapLoader/FileReaderLoader
|
||||
|
||||
FileReaderLoader stores its client as a raw pointer, so in cases like
|
||||
ImageBitmapLoader where the FileReaderLoaderClient really is garbage
|
||||
collected we have to make sure to destroy the FileReaderLoader when
|
||||
the ExecutionContext that owns it is destroyed.
|
||||
|
||||
Bug: 913970
|
||||
Change-Id: I40b02115367cf7bf5bbbbb8e9b57874d2510f861
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1374511
|
||||
Reviewed-by: Jeremy Roman <jbroman@chromium.org>
|
||||
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#616342}
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
|
||||
index 076b9beeaa6675c5e858a1c7f5a321ab57c606fb..40898b704891c3723574d3afa4aebf72f5cdce5c 100644
|
||||
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
|
||||
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
|
||||
@@ -238,27 +238,31 @@ void ImageBitmapFactories::DidFinishLoading(ImageBitmapLoader* loader) {
|
||||
pending_loaders_.erase(loader);
|
||||
}
|
||||
|
||||
+void ImageBitmapFactories::Trace(blink::Visitor* visitor) {
|
||||
+ visitor->Trace(pending_loaders_);
|
||||
+ Supplement<LocalDOMWindow>::Trace(visitor);
|
||||
+ Supplement<WorkerGlobalScope>::Trace(visitor);
|
||||
+}
|
||||
+
|
||||
ImageBitmapFactories::ImageBitmapLoader::ImageBitmapLoader(
|
||||
ImageBitmapFactories& factory,
|
||||
base::Optional<IntRect> crop_rect,
|
||||
ScriptState* script_state,
|
||||
const ImageBitmapOptions& options)
|
||||
- : loader_(
|
||||
+ : ContextLifecycleObserver(ExecutionContext::From(script_state)),
|
||||
+ loader_(
|
||||
FileReaderLoader::Create(FileReaderLoader::kReadAsArrayBuffer, this)),
|
||||
factory_(&factory),
|
||||
resolver_(ScriptPromiseResolver::Create(script_state)),
|
||||
crop_rect_(crop_rect),
|
||||
options_(options) {}
|
||||
|
||||
-void ImageBitmapFactories::ImageBitmapLoader::LoadBlobAsync(
|
||||
- Blob* blob) {
|
||||
+void ImageBitmapFactories::ImageBitmapLoader::LoadBlobAsync(Blob* blob) {
|
||||
loader_->Start(blob->GetBlobDataHandle());
|
||||
}
|
||||
|
||||
-void ImageBitmapFactories::Trace(blink::Visitor* visitor) {
|
||||
- visitor->Trace(pending_loaders_);
|
||||
- Supplement<LocalDOMWindow>::Trace(visitor);
|
||||
- Supplement<WorkerGlobalScope>::Trace(visitor);
|
||||
+ImageBitmapFactories::ImageBitmapLoader::~ImageBitmapLoader() {
|
||||
+ DCHECK(!loader_);
|
||||
}
|
||||
|
||||
void ImageBitmapFactories::ImageBitmapLoader::RejectPromise(
|
||||
@@ -277,11 +281,20 @@ void ImageBitmapFactories::ImageBitmapLoader::RejectPromise(
|
||||
default:
|
||||
NOTREACHED();
|
||||
}
|
||||
+ loader_.reset();
|
||||
factory_->DidFinishLoading(this);
|
||||
}
|
||||
|
||||
+void ImageBitmapFactories::ImageBitmapLoader::ContextDestroyed(
|
||||
+ ExecutionContext*) {
|
||||
+ if (loader_)
|
||||
+ factory_->DidFinishLoading(this);
|
||||
+ loader_.reset();
|
||||
+}
|
||||
+
|
||||
void ImageBitmapFactories::ImageBitmapLoader::DidFinishLoading() {
|
||||
DOMArrayBuffer* array_buffer = loader_->ArrayBufferResult();
|
||||
+ loader_.reset();
|
||||
if (!array_buffer) {
|
||||
RejectPromise(kAllocationFailureImageBitmapRejectionReason);
|
||||
return;
|
||||
@@ -359,6 +372,7 @@ void ImageBitmapFactories::ImageBitmapLoader::ResolvePromiseOnOriginalThread(
|
||||
}
|
||||
|
||||
void ImageBitmapFactories::ImageBitmapLoader::Trace(blink::Visitor* visitor) {
|
||||
+ ContextLifecycleObserver::Trace(visitor);
|
||||
visitor->Trace(factory_);
|
||||
visitor->Trace(resolver_);
|
||||
}
|
||||
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.h b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.h
|
||||
index 25bdf1ffd1e85a05ab4ee46aaa81c61294fd7d1a..726012a20f7250ea1166ec03875ebaa10f352a49 100644
|
||||
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.h
|
||||
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.h
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "third_party/blink/renderer/bindings/core/v8/image_bitmap_source.h"
|
||||
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
|
||||
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
|
||||
+#include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
|
||||
#include "third_party/blink/renderer/core/fileapi/file_reader_loader.h"
|
||||
#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h"
|
||||
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
|
||||
@@ -103,7 +104,10 @@ class ImageBitmapFactories final
|
||||
private:
|
||||
class ImageBitmapLoader final
|
||||
: public GarbageCollectedFinalized<ImageBitmapLoader>,
|
||||
+ public ContextLifecycleObserver,
|
||||
public FileReaderLoaderClient {
|
||||
+ USING_GARBAGE_COLLECTED_MIXIN(ImageBitmapLoader);
|
||||
+
|
||||
public:
|
||||
static ImageBitmapLoader* Create(ImageBitmapFactories& factory,
|
||||
base::Optional<IntRect> crop_rect,
|
||||
@@ -115,9 +119,9 @@ class ImageBitmapFactories final
|
||||
void LoadBlobAsync(Blob*);
|
||||
ScriptPromise Promise() { return resolver_->Promise(); }
|
||||
|
||||
- void Trace(blink::Visitor*);
|
||||
+ void Trace(blink::Visitor*) override;
|
||||
|
||||
- ~ImageBitmapLoader() override = default;
|
||||
+ ~ImageBitmapLoader() override;
|
||||
|
||||
private:
|
||||
ImageBitmapLoader(ImageBitmapFactories&,
|
||||
@@ -140,6 +144,9 @@ class ImageBitmapFactories final
|
||||
const String& color_space_conversion_option);
|
||||
void ResolvePromiseOnOriginalThread(sk_sp<SkImage>);
|
||||
|
||||
+ // ContextLifecycleObserver
|
||||
+ void ContextDestroyed(ExecutionContext*) override;
|
||||
+
|
||||
// FileReaderLoaderClient
|
||||
void DidStartLoading() override {}
|
||||
void DidReceiveData() override {}
|
||||
@@ -1,7 +1,7 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Burda <milan.burda@gmail.com>
|
||||
Date: Wed, 27 Mar 2019 23:27:40 +0100
|
||||
Subject: [IntersectionObserver] Report coordinates as CSS pixels.
|
||||
Subject: Report coordinates as CSS pixels.
|
||||
|
||||
Prior to this patch, IntersectionObserverEntry was reporting
|
||||
coordinates in device pixels.
|
||||
|
||||
@@ -13,7 +13,7 @@ Reviewed-by: John Abd-El-Malek <jam@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#620910}
|
||||
|
||||
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc
|
||||
index 665718d90bf66061f92164c2715f5e500608beb5..63b88c0051354eab316edd16c522b3c7f89158ca 100644
|
||||
index e2afc34bd98f6a6cc76132dc4d1f8ca5c84afbaf..1a86063573849d5e174603ce418beebd103120d3 100644
|
||||
--- a/chrome/browser/ui/startup/startup_browser_creator.cc
|
||||
+++ b/chrome/browser/ui/startup/startup_browser_creator.cc
|
||||
@@ -66,7 +66,6 @@
|
||||
@@ -96,10 +96,10 @@ index 0000000000000000000000000000000000000000..e47cbbf08076216f60f0d01942626f16
|
||||
+
|
||||
+} // namespace content
|
||||
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
|
||||
index aac3f05054724c2fa030efd4c8d7543de9433612..b8a0e794b9ea2791a699d84fa3d4987cced36324 100644
|
||||
index 35fdb9d351db5a6bdaa61742ec49dc75fe70cfa4..c72025ad2e825d3c7f8136434587bcebf8f858e0 100644
|
||||
--- a/content/browser/renderer_host/render_process_host_impl.cc
|
||||
+++ b/content/browser/renderer_host/render_process_host_impl.cc
|
||||
@@ -2793,6 +2793,7 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
|
||||
@@ -2782,6 +2782,7 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
|
||||
static const char* const kSwitchNames[] = {
|
||||
switches::kDisableColorCorrectRendering,
|
||||
network::switches::kNoReferrers,
|
||||
@@ -107,7 +107,7 @@ index aac3f05054724c2fa030efd4c8d7543de9433612..b8a0e794b9ea2791a699d84fa3d4987c
|
||||
service_manager::switches::kDisableInProcessStackTraces,
|
||||
service_manager::switches::kDisableSeccompFilterSandbox,
|
||||
service_manager::switches::kNoSandbox,
|
||||
@@ -2875,7 +2876,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
|
||||
@@ -2863,7 +2864,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
|
||||
switches::kEnableWebGLDraftExtensions,
|
||||
switches::kEnableWebGLImageChromium,
|
||||
switches::kEnableWebVR,
|
||||
@@ -116,7 +116,7 @@ index aac3f05054724c2fa030efd4c8d7543de9433612..b8a0e794b9ea2791a699d84fa3d4987c
|
||||
switches::kFMPNetworkQuietTimeout,
|
||||
switches::kForceColorProfile,
|
||||
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
|
||||
index 074f290638ff7311d6c9683a63f7a7c39a402876..5e1c9138bcf604831fca12a9673675e0d9d4734f 100644
|
||||
index 9d7c9791bd99c361a9ba3edc539d9b48b46659d4..3d11373b77af8bc0db42a27fcfab3089f8aaed1c 100644
|
||||
--- a/content/browser/utility_process_host.cc
|
||||
+++ b/content/browser/utility_process_host.cc
|
||||
@@ -286,6 +286,7 @@ bool UtilityProcessHost::StartProcess() {
|
||||
@@ -128,10 +128,10 @@ index 074f290638ff7311d6c9683a63f7a7c39a402876..5e1c9138bcf604831fca12a9673675e0
|
||||
#if defined(OS_MACOSX)
|
||||
service_manager::switches::kEnableSandboxLogging,
|
||||
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
|
||||
index eeb540ba52e109aff7348714a0ad22399a460a2d..512d0bb910bf9d5091943a5a40b253ad7ac43e65 100644
|
||||
index 19c2246a3bd8dcc3d1e070b74ff3d416adc473fe..cdf81f6c35cd78b4fff4d666284d0615e6c057c6 100644
|
||||
--- a/content/public/common/content_switches.cc
|
||||
+++ b/content/public/common/content_switches.cc
|
||||
@@ -473,10 +473,6 @@ const char kEnableWebVR[] = "enable-webvr";
|
||||
@@ -469,10 +469,6 @@ const char kEnableWebVR[] = "enable-webvr";
|
||||
// Enable rasterizer that writes directly to GPU memory associated with tiles.
|
||||
const char kEnableZeroCopy[] = "enable-zero-copy";
|
||||
|
||||
@@ -143,10 +143,10 @@ index eeb540ba52e109aff7348714a0ad22399a460a2d..512d0bb910bf9d5091943a5a40b253ad
|
||||
// be shared between processes. The argument to this switch is the handle id
|
||||
// (pointer on Windows) as a string, followed by a comma, then the size of the
|
||||
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
|
||||
index 2a08de6a59bb67bfe0f65f82f6ba3397a4896056..f420773ee9fe29e5562878ded07ad98ad6700e5f 100644
|
||||
index 2c795e814b13961eb190d5c7f9bce3c854dbfc17..a4da6292e7c5784e06e686cd62e017b010fa7e27 100644
|
||||
--- a/content/public/common/content_switches.h
|
||||
+++ b/content/public/common/content_switches.h
|
||||
@@ -148,7 +148,6 @@ CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
|
||||
@@ -147,7 +147,6 @@ CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
|
||||
CONTENT_EXPORT extern const char kEnableWebGLImageChromium[];
|
||||
CONTENT_EXPORT extern const char kEnableWebVR[];
|
||||
CONTENT_EXPORT extern const char kEnableZeroCopy[];
|
||||
@@ -155,7 +155,7 @@ index 2a08de6a59bb67bfe0f65f82f6ba3397a4896056..f420773ee9fe29e5562878ded07ad98a
|
||||
CONTENT_EXPORT extern const char kFileUrlPathAlias[];
|
||||
CONTENT_EXPORT extern const char kForceDisplayList2dCanvas[];
|
||||
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
|
||||
index 2e17bf6f1522d3f8557b5d4bac0fb76fec034418..44df5d5461c718d2a793171d3592691c7bba12c8 100644
|
||||
index 5c31ab7654d0168d232e9974105573fa01543aed..b670c95891ab80e749209a843d958ffcbdcc6ba2 100644
|
||||
--- a/content/renderer/render_thread_impl.cc
|
||||
+++ b/content/renderer/render_thread_impl.cc
|
||||
@@ -143,6 +143,7 @@
|
||||
@@ -180,7 +180,7 @@ index 2e17bf6f1522d3f8557b5d4bac0fb76fec034418..44df5d5461c718d2a793171d3592691c
|
||||
}
|
||||
}
|
||||
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
|
||||
index 9e705c8b905c21db05b9e6461c31b0cea7d30980..dab1cfc7e2dd3ad65e9a554362f159970eb5cbd4 100644
|
||||
index 15a64a49d5c821d3cb10b9dfd99725296e6a912c..a28467ec68e2b63964e396977c17a2cbb5cf2407 100644
|
||||
--- a/content/test/BUILD.gn
|
||||
+++ b/content/test/BUILD.gn
|
||||
@@ -791,6 +791,7 @@ test("content_browsertests") {
|
||||
@@ -192,7 +192,7 @@ index 9e705c8b905c21db05b9e6461c31b0cea7d30980..dab1cfc7e2dd3ad65e9a554362f15997
|
||||
"../browser/network_service_browsertest.cc",
|
||||
"../browser/network_service_restart_browsertest.cc",
|
||||
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
|
||||
index e4cf8022f4d017321fb2f684ec0ade3bbd122df3..d22a74c6a8d7cc2e3acc1f0adc15f4b3a6b47867 100644
|
||||
index a91a9f4b5866c11ae76e2d173a92579f0b7d12a1..404c3fa8316abdd77b492468e29a577c0c9c0988 100644
|
||||
--- a/services/network/network_service.cc
|
||||
+++ b/services/network/network_service.cc
|
||||
@@ -19,6 +19,7 @@
|
||||
@@ -218,7 +218,7 @@ index e4cf8022f4d017321fb2f684ec0ade3bbd122df3..d22a74c6a8d7cc2e3acc1f0adc15f4b3
|
||||
// per-NetworkContext basis.
|
||||
UMA_HISTOGRAM_BOOLEAN(
|
||||
diff --git a/services/network/public/cpp/network_switches.cc b/services/network/public/cpp/network_switches.cc
|
||||
index 8b2d4ed3b39e35e1a078ad26a946cc752a830310..60859bc46e6420165a11e2c4bd03dcd81345b122 100644
|
||||
index 7790a6fa6e749f0f87d104f0175ad76d5aace108..6e489aafa30155fbbf75edfbffd17f93159e5665 100644
|
||||
--- a/services/network/public/cpp/network_switches.cc
|
||||
+++ b/services/network/public/cpp/network_switches.cc
|
||||
@@ -37,6 +37,10 @@ const char kLogNetLog[] = "log-net-log";
|
||||
@@ -233,7 +233,7 @@ index 8b2d4ed3b39e35e1a078ad26a946cc752a830310..60859bc46e6420165a11e2c4bd03dcd8
|
||||
|
||||
} // namespace network
|
||||
diff --git a/services/network/public/cpp/network_switches.h b/services/network/public/cpp/network_switches.h
|
||||
index 83e78d0f3f705dc4082992ad8147bb5145308152..db64e5af747369823f91eb5d596ecb6f0cf94f96 100644
|
||||
index 3829a2d4360e6b04fc348712f236451ee704c575..28edfb93d4eaa3797a24691772850dc0009d50c9 100644
|
||||
--- a/services/network/public/cpp/network_switches.h
|
||||
+++ b/services/network/public/cpp/network_switches.h
|
||||
@@ -18,6 +18,7 @@ COMPONENT_EXPORT(NETWORK_CPP)
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Lippautz <mlippautz@chromium.org>
|
||||
Date: Wed, 26 Jun 2019 20:21:46 +0000
|
||||
Subject: MediaControls: Disconnect observers when controls are hidden
|
||||
|
||||
Disconnect ResizeObserver from media controls when the controls are
|
||||
hidden. Otherwise, the obervsers are have pending activities (are
|
||||
observed) which makes them roots for the object graph, ultimately
|
||||
keeping elements (including e.g. HTMLVideoElement) and nodes alive.
|
||||
|
||||
Bug: 969049
|
||||
Change-Id: I07a4470170f187631db307188f6cbe0052aa7d8c
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1677053
|
||||
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
|
||||
Reviewed-by: Tommy Steimel <steimel@chromium.org>
|
||||
Reviewed-by: Kentaro Hara <haraken@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#672629}
|
||||
|
||||
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
|
||||
index e1f55e00cafbfbca376092e8e332ca68f14954b7..15ab3cbe33da36dffb1ee1cda4031a020362eef0 100644
|
||||
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
|
||||
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
|
||||
@@ -91,7 +91,7 @@ MediaControlSliderElement::MediaControlSliderElement(
|
||||
new MediaControlSliderElementResizeObserverDelegate(this))) {
|
||||
setType(InputTypeNames::range);
|
||||
setAttribute(HTMLNames::stepAttr, "any");
|
||||
- resize_observer_->observe(this);
|
||||
+ OnControlsShown();
|
||||
}
|
||||
|
||||
Element& MediaControlSliderElement::GetTrackElement() {
|
||||
@@ -172,4 +172,12 @@ void MediaControlSliderElement::Trace(blink::Visitor* visitor) {
|
||||
MediaControlInputElement::Trace(visitor);
|
||||
}
|
||||
|
||||
+void MediaControlSliderElement::OnControlsShown() {
|
||||
+ resize_observer_->observe(this);
|
||||
+}
|
||||
+
|
||||
+void MediaControlSliderElement::OnControlsHidden() {
|
||||
+ resize_observer_->disconnect();
|
||||
+}
|
||||
+
|
||||
} // namespace blink
|
||||
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
|
||||
index 8f5a631fa87e5f6ce9c94f8f8eefcd4152df1c1f..228886cfb1f1bbb244350e9c52f247bf41d6dbfc 100644
|
||||
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
|
||||
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
|
||||
@@ -33,6 +33,9 @@ class MODULES_EXPORT MediaControlSliderElement
|
||||
// simplicity; deliberately ignores pinch zoom's pageScaleFactor).
|
||||
int TrackWidth();
|
||||
|
||||
+ void OnControlsShown();
|
||||
+ void OnControlsHidden();
|
||||
+
|
||||
protected:
|
||||
class MediaControlSliderElementResizeObserverDelegate;
|
||||
|
||||
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
|
||||
index 62ef007e5f6d5bbe3cae8ab7760251256ce57efb..4022da87d0ad39e34f05423990a9df598955ed50 100644
|
||||
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
|
||||
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
|
||||
@@ -272,10 +272,12 @@ void MediaControlTimelineElement::OnControlsHidden() {
|
||||
|
||||
// End scrubbing state.
|
||||
is_touching_ = false;
|
||||
+ MediaControlSliderElement::OnControlsHidden();
|
||||
}
|
||||
|
||||
void MediaControlTimelineElement::OnControlsShown() {
|
||||
controls_hidden_ = false;
|
||||
+ MediaControlSliderElement::OnControlsShown();
|
||||
}
|
||||
|
||||
bool MediaControlTimelineElement::EndScrubbingEvent(Event& event) {
|
||||
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
|
||||
index 5ca3a5f8314bc67d498b3c1d8306f550223781d3..37321c8331d80899afa632327540fd2199fc0907 100644
|
||||
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
|
||||
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
|
||||
@@ -911,6 +911,8 @@ void MediaControlsImpl::MaybeShow() {
|
||||
loading_panel_->OnControlsShown();
|
||||
|
||||
timeline_->OnControlsShown();
|
||||
+ if (volume_slider_)
|
||||
+ volume_slider_->OnControlsShown();
|
||||
UpdateCSSClassFromState();
|
||||
UpdateActingAsAudioControls();
|
||||
}
|
||||
@@ -936,6 +938,8 @@ void MediaControlsImpl::Hide() {
|
||||
EndScrubbing();
|
||||
}
|
||||
timeline_->OnControlsHidden();
|
||||
+ if (volume_slider_)
|
||||
+ volume_slider_->OnControlsHidden();
|
||||
|
||||
UpdateCSSClassFromState();
|
||||
|
||||
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
|
||||
index 4bd7baed6c95deccfea6ac1f7c8998ad64c64e05..15a786c21b7f84d12e5ac87705b8ff0f54127765 100644
|
||||
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
|
||||
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
|
||||
@@ -14,10 +14,12 @@
|
||||
#include "third_party/blink/public/platform/web_mouse_event.h"
|
||||
#include "third_party/blink/public/platform/web_screen_info.h"
|
||||
#include "third_party/blink/public/platform/web_size.h"
|
||||
+#include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
|
||||
#include "third_party/blink/renderer/core/css/css_property_value_set.h"
|
||||
#include "third_party/blink/renderer/core/css/document_style_environment_variables.h"
|
||||
#include "third_party/blink/renderer/core/css/style_engine.h"
|
||||
#include "third_party/blink/renderer/core/dom/document.h"
|
||||
+#include "third_party/blink/renderer/core/dom/document_parser.h"
|
||||
#include "third_party/blink/renderer/core/dom/element_traversal.h"
|
||||
#include "third_party/blink/renderer/core/dom/events/event.h"
|
||||
#include "third_party/blink/renderer/core/dom/text.h"
|
||||
@@ -1159,6 +1161,33 @@ TEST_F(MediaControlsImplTest,
|
||||
EXPECT_EQ(nullptr, weak_persistent_video);
|
||||
}
|
||||
|
||||
+TEST_F(MediaControlsImplTest,
|
||||
+ RemovingFromDocumentWhenResettingSrcAllowsReclamation) {
|
||||
+ // Regression test: https://crbug.com/918064
|
||||
+ //
|
||||
+ // Test ensures that unified heap garbage collections are able to collect
|
||||
+ // detached HTMLVideoElements. The tricky part is that ResizeObserver's are
|
||||
+ // treated as roots as long as they have observations which prevent the video
|
||||
+ // element from being collected.
|
||||
+
|
||||
+ auto page_holder = std::make_unique<DummyPageHolder>();
|
||||
+ page_holder->GetDocument().write("<video controls>");
|
||||
+ page_holder->GetDocument().Parser()->Finish();
|
||||
+
|
||||
+ HTMLVideoElement& video =
|
||||
+ ToHTMLVideoElement(*page_holder->GetDocument().QuerySelector("video"));
|
||||
+ WeakPersistent<HTMLMediaElement> weak_persistent_video = &video;
|
||||
+ video.remove();
|
||||
+
|
||||
+ test::RunPendingTasks();
|
||||
+
|
||||
+ // Needs to call into V8's GC here to trigger a unified garbage collection.
|
||||
+ V8GCController::CollectAllGarbageForTesting(
|
||||
+ ThreadState::Current()->GetIsolate(),
|
||||
+ v8::EmbedderHeapTracer::EmbedderStackState::kEmpty);
|
||||
+ EXPECT_EQ(nullptr, weak_persistent_video);
|
||||
+}
|
||||
+
|
||||
TEST_F(MediaControlsImplTest,
|
||||
ReInsertingInDocumentRestoresListenersAndCallbacks) {
|
||||
auto page_holder = DummyPageHolder::Create();
|
||||
@@ -0,0 +1,67 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Aaron Leventhal <aleventhal@chromium.org>
|
||||
Date: Mon, 10 Sep 2018 19:54:14 +0000
|
||||
Subject: Restore live region changed events for processing by JAWS focus mode
|
||||
|
||||
The live region changed events are needed by current versions of JAWS,
|
||||
which do not process the text inserted events fired by Chrome in all
|
||||
modes. Specifically, current versions of JAWS processes text inserted
|
||||
events in virtual cursor mode but not in focus mode. This may change
|
||||
in future versions of JAWS, and so at some point the live region
|
||||
changed events may truly become redundant with the text inserted events.
|
||||
|
||||
Bug: 878929
|
||||
Change-Id: I3286c84d1d6366735a38af19e68f4c526658b68b
|
||||
Reviewed-on: https://chromium-review.googlesource.com/1211508
|
||||
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
|
||||
Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/master@{#589412}(cherry picked from commit 521309feaeed915f42a14ce734dd6f0232062532)
|
||||
Reviewed-on: https://chromium-review.googlesource.com/1216944
|
||||
Reviewed-by: Aaron Leventhal <aleventhal@chromium.org>
|
||||
Cr-Commit-Position: refs/branch-heads/3538@{#242}
|
||||
Cr-Branched-From: 79f7c91a2b2a2932cd447fa6f865cb6662fa8fa6-refs/heads/master@{#587811}
|
||||
|
||||
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
|
||||
index f6179284bb4b4e215105de5253bede04feff08bb..b45dc6f416048f387388c3fdbc9821f75648eee6 100644
|
||||
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
|
||||
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
|
||||
@@ -179,10 +179,18 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent(
|
||||
FireWinAccessibilityEvent(EVENT_OBJECT_REORDER, node);
|
||||
break;
|
||||
case Event::LIVE_REGION_CHANGED:
|
||||
- // NVDA and JAWS are inconsistent about speaking this event in content.
|
||||
- // Because of this, and because Firefox does not currently fire it, we
|
||||
- // are avoiding this event for now.
|
||||
- // FireWinAccessibilityEvent(EVENT_OBJECT_LIVEREGIONCHANGED, node);
|
||||
+ // This event is redundant with the IA2_EVENT_TEXT_INSERTED events;
|
||||
+ // however, JAWS 2018 and earlier do not process the text inserted
|
||||
+ // events when "virtual cursor mode" is turned off (Insert+Z).
|
||||
+ // Fortunately, firing the redudant event does not cause duplicate
|
||||
+ // verbalizations in either screen reader.
|
||||
+ // Future versions of JAWS may process the text inserted event when
|
||||
+ // in focus mode, and so at some point the live region
|
||||
+ // changed events may truly become redundant with the text inserted
|
||||
+ // events. Note: Firefox does not fire this event, but JAWS processes
|
||||
+ // Firefox live region events differently (utilizes MSAA's
|
||||
+ // EVENT_OBJECT_SHOW).
|
||||
+ FireWinAccessibilityEvent(EVENT_OBJECT_LIVEREGIONCHANGED, node);
|
||||
break;
|
||||
case Event::LOAD_COMPLETE:
|
||||
FireWinAccessibilityEvent(IA2_EVENT_DOCUMENT_LOAD_COMPLETE, node);
|
||||
diff --git a/content/test/data/accessibility/event/live-region-add-expected-win.txt b/content/test/data/accessibility/event/live-region-add-expected-win.txt
|
||||
index a57cfad63ae0c7ef351fcb732f9903e59b207555..2768682f95a332d32fc3daa9dd9e3eaa0758eb24 100644
|
||||
--- a/content/test/data/accessibility/event/live-region-add-expected-win.txt
|
||||
+++ b/content/test/data/accessibility/event/live-region-add-expected-win.txt
|
||||
@@ -1,3 +1,4 @@
|
||||
+EVENT_OBJECT_LIVEREGIONCHANGED on <div#live> role=DIV
|
||||
EVENT_OBJECT_REORDER on <div#live> role=DIV
|
||||
EVENT_OBJECT_SHOW on <p> role=P
|
||||
IA2_EVENT_TEXT_INSERTED on <div#live> role=DIV new_text={'<obj>' start=6 end=7}
|
||||
diff --git a/content/test/data/accessibility/event/live-region-change-expected-win.txt b/content/test/data/accessibility/event/live-region-change-expected-win.txt
|
||||
index aa60a8459e98e22e954ff6169653a698328bc294..d85c9ec837c461baf90ff3cd2bfec0f8bb25c380 100644
|
||||
--- a/content/test/data/accessibility/event/live-region-change-expected-win.txt
|
||||
+++ b/content/test/data/accessibility/event/live-region-change-expected-win.txt
|
||||
@@ -1,2 +1,3 @@
|
||||
+EVENT_OBJECT_LIVEREGIONCHANGED on <div#live> role=DIV
|
||||
IA2_EVENT_TEXT_INSERTED on <div#live> role=DIV new_text={'After' start=0 end=5}
|
||||
IA2_EVENT_TEXT_REMOVED on <div#live> role=DIV old_text={'Before' start=0 end=6}
|
||||
@@ -0,0 +1,39 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Lan Wei <lanwei@chromium.org>
|
||||
Date: Wed, 12 Sep 2018 00:36:53 +0000
|
||||
Subject: Setup the observer before calling DisplayVirtualKeyboard
|
||||
|
||||
This is a follow up CL of
|
||||
https://chromium-review.googlesource.com/c/chromium/src/+/1194406
|
||||
|
||||
We should setup the keyboard observer before displaying the virtual
|
||||
keyboard otherwise the observer won't see the change of the virtual
|
||||
keyboard.
|
||||
|
||||
Bug: 871756
|
||||
Change-Id: I6b13072ed06d9e10d188c553082b411f2bb09326
|
||||
Reviewed-on: https://chromium-review.googlesource.com/1220560
|
||||
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
|
||||
Commit-Queue: Lan Wei <lanwei@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#590553}
|
||||
|
||||
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
index de9490d94d98afa6812e81b0cf50fb4adc81887c..a1ae227501930e918ea87d2013f6c300fd83644d 100644
|
||||
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
@@ -756,10 +756,12 @@ void RenderWidgetHostViewAura::FocusedNodeTouched(bool editable) {
|
||||
return;
|
||||
auto* controller = input_method->GetInputMethodKeyboardController();
|
||||
if (editable && host()->GetView() && host()->delegate()) {
|
||||
- keyboard_observer_.reset(nullptr);
|
||||
- if (last_pointer_type_ == ui::EventPointerType::POINTER_TYPE_TOUCH &&
|
||||
- controller->DisplayVirtualKeyboard()) {
|
||||
+ if (last_pointer_type_ == ui::EventPointerType::POINTER_TYPE_TOUCH) {
|
||||
keyboard_observer_.reset(new WinScreenKeyboardObserver(this));
|
||||
+ if (!controller->DisplayVirtualKeyboard())
|
||||
+ keyboard_observer_.reset(nullptr);
|
||||
+ } else {
|
||||
+ keyboard_observer_.reset(nullptr);
|
||||
}
|
||||
virtual_keyboard_requested_ = keyboard_observer_.get();
|
||||
} else {
|
||||
30
patches/common/chromium/tabbed_window_lagging.patch
Normal file
30
patches/common/chromium/tabbed_window_lagging.patch
Normal file
@@ -0,0 +1,30 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Cheng Zhao <zcbenz@gmail.com>
|
||||
Date: Thu, 16 May 2019 13:52:12 +0900
|
||||
Subject: tabbed_window_lagging.patch
|
||||
|
||||
Fix lagging when using tabbed windows.
|
||||
|
||||
Later Chromium has some enhancements on graphics code that fix the lagging
|
||||
problem, but the changes are split in multiple commits on multiple files and
|
||||
we can not just cherry-pick them.
|
||||
|
||||
Instead I'm just using the dummy fix and it does not seem to have side effects.
|
||||
|
||||
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm
|
||||
index 8841b59f6b70ac4687adfde61a1fba1424e57e48..cc3659319c4076043a0493798db3c7b8a4afd21e 100644
|
||||
--- a/ui/views/cocoa/bridged_native_widget.mm
|
||||
+++ b/ui/views/cocoa/bridged_native_widget.mm
|
||||
@@ -1039,6 +1039,12 @@ NSUInteger CountBridgedWindows(NSArray* child_windows) {
|
||||
// BridgedNativeWidget, ui::CATransactionObserver
|
||||
|
||||
bool BridgedNativeWidget::ShouldWaitInPreCommit() {
|
||||
+ // Fix lagging when using tabbed windows, see the issue for more:
|
||||
+ // https://github.com/electron/electron/issues/16925
|
||||
+ if (@available(macOS 10.12, *)) {
|
||||
+ if ([[window_ tabbedWindows] count] > 0)
|
||||
+ return false;
|
||||
+ }
|
||||
if (!window_visible_)
|
||||
return false;
|
||||
if (ca_transaction_sync_suppressed_)
|
||||
@@ -0,0 +1,89 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Maks Orlovich <morlovich@chromium.org>
|
||||
Date: Thu, 22 Nov 2018 14:05:57 +0000
|
||||
Subject: Workaround apparent data corruption in blockfile on OS X 10.14 by
|
||||
switching backends.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is slower, but it's better than not loading pages at all since important resources
|
||||
got corrupted:(
|
||||
|
||||
Bug: 899874
|
||||
Change-Id: I19f7eccff0c8aa119e522aee9cf728934906b917
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1347109
|
||||
Commit-Queue: Maks Orlovich <morlovich@chromium.org>
|
||||
Reviewed-by: Elly Fong-Jones <ellyjones@chromium.org>
|
||||
Reviewed-by: Bence Béky <bnc@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#610404}
|
||||
|
||||
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
index 21d34cfab2c426ae367148433d21916fcd92c757..8d98b44fe167f2229dc7204027878f79be533b83 100644
|
||||
--- a/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
@@ -27,6 +27,10 @@
|
||||
#include "net/third_party/quic/core/quic_packets.h"
|
||||
#include "net/third_party/spdy/core/spdy_protocol.h"
|
||||
|
||||
+#if defined(OS_MACOSX) && !defined(OS_IOS)
|
||||
+#include "base/mac/mac_util.h"
|
||||
+#endif
|
||||
+
|
||||
namespace {
|
||||
|
||||
// Map from name to value for all parameters associate with a field trial.
|
||||
@@ -589,12 +593,25 @@ net::URLRequestContextBuilder::HttpCacheParams::Type ChooseCacheType(
|
||||
if (opt_value.empty() || base::LowerCaseEqualsASCII(opt_value, "on"))
|
||||
return net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE;
|
||||
}
|
||||
+
|
||||
const std::string experiment_name =
|
||||
base::FieldTrialList::FindFullName("SimpleCacheTrial");
|
||||
if (base::StartsWith(experiment_name, "Disable",
|
||||
base::CompareCase::INSENSITIVE_ASCII)) {
|
||||
return net::URLRequestContextBuilder::HttpCacheParams::DISK_BLOCKFILE;
|
||||
}
|
||||
+
|
||||
+ // Blockfile breaks on OSX 10.14 (see https://crbug.com/899874); so use
|
||||
+ // SimpleCache even when we don't enable it via experiment, as long as we
|
||||
+ // don't force it off (not used at this time). This unfortunately
|
||||
+ // muddles the experiment data, but as this was written to be considered for
|
||||
+ // backport, having it behave differently than in stable would be a bigger
|
||||
+ // problem.
|
||||
+#if defined(OS_MACOSX) && !defined(OS_IOS)
|
||||
+ if (base::mac::IsAtLeastOS10_14())
|
||||
+ return net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE;
|
||||
+#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
||||
+
|
||||
if (base::StartsWith(experiment_name, "ExperimentYes",
|
||||
base::CompareCase::INSENSITIVE_ASCII)) {
|
||||
return net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE;
|
||||
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
|
||||
index 1e3f7b89c3c1ef5b3da2c89516acd13ac1ad283f..80e5d7ada3f0044f16aeb73891e20316c6cd2461 100644
|
||||
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
|
||||
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
|
||||
@@ -25,6 +25,10 @@
|
||||
#include "net/url_request/url_request_context_builder.h"
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
|
||||
+#if defined(OS_MACOSX) && !defined(OS_IOS)
|
||||
+#include "base/mac/mac_util.h"
|
||||
+#endif
|
||||
+
|
||||
namespace network_session_configurator {
|
||||
|
||||
class NetworkSessionConfiguratorTest : public testing::Test {
|
||||
@@ -735,6 +739,12 @@ TEST_F(NetworkSessionConfiguratorTest, DefaultCacheBackend) {
|
||||
#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
|
||||
EXPECT_EQ(net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE,
|
||||
ChooseCacheType(command_line));
|
||||
+#elif defined(OS_MACOSX) && !defined(OS_IOS)
|
||||
+ EXPECT_EQ(
|
||||
+ base::mac::IsAtLeastOS10_14()
|
||||
+ ? net::URLRequestContextBuilder::HttpCacheParams::DISK_SIMPLE
|
||||
+ : net::URLRequestContextBuilder::HttpCacheParams::DISK_BLOCKFILE,
|
||||
+ ChooseCacheType(command_line));
|
||||
#else
|
||||
EXPECT_EQ(net::URLRequestContextBuilder::HttpCacheParams::DISK_BLOCKFILE,
|
||||
ChooseCacheType(command_line));
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
"src/electron/patches/common/skia": "src/third_party/skia",
|
||||
|
||||
"src/electron/patches/common/swiftshader": "src/third_party/swiftshader",
|
||||
|
||||
"src/electron/patches/common/webrtc": "src/third_party/webrtc",
|
||||
|
||||
"src/electron/patches/common/v8": "src/v8"
|
||||
|
||||
3
patches/common/swiftshader/.patches
Normal file
3
patches/common/swiftshader/.patches
Normal file
@@ -0,0 +1,3 @@
|
||||
prevent_gldeletequeries_from_deleting_a_live_query.patch
|
||||
fix_undefined_behavior_in_offset.patch
|
||||
fixed_all_oob_accesses_in_vertexprogram_and_pixelprogram.patch
|
||||
@@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Capens <capn@google.com>
|
||||
Date: Thu, 22 Nov 2018 10:32:35 -0500
|
||||
Subject: Fix undefined behavior in OFFSET().
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Accessing members of a null pointer is undefined behavior, even when
|
||||
only used to obtain the address again. So use a non-zero value as the
|
||||
base pointer address instead. 32 was chosen to provide sufficient
|
||||
alignment guarantees.
|
||||
|
||||
Bug b/119823623
|
||||
|
||||
Change-Id: Ia6d24dd6c2740261948860c45eb35cc489a3a827
|
||||
Reviewed-on: https://swiftshader-review.googlesource.com/c/22788
|
||||
Tested-by: Nicolas Capens <nicolascapens@google.com>
|
||||
Reviewed-by: Alexis Hétu <sugoi@google.com>
|
||||
|
||||
diff --git a/src/Common/Types.hpp b/src/Common/Types.hpp
|
||||
index cd08ed5704caa7f6454a619fd4ccbb9e2ddcee2c..837df461ab0676d94e6ee1276d75d289f06851ef 100644
|
||||
--- a/src/Common/Types.hpp
|
||||
+++ b/src/Common/Types.hpp
|
||||
@@ -151,7 +151,10 @@ namespace sw
|
||||
return v;
|
||||
}
|
||||
|
||||
- #define OFFSET(s,m) (int)(size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m))
|
||||
+ // The OFFSET macro is a generalization of the offsetof() macro defined in <cstddef>.
|
||||
+ // It allows e.g. getting the offset of array elements, even when indexed dynamically.
|
||||
+ // We cast the address '32' and subtract it again, because null-dereference is undefined behavior.
|
||||
+ #define OFFSET(s,m) ((int)(size_t)&reinterpret_cast<const volatile char&>((((s*)32)->m)) - 32)
|
||||
}
|
||||
|
||||
#endif // sw_Types_hpp
|
||||
@@ -0,0 +1,508 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Alexis Hetu <sugoi@google.com>
|
||||
Date: Thu, 10 Jan 2019 14:04:26 -0500
|
||||
Subject: Fixed all OOB accesses in VertexProgram and PixelProgram
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
A lot of arrays in VertexProgram and PixelProgram have fixed sizes,
|
||||
so programs that have more nested loops or ifs or deeper call stacks
|
||||
can cause OOB accesses, which causes security issues in Chromium.
|
||||
|
||||
Index clamping was added to prevent any OOB memory accesses here.
|
||||
|
||||
This could eventually be fixed properly by first verifying these sizes
|
||||
and giving shader compile errors when these limits are exceeded.
|
||||
|
||||
Bug chromium:915197 chromium:915206 chromium:915218 b/116373662
|
||||
|
||||
Change-Id: I2d0710ed0ce6585f139cba49d5b5d8c909ae6391
|
||||
Reviewed-on: https://swiftshader-review.googlesource.com/c/23568
|
||||
Tested-by: Alexis Hétu <sugoi@google.com>
|
||||
Reviewed-by: Corentin Wallez <cwallez@google.com>
|
||||
|
||||
diff --git a/src/Common/Types.hpp b/src/Common/Types.hpp
|
||||
index 837df461ab0676d94e6ee1276d75d289f06851ef..fac6d362891cf0b2a19f8faee0a1dbbdddbc3a88 100644
|
||||
--- a/src/Common/Types.hpp
|
||||
+++ b/src/Common/Types.hpp
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef sw_Types_hpp
|
||||
#define sw_Types_hpp
|
||||
|
||||
+#include <assert.h>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
|
||||
@@ -151,6 +152,46 @@ namespace sw
|
||||
return v;
|
||||
}
|
||||
|
||||
+ template <int limit> class BoundedIndex
|
||||
+ {
|
||||
+ public:
|
||||
+ BoundedIndex(int index) : index(index) {}
|
||||
+
|
||||
+ inline int operator++(int) { return index++; }
|
||||
+ inline int operator--(int) { return index--; }
|
||||
+ inline void operator=(int i) { index = i; }
|
||||
+
|
||||
+ inline bool operator==(int i) { return index == i; }
|
||||
+ inline bool operator!=(int i) { return index != i; }
|
||||
+ inline bool operator<(int i) { return index < i; }
|
||||
+ inline bool operator>(int i) { return index > i; }
|
||||
+ inline bool operator<=(int i) { return index <= i; }
|
||||
+ inline bool operator>=(int i) { return index >= i; }
|
||||
+
|
||||
+ inline operator int()
|
||||
+ {
|
||||
+ if(index < 0)
|
||||
+ {
|
||||
+#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
|
||||
+ assert(false);
|
||||
+#endif
|
||||
+ return 0;
|
||||
+ }
|
||||
+ else if(index >= limit)
|
||||
+ {
|
||||
+#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
|
||||
+ assert(false);
|
||||
+#endif
|
||||
+ return limit - 1;
|
||||
+ }
|
||||
+
|
||||
+ return index;
|
||||
+ }
|
||||
+
|
||||
+ private:
|
||||
+ int index = 0;
|
||||
+ };
|
||||
+
|
||||
// The OFFSET macro is a generalization of the offsetof() macro defined in <cstddef>.
|
||||
// It allows e.g. getting the offset of array elements, even when indexed dynamically.
|
||||
// We cast the address '32' and subtract it again, because null-dereference is undefined behavior.
|
||||
diff --git a/src/Main/Config.hpp b/src/Main/Config.hpp
|
||||
index 764bfed1e7a159715f5d269e88d0d9ab578b778f..f875085452d0255d78b60ad9313e035d4ab3691f 100644
|
||||
--- a/src/Main/Config.hpp
|
||||
+++ b/src/Main/Config.hpp
|
||||
@@ -97,6 +97,11 @@ namespace sw
|
||||
MAX_TEXTURE_LOD = MIPMAP_LEVELS - 2, // Trilinear accesses lod+1
|
||||
RENDERTARGETS = 8,
|
||||
NUM_TEMPORARY_REGISTERS = 4096,
|
||||
+ MAX_SHADER_CALL_SITES = 2048,
|
||||
+ MAX_SHADER_NESTED_LOOPS = 4,
|
||||
+ MAX_SHADER_NESTED_IFS = 24 + 24,
|
||||
+ MAX_SHADER_CALL_STACK_SIZE = 16,
|
||||
+ MAX_SHADER_ENABLE_STACK_SIZE = 1 + 24,
|
||||
};
|
||||
}
|
||||
|
||||
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp
|
||||
index 3cedbce8debcc7a1f8d22a7e687ea5673f33d01f..f8637209323b7dfe52b1736a9b15f0285f987331 100644
|
||||
--- a/src/Shader/PixelProgram.cpp
|
||||
+++ b/src/Shader/PixelProgram.cpp
|
||||
@@ -828,7 +828,7 @@ namespace sw
|
||||
|
||||
Int4 PixelProgram::enableMask(const Shader::Instruction *instruction)
|
||||
{
|
||||
- Int4 enable = instruction->analysisBranch ? Int4(enableStack[enableIndex]) : Int4(0xFFFFFFFF);
|
||||
+ Int4 enable = instruction->analysisBranch ? Int4(enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))]) : Int4(0xFFFFFFFF);
|
||||
|
||||
if(!whileTest)
|
||||
{
|
||||
@@ -1343,7 +1343,7 @@ namespace sw
|
||||
|
||||
void PixelProgram::BREAK()
|
||||
{
|
||||
- enableBreak = enableBreak & ~enableStack[enableIndex];
|
||||
+ enableBreak = enableBreak & ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
}
|
||||
|
||||
void PixelProgram::BREAKC(Vector4f &src0, Vector4f &src1, Control control)
|
||||
@@ -1379,14 +1379,14 @@ namespace sw
|
||||
|
||||
void PixelProgram::BREAK(Int4 &condition)
|
||||
{
|
||||
- condition &= enableStack[enableIndex];
|
||||
+ condition &= enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
enableBreak = enableBreak & ~condition;
|
||||
}
|
||||
|
||||
void PixelProgram::CONTINUE()
|
||||
{
|
||||
- enableContinue = enableContinue & ~enableStack[enableIndex];
|
||||
+ enableContinue = enableContinue & ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
}
|
||||
|
||||
void PixelProgram::TEST()
|
||||
@@ -1403,7 +1403,7 @@ namespace sw
|
||||
|
||||
if(callRetBlock[labelIndex].size() > 1)
|
||||
{
|
||||
- callStack[stackIndex++] = UInt(callSiteIndex);
|
||||
+ callStack[Min(stackIndex++, Int(MAX_SHADER_CALL_STACK_SIZE))] = UInt(callSiteIndex);
|
||||
}
|
||||
|
||||
Int4 restoreLeave = enableLeave;
|
||||
@@ -1443,7 +1443,7 @@ namespace sw
|
||||
|
||||
if(callRetBlock[labelIndex].size() > 1)
|
||||
{
|
||||
- callStack[stackIndex++] = UInt(callSiteIndex);
|
||||
+ callStack[Min(stackIndex++, Int(MAX_SHADER_CALL_STACK_SIZE))] = UInt(callSiteIndex);
|
||||
}
|
||||
|
||||
Int4 restoreLeave = enableLeave;
|
||||
@@ -1463,7 +1463,7 @@ namespace sw
|
||||
condition = ~condition;
|
||||
}
|
||||
|
||||
- condition &= enableStack[enableIndex];
|
||||
+ condition &= enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
if(!labelBlock[labelIndex])
|
||||
{
|
||||
@@ -1472,11 +1472,11 @@ namespace sw
|
||||
|
||||
if(callRetBlock[labelIndex].size() > 1)
|
||||
{
|
||||
- callStack[stackIndex++] = UInt(callSiteIndex);
|
||||
+ callStack[Min(stackIndex++, Int(MAX_SHADER_CALL_STACK_SIZE))] = UInt(callSiteIndex);
|
||||
}
|
||||
|
||||
enableIndex++;
|
||||
- enableStack[enableIndex] = condition;
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = condition;
|
||||
Int4 restoreLeave = enableLeave;
|
||||
|
||||
Bool notAllFalse = SignMask(condition) != 0;
|
||||
@@ -1496,12 +1496,12 @@ namespace sw
|
||||
|
||||
if(isConditionalIf[ifDepth])
|
||||
{
|
||||
- Int4 condition = ~enableStack[enableIndex] & enableStack[enableIndex - 1];
|
||||
+ Int4 condition = ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] & enableStack[Min(enableIndex - 1, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
Bool notAllFalse = SignMask(condition) != 0;
|
||||
|
||||
branch(notAllFalse, falseBlock, endBlock);
|
||||
|
||||
- enableStack[enableIndex] = ~enableStack[enableIndex] & enableStack[enableIndex - 1];
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] & enableStack[Min(enableIndex - 1, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1655,10 +1655,10 @@ namespace sw
|
||||
|
||||
void PixelProgram::IF(Int4 &condition)
|
||||
{
|
||||
- condition &= enableStack[enableIndex];
|
||||
+ condition &= enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
enableIndex++;
|
||||
- enableStack[enableIndex] = condition;
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = condition;
|
||||
|
||||
BasicBlock *trueBlock = Nucleus::createBasicBlock();
|
||||
BasicBlock *falseBlock = Nucleus::createBasicBlock();
|
||||
@@ -1763,10 +1763,10 @@ namespace sw
|
||||
|
||||
const Vector4f &src = fetchRegister(temporaryRegister);
|
||||
Int4 condition = As<Int4>(src.x);
|
||||
- condition &= enableStack[enableIndex - 1];
|
||||
+ condition &= enableStack[Min(enableIndex - 1, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
if(shader->containsLeaveInstruction()) condition &= enableLeave;
|
||||
if(shader->containsBreakInstruction()) condition &= enableBreak;
|
||||
- enableStack[enableIndex] = condition;
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = condition;
|
||||
|
||||
Bool notAllFalse = SignMask(condition) != 0;
|
||||
branch(notAllFalse, loopBlock, endBlock);
|
||||
@@ -1838,7 +1838,7 @@ namespace sw
|
||||
|
||||
void PixelProgram::LEAVE()
|
||||
{
|
||||
- enableLeave = enableLeave & ~enableStack[enableIndex];
|
||||
+ enableLeave = enableLeave & ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
// FIXME: Return from function if all instances left
|
||||
// FIXME: Use enableLeave in other control-flow constructs
|
||||
diff --git a/src/Shader/PixelProgram.hpp b/src/Shader/PixelProgram.hpp
|
||||
index 240938dd15820601ce2bf5e4ff6eb242ddd196e7..4ed3eef7545e27b56ceffa5a7cf33ebe9b7c287f 100644
|
||||
--- a/src/Shader/PixelProgram.hpp
|
||||
+++ b/src/Shader/PixelProgram.hpp
|
||||
@@ -27,7 +27,7 @@ namespace sw
|
||||
PixelRoutine(state, shader), r(shader->indirectAddressableTemporaries),
|
||||
loopDepth(-1), ifDepth(0), loopRepDepth(0), currentLabel(-1), whileTest(false)
|
||||
{
|
||||
- for(int i = 0; i < 2048; ++i)
|
||||
+ for(int i = 0; i < MAX_SHADER_CALL_SITES; ++i)
|
||||
{
|
||||
labelBlock[i] = 0;
|
||||
}
|
||||
@@ -67,17 +67,17 @@ namespace sw
|
||||
|
||||
// DX9 specific variables
|
||||
Vector4f p0;
|
||||
- Array<Int, 4> aL;
|
||||
- Array<Int, 4> increment;
|
||||
- Array<Int, 4> iteration;
|
||||
+ Array<Int, MAX_SHADER_NESTED_LOOPS> aL;
|
||||
+ Array<Int, MAX_SHADER_NESTED_LOOPS> increment;
|
||||
+ Array<Int, MAX_SHADER_NESTED_LOOPS> iteration;
|
||||
|
||||
Int loopDepth; // FIXME: Add support for switch
|
||||
Int stackIndex; // FIXME: Inc/decrement callStack
|
||||
- Array<UInt, 16> callStack;
|
||||
+ Array<UInt, MAX_SHADER_CALL_STACK_SIZE> callStack;
|
||||
|
||||
// Per pixel based on conditions reached
|
||||
Int enableIndex;
|
||||
- Array<Int4, 1 + 24> enableStack;
|
||||
+ Array<Int4, MAX_SHADER_ENABLE_STACK_SIZE> enableStack;
|
||||
Int4 enableBreak;
|
||||
Int4 enableContinue;
|
||||
Int4 enableLeave;
|
||||
@@ -152,18 +152,18 @@ namespace sw
|
||||
void RET();
|
||||
void LEAVE();
|
||||
|
||||
- int ifDepth;
|
||||
- int loopRepDepth;
|
||||
- int currentLabel;
|
||||
+ BoundedIndex<MAX_SHADER_NESTED_IFS> ifDepth = 0;
|
||||
+ BoundedIndex<MAX_SHADER_NESTED_LOOPS> loopRepDepth = 0;
|
||||
+ BoundedIndex<MAX_SHADER_CALL_SITES> currentLabel = -1;
|
||||
bool whileTest;
|
||||
|
||||
- BasicBlock *ifFalseBlock[24 + 24];
|
||||
- BasicBlock *loopRepTestBlock[4];
|
||||
- BasicBlock *loopRepEndBlock[4];
|
||||
- BasicBlock *labelBlock[2048];
|
||||
- std::vector<BasicBlock*> callRetBlock[2048];
|
||||
+ BasicBlock *ifFalseBlock[MAX_SHADER_NESTED_IFS];
|
||||
+ BasicBlock *loopRepTestBlock[MAX_SHADER_NESTED_LOOPS];
|
||||
+ BasicBlock *loopRepEndBlock[MAX_SHADER_NESTED_LOOPS];
|
||||
+ BasicBlock *labelBlock[MAX_SHADER_CALL_SITES];
|
||||
+ std::vector<BasicBlock*> callRetBlock[MAX_SHADER_CALL_SITES];
|
||||
BasicBlock *returnBlock;
|
||||
- bool isConditionalIf[24 + 24];
|
||||
+ bool isConditionalIf[MAX_SHADER_NESTED_IFS];
|
||||
};
|
||||
}
|
||||
|
||||
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
|
||||
index 36192c93c7473e7c4bc140843ad2c16ca11d3788..ed185d1c0c139bf971e44d7a1c2830de28a9c6ff 100644
|
||||
--- a/src/Shader/Shader.cpp
|
||||
+++ b/src/Shader/Shader.cpp
|
||||
@@ -1877,13 +1877,13 @@ namespace sw
|
||||
// This is used to know what basic block to return to.
|
||||
void Shader::analyzeCallSites()
|
||||
{
|
||||
- int callSiteIndex[2048] = {0};
|
||||
+ int callSiteIndex[MAX_SHADER_CALL_SITES] = {0};
|
||||
|
||||
for(auto &inst : instruction)
|
||||
{
|
||||
if(inst->opcode == OPCODE_CALL || inst->opcode == OPCODE_CALLNZ)
|
||||
{
|
||||
- int label = inst->dst.label;
|
||||
+ int label = sw::min(inst->dst.label, (unsigned int)(MAX_SHADER_CALL_SITES));
|
||||
|
||||
inst->dst.callSite = callSiteIndex[label]++;
|
||||
}
|
||||
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
|
||||
index ad4e37bd4e5c1e93bc6728d5eaba19caf7f95e92..694f05179d6df328ef6f64a882d428422d7e86d6 100644
|
||||
--- a/src/Shader/VertexProgram.cpp
|
||||
+++ b/src/Shader/VertexProgram.cpp
|
||||
@@ -31,7 +31,7 @@ namespace sw
|
||||
currentLabel = -1;
|
||||
whileTest = false;
|
||||
|
||||
- for(int i = 0; i < 2048; i++)
|
||||
+ for(int i = 0; i < MAX_SHADER_CALL_SITES; i++)
|
||||
{
|
||||
labelBlock[i] = 0;
|
||||
}
|
||||
@@ -978,7 +978,7 @@ namespace sw
|
||||
|
||||
Int4 VertexProgram::enableMask(const Shader::Instruction *instruction)
|
||||
{
|
||||
- Int4 enable = instruction->analysisBranch ? Int4(enableStack[enableIndex]) : Int4(0xFFFFFFFF);
|
||||
+ Int4 enable = instruction->analysisBranch ? Int4(enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))]) : Int4(0xFFFFFFFF);
|
||||
|
||||
if(!whileTest)
|
||||
{
|
||||
@@ -1060,7 +1060,7 @@ namespace sw
|
||||
|
||||
void VertexProgram::BREAK()
|
||||
{
|
||||
- enableBreak = enableBreak & ~enableStack[enableIndex];
|
||||
+ enableBreak = enableBreak & ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
}
|
||||
|
||||
void VertexProgram::BREAKC(Vector4f &src0, Vector4f &src1, Control control)
|
||||
@@ -1096,14 +1096,14 @@ namespace sw
|
||||
|
||||
void VertexProgram::BREAK(Int4 &condition)
|
||||
{
|
||||
- condition &= enableStack[enableIndex];
|
||||
+ condition &= enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
enableBreak = enableBreak & ~condition;
|
||||
}
|
||||
|
||||
void VertexProgram::CONTINUE()
|
||||
{
|
||||
- enableContinue = enableContinue & ~enableStack[enableIndex];
|
||||
+ enableContinue = enableContinue & ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
}
|
||||
|
||||
void VertexProgram::TEST()
|
||||
@@ -1120,7 +1120,7 @@ namespace sw
|
||||
|
||||
if(callRetBlock[labelIndex].size() > 1)
|
||||
{
|
||||
- callStack[stackIndex++] = UInt(callSiteIndex);
|
||||
+ callStack[Min(stackIndex++, Int(MAX_SHADER_CALL_STACK_SIZE))] = UInt(callSiteIndex);
|
||||
}
|
||||
|
||||
Int4 restoreLeave = enableLeave;
|
||||
@@ -1160,7 +1160,7 @@ namespace sw
|
||||
|
||||
if(callRetBlock[labelIndex].size() > 1)
|
||||
{
|
||||
- callStack[stackIndex++] = UInt(callSiteIndex);
|
||||
+ callStack[Min(stackIndex++, Int(MAX_SHADER_CALL_STACK_SIZE))] = UInt(callSiteIndex);
|
||||
}
|
||||
|
||||
Int4 restoreLeave = enableLeave;
|
||||
@@ -1180,7 +1180,7 @@ namespace sw
|
||||
condition = ~condition;
|
||||
}
|
||||
|
||||
- condition &= enableStack[enableIndex];
|
||||
+ condition &= enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
if(!labelBlock[labelIndex])
|
||||
{
|
||||
@@ -1189,11 +1189,11 @@ namespace sw
|
||||
|
||||
if(callRetBlock[labelIndex].size() > 1)
|
||||
{
|
||||
- callStack[stackIndex++] = UInt(callSiteIndex);
|
||||
+ callStack[Min(stackIndex++, Int(MAX_SHADER_CALL_STACK_SIZE))] = UInt(callSiteIndex);
|
||||
}
|
||||
|
||||
enableIndex++;
|
||||
- enableStack[enableIndex] = condition;
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = condition;
|
||||
Int4 restoreLeave = enableLeave;
|
||||
|
||||
Bool notAllFalse = SignMask(condition) != 0;
|
||||
@@ -1213,12 +1213,12 @@ namespace sw
|
||||
|
||||
if(isConditionalIf[ifDepth])
|
||||
{
|
||||
- Int4 condition = ~enableStack[enableIndex] & enableStack[enableIndex - 1];
|
||||
+ Int4 condition = ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] & enableStack[Min(enableIndex - 1, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
Bool notAllFalse = SignMask(condition) != 0;
|
||||
|
||||
branch(notAllFalse, falseBlock, endBlock);
|
||||
|
||||
- enableStack[enableIndex] = ~enableStack[enableIndex] & enableStack[enableIndex - 1];
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] & enableStack[Min(enableIndex - 1, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1372,10 +1372,10 @@ namespace sw
|
||||
|
||||
void VertexProgram::IF(Int4 &condition)
|
||||
{
|
||||
- condition &= enableStack[enableIndex];
|
||||
+ condition &= enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
enableIndex++;
|
||||
- enableStack[enableIndex] = condition;
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = condition;
|
||||
|
||||
BasicBlock *trueBlock = Nucleus::createBasicBlock();
|
||||
BasicBlock *falseBlock = Nucleus::createBasicBlock();
|
||||
@@ -1481,10 +1481,10 @@ namespace sw
|
||||
|
||||
const Vector4f &src = fetchRegister(temporaryRegister);
|
||||
Int4 condition = As<Int4>(src.x);
|
||||
- condition &= enableStack[enableIndex - 1];
|
||||
+ condition &= enableStack[Min(enableIndex - 1, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
if(shader->containsLeaveInstruction()) condition &= enableLeave;
|
||||
if(shader->containsBreakInstruction()) condition &= enableBreak;
|
||||
- enableStack[enableIndex] = condition;
|
||||
+ enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))] = condition;
|
||||
|
||||
Bool notAllFalse = SignMask(condition) != 0;
|
||||
branch(notAllFalse, loopBlock, endBlock);
|
||||
@@ -1556,7 +1556,7 @@ namespace sw
|
||||
|
||||
void VertexProgram::LEAVE()
|
||||
{
|
||||
- enableLeave = enableLeave & ~enableStack[enableIndex];
|
||||
+ enableLeave = enableLeave & ~enableStack[Min(enableIndex, Int(MAX_SHADER_ENABLE_STACK_SIZE))];
|
||||
|
||||
// FIXME: Return from function if all instances left
|
||||
// FIXME: Use enableLeave in other control-flow constructs
|
||||
diff --git a/src/Shader/VertexProgram.hpp b/src/Shader/VertexProgram.hpp
|
||||
index 3c4199c6611198997326d387f787bcd7467558a3..8421078acaa9f89e311015f62e17d4825a3a6e82 100644
|
||||
--- a/src/Shader/VertexProgram.hpp
|
||||
+++ b/src/Shader/VertexProgram.hpp
|
||||
@@ -39,18 +39,18 @@ namespace sw
|
||||
|
||||
RegisterArray<NUM_TEMPORARY_REGISTERS> r; // Temporary registers
|
||||
Vector4f a0;
|
||||
- Array<Int, 4> aL;
|
||||
+ Array<Int, MAX_SHADER_NESTED_LOOPS> aL;
|
||||
Vector4f p0;
|
||||
|
||||
- Array<Int, 4> increment;
|
||||
- Array<Int, 4> iteration;
|
||||
+ Array<Int, MAX_SHADER_NESTED_LOOPS> increment;
|
||||
+ Array<Int, MAX_SHADER_NESTED_LOOPS> iteration;
|
||||
|
||||
Int loopDepth;
|
||||
Int stackIndex; // FIXME: Inc/decrement callStack
|
||||
- Array<UInt, 16> callStack;
|
||||
+ Array<UInt, MAX_SHADER_CALL_STACK_SIZE> callStack;
|
||||
|
||||
Int enableIndex;
|
||||
- Array<Int4, 1 + 24> enableStack;
|
||||
+ Array<Int4, MAX_SHADER_ENABLE_STACK_SIZE> enableStack;
|
||||
Int4 enableBreak;
|
||||
Int4 enableContinue;
|
||||
Int4 enableLeave;
|
||||
@@ -121,18 +121,18 @@ namespace sw
|
||||
Vector4f sampleTexture(const Src &s, Vector4f &uvwq, Float4 &lod, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerFunction function);
|
||||
Vector4f sampleTexture(int sampler, Vector4f &uvwq, Float4 &lod, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerFunction function);
|
||||
|
||||
- int ifDepth;
|
||||
- int loopRepDepth;
|
||||
- int currentLabel;
|
||||
+ BoundedIndex<MAX_SHADER_NESTED_IFS> ifDepth = 0;
|
||||
+ BoundedIndex<MAX_SHADER_NESTED_LOOPS> loopRepDepth = 0;
|
||||
+ BoundedIndex<MAX_SHADER_CALL_SITES> currentLabel = -1;
|
||||
bool whileTest;
|
||||
|
||||
- BasicBlock *ifFalseBlock[24 + 24];
|
||||
- BasicBlock *loopRepTestBlock[4];
|
||||
- BasicBlock *loopRepEndBlock[4];
|
||||
- BasicBlock *labelBlock[2048];
|
||||
- std::vector<BasicBlock*> callRetBlock[2048];
|
||||
+ BasicBlock *ifFalseBlock[MAX_SHADER_NESTED_IFS];
|
||||
+ BasicBlock *loopRepTestBlock[MAX_SHADER_NESTED_LOOPS];
|
||||
+ BasicBlock *loopRepEndBlock[MAX_SHADER_NESTED_LOOPS];
|
||||
+ BasicBlock *labelBlock[MAX_SHADER_CALL_SITES];
|
||||
+ std::vector<BasicBlock*> callRetBlock[MAX_SHADER_CALL_SITES];
|
||||
BasicBlock *returnBlock;
|
||||
- bool isConditionalIf[24 + 24];
|
||||
+ bool isConditionalIf[MAX_SHADER_NESTED_IFS];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Alexis Hetu <sugoi@google.com>
|
||||
Date: Wed, 14 Nov 2018 10:54:53 -0500
|
||||
Subject: Prevent glDeleteQueries from deleting a live Query
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
glDeleteQueries() instantly deletes all the es2::Query objects
|
||||
passed as arguments to this function. If some of these queries
|
||||
are still being used by the renderer, this will result in a use
|
||||
after free error. To solve this issue, sw::Query is now a also
|
||||
ref counted object.
|
||||
|
||||
Bug chromium:904714
|
||||
|
||||
Change-Id: Ic1d5781bbf1724d8d07936fd49c8a172dc3d9fd4
|
||||
Reviewed-on: https://swiftshader-review.googlesource.com/c/22548
|
||||
Tested-by: Alexis Hétu <sugoi@google.com>
|
||||
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
|
||||
|
||||
diff --git a/src/D3D9/Direct3DQuery9.cpp b/src/D3D9/Direct3DQuery9.cpp
|
||||
index 31d249e7897869b8a97c1b8a4e449b1a71500f80..b6a3b2d60a8fa14016007d00be753e1642c75cbc 100644
|
||||
--- a/src/D3D9/Direct3DQuery9.cpp
|
||||
+++ b/src/D3D9/Direct3DQuery9.cpp
|
||||
@@ -41,7 +41,7 @@ namespace D3D9
|
||||
{
|
||||
device->removeQuery(query);
|
||||
|
||||
- delete query;
|
||||
+ query->release();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ namespace D3D9
|
||||
return INVALIDCALL();
|
||||
}
|
||||
|
||||
- bool signaled = !query || query->reference == 0;
|
||||
+ bool signaled = !query || query->isReady();
|
||||
|
||||
if(size && signaled)
|
||||
{
|
||||
diff --git a/src/OpenGL/libGLESv2/Query.cpp b/src/OpenGL/libGLESv2/Query.cpp
|
||||
index 027f8abcae73d0caae9cdfb610c4873229e93e40..87286210f2c4e4b6e984c5b28049afe3587eb1ca 100644
|
||||
--- a/src/OpenGL/libGLESv2/Query.cpp
|
||||
+++ b/src/OpenGL/libGLESv2/Query.cpp
|
||||
@@ -32,7 +32,7 @@ Query::Query(GLuint name, GLenum type) : NamedObject(name)
|
||||
|
||||
Query::~Query()
|
||||
{
|
||||
- delete mQuery;
|
||||
+ mQuery->release();
|
||||
}
|
||||
|
||||
void Query::begin()
|
||||
@@ -140,7 +140,7 @@ GLboolean Query::testQuery()
|
||||
{
|
||||
if(mQuery != nullptr && mStatus != GL_TRUE)
|
||||
{
|
||||
- if(!mQuery->building && mQuery->reference == 0)
|
||||
+ if(!mQuery->building && mQuery->isReady())
|
||||
{
|
||||
unsigned int resultSum = mQuery->data;
|
||||
mStatus = GL_TRUE;
|
||||
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
|
||||
index b560f4171ea649055572e4c535560d8664e1fa7e..e4a4e06660bf8a4731974f7615b8d68dd39e6b30 100644
|
||||
--- a/src/Renderer/Renderer.cpp
|
||||
+++ b/src/Renderer/Renderer.cpp
|
||||
@@ -78,6 +78,27 @@ namespace sw
|
||||
int threadIndex;
|
||||
};
|
||||
|
||||
+ Query::Query(Type type) : building(false), data(0), type(type), reference(1)
|
||||
+ {
|
||||
+ }
|
||||
+
|
||||
+ void Query::addRef()
|
||||
+ {
|
||||
+ ++reference; // Atomic
|
||||
+ }
|
||||
+
|
||||
+ void Query::release()
|
||||
+ {
|
||||
+ int ref = reference--; // Atomic
|
||||
+
|
||||
+ ASSERT(ref >= 0);
|
||||
+
|
||||
+ if(ref == 0)
|
||||
+ {
|
||||
+ delete this;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
DrawCall::DrawCall()
|
||||
{
|
||||
queries = 0;
|
||||
@@ -314,7 +335,7 @@ namespace sw
|
||||
{
|
||||
if(includePrimitivesWrittenQueries || (query->type != Query::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN))
|
||||
{
|
||||
- ++query->reference; // Atomic
|
||||
+ query->addRef();
|
||||
draw->queries->push_back(query);
|
||||
}
|
||||
}
|
||||
@@ -1002,7 +1023,7 @@ namespace sw
|
||||
break;
|
||||
}
|
||||
|
||||
- --query->reference; // Atomic
|
||||
+ query->release();
|
||||
}
|
||||
|
||||
delete draw.queries;
|
||||
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp
|
||||
index ce22866d7224036d4d32294d93f6a53c9da7d48d..0846a27b7b83b70206df6f594af0f59fb9e74fb5 100644
|
||||
--- a/src/Renderer/Renderer.hpp
|
||||
+++ b/src/Renderer/Renderer.hpp
|
||||
@@ -89,26 +89,35 @@ namespace sw
|
||||
{
|
||||
enum Type { FRAGMENTS_PASSED, TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN };
|
||||
|
||||
- Query(Type type) : building(false), reference(0), data(0), type(type)
|
||||
- {
|
||||
- }
|
||||
+ Query(Type type);
|
||||
+
|
||||
+ void addRef();
|
||||
+ void release();
|
||||
|
||||
- void begin()
|
||||
+ inline void begin()
|
||||
{
|
||||
building = true;
|
||||
data = 0;
|
||||
}
|
||||
|
||||
- void end()
|
||||
+ inline void end()
|
||||
{
|
||||
building = false;
|
||||
}
|
||||
|
||||
+ inline bool isReady() const
|
||||
+ {
|
||||
+ return (reference == 1);
|
||||
+ }
|
||||
+
|
||||
bool building;
|
||||
- AtomicInt reference;
|
||||
AtomicInt data;
|
||||
|
||||
const Type type;
|
||||
+ private:
|
||||
+ ~Query() {} // Only delete a query within the release() function
|
||||
+
|
||||
+ AtomicInt reference;
|
||||
};
|
||||
|
||||
struct DrawData
|
||||
@@ -19,3 +19,10 @@ disable-warning-win.patch
|
||||
expose_mksnapshot.patch
|
||||
build-torque-with-x64-toolchain-on-arm.patch
|
||||
do_not_run_arm_arm64_mksnapshot_binaries.patch
|
||||
do_not_export_private_v8_symbols_on_windows.patch
|
||||
turbofan_fix_wrong_typing_of_speculativesafeintegersubtract.patch
|
||||
turbofan_restrict_redundancy_elimination_from_widening_types.patch
|
||||
parser_literalbuffer_expandbuffer_always_grows.patch
|
||||
valueserializer_report_if_buffer_expansion_fails_during.patch
|
||||
check_array_element_length_in_valuedeserializer.patch
|
||||
liftoff-correctly-unuse-labels.patch
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Burda <milan.burda@gmail.com>
|
||||
Date: Sat, 1 Jun 2019 23:36:46 +0200
|
||||
Subject: Check array element length in ValueDeserializer
|
||||
|
||||
Backports:
|
||||
- https://chromium-review.googlesource.com/c/v8/v8/+/1339699
|
||||
- https://chromium-review.googlesource.com/c/v8/v8/+/1340283
|
||||
- https://chromium-review.googlesource.com/c/v8/v8/+/1362046
|
||||
|
||||
diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
||||
index 8c85bd9f5466612937a71f8bfdcb82120f7fb9c7..e624641c315f0d2c3423462928d8e1e900027031 100644
|
||||
--- a/src/value-serializer.cc
|
||||
+++ b/src/value-serializer.cc
|
||||
@@ -1150,6 +1150,7 @@ void ValueDeserializer::TransferArrayBuffer(
|
||||
}
|
||||
|
||||
MaybeHandle<Object> ValueDeserializer::ReadObject() {
|
||||
+ DisallowJavascriptExecution no_js(isolate_);
|
||||
MaybeHandle<Object> result = ReadObjectInternal();
|
||||
|
||||
// ArrayBufferView is special in that it consumes the value before it, even
|
||||
@@ -1474,6 +1475,11 @@ MaybeHandle<JSArray> ValueDeserializer::ReadDenseJSArray() {
|
||||
// hole. Past version 11, undefined means undefined.
|
||||
if (version_ < 11 && element->IsUndefined(isolate_)) continue;
|
||||
|
||||
+ // Safety check.
|
||||
+ if (i >= static_cast<uint32_t>(elements->length())) {
|
||||
+ return MaybeHandle<JSArray>();
|
||||
+ }
|
||||
+
|
||||
elements->set(i, *element);
|
||||
}
|
||||
|
||||
@@ -1595,8 +1601,12 @@ MaybeHandle<JSMap> ValueDeserializer::ReadJSMap() {
|
||||
}
|
||||
|
||||
Handle<Object> argv[2];
|
||||
- if (!ReadObject().ToHandle(&argv[0]) || !ReadObject().ToHandle(&argv[1]) ||
|
||||
- Execution::Call(isolate_, map_set, map, arraysize(argv), argv)
|
||||
+ if (!ReadObject().ToHandle(&argv[0]) || !ReadObject().ToHandle(&argv[1])) {
|
||||
+ return MaybeHandle<JSMap>();
|
||||
+ }
|
||||
+
|
||||
+ AllowJavascriptExecution allow_js(isolate_);
|
||||
+ if (Execution::Call(isolate_, map_set, map, arraysize(argv), argv)
|
||||
.is_null()) {
|
||||
return MaybeHandle<JSMap>();
|
||||
}
|
||||
@@ -1631,8 +1641,10 @@ MaybeHandle<JSSet> ValueDeserializer::ReadJSSet() {
|
||||
}
|
||||
|
||||
Handle<Object> argv[1];
|
||||
- if (!ReadObject().ToHandle(&argv[0]) ||
|
||||
- Execution::Call(isolate_, set_add, set, arraysize(argv), argv)
|
||||
+ if (!ReadObject().ToHandle(&argv[0])) return MaybeHandle<JSSet>();
|
||||
+
|
||||
+ AllowJavascriptExecution allow_js(isolate_);
|
||||
+ if (Execution::Call(isolate_, set_add, set, arraysize(argv), argv)
|
||||
.is_null()) {
|
||||
return MaybeHandle<JSSet>();
|
||||
}
|
||||
@@ -1981,7 +1993,7 @@ Maybe<uint32_t> ValueDeserializer::ReadJSObjectProperties(
|
||||
bool success;
|
||||
LookupIterator it = LookupIterator::PropertyOrElement(
|
||||
isolate_, object, key, &success, LookupIterator::OWN);
|
||||
- if (!success ||
|
||||
+ if (!success || it.state() != LookupIterator::NOT_FOUND ||
|
||||
JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE)
|
||||
.is_null()) {
|
||||
return Nothing<uint32_t>();
|
||||
@@ -2015,7 +2027,7 @@ Maybe<uint32_t> ValueDeserializer::ReadJSObjectProperties(
|
||||
bool success;
|
||||
LookupIterator it = LookupIterator::PropertyOrElement(
|
||||
isolate_, object, key, &success, LookupIterator::OWN);
|
||||
- if (!success ||
|
||||
+ if (!success || it.state() != LookupIterator::NOT_FOUND ||
|
||||
JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE)
|
||||
.is_null()) {
|
||||
return Nothing<uint32_t>();
|
||||
@@ -2062,7 +2074,7 @@ static Maybe<bool> SetPropertiesFromKeyValuePairs(Isolate* isolate,
|
||||
bool success;
|
||||
LookupIterator it = LookupIterator::PropertyOrElement(
|
||||
isolate, object, key, &success, LookupIterator::OWN);
|
||||
- if (!success ||
|
||||
+ if (!success || it.state() != LookupIterator::NOT_FOUND ||
|
||||
JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE)
|
||||
.is_null()) {
|
||||
return Nothing<bool>();
|
||||
diff --git a/test/unittests/value-serializer-unittest.cc b/test/unittests/value-serializer-unittest.cc
|
||||
index bc738c84fc8b15bdfcdb0cc995f8002362292a4c..d81a4d2cc590e265221804bfa23a7a5967a3d042 100644
|
||||
--- a/test/unittests/value-serializer-unittest.cc
|
||||
+++ b/test/unittests/value-serializer-unittest.cc
|
||||
@@ -1877,6 +1877,18 @@ TEST_F(ValueSerializerTest, DecodeDataView) {
|
||||
ExpectScriptTrue("Object.getPrototypeOf(result) === DataView.prototype");
|
||||
}
|
||||
|
||||
+TEST_F(ValueSerializerTest, DecodeArrayWithLengthProperty1) {
|
||||
+ InvalidDecodeTest({0xff, 0x0d, 0x41, 0x03, 0x49, 0x02, 0x49, 0x04,
|
||||
+ 0x49, 0x06, 0x22, 0x06, 0x6c, 0x65, 0x6e, 0x67,
|
||||
+ 0x74, 0x68, 0x49, 0x02, 0x24, 0x01, 0x03});
|
||||
+}
|
||||
+
|
||||
+TEST_F(ValueSerializerTest, DecodeArrayWithLengthProperty2) {
|
||||
+ InvalidDecodeTest({0xff, 0x0d, 0x41, 0x03, 0x49, 0x02, 0x49, 0x04,
|
||||
+ 0x49, 0x06, 0x22, 0x06, 0x6c, 0x65, 0x6e, 0x67,
|
||||
+ 0x74, 0x68, 0x6f, 0x7b, 0x00, 0x24, 0x01, 0x03});
|
||||
+}
|
||||
+
|
||||
TEST_F(ValueSerializerTest, DecodeInvalidDataView) {
|
||||
// Byte offset out of range.
|
||||
InvalidDecodeTest(
|
||||
@@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Rycl <torycl@microsoft.com>
|
||||
Date: Mon, 13 May 2019 15:48:48 +0200
|
||||
Subject: Do not export private V8 symbols on Windows
|
||||
|
||||
This change stops private V8 symbols and internal crt methods being exported.
|
||||
It fixes an issue where native node modules can import
|
||||
incorrect CRT methods and crash on Windows.
|
||||
It also reduces size of node.lib by 75%.
|
||||
|
||||
This patch can be safely removed if, when it is removed, `node.lib` does not
|
||||
contain any standard C++ library exports (e.g. `std::ostringstream`).
|
||||
|
||||
diff --git a/BUILD.gn b/BUILD.gn
|
||||
index f43c42a62e1a2d273ece56377c328addb8b99d66..fcf110e673b92070cc1931b376f8a26d38b188e4 100644
|
||||
--- a/BUILD.gn
|
||||
+++ b/BUILD.gn
|
||||
@@ -212,6 +212,10 @@ config("internal_config") {
|
||||
|
||||
defines = []
|
||||
|
||||
+ if (!is_component_build && is_electron_build) {
|
||||
+ defines += [ "HIDE_PRIVATE_SYMBOLS" ]
|
||||
+ }
|
||||
+
|
||||
if (is_component_build || is_electron_build) {
|
||||
defines += [ "BUILDING_V8_SHARED" ]
|
||||
}
|
||||
diff --git a/src/globals.h b/src/globals.h
|
||||
index 6edc5d01b4ff503d05d70a7e40959fbc7f972628..d442f691729bd661488018c55e621169cc52ee5e 100644
|
||||
--- a/src/globals.h
|
||||
+++ b/src/globals.h
|
||||
@@ -20,13 +20,17 @@
|
||||
#ifdef V8_OS_WIN
|
||||
|
||||
// Setup for Windows shared library export.
|
||||
+#if defined(HIDE_PRIVATE_SYMBOLS)
|
||||
+#define V8_EXPORT_PRIVATE
|
||||
+#else //if !defined(HIDE_PRIVATE_SYMBOLS)
|
||||
#ifdef BUILDING_V8_SHARED
|
||||
#define V8_EXPORT_PRIVATE __declspec(dllexport)
|
||||
#elif USING_V8_SHARED
|
||||
#define V8_EXPORT_PRIVATE __declspec(dllimport)
|
||||
-#else
|
||||
+#else //!(BUILDING_V8_SHARED || USING_V8_SHARED)
|
||||
#define V8_EXPORT_PRIVATE
|
||||
-#endif // BUILDING_V8_SHARED
|
||||
+#endif
|
||||
+#endif
|
||||
|
||||
#else // V8_OS_WIN
|
||||
|
||||
104
patches/common/v8/liftoff-correctly-unuse-labels.patch
Normal file
104
patches/common/v8/liftoff-correctly-unuse-labels.patch
Normal file
@@ -0,0 +1,104 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Clemens Hammacher <clemensh@chromium.org>
|
||||
Date: Tue, 29 Jan 2019 15:04:04 +0100
|
||||
Subject: [Liftoff] Correctly unuse Labels
|
||||
|
||||
On Liftoff bailout, instead of binding all unbound labels (to avoid
|
||||
triggering DCHECKS in their destructor), just Unuse them.
|
||||
|
||||
R=mstarzinger@chromium.org
|
||||
|
||||
Bug: chromium:924843
|
||||
Change-Id: Icf581bca06eaa7369ab2bbd5d805112289d6a801
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1442645
|
||||
Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
|
||||
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#59172}
|
||||
|
||||
diff --git a/src/wasm/baseline/liftoff-compiler.cc b/src/wasm/baseline/liftoff-compiler.cc
|
||||
index 1130cf0cdd5f1e5a83ebc99433d4269952a3aac3..dd16a0762c9fefd8ba4e7287a50b84f580e0d60b 100644
|
||||
--- a/src/wasm/baseline/liftoff-compiler.cc
|
||||
+++ b/src/wasm/baseline/liftoff-compiler.cc
|
||||
@@ -145,7 +145,7 @@ class LiftoffCompiler {
|
||||
compilation_zone_(compilation_zone),
|
||||
safepoint_table_builder_(compilation_zone_) {}
|
||||
|
||||
- ~LiftoffCompiler() { BindUnboundLabels(nullptr); }
|
||||
+ ~LiftoffCompiler() { UnuseLabels(nullptr); }
|
||||
|
||||
bool ok() const { return ok_; }
|
||||
|
||||
@@ -169,7 +169,7 @@ class LiftoffCompiler {
|
||||
ok_ = false;
|
||||
TRACE("unsupported: %s\n", reason);
|
||||
decoder->errorf(decoder->pc(), "unsupported liftoff operation: %s", reason);
|
||||
- BindUnboundLabels(decoder);
|
||||
+ UnuseLabels(decoder);
|
||||
}
|
||||
|
||||
bool DidAssemblerBailout(Decoder* decoder) {
|
||||
@@ -195,23 +195,21 @@ class LiftoffCompiler {
|
||||
return safepoint_table_builder_.GetCodeOffset();
|
||||
}
|
||||
|
||||
- void BindUnboundLabels(Decoder* decoder) {
|
||||
+ void UnuseLabels(Decoder* decoder) {
|
||||
#ifdef DEBUG
|
||||
- // Bind all labels now, otherwise their destructor will fire a DCHECK error
|
||||
+ auto Unuse = [](Label* label) {
|
||||
+ label->Unuse();
|
||||
+ label->UnuseNear();
|
||||
+ };
|
||||
+ // Unuse all labels now, otherwise their destructor will fire a DCHECK error
|
||||
// if they where referenced before.
|
||||
uint32_t control_depth = decoder ? decoder->control_depth() : 0;
|
||||
for (uint32_t i = 0; i < control_depth; ++i) {
|
||||
Control* c = decoder->control_at(i);
|
||||
- Label* label = c->label.get();
|
||||
- if (!label->is_bound()) __ bind(label);
|
||||
- if (c->else_state) {
|
||||
- Label* else_label = c->else_state->label.get();
|
||||
- if (!else_label->is_bound()) __ bind(else_label);
|
||||
- }
|
||||
- }
|
||||
- for (auto& ool : out_of_line_code_) {
|
||||
- if (!ool.label.get()->is_bound()) __ bind(ool.label.get());
|
||||
+ Unuse(c->label.get());
|
||||
+ if (c->else_state) Unuse(c->else_state->label.get());
|
||||
}
|
||||
+ for (auto& ool : out_of_line_code_) Unuse(ool.label.get());
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -437,7 +435,7 @@ class LiftoffCompiler {
|
||||
|
||||
void OnFirstError(Decoder* decoder) {
|
||||
ok_ = false;
|
||||
- BindUnboundLabels(decoder);
|
||||
+ UnuseLabels(decoder);
|
||||
asm_.AbortCompilation();
|
||||
}
|
||||
|
||||
diff --git a/test/mjsunit/regress/wasm/regress-924843.js b/test/mjsunit/regress/wasm/regress-924843.js
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b59548540ccbd514eb65da4619698f87d2b48c70
|
||||
--- /dev/null
|
||||
+++ b/test/mjsunit/regress/wasm/regress-924843.js
|
||||
@@ -0,0 +1,17 @@
|
||||
+// Copyright 2019 the V8 project authors. All rights reserved.
|
||||
+// Use of this source code is governed by a BSD-style license that can be
|
||||
+// found in the LICENSE file.
|
||||
+
|
||||
+load('test/mjsunit/wasm/wasm-constants.js');
|
||||
+load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
+
|
||||
+const builder = new WasmModuleBuilder();
|
||||
+const sig = builder.addType(makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]));
|
||||
+builder.addFunction(undefined, sig)
|
||||
+ .addBody([
|
||||
+ kExprGetLocal, 2,
|
||||
+ kExprIf, kWasmStmt,
|
||||
+ kExprBlock, kWasmStmt
|
||||
+ ]);
|
||||
+builder.addExport('main', 0);
|
||||
+assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
|
||||
@@ -0,0 +1,49 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Toon Verwaest <verwaest@chromium.org>
|
||||
Date: Fri, 11 Jan 2019 11:27:18 +0100
|
||||
Subject: [parser] LiteralBuffer::ExpandBuffer always grows
|
||||
|
||||
Bug: chromium:914736
|
||||
Change-Id: Id02715b69361d15df23c70f85f3250526369547f
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1405859
|
||||
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
|
||||
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#58734}
|
||||
|
||||
diff --git a/src/parsing/scanner.cc b/src/parsing/scanner.cc
|
||||
index 852b5e400b3ffe84e464a2d63c943a30b497ac69..267b38fd7fed38421b9b6e315b02771dbab9381f 100644
|
||||
--- a/src/parsing/scanner.cc
|
||||
+++ b/src/parsing/scanner.cc
|
||||
@@ -67,13 +67,14 @@ Handle<String> Scanner::LiteralBuffer::Internalize(Isolate* isolate) const {
|
||||
}
|
||||
|
||||
int Scanner::LiteralBuffer::NewCapacity(int min_capacity) {
|
||||
- int capacity = Max(min_capacity, backing_store_.length());
|
||||
- int new_capacity = Min(capacity * kGrowthFactory, capacity + kMaxGrowth);
|
||||
- return new_capacity;
|
||||
+ return min_capacity < (kMaxGrowth / (kGrowthFactor - 1))
|
||||
+ ? min_capacity * kGrowthFactor
|
||||
+ : min_capacity + kMaxGrowth;
|
||||
}
|
||||
|
||||
void Scanner::LiteralBuffer::ExpandBuffer() {
|
||||
- Vector<byte> new_store = Vector<byte>::New(NewCapacity(kInitialCapacity));
|
||||
+ int min_capacity = Max(kInitialCapacity, backing_store_.length());
|
||||
+ Vector<byte> new_store = Vector<byte>::New(NewCapacity(min_capacity));
|
||||
MemCopy(new_store.start(), backing_store_.start(), position_);
|
||||
backing_store_.Dispose();
|
||||
backing_store_ = new_store;
|
||||
diff --git a/src/parsing/scanner.h b/src/parsing/scanner.h
|
||||
index 34da5fafbf733fd326e91baeeac26bf4517c9fcf..d779317c55567311dc266af101815d2740d28e0b 100644
|
||||
--- a/src/parsing/scanner.h
|
||||
+++ b/src/parsing/scanner.h
|
||||
@@ -453,8 +453,7 @@ class Scanner {
|
||||
|
||||
private:
|
||||
static const int kInitialCapacity = 16;
|
||||
- static const int kGrowthFactory = 4;
|
||||
- static const int kMinConversionSlack = 256;
|
||||
+ static const int kGrowthFactor = 4;
|
||||
static const int kMaxGrowth = 1 * MB;
|
||||
|
||||
inline bool IsValidAscii(char code_unit) {
|
||||
@@ -0,0 +1,78 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benedikt Meurer <bmeurer@chromium.org>
|
||||
Date: Tue, 11 Dec 2018 07:58:19 +0100
|
||||
Subject: [turbofan] Fix wrong typing of SpeculativeSafeIntegerSubtract.
|
||||
|
||||
The typing of SpeculativeSafeIntegerSubtract didn't include -0, and the
|
||||
SimplifiedLowering rules for SpeculativeSafeIntegerSubtract didn't
|
||||
properly handle the case of `-0 - 0`, but would always pass Word32
|
||||
truncations.
|
||||
|
||||
Bug: chromium:913296
|
||||
Change-Id: I0e5a401f075db8b349a5579e1e294df97378ea49
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1370042
|
||||
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
|
||||
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#58147}
|
||||
|
||||
diff --git a/src/compiler/operation-typer.cc b/src/compiler/operation-typer.cc
|
||||
index a9ae8c322aa6d1be31f52cef77f0915a1506cad9..31c4d75f8e88ece659fb13279247c56f43c28141 100644
|
||||
--- a/src/compiler/operation-typer.cc
|
||||
+++ b/src/compiler/operation-typer.cc
|
||||
@@ -664,7 +664,7 @@ Type OperationTyper::SpeculativeSafeIntegerSubtract(Type lhs, Type rhs) {
|
||||
// In either case the result will be in the safe integer range, so we
|
||||
// can bake in the type here. This needs to be in sync with
|
||||
// SimplifiedLowering::VisitSpeculativeAdditiveOp.
|
||||
- return result = Type::Intersect(result, cache_.kSafeInteger, zone());
|
||||
+ return Type::Intersect(result, cache_.kSafeIntegerOrMinusZero, zone());
|
||||
}
|
||||
|
||||
Type OperationTyper::NumberMultiply(Type lhs, Type rhs) {
|
||||
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
||||
index 74bb7fcd6b5f00209a920a41ab117f232a0d0fca..65c7e73ddaa0c079392283e2c245061bb6deb950 100644
|
||||
--- a/src/compiler/simplified-lowering.cc
|
||||
+++ b/src/compiler/simplified-lowering.cc
|
||||
@@ -1305,7 +1305,6 @@ class RepresentationSelector {
|
||||
|
||||
// Try to use type feedback.
|
||||
NumberOperationHint hint = NumberOperationHintOf(node->op());
|
||||
-
|
||||
DCHECK(hint == NumberOperationHint::kSignedSmall ||
|
||||
hint == NumberOperationHint::kSigned32);
|
||||
|
||||
@@ -1313,8 +1312,14 @@ class RepresentationSelector {
|
||||
Type right_feedback_type = TypeOf(node->InputAt(1));
|
||||
// Handle the case when no int32 checks on inputs are necessary (but
|
||||
// an overflow check is needed on the output). Note that we do not
|
||||
- // have to do any check if at most one side can be minus zero.
|
||||
- if (left_upper.Is(Type::Signed32OrMinusZero()) &&
|
||||
+ // have to do any check if at most one side can be minus zero. For
|
||||
+ // subtraction we need to handle the case of -0 - 0 properly, since
|
||||
+ // that can produce -0.
|
||||
+ Type left_constraint_type =
|
||||
+ node->opcode() == IrOpcode::kSpeculativeSafeIntegerAdd
|
||||
+ ? Type::Signed32OrMinusZero()
|
||||
+ : Type::Signed32();
|
||||
+ if (left_upper.Is(left_constraint_type) &&
|
||||
right_upper.Is(Type::Signed32OrMinusZero()) &&
|
||||
(left_upper.Is(Type::Signed32()) || right_upper.Is(Type::Signed32()))) {
|
||||
VisitBinop(node, UseInfo::TruncatingWord32(),
|
||||
diff --git a/test/mjsunit/regress/regress-crbug-913296.js b/test/mjsunit/regress/regress-crbug-913296.js
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..3fab06607f51aeca4752afca9cde56cc42e567c9
|
||||
--- /dev/null
|
||||
+++ b/test/mjsunit/regress/regress-crbug-913296.js
|
||||
@@ -0,0 +1,13 @@
|
||||
+// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
+// Use of this source code is governed by a BSD-style license that can be
|
||||
+// found in the LICENSE file.
|
||||
+
|
||||
+// Flags: --allow-natives-syntax
|
||||
+
|
||||
+function foo(trigger) {
|
||||
+ return Object.is((trigger ? -0 : 0) - 0, -0);
|
||||
+}
|
||||
+
|
||||
+assertFalse(foo(false));
|
||||
+%OptimizeFunctionOnNextCall(foo);
|
||||
+assertTrue(foo(true));
|
||||
@@ -0,0 +1,70 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Sigurd Schneider <sigurds@chromium.org>
|
||||
Date: Mon, 7 Jan 2019 15:11:31 +0100
|
||||
Subject: [turbofan] Restrict redundancy elimination from widening types
|
||||
|
||||
This CL prevents redundancy elimination from widening types, which
|
||||
can cause problems if the input of a DeadValue (which has type None)
|
||||
is replaced by an equivalent node that does not have type None. This
|
||||
can happen because load elimination does not re-type nodes, for
|
||||
example.
|
||||
|
||||
Bug: chromium:919340
|
||||
Change-Id: I89e872412edbcdc610e70ae160cde56cd045006c
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1397709
|
||||
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
|
||||
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
|
||||
Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#58617}
|
||||
|
||||
diff --git a/src/compiler/redundancy-elimination.cc b/src/compiler/redundancy-elimination.cc
|
||||
index 5ecef0408be4c849cccd695ccb8329ec7f27055e..8cc0501a22132e3c226294c53b047a473a8f9005 100644
|
||||
--- a/src/compiler/redundancy-elimination.cc
|
||||
+++ b/src/compiler/redundancy-elimination.cc
|
||||
@@ -179,11 +179,22 @@ bool CheckSubsumes(Node const* a, Node const* b) {
|
||||
return true;
|
||||
}
|
||||
|
||||
+bool TypeSubsumes(Node* node, Node* replacement) {
|
||||
+ if (!NodeProperties::IsTyped(node) || !NodeProperties::IsTyped(replacement)) {
|
||||
+ // If either node is untyped, we are running during an untyped optimization
|
||||
+ // phase, and replacement is OK.
|
||||
+ return true;
|
||||
+ }
|
||||
+ Type node_type = NodeProperties::GetType(node);
|
||||
+ Type replacement_type = NodeProperties::GetType(replacement);
|
||||
+ return replacement_type.Is(node_type);
|
||||
+}
|
||||
+
|
||||
} // namespace
|
||||
|
||||
Node* RedundancyElimination::EffectPathChecks::LookupCheck(Node* node) const {
|
||||
for (Check const* check = head_; check != nullptr; check = check->next) {
|
||||
- if (CheckSubsumes(check->node, node)) {
|
||||
+ if (CheckSubsumes(check->node, node) && TypeSubsumes(node, check->node)) {
|
||||
DCHECK(!check->node->IsDead());
|
||||
return check->node;
|
||||
}
|
||||
diff --git a/test/mjsunit/regress/regress-919340.js b/test/mjsunit/regress/regress-919340.js
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..900bf6fde2f56bc328a17995c18a2fabd3f1023b
|
||||
--- /dev/null
|
||||
+++ b/test/mjsunit/regress/regress-919340.js
|
||||
@@ -0,0 +1,17 @@
|
||||
+// Copyright 2019 the V8 project authors. All rights reserved.
|
||||
+// Use of this source code is governed by a BSD-style license that can be
|
||||
+// found in the LICENSE file.
|
||||
+
|
||||
+// Flags: --allow-natives-syntax --opt
|
||||
+
|
||||
+var E = 'Σ';
|
||||
+var PI = 123;
|
||||
+function f() {
|
||||
+ print(E = 2, /b/.test(E) || /b/.test(E = 2));
|
||||
+ ((E = 3) * PI);
|
||||
+}
|
||||
+
|
||||
+f();
|
||||
+f();
|
||||
+%OptimizeFunctionOnNextCall(f);
|
||||
+f();
|
||||
@@ -0,0 +1,164 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jeremy Roman <jbroman@chromium.org>
|
||||
Date: Thu, 13 Dec 2018 18:43:00 -0500
|
||||
Subject: ValueSerializer: Report if buffer expansion fails during
|
||||
WriteHostObject.
|
||||
|
||||
Also fail early if we detect that we've previously run out of memory and thus
|
||||
corrupted the buffer.
|
||||
|
||||
Add a unit test for this kind of case.
|
||||
|
||||
Bug: chromium:914731
|
||||
Change-Id: Iaaf3927209bffeab6fe8ba462d9dd9dad8cbbe2f
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/1377449
|
||||
Reviewed-by: Yang Guo <yangguo@chromium.org>
|
||||
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/master@{#58248}
|
||||
|
||||
diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
||||
index 4c9c9a9aa2d9ce6017bb02448fa474478c9f6308..8c85bd9f5466612937a71f8bfdcb82120f7fb9c7 100644
|
||||
--- a/src/value-serializer.cc
|
||||
+++ b/src/value-serializer.cc
|
||||
@@ -344,7 +344,11 @@ void ValueSerializer::TransferArrayBuffer(uint32_t transfer_id,
|
||||
}
|
||||
|
||||
Maybe<bool> ValueSerializer::WriteObject(Handle<Object> object) {
|
||||
- out_of_memory_ = false;
|
||||
+ // There is no sense in trying to proceed if we've previously run out of
|
||||
+ // memory. Bail immediately, as this likely implies that some write has
|
||||
+ // previously failed and so the buffer is corrupt.
|
||||
+ if (V8_UNLIKELY(out_of_memory_)) return ThrowIfOutOfMemory();
|
||||
+
|
||||
if (object->IsSmi()) {
|
||||
WriteSmi(Smi::cast(*object));
|
||||
return ThrowIfOutOfMemory();
|
||||
@@ -930,8 +934,10 @@ Maybe<bool> ValueSerializer::WriteHostObject(Handle<JSObject> object) {
|
||||
Maybe<bool> result =
|
||||
delegate_->WriteHostObject(v8_isolate, Utils::ToLocal(object));
|
||||
RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate_, Nothing<bool>());
|
||||
+ USE(result);
|
||||
DCHECK(!result.IsNothing());
|
||||
- return result;
|
||||
+ DCHECK(result.ToChecked());
|
||||
+ return ThrowIfOutOfMemory();
|
||||
}
|
||||
|
||||
Maybe<uint32_t> ValueSerializer::WriteJSObjectPropertiesSlow(
|
||||
diff --git a/test/unittests/value-serializer-unittest.cc b/test/unittests/value-serializer-unittest.cc
|
||||
index 92603b588ad13480460a166b556be18e57fc8ad6..bc738c84fc8b15bdfcdb0cc995f8002362292a4c 100644
|
||||
--- a/test/unittests/value-serializer-unittest.cc
|
||||
+++ b/test/unittests/value-serializer-unittest.cc
|
||||
@@ -119,7 +119,10 @@ class ValueSerializerTest : public TestWithIsolate {
|
||||
}
|
||||
std::pair<uint8_t*, size_t> buffer = serializer.Release();
|
||||
std::vector<uint8_t> result(buffer.first, buffer.first + buffer.second);
|
||||
- free(buffer.first);
|
||||
+ if (auto* delegate = GetSerializerDelegate())
|
||||
+ delegate->FreeBufferMemory(buffer.first);
|
||||
+ else
|
||||
+ free(buffer.first);
|
||||
return Just(std::move(result));
|
||||
}
|
||||
|
||||
@@ -138,6 +141,10 @@ class ValueSerializerTest : public TestWithIsolate {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
+ std::vector<uint8_t> EncodeTest(const char* source) {
|
||||
+ return EncodeTest(EvaluateScriptForInput(source));
|
||||
+ }
|
||||
+
|
||||
v8::Local<v8::Message> InvalidEncodeTest(Local<Value> input_value) {
|
||||
Context::Scope scope(serialization_context());
|
||||
TryCatch try_catch(isolate());
|
||||
@@ -2698,5 +2705,89 @@ TEST_F(ValueSerializerTestWithWasm, DecodeWasmModuleWithInvalidDataLength) {
|
||||
InvalidDecodeTest({0xFF, 0x09, 0x3F, 0x00, 0x57, 0x79, 0x00, 0x7F});
|
||||
}
|
||||
|
||||
+class ValueSerializerTestWithLimitedMemory : public ValueSerializerTest {
|
||||
+ protected:
|
||||
+// GMock doesn't use the "override" keyword.
|
||||
+#if __clang__
|
||||
+#pragma clang diagnostic push
|
||||
+#pragma clang diagnostic ignored "-Winconsistent-missing-override"
|
||||
+#endif
|
||||
+
|
||||
+ class SerializerDelegate : public ValueSerializer::Delegate {
|
||||
+ public:
|
||||
+ explicit SerializerDelegate(ValueSerializerTestWithLimitedMemory* test)
|
||||
+ : test_(test) {}
|
||||
+
|
||||
+ ~SerializerDelegate() { EXPECT_EQ(nullptr, last_buffer_); }
|
||||
+
|
||||
+ void SetMemoryLimit(size_t limit) { memory_limit_ = limit; }
|
||||
+
|
||||
+ void* ReallocateBufferMemory(void* old_buffer, size_t size,
|
||||
+ size_t* actual_size) override {
|
||||
+ EXPECT_EQ(old_buffer, last_buffer_);
|
||||
+ if (size > memory_limit_) return nullptr;
|
||||
+ *actual_size = size;
|
||||
+ last_buffer_ = realloc(old_buffer, size);
|
||||
+ return last_buffer_;
|
||||
+ }
|
||||
+
|
||||
+ void FreeBufferMemory(void* buffer) override {
|
||||
+ EXPECT_EQ(buffer, last_buffer_);
|
||||
+ last_buffer_ = nullptr;
|
||||
+ free(buffer);
|
||||
+ }
|
||||
+
|
||||
+ void ThrowDataCloneError(Local<String> message) override {
|
||||
+ test_->isolate()->ThrowException(Exception::Error(message));
|
||||
+ }
|
||||
+
|
||||
+ MOCK_METHOD2(WriteHostObject,
|
||||
+ Maybe<bool>(Isolate* isolate, Local<Object> object));
|
||||
+
|
||||
+ private:
|
||||
+ ValueSerializerTestWithLimitedMemory* test_;
|
||||
+ void* last_buffer_ = nullptr;
|
||||
+ size_t memory_limit_ = 0;
|
||||
+ };
|
||||
+
|
||||
+#if __clang__
|
||||
+#pragma clang diagnostic pop
|
||||
+#endif
|
||||
+
|
||||
+ ValueSerializer::Delegate* GetSerializerDelegate() override {
|
||||
+ return &serializer_delegate_;
|
||||
+ }
|
||||
+
|
||||
+ void BeforeEncode(ValueSerializer* serializer) override {
|
||||
+ serializer_ = serializer;
|
||||
+ }
|
||||
+
|
||||
+ SerializerDelegate serializer_delegate_{this};
|
||||
+ ValueSerializer* serializer_ = nullptr;
|
||||
+};
|
||||
+
|
||||
+TEST_F(ValueSerializerTestWithLimitedMemory, FailIfNoMemoryInWriteHostObject) {
|
||||
+ EXPECT_CALL(serializer_delegate_, WriteHostObject(isolate(), _))
|
||||
+ .WillRepeatedly(Invoke([this](Isolate*, Local<Object>) {
|
||||
+ static const char kDummyData[1024] = {};
|
||||
+ serializer_->WriteRawBytes(&kDummyData, sizeof(kDummyData));
|
||||
+ return Just(true);
|
||||
+ }));
|
||||
+
|
||||
+ // If there is enough memory, things work.
|
||||
+ serializer_delegate_.SetMemoryLimit(2048);
|
||||
+ EncodeTest("new ExampleHostObject()");
|
||||
+
|
||||
+ // If not, we get a graceful failure, rather than silent misbehavior.
|
||||
+ serializer_delegate_.SetMemoryLimit(1024);
|
||||
+ InvalidEncodeTest("new ExampleHostObject()");
|
||||
+
|
||||
+ // And we definitely don't continue to serialize other things.
|
||||
+ serializer_delegate_.SetMemoryLimit(1024);
|
||||
+ EvaluateScriptForInput("gotA = false");
|
||||
+ InvalidEncodeTest("[new ExampleHostObject, {get a() { gotA = true; }}]");
|
||||
+ EXPECT_TRUE(EvaluateScriptForInput("gotA")->IsFalse());
|
||||
+}
|
||||
+
|
||||
} // namespace
|
||||
} // namespace v8
|
||||
@@ -2,12 +2,12 @@ if (!process.env.CI) require('dotenv-safe').load()
|
||||
|
||||
const assert = require('assert')
|
||||
const request = require('request')
|
||||
const buildAppVeyorURL = 'https://windows-ci.electronjs.org/api/builds'
|
||||
const buildAppVeyorURL = 'https://ci.appveyor.com/api/builds'
|
||||
const vstsURL = 'https://github.visualstudio.com/electron/_apis/build'
|
||||
|
||||
const appVeyorJobs = {
|
||||
'electron-x64': 'electron',
|
||||
'electron-ia32': 'electron-39ng6'
|
||||
'electron-x64': 'electron-x64-release',
|
||||
'electron-ia32': 'electron-ia32-release'
|
||||
}
|
||||
|
||||
const circleCIJobs = [
|
||||
@@ -100,13 +100,13 @@ async function callAppVeyor (targetBranch, job, options) {
|
||||
const requestOpts = {
|
||||
url: buildAppVeyorURL,
|
||||
auth: {
|
||||
bearer: process.env.APPVEYOR_TOKEN
|
||||
bearer: process.env.APPVEYOR_CLOUD_TOKEN
|
||||
},
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
accountName: 'AppVeyor',
|
||||
accountName: 'electron-bot',
|
||||
projectSlug: appVeyorJobs[job],
|
||||
branch: targetBranch,
|
||||
environmentVariables
|
||||
@@ -116,7 +116,7 @@ async function callAppVeyor (targetBranch, job, options) {
|
||||
const appVeyorResponse = await makeRequest(requestOpts, true).catch(err => {
|
||||
console.log('Error calling AppVeyor:', err)
|
||||
})
|
||||
const buildUrl = `https://windows-ci.electronjs.org/project/AppVeyor/${appVeyorJobs[job]}/build/${appVeyorResponse.version}`
|
||||
const buildUrl = `https://ci.appveyor.com/project/electron-bot/${appVeyorJobs[job]}/build/${appVeyorResponse.version}`
|
||||
console.log(`AppVeyor release build request for ${job} successful. Check build status at ${buildUrl}`)
|
||||
}
|
||||
|
||||
|
||||
@@ -13,15 +13,17 @@ async function makeRequest (requestOptions, parseResponse) {
|
||||
resolve(body)
|
||||
}
|
||||
} else {
|
||||
console.error('Error occurred while requesting:', requestOptions.url)
|
||||
if (parseResponse) {
|
||||
try {
|
||||
console.log('Error: ', `(status ${res.statusCode})`, err || JSON.parse(res.body), requestOptions)
|
||||
} catch (err) {
|
||||
if (args.verbose) {
|
||||
console.error('Error occurred while requesting:', requestOptions.url)
|
||||
if (parseResponse) {
|
||||
try {
|
||||
console.log('Error: ', `(status ${res.statusCode})`, err || JSON.parse(res.body), requestOptions)
|
||||
} catch (err) {
|
||||
console.log('Error: ', `(status ${res.statusCode})`, err || res.body, requestOptions)
|
||||
}
|
||||
} else {
|
||||
console.log('Error: ', `(status ${res.statusCode})`, err || res.body, requestOptions)
|
||||
}
|
||||
} else {
|
||||
console.log('Error: ', `(status ${res.statusCode})`, err || res.body, requestOptions)
|
||||
}
|
||||
reject(err)
|
||||
}
|
||||
@@ -39,7 +41,11 @@ async function downloadArtifact (name, buildNum, dest) {
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
}, true).catch(err => {
|
||||
console.log('Error calling CircleCI:', err)
|
||||
if (args.verbose) {
|
||||
console.log('Error calling CircleCI:', err)
|
||||
} else {
|
||||
console.error('Error calling CircleCI to get artifact details')
|
||||
}
|
||||
})
|
||||
const artifactToDownload = artifacts.find(artifact => {
|
||||
return (artifact.path === name)
|
||||
@@ -49,15 +55,41 @@ async function downloadArtifact (name, buildNum, dest) {
|
||||
process.exit(1)
|
||||
} else {
|
||||
console.log(`Downloading ${artifactToDownload.url}.`)
|
||||
await downloadFile(artifactToDownload.url, dest)
|
||||
console.log(`Successfully downloaded ${name}.`)
|
||||
let downloadError = false
|
||||
await downloadWithRetry(artifactToDownload.url, dest).catch(err => {
|
||||
if (args.verbose) {
|
||||
console.log(`${artifactToDownload.url} could not be successfully downloaded. Error was:`, err)
|
||||
} else {
|
||||
console.log(`${artifactToDownload.url} could not be successfully downloaded.`)
|
||||
}
|
||||
downloadError = true
|
||||
})
|
||||
if (!downloadError) {
|
||||
console.log(`Successfully downloaded ${name}.`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadWithRetry (url, directory) {
|
||||
let lastError
|
||||
const downloadURL = `${url}?circle-token=${process.env.CIRCLE_TOKEN}`
|
||||
for (let i = 0; i < 5; i++) {
|
||||
console.log(`Attempting to download ${url} - attempt #${(i + 1)}`)
|
||||
try {
|
||||
return await downloadFile(downloadURL, directory)
|
||||
} catch (err) {
|
||||
lastError = err
|
||||
await new Promise((resolve, reject) => setTimeout(resolve, 30000))
|
||||
}
|
||||
}
|
||||
throw lastError
|
||||
}
|
||||
|
||||
function downloadFile (url, directory) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const nuggetOpts = {
|
||||
dir: directory
|
||||
dir: directory,
|
||||
quiet: args.verbose
|
||||
}
|
||||
nugget(url, nuggetOpts, (err) => {
|
||||
if (err) {
|
||||
@@ -71,7 +103,7 @@ function downloadFile (url, directory) {
|
||||
|
||||
if (!args.name || !args.buildNum || !args.dest) {
|
||||
console.log(`Download CircleCI artifacts.
|
||||
Usage: download-circleci-artifacts.js [--buildNum=CIRCLE_BUILD_NUMBER] [--name=artifactName] [--dest]`)
|
||||
Usage: download-circleci-artifacts.js [--buildNum=CIRCLE_BUILD_NUMBER] [--name=artifactName] [--dest] [--verbose]`)
|
||||
process.exit(0)
|
||||
} else {
|
||||
downloadArtifact(args.name, args.buildNum, args.dest)
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
from lib.config import PLATFORM, enable_verbose_mode, is_verbose_mode
|
||||
from lib.util import get_electron_branding, execute, rm_rf, get_out_dir, \
|
||||
SRC_DIR
|
||||
|
||||
ELECTRON_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
||||
SOURCE_ROOT = os.path.abspath(os.path.dirname(ELECTRON_ROOT))
|
||||
RELEASE_PATH = get_out_dir()
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
if args.verbose:
|
||||
enable_verbose_mode()
|
||||
rm_rf(args.destination)
|
||||
source_root = os.path.abspath(args.source_root)
|
||||
build_path = os.path.join(source_root, args.build_dir)
|
||||
(project_name, product_name) = get_names_from_branding()
|
||||
|
||||
if PLATFORM in ['darwin', 'linux']:
|
||||
|
||||
if PLATFORM == 'darwin':
|
||||
#macOS has an additional helper app; provide the path to that binary also
|
||||
main_app = os.path.join(build_path, '{0}.app'.format(product_name),
|
||||
'Contents', 'MacOS', product_name)
|
||||
helper_name = product_name + " Helper"
|
||||
helper_app = os.path.join(build_path, '{0}.app'.format(helper_name),
|
||||
'Contents', 'MacOS', product_name + " Helper")
|
||||
binaries = [main_app, helper_app]
|
||||
for binary in binaries:
|
||||
generate_posix_symbols(binary, source_root, build_path,
|
||||
args.destination)
|
||||
else:
|
||||
binary = os.path.join(build_path, project_name)
|
||||
generate_posix_symbols(binary, source_root, build_path,
|
||||
args.destination)
|
||||
|
||||
else:
|
||||
generate_breakpad_symbols = os.path.join(ELECTRON_ROOT, 'tools', 'win',
|
||||
'generate_breakpad_symbols.py')
|
||||
args = [
|
||||
'--symbols-dir={0}'.format(args.destination),
|
||||
'--jobs=16',
|
||||
os.path.relpath(build_path),
|
||||
]
|
||||
if is_verbose_mode():
|
||||
args += ['-v']
|
||||
#Make sure msdia140.dll is in the path (needed for dump_syms.exe)
|
||||
env = os.environ.copy()
|
||||
msdia140_dll_path = os.path.join(SRC_DIR, 'third_party', 'llvm-build',
|
||||
'Release+Asserts', 'bin')
|
||||
env['PATH'] = os.path.pathsep.join(
|
||||
[env.get('PATH', '')] + [msdia140_dll_path])
|
||||
execute([sys.executable, generate_breakpad_symbols] + args, env)
|
||||
|
||||
def get_names_from_branding():
|
||||
variables = get_electron_branding()
|
||||
return (variables['project_name'], variables['product_name'])
|
||||
|
||||
def generate_posix_symbols(binary, source_root, build_dir, destination):
|
||||
generate_breakpad_symbols = os.path.join(source_root, 'components', 'crash',
|
||||
'content', 'tools',
|
||||
'generate_breakpad_symbols.py')
|
||||
args = [
|
||||
'--build-dir={0}'.format(build_dir),
|
||||
'--symbols-dir={0}'.format(destination),
|
||||
'--jobs=16',
|
||||
'--binary={0}'.format(binary),
|
||||
]
|
||||
if is_verbose_mode():
|
||||
args += ['--verbose']
|
||||
execute([sys.executable, generate_breakpad_symbols] + args)
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description='Create breakpad symbols')
|
||||
parser.add_argument('-b', '--build-dir',
|
||||
help='Path to an Electron build folder.',
|
||||
default=RELEASE_PATH,
|
||||
required=False)
|
||||
parser.add_argument('-d', '--destination',
|
||||
help='Path to save symbols to.',
|
||||
default=None,
|
||||
required=True)
|
||||
parser.add_argument('-s', '--source-root',
|
||||
help='Path to the src folder.',
|
||||
default=SOURCE_ROOT,
|
||||
required=False)
|
||||
parser.add_argument('-v', '--verbose',
|
||||
action='store_true',
|
||||
help='Prints the output of the subprocesses')
|
||||
return parser.parse_args()
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
14
script/generate-zip-manifest.py
Executable file
14
script/generate-zip-manifest.py
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import zipfile
|
||||
import sys
|
||||
|
||||
def main(zip_path, manifest_out):
|
||||
with open(manifest_out, 'w') as manifest, \
|
||||
zipfile.ZipFile(zip_path, 'r', allowZip64=True) as z:
|
||||
for name in sorted(z.namelist()):
|
||||
manifest.write(name + '\n')
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(*sys.argv[1:]))
|
||||
@@ -1,6 +1,10 @@
|
||||
const { GitProcess } = require('dugite')
|
||||
const path = require('path')
|
||||
|
||||
const OUT_DIR = process.env.ELECTRON_OUT_DIR || 'Debug'
|
||||
|
||||
const path = require('path')
|
||||
require('colors')
|
||||
const fail = '\u2717'.red
|
||||
|
||||
function getElectronExec () {
|
||||
switch (process.platform) {
|
||||
@@ -19,7 +23,40 @@ function getAbsoluteElectronExec () {
|
||||
return path.resolve(__dirname, '../../..', getElectronExec())
|
||||
}
|
||||
|
||||
async function handleGitCall (args, gitDir) {
|
||||
const details = await GitProcess.exec(args, gitDir)
|
||||
if (details.exitCode === 0) {
|
||||
return details.stdout.replace(/^\*|\s+|\s+$/, '')
|
||||
} else {
|
||||
const error = GitProcess.parseError(details.stderr)
|
||||
console.log(`${fail} couldn't parse git process call: `, error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
async function getCurrentBranch (gitDir) {
|
||||
let branch = await handleGitCall(['rev-parse', '--abbrev-ref', 'HEAD'], gitDir)
|
||||
if (branch !== 'master' && !branch.match(/[0-9]+-[0-9]+-x/)) {
|
||||
const lastCommit = await handleGitCall(['rev-parse', 'HEAD'], gitDir)
|
||||
const branches = (await handleGitCall([
|
||||
'branch',
|
||||
'--contains',
|
||||
lastCommit,
|
||||
'--remote'
|
||||
], gitDir)).split('\n')
|
||||
|
||||
branch = branches.filter(b => b === 'master' || b.match(/[0-9]+-[0-9]+-x/))[0]
|
||||
if (!branch) {
|
||||
console.log(`${fail} no release branch exists for this ref`)
|
||||
process.exit(1)
|
||||
}
|
||||
if (branch.startsWith('origin/')) branch = branch.substr('origin/'.length)
|
||||
}
|
||||
return branch.trim()
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getCurrentBranch,
|
||||
getElectronExec,
|
||||
getAbsoluteElectronExec,
|
||||
OUT_DIR
|
||||
|
||||
@@ -14,6 +14,7 @@ const pass = '\u2713'.green
|
||||
const path = require('path')
|
||||
const readline = require('readline')
|
||||
const releaseNotesGenerator = require('./release-notes/index.js')
|
||||
const { getCurrentBranch } = require('./lib/utils.js')
|
||||
const versionType = args._[0]
|
||||
const targetRepo = versionType === 'nightly' ? 'nightlies' : 'electron'
|
||||
|
||||
@@ -53,23 +54,6 @@ async function getNewVersion (dryRun) {
|
||||
}
|
||||
}
|
||||
|
||||
async function getCurrentBranch (gitDir) {
|
||||
console.log(`Determining current git branch`)
|
||||
const gitArgs = ['rev-parse', '--abbrev-ref', 'HEAD']
|
||||
const branchDetails = await GitProcess.exec(gitArgs, gitDir)
|
||||
if (branchDetails.exitCode === 0) {
|
||||
const currentBranch = branchDetails.stdout.trim()
|
||||
console.log(`${pass} Successfully determined current git branch is ` +
|
||||
`${currentBranch}`)
|
||||
return currentBranch
|
||||
} else {
|
||||
const error = GitProcess.parseError(branchDetails.stderr)
|
||||
console.log(`${fail} Could not get details for the current branch,
|
||||
error was ${branchDetails.stderr}`, error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
async function getReleaseNotes (currentBranch, newVersion) {
|
||||
if (versionType === 'nightly') {
|
||||
return 'Nightlies do not get release notes, please compare tags for info'
|
||||
|
||||
@@ -2,8 +2,8 @@ const temp = require('temp')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const childProcess = require('child_process')
|
||||
const { getCurrentBranch } = require('./lib/utils.js')
|
||||
const GitHubApi = require('github')
|
||||
const { GitProcess } = require('dugite')
|
||||
const request = require('request')
|
||||
const semver = require('semver')
|
||||
const rootPackageJson = require('../package.json')
|
||||
@@ -176,21 +176,3 @@ new Promise((resolve, reject) => {
|
||||
console.error(`Error: ${err}`)
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
async function getCurrentBranch () {
|
||||
const gitDir = path.resolve(__dirname, '..')
|
||||
console.log(`Determining current git branch`)
|
||||
const gitArgs = ['rev-parse', '--abbrev-ref', 'HEAD']
|
||||
const branchDetails = await GitProcess.exec(gitArgs, gitDir)
|
||||
if (branchDetails.exitCode === 0) {
|
||||
const currentBranch = branchDetails.stdout.trim()
|
||||
console.log(`Successfully determined current git branch is ` +
|
||||
`${currentBranch}`)
|
||||
return currentBranch
|
||||
} else {
|
||||
const error = GitProcess.parseError(branchDetails.stderr)
|
||||
console.log(`Could not get details for the current branch,
|
||||
error was ${branchDetails.stderr}`, error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ const args = require('minimist')(process.argv.slice(2), {
|
||||
})
|
||||
const { execSync } = require('child_process')
|
||||
const { GitProcess } = require('dugite')
|
||||
const { getCurrentBranch } = require('./lib/utils.js')
|
||||
|
||||
const GitHub = require('github')
|
||||
const path = require('path')
|
||||
@@ -27,18 +28,6 @@ function getLastBumpCommit (tag) {
|
||||
return JSON.parse(data)
|
||||
}
|
||||
|
||||
async function getCurrentBranch (gitDir) {
|
||||
const gitArgs = ['rev-parse', '--abbrev-ref', 'HEAD']
|
||||
const branchDetails = await GitProcess.exec(gitArgs, gitDir)
|
||||
if (branchDetails.exitCode === 0) {
|
||||
return branchDetails.stdout.trim()
|
||||
}
|
||||
|
||||
const error = GitProcess.parseError(branchDetails.stderr)
|
||||
console.error(`${fail} couldn't get current branch: `, error)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function revertBumpCommit (tag) {
|
||||
const branch = await getCurrentBranch()
|
||||
const commitToRevert = getLastBumpCommit(tag).hash
|
||||
|
||||
@@ -9,7 +9,9 @@ LINUX_BINARIES_TO_STRIP = [
|
||||
'electron',
|
||||
'libffmpeg.so',
|
||||
'libGLESv2.so',
|
||||
'libEGL.so'
|
||||
'libEGL.so',
|
||||
'swiftshader/libGLESv2.so',
|
||||
'swiftshader/libEGL.so'
|
||||
]
|
||||
|
||||
def strip_binaries(directory, target_cpu):
|
||||
|
||||
27
script/zip_manifests/check-zip-manifest.py
Executable file
27
script/zip_manifests/check-zip-manifest.py
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import zipfile
|
||||
import sys
|
||||
|
||||
def main(zip_path, manifest_in):
|
||||
with open(manifest_in, 'r') as manifest, \
|
||||
zipfile.ZipFile(zip_path, 'r', allowZip64=True) as z:
|
||||
files_in_zip = set(z.namelist())
|
||||
files_in_manifest = set([l.strip() for l in manifest.readlines()])
|
||||
added_files = files_in_zip - files_in_manifest
|
||||
removed_files = files_in_manifest - files_in_zip
|
||||
if added_files:
|
||||
print("Files added to bundle:")
|
||||
for f in sorted(list(added_files)):
|
||||
print('+' + f)
|
||||
if removed_files:
|
||||
print("Files removed from bundle:")
|
||||
for f in sorted(list(removed_files)):
|
||||
print('-' + f)
|
||||
if added_files or removed_files:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(*sys.argv[1:]))
|
||||
69
script/zip_manifests/dist_zip.linux.arm.manifest
Normal file
69
script/zip_manifests/dist_zip.linux.arm.manifest
Normal file
@@ -0,0 +1,69 @@
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
chrome_100_percent.pak
|
||||
chrome_200_percent.pak
|
||||
electron
|
||||
icudtl.dat
|
||||
libEGL.so
|
||||
libGLESv2.so
|
||||
libffmpeg.so
|
||||
locales/am.pak
|
||||
locales/ar.pak
|
||||
locales/bg.pak
|
||||
locales/bn.pak
|
||||
locales/ca.pak
|
||||
locales/cs.pak
|
||||
locales/da.pak
|
||||
locales/de.pak
|
||||
locales/el.pak
|
||||
locales/en-GB.pak
|
||||
locales/en-US.pak
|
||||
locales/es-419.pak
|
||||
locales/es.pak
|
||||
locales/et.pak
|
||||
locales/fa.pak
|
||||
locales/fi.pak
|
||||
locales/fil.pak
|
||||
locales/fr.pak
|
||||
locales/gu.pak
|
||||
locales/he.pak
|
||||
locales/hi.pak
|
||||
locales/hr.pak
|
||||
locales/hu.pak
|
||||
locales/id.pak
|
||||
locales/it.pak
|
||||
locales/ja.pak
|
||||
locales/kn.pak
|
||||
locales/ko.pak
|
||||
locales/lt.pak
|
||||
locales/lv.pak
|
||||
locales/ml.pak
|
||||
locales/mr.pak
|
||||
locales/ms.pak
|
||||
locales/nb.pak
|
||||
locales/nl.pak
|
||||
locales/pl.pak
|
||||
locales/pt-BR.pak
|
||||
locales/pt-PT.pak
|
||||
locales/ro.pak
|
||||
locales/ru.pak
|
||||
locales/sk.pak
|
||||
locales/sl.pak
|
||||
locales/sr.pak
|
||||
locales/sv.pak
|
||||
locales/sw.pak
|
||||
locales/ta.pak
|
||||
locales/te.pak
|
||||
locales/th.pak
|
||||
locales/tr.pak
|
||||
locales/uk.pak
|
||||
locales/vi.pak
|
||||
locales/zh-CN.pak
|
||||
locales/zh-TW.pak
|
||||
natives_blob.bin
|
||||
resources.pak
|
||||
resources/default_app.asar
|
||||
resources/electron.asar
|
||||
snapshot_blob.bin
|
||||
v8_context_snapshot.bin
|
||||
version
|
||||
69
script/zip_manifests/dist_zip.linux.arm64.manifest
Normal file
69
script/zip_manifests/dist_zip.linux.arm64.manifest
Normal file
@@ -0,0 +1,69 @@
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
chrome_100_percent.pak
|
||||
chrome_200_percent.pak
|
||||
electron
|
||||
icudtl.dat
|
||||
libEGL.so
|
||||
libGLESv2.so
|
||||
libffmpeg.so
|
||||
locales/am.pak
|
||||
locales/ar.pak
|
||||
locales/bg.pak
|
||||
locales/bn.pak
|
||||
locales/ca.pak
|
||||
locales/cs.pak
|
||||
locales/da.pak
|
||||
locales/de.pak
|
||||
locales/el.pak
|
||||
locales/en-GB.pak
|
||||
locales/en-US.pak
|
||||
locales/es-419.pak
|
||||
locales/es.pak
|
||||
locales/et.pak
|
||||
locales/fa.pak
|
||||
locales/fi.pak
|
||||
locales/fil.pak
|
||||
locales/fr.pak
|
||||
locales/gu.pak
|
||||
locales/he.pak
|
||||
locales/hi.pak
|
||||
locales/hr.pak
|
||||
locales/hu.pak
|
||||
locales/id.pak
|
||||
locales/it.pak
|
||||
locales/ja.pak
|
||||
locales/kn.pak
|
||||
locales/ko.pak
|
||||
locales/lt.pak
|
||||
locales/lv.pak
|
||||
locales/ml.pak
|
||||
locales/mr.pak
|
||||
locales/ms.pak
|
||||
locales/nb.pak
|
||||
locales/nl.pak
|
||||
locales/pl.pak
|
||||
locales/pt-BR.pak
|
||||
locales/pt-PT.pak
|
||||
locales/ro.pak
|
||||
locales/ru.pak
|
||||
locales/sk.pak
|
||||
locales/sl.pak
|
||||
locales/sr.pak
|
||||
locales/sv.pak
|
||||
locales/sw.pak
|
||||
locales/ta.pak
|
||||
locales/te.pak
|
||||
locales/th.pak
|
||||
locales/tr.pak
|
||||
locales/uk.pak
|
||||
locales/vi.pak
|
||||
locales/zh-CN.pak
|
||||
locales/zh-TW.pak
|
||||
natives_blob.bin
|
||||
resources.pak
|
||||
resources/default_app.asar
|
||||
resources/electron.asar
|
||||
snapshot_blob.bin
|
||||
v8_context_snapshot.bin
|
||||
version
|
||||
71
script/zip_manifests/dist_zip.linux.x64.manifest
Normal file
71
script/zip_manifests/dist_zip.linux.x64.manifest
Normal file
@@ -0,0 +1,71 @@
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
chrome_100_percent.pak
|
||||
chrome_200_percent.pak
|
||||
electron
|
||||
icudtl.dat
|
||||
libEGL.so
|
||||
libGLESv2.so
|
||||
libffmpeg.so
|
||||
locales/am.pak
|
||||
locales/ar.pak
|
||||
locales/bg.pak
|
||||
locales/bn.pak
|
||||
locales/ca.pak
|
||||
locales/cs.pak
|
||||
locales/da.pak
|
||||
locales/de.pak
|
||||
locales/el.pak
|
||||
locales/en-GB.pak
|
||||
locales/en-US.pak
|
||||
locales/es-419.pak
|
||||
locales/es.pak
|
||||
locales/et.pak
|
||||
locales/fa.pak
|
||||
locales/fi.pak
|
||||
locales/fil.pak
|
||||
locales/fr.pak
|
||||
locales/gu.pak
|
||||
locales/he.pak
|
||||
locales/hi.pak
|
||||
locales/hr.pak
|
||||
locales/hu.pak
|
||||
locales/id.pak
|
||||
locales/it.pak
|
||||
locales/ja.pak
|
||||
locales/kn.pak
|
||||
locales/ko.pak
|
||||
locales/lt.pak
|
||||
locales/lv.pak
|
||||
locales/ml.pak
|
||||
locales/mr.pak
|
||||
locales/ms.pak
|
||||
locales/nb.pak
|
||||
locales/nl.pak
|
||||
locales/pl.pak
|
||||
locales/pt-BR.pak
|
||||
locales/pt-PT.pak
|
||||
locales/ro.pak
|
||||
locales/ru.pak
|
||||
locales/sk.pak
|
||||
locales/sl.pak
|
||||
locales/sr.pak
|
||||
locales/sv.pak
|
||||
locales/sw.pak
|
||||
locales/ta.pak
|
||||
locales/te.pak
|
||||
locales/th.pak
|
||||
locales/tr.pak
|
||||
locales/uk.pak
|
||||
locales/vi.pak
|
||||
locales/zh-CN.pak
|
||||
locales/zh-TW.pak
|
||||
natives_blob.bin
|
||||
resources.pak
|
||||
resources/default_app.asar
|
||||
resources/electron.asar
|
||||
snapshot_blob.bin
|
||||
swiftshader/libEGL.so
|
||||
swiftshader/libGLESv2.so
|
||||
v8_context_snapshot.bin
|
||||
version
|
||||
71
script/zip_manifests/dist_zip.linux.x86.manifest
Normal file
71
script/zip_manifests/dist_zip.linux.x86.manifest
Normal file
@@ -0,0 +1,71 @@
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
chrome_100_percent.pak
|
||||
chrome_200_percent.pak
|
||||
electron
|
||||
icudtl.dat
|
||||
libEGL.so
|
||||
libGLESv2.so
|
||||
libffmpeg.so
|
||||
locales/am.pak
|
||||
locales/ar.pak
|
||||
locales/bg.pak
|
||||
locales/bn.pak
|
||||
locales/ca.pak
|
||||
locales/cs.pak
|
||||
locales/da.pak
|
||||
locales/de.pak
|
||||
locales/el.pak
|
||||
locales/en-GB.pak
|
||||
locales/en-US.pak
|
||||
locales/es-419.pak
|
||||
locales/es.pak
|
||||
locales/et.pak
|
||||
locales/fa.pak
|
||||
locales/fi.pak
|
||||
locales/fil.pak
|
||||
locales/fr.pak
|
||||
locales/gu.pak
|
||||
locales/he.pak
|
||||
locales/hi.pak
|
||||
locales/hr.pak
|
||||
locales/hu.pak
|
||||
locales/id.pak
|
||||
locales/it.pak
|
||||
locales/ja.pak
|
||||
locales/kn.pak
|
||||
locales/ko.pak
|
||||
locales/lt.pak
|
||||
locales/lv.pak
|
||||
locales/ml.pak
|
||||
locales/mr.pak
|
||||
locales/ms.pak
|
||||
locales/nb.pak
|
||||
locales/nl.pak
|
||||
locales/pl.pak
|
||||
locales/pt-BR.pak
|
||||
locales/pt-PT.pak
|
||||
locales/ro.pak
|
||||
locales/ru.pak
|
||||
locales/sk.pak
|
||||
locales/sl.pak
|
||||
locales/sr.pak
|
||||
locales/sv.pak
|
||||
locales/sw.pak
|
||||
locales/ta.pak
|
||||
locales/te.pak
|
||||
locales/th.pak
|
||||
locales/tr.pak
|
||||
locales/uk.pak
|
||||
locales/vi.pak
|
||||
locales/zh-CN.pak
|
||||
locales/zh-TW.pak
|
||||
natives_blob.bin
|
||||
resources.pak
|
||||
resources/default_app.asar
|
||||
resources/electron.asar
|
||||
snapshot_blob.bin
|
||||
swiftshader/libEGL.so
|
||||
swiftshader/libGLESv2.so
|
||||
v8_context_snapshot.bin
|
||||
version
|
||||
312
script/zip_manifests/dist_zip.mac.x64.manifest
Normal file
312
script/zip_manifests/dist_zip.mac.x64.manifest
Normal file
@@ -0,0 +1,312 @@
|
||||
Electron.app/
|
||||
Electron.app/Contents/
|
||||
Electron.app/Contents/Frameworks/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Libraries
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Resources
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Info.plist
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/am.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/am.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ar.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ar.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bg.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bg.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bn.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bn.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ca.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ca.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/chrome_100_percent.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/chrome_200_percent.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/crashpad_handler
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/cs.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/cs.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/da.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/da.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/de.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/de.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/el.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/el.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en_GB.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en_GB.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es_419.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es_419.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/et.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/et.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fa.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fa.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fi.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fi.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fil.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fil.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/gu.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/gu.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/he.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/he.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hi.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hi.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hu.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hu.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/icudtl.dat
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/id.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/id.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/it.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/it.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ja.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ja.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/kn.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/kn.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ko.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ko.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lt.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lt.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lv.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lv.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ml.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ml.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/mr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/mr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ms.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ms.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/natives_blob.bin
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nb.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nb.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nl.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nl.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pl.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pl.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_BR.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_BR.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_PT.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_PT.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/resources.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ro.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ro.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ru.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ru.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sk.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sk.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sl.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sl.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sv.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sv.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sw.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sw.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ta.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ta.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/te.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/te.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/th.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/th.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/tr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/tr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/uk.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/uk.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/v8_context_snapshot.bin
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/vi.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/vi.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_CN.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_CN.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_TW.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_TW.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/Current
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/Info.plist
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/MacOS/
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/MacOS/Electron Helper
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/PkgInfo
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Headers
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Mantle
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Modules
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Resources
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLJSONAdapter.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLManagedObjectAdapter.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLModel+NSCoding.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLModel.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLValueTransformer.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/Mantle.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSArray+MTLManipulationAdditions.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSDictionary+MTLManipulationAdditions.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSObject+MTLComparisonAdditions.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSValueTransformer+MTLInversionAdditions.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSValueTransformer+MTLPredefinedTransformerAdditions.h
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Mantle
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Modules/
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Modules/module.modulemap
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Resources/
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Resources/Info.plist
|
||||
Electron.app/Contents/Frameworks/Mantle.framework/Versions/Current
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Headers
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Modules
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/ReactiveCocoa
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Resources
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/EXTKeyPathCoding.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/EXTScope.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSArray+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSControl+RACCommandSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSControl+RACTextSignalSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSData+RACSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSDictionary+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSEnumerator+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSFileHandle+RACSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSIndexSet+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSNotificationCenter+RACSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACAppKitBindings.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACDeallocating.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACLifting.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACPropertySubscribing.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACSelectorSignal.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSOrderedSet+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSSet+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSString+RACSequenceAdditions.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSString+RACSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSText+RACSignalSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSURLConnection+RACSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSUserDefaults+RACSupport.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACBacktrace.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACBehaviorSubject.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACChannel.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACCommand.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACCompoundDisposable.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACDisposable.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACEvent.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACGroupedSignal.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACKVOChannel.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACMulticastConnection.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACQueueScheduler+Subclass.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACQueueScheduler.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACReplaySubject.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACScheduler+Subclass.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACScheduler.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACScopedDisposable.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSequence.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSerialDisposable.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSignal+Operations.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSignal.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACStream.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSubject.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSubscriber.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSubscriptingAssignmentTrampoline.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACTargetQueueScheduler.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACTestScheduler.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACTuple.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACUnit.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/ReactiveCocoa.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/metamacros.h
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Modules/
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Modules/module.modulemap
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/ReactiveCocoa
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Resources/
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Resources/Info.plist
|
||||
Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/Current
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Headers
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Modules
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Resources
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Squirrel
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/NSBundle+SQRLVersionExtensions.h
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/NSProcessInfo+SQRLVersionExtensions.h
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/SQRLDownloadedUpdate.h
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/SQRLUpdate.h
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/SQRLUpdater.h
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/Squirrel.h
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Modules/
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Modules/module.modulemap
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/Info.plist
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/ShipIt
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Squirrel
|
||||
Electron.app/Contents/Frameworks/Squirrel.framework/Versions/Current
|
||||
Electron.app/Contents/Info.plist
|
||||
Electron.app/Contents/MacOS/
|
||||
Electron.app/Contents/MacOS/Electron
|
||||
Electron.app/Contents/PkgInfo
|
||||
Electron.app/Contents/Resources/
|
||||
Electron.app/Contents/Resources/am.lproj/
|
||||
Electron.app/Contents/Resources/ar.lproj/
|
||||
Electron.app/Contents/Resources/bg.lproj/
|
||||
Electron.app/Contents/Resources/bn.lproj/
|
||||
Electron.app/Contents/Resources/ca.lproj/
|
||||
Electron.app/Contents/Resources/cs.lproj/
|
||||
Electron.app/Contents/Resources/da.lproj/
|
||||
Electron.app/Contents/Resources/de.lproj/
|
||||
Electron.app/Contents/Resources/default_app.asar
|
||||
Electron.app/Contents/Resources/el.lproj/
|
||||
Electron.app/Contents/Resources/electron.asar
|
||||
Electron.app/Contents/Resources/electron.icns
|
||||
Electron.app/Contents/Resources/en.lproj/
|
||||
Electron.app/Contents/Resources/en_GB.lproj/
|
||||
Electron.app/Contents/Resources/es.lproj/
|
||||
Electron.app/Contents/Resources/es_419.lproj/
|
||||
Electron.app/Contents/Resources/et.lproj/
|
||||
Electron.app/Contents/Resources/fa.lproj/
|
||||
Electron.app/Contents/Resources/fi.lproj/
|
||||
Electron.app/Contents/Resources/fil.lproj/
|
||||
Electron.app/Contents/Resources/fr.lproj/
|
||||
Electron.app/Contents/Resources/gu.lproj/
|
||||
Electron.app/Contents/Resources/he.lproj/
|
||||
Electron.app/Contents/Resources/hi.lproj/
|
||||
Electron.app/Contents/Resources/hr.lproj/
|
||||
Electron.app/Contents/Resources/hu.lproj/
|
||||
Electron.app/Contents/Resources/id.lproj/
|
||||
Electron.app/Contents/Resources/it.lproj/
|
||||
Electron.app/Contents/Resources/ja.lproj/
|
||||
Electron.app/Contents/Resources/kn.lproj/
|
||||
Electron.app/Contents/Resources/ko.lproj/
|
||||
Electron.app/Contents/Resources/lt.lproj/
|
||||
Electron.app/Contents/Resources/lv.lproj/
|
||||
Electron.app/Contents/Resources/ml.lproj/
|
||||
Electron.app/Contents/Resources/mr.lproj/
|
||||
Electron.app/Contents/Resources/ms.lproj/
|
||||
Electron.app/Contents/Resources/nb.lproj/
|
||||
Electron.app/Contents/Resources/nl.lproj/
|
||||
Electron.app/Contents/Resources/pl.lproj/
|
||||
Electron.app/Contents/Resources/pt_BR.lproj/
|
||||
Electron.app/Contents/Resources/pt_PT.lproj/
|
||||
Electron.app/Contents/Resources/ro.lproj/
|
||||
Electron.app/Contents/Resources/ru.lproj/
|
||||
Electron.app/Contents/Resources/sk.lproj/
|
||||
Electron.app/Contents/Resources/sl.lproj/
|
||||
Electron.app/Contents/Resources/sr.lproj/
|
||||
Electron.app/Contents/Resources/sv.lproj/
|
||||
Electron.app/Contents/Resources/sw.lproj/
|
||||
Electron.app/Contents/Resources/ta.lproj/
|
||||
Electron.app/Contents/Resources/te.lproj/
|
||||
Electron.app/Contents/Resources/th.lproj/
|
||||
Electron.app/Contents/Resources/tr.lproj/
|
||||
Electron.app/Contents/Resources/uk.lproj/
|
||||
Electron.app/Contents/Resources/vi.lproj/
|
||||
Electron.app/Contents/Resources/zh_CN.lproj/
|
||||
Electron.app/Contents/Resources/zh_TW.lproj/
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
version
|
||||
206
script/zip_manifests/dist_zip.mac_mas.x64.manifest
Normal file
206
script/zip_manifests/dist_zip.mac_mas.x64.manifest
Normal file
@@ -0,0 +1,206 @@
|
||||
Electron.app/
|
||||
Electron.app/Contents/
|
||||
Electron.app/Contents/Frameworks/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Libraries
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Resources
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Info.plist
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/am.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/am.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ar.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ar.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bg.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bg.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bn.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/bn.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ca.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ca.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/chrome_100_percent.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/chrome_200_percent.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/cs.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/cs.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/da.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/da.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/de.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/de.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/el.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/el.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en_GB.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/en_GB.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es_419.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/es_419.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/et.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/et.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fa.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fa.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fi.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fi.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fil.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fil.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/fr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/gu.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/gu.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/he.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/he.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hi.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hi.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hu.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/hu.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/icudtl.dat
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/id.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/id.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/it.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/it.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ja.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ja.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/kn.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/kn.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ko.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ko.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lt.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lt.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lv.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/lv.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ml.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ml.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/mr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/mr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ms.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ms.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/natives_blob.bin
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nb.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nb.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nl.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/nl.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pl.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pl.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_BR.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_BR.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_PT.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/pt_PT.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/resources.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ro.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ro.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ru.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ru.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sk.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sk.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sl.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sl.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sv.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sv.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sw.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/sw.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ta.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/ta.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/te.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/te.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/th.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/th.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/tr.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/tr.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/uk.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/uk.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/v8_context_snapshot.bin
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/vi.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/vi.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_CN.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_CN.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_TW.lproj/
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/zh_TW.lproj/locale.pak
|
||||
Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/Current
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/Info.plist
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/MacOS/
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/MacOS/Electron Helper
|
||||
Electron.app/Contents/Frameworks/Electron Helper.app/Contents/PkgInfo
|
||||
Electron.app/Contents/Info.plist
|
||||
Electron.app/Contents/Library/
|
||||
Electron.app/Contents/Library/LoginItems/
|
||||
Electron.app/Contents/Library/LoginItems/Electron Login Helper.app/
|
||||
Electron.app/Contents/Library/LoginItems/Electron Login Helper.app/Contents/
|
||||
Electron.app/Contents/Library/LoginItems/Electron Login Helper.app/Contents/Info.plist
|
||||
Electron.app/Contents/Library/LoginItems/Electron Login Helper.app/Contents/MacOS/
|
||||
Electron.app/Contents/Library/LoginItems/Electron Login Helper.app/Contents/MacOS/Electron Login Helper
|
||||
Electron.app/Contents/Library/LoginItems/Electron Login Helper.app/Contents/PkgInfo
|
||||
Electron.app/Contents/MacOS/
|
||||
Electron.app/Contents/MacOS/Electron
|
||||
Electron.app/Contents/PkgInfo
|
||||
Electron.app/Contents/Resources/
|
||||
Electron.app/Contents/Resources/am.lproj/
|
||||
Electron.app/Contents/Resources/ar.lproj/
|
||||
Electron.app/Contents/Resources/bg.lproj/
|
||||
Electron.app/Contents/Resources/bn.lproj/
|
||||
Electron.app/Contents/Resources/ca.lproj/
|
||||
Electron.app/Contents/Resources/cs.lproj/
|
||||
Electron.app/Contents/Resources/da.lproj/
|
||||
Electron.app/Contents/Resources/de.lproj/
|
||||
Electron.app/Contents/Resources/default_app.asar
|
||||
Electron.app/Contents/Resources/el.lproj/
|
||||
Electron.app/Contents/Resources/electron.asar
|
||||
Electron.app/Contents/Resources/electron.icns
|
||||
Electron.app/Contents/Resources/en.lproj/
|
||||
Electron.app/Contents/Resources/en_GB.lproj/
|
||||
Electron.app/Contents/Resources/es.lproj/
|
||||
Electron.app/Contents/Resources/es_419.lproj/
|
||||
Electron.app/Contents/Resources/et.lproj/
|
||||
Electron.app/Contents/Resources/fa.lproj/
|
||||
Electron.app/Contents/Resources/fi.lproj/
|
||||
Electron.app/Contents/Resources/fil.lproj/
|
||||
Electron.app/Contents/Resources/fr.lproj/
|
||||
Electron.app/Contents/Resources/gu.lproj/
|
||||
Electron.app/Contents/Resources/he.lproj/
|
||||
Electron.app/Contents/Resources/hi.lproj/
|
||||
Electron.app/Contents/Resources/hr.lproj/
|
||||
Electron.app/Contents/Resources/hu.lproj/
|
||||
Electron.app/Contents/Resources/id.lproj/
|
||||
Electron.app/Contents/Resources/it.lproj/
|
||||
Electron.app/Contents/Resources/ja.lproj/
|
||||
Electron.app/Contents/Resources/kn.lproj/
|
||||
Electron.app/Contents/Resources/ko.lproj/
|
||||
Electron.app/Contents/Resources/lt.lproj/
|
||||
Electron.app/Contents/Resources/lv.lproj/
|
||||
Electron.app/Contents/Resources/ml.lproj/
|
||||
Electron.app/Contents/Resources/mr.lproj/
|
||||
Electron.app/Contents/Resources/ms.lproj/
|
||||
Electron.app/Contents/Resources/nb.lproj/
|
||||
Electron.app/Contents/Resources/nl.lproj/
|
||||
Electron.app/Contents/Resources/pl.lproj/
|
||||
Electron.app/Contents/Resources/pt_BR.lproj/
|
||||
Electron.app/Contents/Resources/pt_PT.lproj/
|
||||
Electron.app/Contents/Resources/ro.lproj/
|
||||
Electron.app/Contents/Resources/ru.lproj/
|
||||
Electron.app/Contents/Resources/sk.lproj/
|
||||
Electron.app/Contents/Resources/sl.lproj/
|
||||
Electron.app/Contents/Resources/sr.lproj/
|
||||
Electron.app/Contents/Resources/sv.lproj/
|
||||
Electron.app/Contents/Resources/sw.lproj/
|
||||
Electron.app/Contents/Resources/ta.lproj/
|
||||
Electron.app/Contents/Resources/te.lproj/
|
||||
Electron.app/Contents/Resources/th.lproj/
|
||||
Electron.app/Contents/Resources/tr.lproj/
|
||||
Electron.app/Contents/Resources/uk.lproj/
|
||||
Electron.app/Contents/Resources/vi.lproj/
|
||||
Electron.app/Contents/Resources/zh_CN.lproj/
|
||||
Electron.app/Contents/Resources/zh_TW.lproj/
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
version
|
||||
73
script/zip_manifests/dist_zip.win.ia32.manifest
Normal file
73
script/zip_manifests/dist_zip.win.ia32.manifest
Normal file
@@ -0,0 +1,73 @@
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
chrome_100_percent.pak
|
||||
chrome_200_percent.pak
|
||||
d3dcompiler_47.dll
|
||||
electron.exe
|
||||
ffmpeg.dll
|
||||
icudtl.dat
|
||||
libEGL.dll
|
||||
libGLESv2.dll
|
||||
locales/am.pak
|
||||
locales/ar.pak
|
||||
locales/bg.pak
|
||||
locales/bn.pak
|
||||
locales/ca.pak
|
||||
locales/cs.pak
|
||||
locales/da.pak
|
||||
locales/de.pak
|
||||
locales/el.pak
|
||||
locales/en-GB.pak
|
||||
locales/en-US.pak
|
||||
locales/es-419.pak
|
||||
locales/es.pak
|
||||
locales/et.pak
|
||||
locales/fa.pak
|
||||
locales/fi.pak
|
||||
locales/fil.pak
|
||||
locales/fr.pak
|
||||
locales/gu.pak
|
||||
locales/he.pak
|
||||
locales/hi.pak
|
||||
locales/hr.pak
|
||||
locales/hu.pak
|
||||
locales/id.pak
|
||||
locales/it.pak
|
||||
locales/ja.pak
|
||||
locales/kn.pak
|
||||
locales/ko.pak
|
||||
locales/lt.pak
|
||||
locales/lv.pak
|
||||
locales/ml.pak
|
||||
locales/mr.pak
|
||||
locales/ms.pak
|
||||
locales/nb.pak
|
||||
locales/nl.pak
|
||||
locales/pl.pak
|
||||
locales/pt-BR.pak
|
||||
locales/pt-PT.pak
|
||||
locales/ro.pak
|
||||
locales/ru.pak
|
||||
locales/sk.pak
|
||||
locales/sl.pak
|
||||
locales/sr.pak
|
||||
locales/sv.pak
|
||||
locales/sw.pak
|
||||
locales/ta.pak
|
||||
locales/te.pak
|
||||
locales/th.pak
|
||||
locales/tr.pak
|
||||
locales/uk.pak
|
||||
locales/vi.pak
|
||||
locales/zh-CN.pak
|
||||
locales/zh-TW.pak
|
||||
natives_blob.bin
|
||||
osmesa.dll
|
||||
resources.pak
|
||||
resources/default_app.asar
|
||||
resources/electron.asar
|
||||
snapshot_blob.bin
|
||||
swiftshader/libEGL.dll
|
||||
swiftshader/libGLESv2.dll
|
||||
v8_context_snapshot.bin
|
||||
version
|
||||
73
script/zip_manifests/dist_zip.win.x64.manifest
Normal file
73
script/zip_manifests/dist_zip.win.x64.manifest
Normal file
@@ -0,0 +1,73 @@
|
||||
LICENSE
|
||||
LICENSES.chromium.html
|
||||
chrome_100_percent.pak
|
||||
chrome_200_percent.pak
|
||||
d3dcompiler_47.dll
|
||||
electron.exe
|
||||
ffmpeg.dll
|
||||
icudtl.dat
|
||||
libEGL.dll
|
||||
libGLESv2.dll
|
||||
locales/am.pak
|
||||
locales/ar.pak
|
||||
locales/bg.pak
|
||||
locales/bn.pak
|
||||
locales/ca.pak
|
||||
locales/cs.pak
|
||||
locales/da.pak
|
||||
locales/de.pak
|
||||
locales/el.pak
|
||||
locales/en-GB.pak
|
||||
locales/en-US.pak
|
||||
locales/es-419.pak
|
||||
locales/es.pak
|
||||
locales/et.pak
|
||||
locales/fa.pak
|
||||
locales/fi.pak
|
||||
locales/fil.pak
|
||||
locales/fr.pak
|
||||
locales/gu.pak
|
||||
locales/he.pak
|
||||
locales/hi.pak
|
||||
locales/hr.pak
|
||||
locales/hu.pak
|
||||
locales/id.pak
|
||||
locales/it.pak
|
||||
locales/ja.pak
|
||||
locales/kn.pak
|
||||
locales/ko.pak
|
||||
locales/lt.pak
|
||||
locales/lv.pak
|
||||
locales/ml.pak
|
||||
locales/mr.pak
|
||||
locales/ms.pak
|
||||
locales/nb.pak
|
||||
locales/nl.pak
|
||||
locales/pl.pak
|
||||
locales/pt-BR.pak
|
||||
locales/pt-PT.pak
|
||||
locales/ro.pak
|
||||
locales/ru.pak
|
||||
locales/sk.pak
|
||||
locales/sl.pak
|
||||
locales/sr.pak
|
||||
locales/sv.pak
|
||||
locales/sw.pak
|
||||
locales/ta.pak
|
||||
locales/te.pak
|
||||
locales/th.pak
|
||||
locales/tr.pak
|
||||
locales/uk.pak
|
||||
locales/vi.pak
|
||||
locales/zh-CN.pak
|
||||
locales/zh-TW.pak
|
||||
natives_blob.bin
|
||||
osmesa.dll
|
||||
resources.pak
|
||||
resources/default_app.asar
|
||||
resources/electron.asar
|
||||
snapshot_blob.bin
|
||||
swiftshader/libEGL.dll
|
||||
swiftshader/libGLESv2.dll
|
||||
v8_context_snapshot.bin
|
||||
version
|
||||
@@ -6,6 +6,7 @@ const https = require('https')
|
||||
const net = require('net')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const cp = require('child_process')
|
||||
const { ipcRenderer, remote } = require('electron')
|
||||
const { emittedOnce } = require('./events-helpers')
|
||||
const { closeWindow } = require('./window-helpers')
|
||||
@@ -556,6 +557,28 @@ describe('app module', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('getAppPath', () => {
|
||||
it('works for directories with package.json', async () => {
|
||||
const { appPath } = await runTestApp('app-path')
|
||||
expect(appPath).to.equal(path.resolve(__dirname, 'fixtures/api/app-path'))
|
||||
})
|
||||
|
||||
it('works for directories with index.js', async () => {
|
||||
const { appPath } = await runTestApp('app-path/lib')
|
||||
expect(appPath).to.equal(path.resolve(__dirname, 'fixtures/api/app-path/lib'))
|
||||
})
|
||||
|
||||
it('works for files without extension', async () => {
|
||||
const { appPath } = await runTestApp('app-path/lib/index')
|
||||
expect(appPath).to.equal(path.resolve(__dirname, 'fixtures/api/app-path/lib'))
|
||||
})
|
||||
|
||||
it('works for files', async () => {
|
||||
const { appPath } = await runTestApp('app-path/lib/index.js')
|
||||
expect(appPath).to.equal(path.resolve(__dirname, 'fixtures/api/app-path/lib'))
|
||||
})
|
||||
})
|
||||
|
||||
describe('getPath(name)', () => {
|
||||
it('returns paths that exist', () => {
|
||||
const paths = [
|
||||
@@ -1125,3 +1148,16 @@ describe('app module', () => {
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
async function runTestApp (name, ...args) {
|
||||
const appPath = path.join(__dirname, 'fixtures', 'api', name)
|
||||
const electronPath = remote.getGlobal('process').execPath
|
||||
const appProcess = cp.spawn(electronPath, [appPath, ...args])
|
||||
|
||||
let output = ''
|
||||
appProcess.stdout.on('data', (data) => { output += data })
|
||||
|
||||
await emittedOnce(appProcess.stdout, 'end')
|
||||
|
||||
return JSON.parse(output)
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user