Merge branch 'master' into breaking-changes

This commit is contained in:
Charles Kerr 2018-05-31 12:12:02 +02:00
commit c7d1f95240
41 changed files with 267 additions and 298 deletions

2
DEPS
View file

@ -2,7 +2,7 @@ vars = {
'chromium_version':
'63.0.3239.150',
'libchromiumcontent_revision':
'0e8b7216fe616405ea14ff5bece3ca087ead613c',
'1c542968990da951df27c8a0371a4ab5494a5a6c',
'node_version':
'v9.7.0-33-g538a5023af',
'native_mate_revision':

View file

@ -145,9 +145,6 @@ void Screen::BuildPrototype(v8::Isolate* isolate,
.SetMethod("dipToScreenPoint", &display::win::ScreenWin::DIPToScreenPoint)
.SetMethod("screenToDipRect", &ScreenToDIPRect)
.SetMethod("dipToScreenRect", &DIPToScreenRect)
#endif
#if defined(OS_MACOSX)
.SetMethod("getMenuBarHeight", &Screen::getMenuBarHeight)
#endif
.SetMethod("getDisplayMatching", &Screen::GetDisplayMatching);
}

View file

@ -40,10 +40,6 @@ class Screen : public mate::EventEmitter<Screen>,
display::Display GetDisplayNearestPoint(const gfx::Point& point);
display::Display GetDisplayMatching(const gfx::Rect& match_rect);
#if defined(OS_MACOSX)
int getMenuBarHeight();
#endif
// display::DisplayObserver:
void OnDisplayAdded(const display::Display& new_display) override;
void OnDisplayRemoved(const display::Display& old_display) override;

View file

@ -1,19 +0,0 @@
// Copyright (c) 2017 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#import "atom/browser/api/atom_api_screen.h"
namespace atom {
namespace api {
// TODO(codebytere): deprecated; remove in 3.0
int Screen::getMenuBarHeight() {
return [[NSApp mainMenu] menuBarHeight];
}
} // namespace api
} // namespace atom

View file

@ -821,7 +821,7 @@ void Session::BuildPrototype(v8::Isolate* isolate,
.SetMethod("setDownloadPath", &Session::SetDownloadPath)
.SetMethod("enableNetworkEmulation", &Session::EnableNetworkEmulation)
.SetMethod("disableNetworkEmulation", &Session::DisableNetworkEmulation)
.SetMethod("_setCertificateVerifyProc", &Session::SetCertVerifyProc)
.SetMethod("setCertificateVerifyProc", &Session::SetCertVerifyProc)
.SetMethod("setPermissionRequestHandler",
&Session::SetPermissionRequestHandler)
.SetMethod("clearHostResolverCache", &Session::ClearHostResolverCache)

View file

@ -40,16 +40,6 @@ struct Converter<atom::TrayIcon::HighlightMode> {
return true;
}
}
bool highlight;
if (ConvertFromV8(isolate, val, &highlight)) {
if (highlight)
*out = atom::TrayIcon::HighlightMode::SELECTION;
else
*out = atom::TrayIcon::HighlightMode::NEVER;
return true;
}
return false;
}
};

View file

@ -1296,15 +1296,9 @@ void WebContents::OpenDevTools(mate::Arguments* args) {
state = "detach";
}
if (args && args->Length() == 1) {
bool detach = false;
mate::Dictionary options;
if (args->GetNext(&options)) {
options.Get("mode", &state);
// TODO(kevinsawicki) Remove in 2.0
options.Get("detach", &detach);
if (state.empty() && detach)
state = "detach";
}
}
managed_web_contents()->SetDockState(state);

View file

@ -143,10 +143,6 @@ bool NativeWindowViews::ExecuteWindowsCommand(int command_id) {
std::string command = AppCommandToString(command_id);
NotifyWindowExecuteWindowsCommand(command);
if (command_id == APPCOMMAND_MEDIA_PLAY_PAUSE)
// FIXME(htk3): Remove media-play_pause in 3.0
NotifyWindowExecuteWindowsCommand("media-play_pause");
return false;
}

View file

@ -232,7 +232,7 @@ void WebContentsPreferences::AppendCommandLineSwitches(
}
// Enable blink features.
if (dict_.GetString(options::kBlinkFeatures, &s))
if (dict_.GetString(options::kEnableBlinkFeatures, &s))
command_line->AppendSwitchASCII(::switches::kEnableBlinkFeatures, s);
// Disable blink features.

View file

@ -517,9 +517,6 @@ mate::Handle<NativeImage> NativeImage::CreateFromBuffer(
options.Get("width", &width);
options.Get("height", &height);
options.Get("scaleFactor", &scale_factor);
} else {
// TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings
args->GetNext(&scale_factor);
}
gfx::ImageSkia image_skia;

View file

@ -127,8 +127,7 @@ const char kOpenerID[] = "openerId";
const char kScrollBounce[] = "scrollBounce";
// Enable blink features.
// TODO(kevinsawicki) Rename to enableBlinkFeatures in 2.0
const char kBlinkFeatures[] = "blinkFeatures";
const char kEnableBlinkFeatures[] = "enableBlinkFeatures";
// Disable blink features.
const char kDisableBlinkFeatures[] = "disableBlinkFeatures";

View file

@ -64,7 +64,7 @@ extern const char kExperimentalFeatures[];
extern const char kExperimentalCanvasFeatures[];
extern const char kOpenerID[];
extern const char kScrollBounce[];
extern const char kBlinkFeatures[];
extern const char kEnableBlinkFeatures[];
extern const char kDisableBlinkFeatures[];
extern const char kNodeIntegrationInWorker[];
extern const char kWebviewTag[];

View file

@ -206,12 +206,6 @@ void WebFrame::SetSpellCheckProvider(mate::Arguments* args,
web_frame_->SetSpellCheckPanelHostClient(spell_check_client_.get());
}
void WebFrame::RegisterURLSchemeAsSecure(const std::string& scheme) {
// TODO(pfrazee): Remove 2.0
blink::SchemeRegistry::RegisterURLSchemeAsSecure(
WTF::String::FromUTF8(scheme.data(), scheme.length()));
}
void WebFrame::RegisterURLSchemeAsBypassingCSP(const std::string& scheme) {
// Register scheme to bypass pages's Content Security Policy.
blink::SchemeRegistry::RegisterURLSchemeAsBypassingContentSecurityPolicy(
@ -243,10 +237,6 @@ void WebFrame::RegisterURLSchemeAsPrivileged(const std::string& scheme,
// Register scheme to privileged list (https, wss, data, chrome-extension)
WTF::String privileged_scheme(
WTF::String::FromUTF8(scheme.data(), scheme.length()));
if (secure) {
// TODO(pfrazee): Remove 2.0
blink::SchemeRegistry::RegisterURLSchemeAsSecure(privileged_scheme);
}
if (bypassCSP) {
blink::SchemeRegistry::RegisterURLSchemeAsBypassingContentSecurityPolicy(
privileged_scheme);
@ -442,13 +432,13 @@ v8::Local<v8::Value> WebFrame::FindFrameByName(const std::string& name) const {
v8::Local<v8::Value> WebFrame::FindFrameByRoutingId(int routing_id) const {
content::RenderFrame* render_frame =
content::RenderFrame::FromRoutingID(routing_id);
content::RenderFrame::FromRoutingID(routing_id);
blink::WebLocalFrame* local_frame = nullptr;
if (render_frame)
local_frame = render_frame->GetWebFrame();
if (local_frame)
return mate::CreateHandle(isolate(),
new WebFrame(isolate(), local_frame)).ToV8();
return mate::CreateHandle(isolate(), new WebFrame(isolate(), local_frame))
.ToV8();
else
return v8::Null(isolate());
}
@ -479,8 +469,6 @@ void WebFrame::BuildPrototype(v8::Isolate* isolate,
.SetMethod("attachGuest", &WebFrame::AttachGuest)
.SetMethod("detachGuest", &WebFrame::DetachGuest)
.SetMethod("setSpellCheckProvider", &WebFrame::SetSpellCheckProvider)
.SetMethod("registerURLSchemeAsSecure",
&WebFrame::RegisterURLSchemeAsSecure)
.SetMethod("registerURLSchemeAsBypassingCSP",
&WebFrame::RegisterURLSchemeAsBypassingCSP)
.SetMethod("registerURLSchemeAsPrivileged",

View file

@ -66,7 +66,6 @@ class WebFrame : public mate::Wrappable<WebFrame> {
bool auto_spell_correct_turned_on,
v8::Local<v8::Object> provider);
void RegisterURLSchemeAsSecure(const std::string& scheme);
void RegisterURLSchemeAsBypassingCSP(const std::string& scheme);
void RegisterURLSchemeAsPrivileged(const std::string& scheme,
mate::Arguments* args);

View file

@ -309,7 +309,7 @@ It creates a new `BrowserWindow` with native properties as set by the `options`.
canvas features. Default is `false`.
* `scrollBounce` Boolean (optional) - Enables scroll bounce (rubber banding) effect on
macOS. Default is `false`.
* `blinkFeatures` String (optional) - A list of feature strings separated by `,`, like
* `enableBlinkFeatures` String (optional) - A list of feature strings separated by `,`, like
`CSSVariables,KeyboardEventKey` to enable. The full list of supported feature
strings can be found in the [RuntimeEnabledFeatures.json5][runtime-enabled-features]
file.

View file

@ -22,7 +22,7 @@ win.loadURL('https://github.com')
```
**Note:** For the reverse (access the renderer process from the main process),
you can use [webContents.executeJavascript](web-contents.md#contentsexecutejavascriptcode-usergesture-callback).
you can use [webContents.executeJavaScript](web-contents.md#contentsexecutejavascriptcode-usergesture-callback).
## Remote Objects

View file

@ -95,10 +95,6 @@ Returns [`Point`](structures/point.md)
The current absolute position of the mouse pointer.
### `screen.getMenuBarHeight()` _macOS_
Returns `Integer` - The height of the menu bar in pixels.
### `screen.getPrimaryDisplay()`
Returns [`Display`](structures/display.md) - The primary display.

View file

@ -81,16 +81,6 @@ webFrame.setSpellCheckProvider('en-US', true, {
})
```
### `webFrame.registerURLSchemeAsSecure(scheme)`
* `scheme` String
Registers the `scheme` as secure scheme.
Secure schemes do not trigger mixed content warnings. For example, `https` and
`data` are secure schemes because they cannot be corrupted by active network
attackers.
### `webFrame.registerURLSchemeAsBypassingCSP(scheme)`
* `scheme` String

View file

@ -214,10 +214,10 @@ A name by itself is given a `true` boolean value.
A preference can be set to another value by including an `=`, followed by the value.
Special values `yes` and `1` are interpreted as `true`, while `no` and `0` are interpreted as `false`.
### `blinkfeatures`
### `enableblinkfeatures`
```html
<webview src="https://www.github.com/" blinkfeatures="PreciseMemoryInfo, CSSVariables"></webview>
<webview src="https://www.github.com/" enableblinkfeatures="PreciseMemoryInfo, CSSVariables"></webview>
```
A list of strings which specifies the blink features to be enabled separated by `,`.

View file

@ -0,0 +1,93 @@
# Build Instructions (experimental GN build)
Follow the guidelines below for building Electron with the experimental GN
build.
> **NOTE**: The GN build system is in _experimental_ status, and currently only
> works on macOS and Linux, in debug mode, as a component build.
## Prerequisites
See the [macOS](build-instructions-osx.md#prerequisites) or
[Linux](build-instructions-linux.md#prerequisites) build instructions for the
requirements for your platform. In addition, you'll need to install
[`depot_tools`][depot-tools], the toolset used for fetching Chromium and its
dependencies.
[depot-tools]: http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up
## Getting the Code
```sh
$ mkdir electron-gn && cd electron-gn
$ cat > .gclient <<-GCLIENT
solutions = [
{
"url": "https://github.com/electron/electron",
"managed": False,
"name": "src/electron",
},
]
GCLIENT
$ gclient sync --with_branch_heads --with_tags
# This will take a while, go get a coffee.
```
## Building
```sh
$ cd src
$ export CHROMIUM_BUILDTOOLS_PATH=`pwd`/buildtools
$ gn gen out/Default --args='root_extra_deps=["//electron"] is_electron_build=true is_component_build=true use_jumbo_build=true v8_promise_internal_field_count=1 v8_typed_array_max_size_in_heap=0'
```
This will generate all the ninja files needed for the build. You shouldn't have
to run `gn gen` again—if you want to change the build arguments you can run `gn
args out/Default` to bring up an editor.
To build, run `ninja` with the `electron:electron_app` target:
```sh
$ ninja -C out/Default electron:electron_app
# This will also take a while and probably heat up your lap.
```
This will build all of what was previously 'libchromiumcontent' (i.e. the
`content/` directory of `chromium` and its dependencies, incl. WebKit and V8),
so it will take a while.
To speed up subsequent builds, you can use [sccache][sccache]. Add the GN arg
`cc_wrapper="sccache"` by running `gn args out/Default` to bring up an editor.
[sccache]: https://github.com/mozilla/sccache
The built executable will be under `./out/Default`:
```sh
$ ./out/Default/Electron.app/Contents/MacOS/Electron
# or, on Linux
$ ./out/Default/electron
```
## Tests
To run the tests, you'll first need to build the test modules against the
same version of node.js that was built as part of the build process.
```sh
$ (cd electron/spec && npm i --nodedir=../../third_party/electron_node)
```
Then, run Electron with `electron/spec` as the argument:
```sh
$ ./out/Default/Electron.app/Contents/MacOS/Electron electron/spec
```
If you're debugging something, it can be helpful to pass some extra flags to
the Electron binary:
```sh
$ ./out/Default/Electron.app/Contents/MacOS/Electron electron/spec \
--ci --enable-logging -g 'BrowserWindow module'
```

View file

@ -12,7 +12,7 @@ Follow the guidelines below for building Electron on Linux.
For a quick test, run the following script:
```sh
$ python ./script/check-tls.py
$ python ./script/tls.py
```
If the script returns that your configuration is using an outdated security

View file

@ -15,7 +15,7 @@ Please also ensure that your system and Python version support at least TLS 1.2.
This depends on both your version of macOS and Python. For a quick test, run:
```sh
$ python ./script/check-tls.py
$ python ./script/tls.py
```
If the script returns that your configuration is using an outdated security

View file

@ -61,7 +61,7 @@ the notification away.
## macOS
Notifications are straight-forward on macOS, but you should be aware of
[Apple's Human Interface guidelines regarding notifications](https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/NotificationCenter.html).
[Apple's Human Interface guidelines regarding notifications](https://developer.apple.com/macos/human-interface-guidelines/system-capabilities/notifications/).
Note that notifications are limited to 256 bytes in size and will be truncated
if you exceed that limit.

View file

@ -78,7 +78,7 @@ improve the security of your application.
7. [Override and disable `eval`](#7-override-and-disable-eval), which allows strings to be executed as code.
8. [Do not set `allowRunningInsecureContent` to `true`](#8-do-not-set-allowrunninginsecurecontent-to-true)
9. [Do not enable experimental features](#9-do-not-enable-experimental-features)
10. [Do not use `blinkFeatures`](#10-do-not-use-blinkfeatures)
10. [Do not use `enableBlinkFeatures`](#10-do-not-use-enableblinkfeatures)
11. [WebViews: Do not use `allowpopups`](#11-do-not-use-allowpopups)
12. [WebViews: Verify the options and params of all `<webview>` tags](#12-verify-webview-options-before-creation)
@ -452,12 +452,12 @@ const mainWindow = new BrowserWindow({})
```
## 10) Do Not Use `blinkFeatures`
## 10) Do Not Use `enableBlinkFeatures`
_Recommendation is Electron's default_
Blink is the name of the rendering engine behind Chromium. As with
`experimentalFeatures`, the `blinkFeatures` property allows developers to
`experimentalFeatures`, the `enableBlinkFeatures` property allows developers to
enable features that have been disabled by default.
### Why?
@ -473,7 +473,7 @@ no circumstances should you enable features speculatively.
// Bad
const mainWindow = new BrowserWindow({
webPreferences: {
blinkFeatures: ['ExecCommandInJavaScript']
enableBlinkFeatures: ['ExecCommandInJavaScript']
}
})
```

View file

@ -152,7 +152,6 @@
'atom/browser/api/atom_api_render_process_preferences.h',
'atom/browser/api/atom_api_screen.cc',
'atom/browser/api/atom_api_screen.h',
'atom/browser/api/atom_api_screen_mac.mm',
'atom/browser/api/atom_api_session.cc',
'atom/browser/api/atom_api_session.h',
'atom/browser/api/atom_api_system_preferences.cc',

View file

@ -1,17 +1,8 @@
const {EventEmitter} = require('events')
const {deprecate} = require('electron')
const {screen, Screen} = process.atomBinding('screen')
// Screen is an EventEmitter.
Object.setPrototypeOf(Screen.prototype, EventEmitter.prototype)
EventEmitter.call(screen)
const nativeFn = screen.getMenuBarHeight
screen.getMenuBarHeight = function () {
if (!process.noDeprecations) {
deprecate.warn('screen.getMenuBarHeight', 'screen.getPrimaryDisplay().workArea')
}
return nativeFn.call(this)
}
module.exports = screen

View file

@ -20,18 +20,3 @@ Object.setPrototypeOf(Cookies.prototype, EventEmitter.prototype)
Session.prototype._init = function () {
app.emit('session-created', this)
}
Session.prototype.setCertificateVerifyProc = function (verifyProc) {
if (verifyProc != null && verifyProc.length > 2) {
// TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings
this._setCertificateVerifyProc(({hostname, certificate, verificationResult}, cb) => {
verifyProc(hostname, certificate, (result) => {
// Disabled due to false positive in StandardJS
// eslint-disable-next-line standard/no-callback-literal
cb(result ? 0 : -2)
})
})
} else {
this._setCertificateVerifyProc(verifyProc)
}
}

View file

@ -1,20 +1,6 @@
const {EventEmitter} = require('events')
const {deprecate} = require('electron')
const {Tray} = process.atomBinding('tray')
Object.setPrototypeOf(Tray.prototype, EventEmitter.prototype)
// TODO(codebytere): remove in 3.0
const nativeSetHighlightMode = Tray.prototype.setHighlightMode
Tray.prototype.setHighlightMode = function (param) {
if (!process.noDeprecations && typeof param === 'boolean') {
if (param) {
deprecate.warn('tray.setHighlightMode(true)', `tray.setHighlightMode("on")`)
} else {
deprecate.warn('tray.setHighlightMode(false)', `tray.setHighlightMode("off")`)
}
}
return nativeSetHighlightMode.call(this, param)
}
module.exports = Tray

View file

@ -165,14 +165,6 @@ for (const method of webFrameMethodsWithResult) {
}
}
const nativeOpenDevTools = WebContents.prototype.openDevTools
WebContents.prototype.openDevTools = function (params) {
if (!process.noDeprecations && params && 'detach' in params) {
deprecate.warn('webContents.openDevTools({detach: true})', `webContents.openDevTools({mode: 'detach'})`)
}
return nativeOpenDevTools.call(this, params)
}
// Make sure WebContents::executeJavaScript would run the code only when the
// WebContents has been loaded.
WebContents.prototype.executeJavaScript = function (code, hasUserGesture, callback) {

View file

@ -217,7 +217,7 @@ const attachGuest = function (event, elementInstanceId, guestInstanceId, params)
plugins: params.plugins,
zoomFactor: embedder._getZoomFactor(),
webSecurity: !params.disablewebsecurity,
blinkFeatures: params.blinkfeatures,
enableBlinkFeatures: params.blinkfeatures,
disableBlinkFeatures: params.disableblinkfeatures
}

View file

@ -2,41 +2,8 @@ if (process.platform === 'linux' && process.type === 'renderer') {
// On Linux we could not access clipboard in renderer process.
module.exports = require('electron').remote.clipboard
} else {
const {deprecate} = require('electron')
const clipboard = process.atomBinding('clipboard')
// TODO(codebytere): remove in 3.0
clipboard.readHtml = function () {
if (!process.noDeprecations) {
deprecate.warn('clipboard.readHtml', 'clipboard.readHTML')
}
return clipboard.readHTML()
}
// TODO(codebytere): remove in 3.0
clipboard.writeHtml = function () {
if (!process.noDeprecations) {
deprecate.warn('clipboard.writeHtml', 'clipboard.writeHTML')
}
return clipboard.writeHTML()
}
// TODO(codebytere): remove in 3.0
clipboard.readRtf = function () {
if (!process.noDeprecations) {
deprecate.warn('clipboard.readRtf', 'clipboard.writeRTF')
}
return clipboard.readRTF()
}
// TODO(codebytere): remove in 3.0
clipboard.writeRtf = function () {
if (!process.noDeprecations) {
deprecate.warn('clipboard.writeRtf', 'clipboard.writeRTF')
}
return clipboard.writeRTF()
}
// Read/write to find pasteboard over IPC since only main process is notified
// of changes
if (process.platform === 'darwin' && process.type === 'renderer') {

View file

@ -4,7 +4,7 @@ const {spawn} = require('child_process')
const os = require('os')
const path = require('path')
const electron = require('electron')
const {app, deprecate} = process.type === 'browser' ? electron : electron.remote
const {app} = process.type === 'browser' ? electron : electron.remote
const binding = process.atomBinding('crash_reporter')
class CrashReporter {
@ -21,12 +21,7 @@ class CrashReporter {
} = options
if (uploadToServer == null) {
if (options.autoSubmit) {
deprecate.warn('autoSubmit', 'uploadToServer')
uploadToServer = options.autoSubmit
} else {
uploadToServer = true
}
uploadToServer = true
}
if (ignoreSystemCrashHandler == null) ignoreSystemCrashHandler = false

View file

@ -87,20 +87,33 @@ deprecate.getHandler = () => deprecationHandler
// return this[member][method].apply(this[member], arguments)
// }
// }
//
// // Deprecate a property.
// deprecate.property = (object, property, method) => {
// return Object.defineProperty(object, property, {
// get: function () {
// let warned = false
// if (!(warned || process.noDeprecation)) {
// warned = true
// deprecate.warn(`${property} property`, `${method} method`)
// }
// return this[method]()
// }
// })
// }
//
// Deprecate the old name of a property
deprecate.property = (object, deprecatedName, newName) => {
let warned = false
let warn = () => {
if (!(warned || process.noDeprecation)) {
warned = true
deprecate.warn(deprecatedName, newName)
}
}
if ((typeof object[newName] === 'undefined') &&
(typeof object[deprecatedName] !== 'undefined')) {
warn()
object[newName] = object[deprecatedName]
}
return Object.defineProperty(object, deprecatedName, {
get: function () {
warn()
return this[newName]
},
set: function (value) {
warn()
this[newName] = value
}
})
}
module.exports = deprecate

View file

@ -31,7 +31,7 @@ const {
warnAboutDisabledWebSecurity,
warnAboutInsecureContentAllowed,
warnAboutExperimentalFeatures,
warnAboutBlinkFeatures,
warnAboutEnableBlinkFeatures,
warnAboutInsecureResources,
warnAboutInsecureCSP,
warnAboutAllowedPopups,
@ -177,7 +177,7 @@ window.addEventListener('load', function loadHandler () {
warnAboutInsecureResources()
warnAboutInsecureContentAllowed()
warnAboutExperimentalFeatures()
warnAboutBlinkFeatures()
warnAboutEnableBlinkFeatures()
warnAboutInsecureCSP()
warnAboutAllowedPopups()
}

View file

@ -91,9 +91,9 @@ const getWebPreferences = function () {
}
}
const moreInformation = '\nFor more information and help, consult ' +
'https://electronjs.org/docs/tutorial/security.\n' +
'This warning will not show up once the app is packaged.'
const moreInformation = `\nFor more information and help, consult
https://electronjs.org/docs/tutorial/security.\n This warning will not show up
once the app is packaged.`
module.exports = {
shouldLogSecurityWarnings,
@ -119,11 +119,10 @@ module.exports = {
return
}
let warning = 'This renderer process loads resources using insecure protocols. ' +
'This exposes users of this app to unnecessary security risks. ' +
'Consider loading the following resources over HTTPS or FTPS. \n' +
resources + '\n' +
moreInformation
const warning = `This renderer process loads resources using insecure
protocols.This exposes users of this app to unnecessary security risks.
Consider loading the following resources over HTTPS or FTPS. \n ${resources}
\n ${moreInformation}`
console.warn('%cElectron Security Warning (Insecure Resources)',
'font-weight: bold;', warning)
@ -137,10 +136,9 @@ module.exports = {
*/
warnAboutNodeWithRemoteContent: () => {
if (getIsRemoteProtocol()) {
let warning = 'This renderer process has Node.js integration enabled ' +
'and attempted to load remote content. This exposes users of this app to severe ' +
'security risks.\n' +
moreInformation
const warning = `This renderer process has Node.js integration enabled
and attempted to load remote content. This exposes users of this app to
severe security risks.\n ${moreInformation}`
console.warn('%cElectron Security Warning (Node.js Integration with Remote Content)',
'font-weight: bold;', warning)
@ -162,9 +160,8 @@ module.exports = {
const webPreferences = getWebPreferences()
if (!webPreferences || webPreferences.webSecurity !== false) return
let warning = 'This renderer process has "webSecurity" disabled. ' +
'This exposes users of this app to severe security risks.\n' +
moreInformation
const warning = `This renderer process has "webSecurity" disabled. This
exposes users of this app to severe security risks.\n ${moreInformation}`
console.warn('%cElectron Security Warning (Disabled webSecurity)',
'font-weight: bold;', warning)
@ -180,10 +177,9 @@ module.exports = {
*/
warnAboutInsecureCSP: () => {
if (isUnsafeEvalEnabled()) {
let warning = 'This renderer process has either no Content Security Policy set ' +
'or a policy with "unsafe-eval" enabled. This exposes users of this ' +
'app to unnecessary security risks.\n' +
moreInformation
const warning = `This renderer process has either no Content Security
Policy set or a policy with "unsafe-eval" enabled. This exposes users of
this app to unnecessary security risks.\n ${moreInformation}`
console.warn('%cElectron Security Warning (Insecure Content-Security-Policy)',
'font-weight: bold;', warning)
@ -199,9 +195,9 @@ module.exports = {
const webPreferences = getWebPreferences()
if (!webPreferences || !webPreferences.allowRunningInsecureContent) return
let warning = 'This renderer process has "allowRunningInsecureContent" ' +
'enabled. This exposes users of this app to severe security risks.\n' +
moreInformation
const warning = `This renderer process has "allowRunningInsecureContent"
enabled. This exposes users of this app to severe security risks.\n
${moreInformation}`
console.warn('%cElectron Security Warning (allowRunningInsecureContent)',
'font-weight: bold;', warning)
@ -219,33 +215,32 @@ module.exports = {
return
}
let warning = 'This renderer process has "experimentalFeatures" ' +
'enabled. This exposes users of this app to some security risk. ' +
'If you do not need this feature, you should disable it.\n' +
moreInformation
const warning = `This renderer process has "experimentalFeatures" enabled.
This exposes users of this app to some security risk. If you do not need
this feature, you should disable it.\n ${moreInformation}`
console.warn('%cElectron Security Warning (experimentalFeatures)',
'font-weight: bold;', warning)
},
/**
* #10 on the checklist: Do not use blinkFeatures
* #10 on the checklist: Do not use enableBlinkFeatures
*
* Logs a warning message about blinkFeatures
* Logs a warning message about enableBlinkFeatures
*/
warnAboutBlinkFeatures: () => {
warnAboutEnableBlinkFeatures: () => {
const webPreferences = getWebPreferences()
if (!webPreferences || !webPreferences.blinkFeatures ||
(webPreferences.blinkFeatures.length && webPreferences.blinkFeatures.length === 0)) {
if (webPreferences === null ||
!webPreferences.hasOwnProperty('enableBlinkFeatures') ||
webPreferences.enableBlinkFeatures.length === 0) {
return
}
let warning = 'This renderer process has additional "blinkFeatures" ' +
'enabled. This exposes users of this app to some security risk. ' +
'If you do not need this feature, you should disable it.\n' +
moreInformation
const warning = `This renderer process has additional "enableBlinkFeatures"
enabled. This exposes users of this app to some security risk. If you do not
need this feature, you should disable it.\n ${moreInformation}`
console.warn('%cElectron Security Warning (blinkFeatures)',
console.warn('%cElectron Security Warning (enableBlinkFeatures)',
'font-weight: bold;', warning)
},
@ -262,10 +257,10 @@ module.exports = {
return
}
let warning = 'A <webview> has "allowpopups" set to true. ' +
'This exposes users of this app to some security risk, since popups are just ' +
'BrowserWindows. If you do not need this feature, you should disable it.\n' +
moreInformation
const warning = `A <webview> has "allowpopups" set to true. This exposes
users of this app to some security risk, since popups are just
BrowserWindows. If you do not need this feature, you should disable it.\n
${moreInformation}`
console.warn('%cElectron Security Warning (allowpopups)',
'font-weight: bold;', warning)

View file

@ -13,7 +13,7 @@
"dugite": "^1.45.0",
"electabul": "~0.0.4",
"electron-docs-linter": "^2.3.4",
"electron-typescript-definitions": "^1.3.4",
"electron-typescript-definitions": "^1.3.5",
"github": "^9.2.0",
"husky": "^0.14.3",
"lint": "^1.1.2",

View file

@ -14,7 +14,8 @@ if sys.platform == "win32":
from lib.config import BASE_URL, PLATFORM, enable_verbose_mode, \
get_target_arch, get_zip_name, build_env
from lib.util import scoped_cwd, rm_rf, get_electron_version, make_zip, \
execute, electron_gyp, electron_features
execute, electron_gyp, electron_features, parse_version
from lib.env_util import get_vs_location
ELECTRON_VERSION = get_electron_version()
@ -146,22 +147,28 @@ def copy_chrome_binary(binary):
os.chmod(dest, os.stat(dest).st_mode | stat.S_IEXEC)
def copy_vcruntime_binaries():
with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\Microsoft\VisualStudio\14.0\Setup\VC", 0,
_winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) as key:
crt_dir = _winreg.QueryValueEx(key, "ProductDir")[0]
arch = get_target_arch()
if arch == "ia32":
arch = "x86"
subkey = r"SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\\"
with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey + arch, 0,
_winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) as key:
runtime_version = _winreg.QueryValueEx(key, "Version")[0][1:]
crt_dir += r"redist\{0}\Microsoft.VC140.CRT\\".format(arch)
version_parts = parse_version(runtime_version)
if len(version_parts) > 3:
runtime_version = '.'.join(version_parts[0:3])
vs_location = get_vs_location('[15.0,16.0)')
crt_dir = os.path.join(vs_location, 'VC', 'Redist', 'MSVC', runtime_version,
arch, 'Microsoft.VC141.CRT')
dlls = ["msvcp140.dll", "vcruntime140.dll"]
# Note: copyfile is used to remove the read-only flag
for dll in dlls:
shutil.copyfile(crt_dir + dll, os.path.join(DIST_DIR, dll))
shutil.copyfile(os.path.join(crt_dir, dll), os.path.join(DIST_DIR, dll))
TARGET_BINARIES_EXT.append(dll)

View file

@ -3,6 +3,7 @@
from __future__ import print_function
import itertools
import os
import subprocess
import sys
@ -58,31 +59,42 @@ def get_environment_from_batch_command(env_cmd, initial=None):
proc.communicate()
return result
def get_vs_location(vs_version):
"""
Returns the location of the VS building environment.
The vs_version can be strings like "[15.0,16.0)", meaning 2017, but not the next version.
"""
# vswhere can't handle spaces, like "[15.0, 16.0)" should become "[15.0,16.0)"
vs_version = vs_version.replace(" ", "")
program_files = os.environ.get('ProgramFiles(x86)')
# Find visual studio
proc = subprocess.Popen(
program_files + "\\Microsoft Visual Studio\\Installer\\vswhere.exe "
"-property installationPath "
"-requires Microsoft.VisualStudio.Component.VC.CoreIde "
"-format value "
"-version {0}".format(vs_version),
stdout=subprocess.PIPE)
location = proc.stdout.readline().rstrip()
return location
def get_vs_env(vs_version, arch):
"""
Returns the env object for VS building environment.
The vs_version can be strings like "[15.0,16.0)", meaning 2017, but not the next version.
vs_version is the version of Visual Studio to use. See get_vs_location for
more details.
The arch has to be one of "x86", "amd64", "arm", "x86_amd64", "x86_arm", "amd64_x86",
"amd64_arm", e.g. the args passed to vcvarsall.bat.
"amd64_arm", i.e. the args passed to vcvarsall.bat.
"""
# vswhere can't handle spaces, like "[15.0, 16.0)" should become "[15.0,16.0)"
vs_version = vs_version.replace(" ", "")
# Find visual studio
proc = subprocess.Popen(
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\vswhere.exe "
"-property installationPath "
"-requires Microsoft.VisualStudio.Component.VC.CoreIde "
"-format value "
"-version {0}".format(vs_version),
stdout=subprocess.PIPE)
location = proc.stdout.readline().rstrip()
location = get_vs_location(vs_version)
# Launch the process.
vsvarsall = "{0}\\VC\\Auxiliary\\Build\\vcvarsall.bat".format(location)
return get_environment_from_batch_command([vsvarsall, arch])
return get_environment_from_batch_command([vsvarsall, arch])

View file

@ -49,6 +49,46 @@ describe('deprecations', () => {
assert.equal(typeof nativeImage.createFromDataUrl, 'function')
})
it('renames a property', () => {
let msg
deprecations.setHandler((m) => { msg = m })
const oldPropertyName = 'dingyOldName'
const newPropertyName = 'shinyNewName'
let value = 0
let o = { [newPropertyName]: value }
assert.strictEqual(typeof o[oldPropertyName], 'undefined')
assert.strictEqual(typeof o[newPropertyName], 'number')
deprecate.property(o, oldPropertyName, newPropertyName)
assert.notEqual(typeof msg, 'string')
o[oldPropertyName] = ++value
assert.strictEqual(typeof msg, 'string')
assert.ok(msg.includes(oldPropertyName))
assert.ok(msg.includes(newPropertyName))
assert.strictEqual(o[newPropertyName], value)
assert.strictEqual(o[oldPropertyName], value)
})
it('warns if deprecated property is already set', () => {
let msg
deprecations.setHandler((m) => { msg = m })
const oldPropertyName = 'dingyOldName'
const newPropertyName = 'shinyNewName'
const value = 0
let o = { [oldPropertyName]: value }
deprecate.property(o, oldPropertyName, newPropertyName)
assert.strictEqual(typeof msg, 'string')
assert.ok(msg.includes(oldPropertyName))
assert.ok(msg.includes(newPropertyName))
})
it('throws an exception if no deprecation handler is specified', () => {
assert.throws(() => {
deprecate.log('this is deprecated')

View file

@ -587,35 +587,6 @@ describe('session module', () => {
w.loadURL(`https://127.0.0.1:${server.address().port}`)
})
describe('deprecated function signature', () => {
it('supports accepting the request', (done) => {
session.defaultSession.setCertificateVerifyProc((hostname, certificate, callback) => {
assert.equal(hostname, '127.0.0.1')
callback(true)
})
w.webContents.once('did-finish-load', () => {
assert.equal(w.webContents.getTitle(), 'hello')
done()
})
w.loadURL(`https://127.0.0.1:${server.address().port}`)
})
it('supports rejecting the request', (done) => {
session.defaultSession.setCertificateVerifyProc((hostname, certificate, callback) => {
assert.equal(hostname, '127.0.0.1')
callback(false)
})
const url = `https://127.0.0.1:${server.address().port}`
w.webContents.once('did-finish-load', () => {
assert.equal(w.webContents.getTitle(), url)
done()
})
w.loadURL(url)
})
})
it('rejects the request when the callback is called with -2', (done) => {
session.defaultSession.setCertificateVerifyProc(({hostname, certificate, verificationResult}, callback) => {
assert.equal(hostname, '127.0.0.1')

View file

@ -133,16 +133,16 @@ describe('security warnings', () => {
w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
})
it('should warn about blinkFeatures', (done) => {
it('should warn about enableBlinkFeatures', (done) => {
w = new BrowserWindow({
show: false,
webPreferences: {
blinkFeatures: ['my-cool-feature'],
enableBlinkFeatures: ['my-cool-feature'],
nodeIntegration: false
}
})
w.webContents.once('console-message', (e, level, message) => {
assert(message.includes('blinkFeatures'), message)
assert(message.includes('enableBlinkFeatures'), message)
done()
})