diff --git a/OSSREADME.json b/OSSREADME.json index 40132a7ff3f..cb4a400020b 100644 --- a/OSSREADME.json +++ b/OSSREADME.json @@ -68,7 +68,7 @@ }, { "name": "chromium", - "version": "52.0.2743.82", + "version": "53.0.2785.143", "repositoryURL": "http://www.chromium.org/Home", "licenseDetail": [ "BSD License", @@ -104,7 +104,7 @@ }, { "name": "libchromiumcontent", - "version": "52.0.2743.82", + "version": "53.0.2785.143", "license": "MIT", "repositoryURL": "https://github.com/electron/libchromiumcontent", "isProd": true @@ -117,7 +117,7 @@ }, { "name": "electron", - "version": "1.3.8", + "version": "1.4.6", "license": "MIT", "repositoryURL": "https://github.com/electron/electron", "isProd": true diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index be428894ccd..bea99c8552a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -289,7 +289,6 @@ function packageTask(platform, arch, opts) { if (platform === 'win32') { result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32' })); - result = es.merge(result, gulp.src('resources/win32/bin/cat.exe', { base: 'resources/win32' })); result = es.merge(result, gulp.src('resources/win32/bin/code.cmd', { base: 'resources/win32' }) .pipe(replace('@@NAME@@', product.nameShort)) diff --git a/package.json b/package.json index 11eb0a4c29b..b2190c2e713 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.8.0", - "electronVersion": "1.3.8", + "electronVersion": "1.4.6", "distro": "cc6a2710b81e898b8cde2b51ba29e178980009e8", "author": { "name": "Microsoft Corporation" diff --git a/resources/win32/bin/cat.exe b/resources/win32/bin/cat.exe deleted file mode 100644 index e5490f2a78b..00000000000 Binary files a/resources/win32/bin/cat.exe and /dev/null differ diff --git a/resources/win32/bin/code.cmd b/resources/win32/bin/code.cmd index 377f7c1e120..85d97eb39eb 100644 --- a/resources/win32/bin/code.cmd +++ b/resources/win32/bin/code.cmd @@ -2,5 +2,5 @@ setlocal set VSCODE_DEV= set ELECTRON_RUN_AS_NODE=1 -call "%~dp0..\@@NAME@@.exe" "%~dp0..\resources\app\out\cli.js" %* | "%~dp0\cat.exe" +call "%~dp0..\@@NAME@@.exe" "%~dp0..\resources\app\out\cli.js" %* endlocal \ No newline at end of file diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index 49636eec1e2..1281a1f8c38 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -11,5 +11,5 @@ if [ "$(expr substr $(uname -s) 1 9)" == "CYGWIN_NT" ]; then else CLI="$VSCODE_PATH/resources/app/out/cli.js" fi -ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" | cat +ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" exit $? diff --git a/scripts/test.bat b/scripts/test.bat index 04e2aa06416..e1aa4bef47f 100644 --- a/scripts/test.bat +++ b/scripts/test.bat @@ -17,7 +17,7 @@ if not "%BUILD_BUILDID%" == "" ( rem Otherwise if "%BUILD_BUILDID%" == "" ( - %CODE% .\node_modules\mocha\bin\_mocha --reporter dot %* | .\resources\win32\bin\cat + %CODE% .\node_modules\mocha\bin\_mocha --reporter dot %* ) popd diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index 330adfe080b..261fdff932f 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron v1.3.5 +// Type definitions for Electron v1.4.4 // Project: http://electron.atom.io/ // Definitions by: jedmao , rhysd , Milan Burda // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped @@ -46,6 +46,17 @@ declare namespace Electron { height: number; } + interface Destroyable { + /** + * Destroys the object. + */ + destroy(): void; + /** + * @returns Whether the object is destroyed. + */ + isDestroyed(): boolean; + } + // https://github.com/electron/electron/blob/master/docs/api/app.md /** @@ -66,7 +77,7 @@ declare namespace Electron { /** * Emitted when Electron has finished initialization. */ - on(event: 'ready', listener: Function): this; + on(event: 'ready', listener: (event: Event, launchInfo: Object) => void): this; /** * Emitted when all windows have been closed. * @@ -180,7 +191,7 @@ declare namespace Electron { /** * Emitted when the gpu process crashes. */ - on(event: 'gpu-process-crashed', listener: Function): this; + on(event: 'gpu-process-crashed', listener: (event: Event, killed: boolean) => void): this; /** * Emitted when Chrome's accessibility support changes. * @@ -222,6 +233,10 @@ declare namespace Electron { args?: string[], execPath?: string }): void; + /** + * @returns Whether Electron has finished initializing. + */ + isReady(): boolean; /** * On Linux, focuses on the first visible window. * On macOS, makes the application the active app. @@ -425,6 +440,13 @@ declare namespace Electron { * Note: This API is only available on macOS and Windows. */ setLoginItemSettings(settings: LoginItemSettings): void; + /** + * Set the about panel options. This will override the values defined in the app's .plist file. + * See the Apple docs for more details. + * + * Note: This API is only available on macOS. + */ + setAboutPanelOptions(options: AboutPanelOptions): void; commandLine: CommandLine; /** * Note: This API is only available on macOS. @@ -432,7 +454,7 @@ declare namespace Electron { dock: Dock; } - type AppPathName = 'home' | 'appData' | 'userData' | 'temp' | 'exe' | 'module' | 'desktop' | 'documents' | 'downloads' | 'music' | 'pictures' | 'videos' | 'pepperFlashSystemPlugin'; + type AppPathName = 'home'|'appData'|'userData'|'temp'|'exe'|'module'|'desktop'|'documents'|'downloads'|'music'|'pictures'|'videos'|'pepperFlashSystemPlugin'; interface ImportCertificateOptions { /** @@ -686,12 +708,35 @@ declare namespace Electron { restoreState?: boolean; } + interface AboutPanelOptions { + /** + * The app's name. + */ + applicationName?: string; + /** + * The app's version. + */ + applicationVersion?: string; + /** + * Copyright information. + */ + copyright?: string; + /** + * Credit information. + */ + credits?: string; + /** + * The app's build version number. + */ + version?: string; + } + // https://github.com/electron/electron/blob/master/docs/api/auto-updater.md /** * This module provides an interface for the Squirrel auto-updater framework. */ - interface AutoUpdater extends NodeJS.EventEmitter { + interface AutoUpdater extends EventEmitter { /** * Emitted when there is an error while updating. */ @@ -740,7 +785,7 @@ declare namespace Electron { * The BrowserWindow class gives you ability to create a browser window. * You can also create a window without chrome by using Frameless Window API. */ - class BrowserWindow extends EventEmitter { + class BrowserWindow extends EventEmitter implements Destroyable { /** * Emitted when the document changed its title, * calling event.preventDefault() would prevent the native window’s title to change. @@ -841,6 +886,11 @@ declare namespace Electron { * Note: This is only implemented on macOS. */ on(event: 'scroll-touch-end', listener: Function): this; + /** + * Emitted when scroll wheel event phase filed upon reaching the edge of element. + * Note: This is only implemented on macOS. + */ + on(event: 'scroll-touch-edge', listener: Function): this; /** * Emitted on 3-finger swipe. * Note: This is only implemented on macOS. @@ -1099,7 +1149,7 @@ declare namespace Electron { * setting this, the window is still a normal window, not a toolbox window * which can not be focused on. */ - setAlwaysOnTop(flag: boolean): void; + setAlwaysOnTop(flag: boolean, level?: WindowLevel): void; /** * @returns Whether the window is always on top of other windows. */ @@ -1352,8 +1402,8 @@ declare namespace Electron { getChildWindows(): BrowserWindow[]; } + type WindowLevel = 'normal' | 'floating' | 'torn-off-menu' | 'modal-panel' | 'main-menu' | 'status' | 'pop-up-menu' | 'screen-saver' | 'dock'; type SwipeDirection = 'up' | 'right' | 'down' | 'left'; - type ThumbarButtonFlags = 'enabled' | 'disabled' | 'dismissonclick' | 'nobackground' | 'hidden' | 'noninteractive'; interface ThumbarButton { @@ -1371,6 +1421,12 @@ declare namespace Electron { } interface WebPreferences { + /** + * Whether to enable DevTools. + * If it is set to false, can not use BrowserWindow.webContents.openDevTools() to open DevTools. + * Default: true. + */ + devTools?: boolean; /** * Whether node integration is enabled. * Default: true. @@ -1527,6 +1583,11 @@ declare namespace Electron { * Default: false. */ offscreen?: boolean; + /** + * Whether to enable Chromium OS-level sandbox. + * Default: false. + */ + sandbox?: boolean; } interface BrowserWindowOptions { @@ -1653,7 +1714,7 @@ declare namespace Electron { /** * The window icon, when omitted on Windows the executable’s icon would be used as window icon. */ - icon?: NativeImage | string; + icon?: NativeImage|string; /** * Whether window should be shown when created. * Default: true. @@ -1961,7 +2022,7 @@ declare namespace Electron { interface CrashReporterStartOptions { /** - * Default: Electron + * Default: app.getName() */ productName?: string; companyName: string; @@ -1982,7 +2043,7 @@ declare namespace Electron { * An object you can define that will be sent along with the report. * Only string properties are sent correctly, nested objects are not supported. */ - extra?: { [prop: string]: string }; + extra?: {[prop: string]: string}; } interface CrashReport { @@ -2478,7 +2539,7 @@ declare namespace Electron { * In Electron for the APIs that take images, you can pass either file paths * or NativeImage instances. When passing null, an empty image will be used. */ - icon?: NativeImage | string; + icon?: NativeImage|string; /** * If false, the menu item will be greyed out and unclickable. */ @@ -2495,7 +2556,7 @@ declare namespace Electron { * Should be specified for submenu type menu item, when it's specified the * type: 'submenu' can be omitted for the menu item */ - submenu?: Menu | MenuItemOptions[]; + submenu?: Menu|MenuItemOptions[]; /** * Unique within a single menu. If defined then it can be used as a reference * to this item by the position attribute. @@ -2583,6 +2644,7 @@ declare namespace Electron { static createEmpty(): NativeImage; /** * Creates a new NativeImage instance from file located at path. + * This method returns an empty image if the path does not exist, cannot be read, or is not a valid image. */ static createFromPath(path: string): NativeImage; /** @@ -2615,7 +2677,7 @@ declare namespace Electron { */ getBitmap(): Buffer; /** - * @returns string The data URL of the image. + * @returns The data URL of the image. */ toDataURL(): string; /** @@ -2625,11 +2687,11 @@ declare namespace Electron { */ getNativeHandle(): Buffer; /** - * @returns boolean Whether the image is empty. + * @returns Whether the image is empty. */ isEmpty(): boolean; /** - * @returns {} The size of the image. + * @returns The size of the image. */ getSize(): Size; /** @@ -2640,6 +2702,28 @@ declare namespace Electron { * Returns a boolean whether the image is a template image. */ isTemplateImage(): boolean; + /** + * @param rect The area of the image to crop + * @returns The cropped image. + */ + crop(rect: Rectangle): NativeImage; + /** + * @returns The resized image. + * If only the height or the width are specified then the current aspect ratio will be preserved in the resized image. + */ + resize(options: { + width?: number; + height?: number; + /** + * The desired quality of the resized image. + * Default: best. + */ + quality?: 'good' | 'better' | 'best'; + }): NativeImage; + /** + * @returns The image's aspect ratio. + */ + getAspectRatio(): number; } // https://github.com/electron/electron/blob/master/docs/api/power-monitor.md @@ -2677,7 +2761,7 @@ declare namespace Electron { interface PowerSaveBlocker { /** * Starts preventing the system from entering lower-power mode. - * @returns an integer identifying the power save blocker. + * @returns The blocker ID that is assigned to this power blocker. * Note: prevent-display-sleep has higher has precedence over prevent-app-suspension. */ start(type: 'prevent-app-suspension' | 'prevent-display-sleep'): number; @@ -2688,7 +2772,7 @@ declare namespace Electron { stop(id: number): void; /** * @param id The power save blocker id returned by powerSaveBlocker.start. - * @returns a boolean whether the corresponding powerSaveBlocker has started. + * @returns Whether the corresponding powerSaveBlocker has started. */ isStarted(id: number): boolean; } @@ -2763,8 +2847,18 @@ declare namespace Electron { referrer: string; method: string; uploadData?: { + /** + * Content being sent. + */ bytes: Buffer, - file: string + /** + * Path of file being uploaded. + */ + file: string, + /** + * UUID of blob data. Use session.getBlobData method to retrieve the data. + */ + blobUUID: string; }[]; } @@ -3010,6 +3104,10 @@ declare namespace Electron { * @returns The user agent for this session. */ getUserAgent(): string; + /** + * Returns the blob data associated with the identifier. + */ + getBlobData(identifier: string, callback: (result: Buffer) => void): void; /** * The webRequest API set allows to intercept and modify contents of a request at various stages of its lifetime. */ @@ -3110,6 +3208,11 @@ declare namespace Electron { } interface Cookie { + /** + * Emitted when a cookie is changed because it was added, edited, removed, or expired. + */ + on(event: 'changed', listener: (event: Event, cookie: Cookie, cause: CookieChangedCause) => void): this; + on(event: string, listener: Function): this; /** * The name of the cookie. */ @@ -3149,6 +3252,8 @@ declare namespace Electron { expirationDate?: number; } + type CookieChangedCause = 'explicit' | 'overwrite' | 'expired' | 'evicted' | 'expired-overwrite'; + interface CookieDetails { /** * The URL associated with the cookie. @@ -3311,6 +3416,10 @@ declare namespace Electron { * Path of file being uploaded. */ file: string; + /** + * UUID of blob data. Use session.getBlobData method to retrieve the data. + */ + blobUUID: string; } interface BeforeRequestDetails extends Details { @@ -3396,16 +3505,18 @@ declare namespace Electron { interface Shell { /** * Show the given file in a file manager. If possible, select the file. + * @returns Whether the item was successfully shown. */ - showItemInFolder(fullPath: string): void; + showItemInFolder(fullPath: string): boolean; /** * Open the given file in the desktop's default manner. + * @returns Whether the item was successfully shown. */ - openItem(fullPath: string): void; + openItem(fullPath: string): boolean; /** * Open the given external protocol URL in the desktop's default manner * (e.g., mailto: URLs in the default mail user agent). - * @returns true if an application was available to open the URL, false otherwise. + * @returns Whether an application was available to open the URL. */ openExternal(url: string, options?: { /** @@ -3416,7 +3527,7 @@ declare namespace Electron { }): boolean; /** * Move the given file to trash. - * @returns boolean status for the operation. + * @returns Whether the item was successfully moved to the trash. */ moveItemToTrash(fullPath: string): boolean; /** @@ -3483,18 +3594,69 @@ declare namespace Electron { // https://github.com/electron/electron/blob/master/docs/api/system-preferences.md + type SystemColor = + '3d-dark-shadow' | // Dark shadow for three-dimensional display elements. + '3d-face' | // Face color for three-dimensional display elements and for dialog box backgrounds. + '3d-highlight' | // Highlight color for three-dimensional display elements. + '3d-light' | // Light color for three-dimensional display elements. + '3d-shadow' | // Shadow color for three-dimensional display elements. + 'active-border' | // Active window border. + 'active-caption' | // Active window title bar. Specifies the left side color in the color gradient of an active window's title bar if the gradient effect is enabled. + 'active-caption-gradient' | // Right side color in the color gradient of an active window's title bar. + 'app-workspace' | // Background color of multiple document interface (MDI) applications. + 'button-text' | // Text on push buttons. + 'caption-text' | // Text in caption, size box, and scroll bar arrow box. + 'desktop' | // Desktop background color. + 'disabled-text' | // Grayed (disabled) text. + 'highlight' | // Item(s) selected in a control. + 'highlight-text' | // Text of item(s) selected in a control. + 'hotlight' | // Color for a hyperlink or hot-tracked item. + 'inactive-border' | // Inactive window border. + 'inactive-caption' | // Inactive window caption. Specifies the left side color in the color gradient of an inactive window's title bar if the gradient effect is enabled. + 'inactive-caption-gradient' | // Right side color in the color gradient of an inactive window's title bar. + 'inactive-caption-text' | // Color of text in an inactive caption. + 'info-background' | // Background color for tooltip controls. + 'info-text' | // Text color for tooltip controls. + 'menu' | // Menu background. + 'menu-highlight' | // The color used to highlight menu items when the menu appears as a flat menu. + 'menubar' | // The background color for the menu bar when menus appear as flat menus. + 'menu-text' | // Text in menus. + 'scrollbar' | // Scroll bar gray area. + 'window' | // Window background. + 'window-frame' | // Window frame. + 'window-text'; // Text in windows. + /** * Get system preferences. */ interface SystemPreferences { /** - * @returns If the system is in Dark Mode. + * Note: This is only implemented on Windows. + */ + on(event: 'accent-color-changed', listener: (event: Event, newColor: string) => void): this; + /** + * Note: This is only implemented on Windows. + */ + on(event: 'color-changed', listener: (event: Event) => void): this; + /** + * Note: This is only implemented on Windows. + */ + on(event: 'inverted-color-scheme-changed', listener: ( + event: Event, + /** + * @param invertedColorScheme true if an inverted color scheme, such as a high contrast theme, is being used, false otherwise. + */ + invertedColorScheme: boolean + ) => void): this; + on(event: string, listener: Function): this; + /** + * @returns Whether the system is in Dark Mode. * * Note: This is only implemented on macOS. */ isDarkMode(): boolean; /** - * @returns If the Swipe between pages setting is on. + * @returns Whether the Swipe between pages setting is on. * * Note: This is only implemented on macOS. */ @@ -3541,13 +3703,29 @@ declare namespace Electron { */ getUserDefault(key: string, type: 'string' | 'boolean' | 'integer' | 'float' | 'double' | 'url' | 'array' | 'dictionary'): any; /** - * This method returns true if DWM composition (Aero Glass) is enabled, - * and false otherwise. You can use it to determine if you should create - * a transparent window or not (transparent windows won’t work correctly when DWM composition is disabled). + * @returns Whether DWM composition (Aero Glass) is enabled. * * Note: This is only implemented on Windows. */ isAeroGlassEnabled(): boolean; + /** + * @returns The users current system wide color preference in the form of an RGBA hexadecimal string. + * + * Note: This is only implemented on Windows. + */ + getAccentColor(): string; + /** + * @returns true if an inverted color scheme, such as a high contrast theme, is active, false otherwise. + * + * Note: This is only implemented on Windows. + */ + isInvertedColorScheme(): boolean; + /** + * @returns The system color setting in RGB hexadecimal form (#ABCDEF). See the Windows docs for more details. + * + * Note: This is only implemented on Windows. + */ + getColor(color: SystemColor): string; } // https://github.com/electron/electron/blob/master/docs/api/tray.md @@ -3555,7 +3733,7 @@ declare namespace Electron { /** * A Tray represents an icon in an operating system's notification area. */ - interface Tray extends NodeJS.EventEmitter { + class Tray extends EventEmitter implements Destroyable { /** * Emitted when the tray icon is clicked. * Note: The bounds payload is only implemented on macOS and Windows. @@ -3620,7 +3798,7 @@ declare namespace Electron { /** * Creates a new tray icon associated with the image. */ - new (image: NativeImage | string): Tray; + constructor(image: NativeImage|string); /** * Destroys the tray icon immediately. */ @@ -3628,7 +3806,7 @@ declare namespace Electron { /** * Sets the image associated with this tray icon. */ - setImage(image: NativeImage | string): void; + setImage(image: NativeImage|string): void; /** * Sets the image associated with this tray icon when pressed. */ @@ -3671,6 +3849,10 @@ declare namespace Electron { * @returns The bounds of this tray icon. */ getBounds(): Rectangle; + /** + * @returns Whether the tray icon is destroyed. + */ + isDestroyed(): boolean; } interface Modifiers { @@ -3776,12 +3958,21 @@ declare namespace Electron { * By default a new BrowserWindow will be created for the url. * * Calling event.preventDefault() will prevent creating new windows. + * In such case, the event.newGuest may be set with a reference + * to a BrowserWindow instance to make it used by the Electron's runtime. */ - on(event: 'new-window', listener: (event: Event, + on(event: 'new-window', listener: (event: WebContents.NewWindowEvent, url: string, frameName: string, disposition: NewWindowDisposition, - options: BrowserWindowOptions + /** + * The options which will be used for creating the new BrowserWindow. + */ + options: BrowserWindowOptions, + /** + * The non-standard features (features not handled by Chromium or Electron) given to window.open(). + */ + additionalFeatures: string[] ) => void): this; /** * Emitted when a user or the page wants to start navigation. @@ -3814,7 +4005,7 @@ declare namespace Electron { /** * Emitted when the renderer process has crashed. */ - on(event: 'crashed', listener: Function): this; + on(event: 'crashed', listener: (event: Event, killed: boolean) => void): this; /** * Emitted when a plugin process has crashed. */ @@ -4229,6 +4420,10 @@ declare namespace Electron { * If offscreen rendering is enabled returns the current frame rate. */ getFrameRate(): number; + /** + * If offscreen rendering is enabled invalidates the frame and generates a new one through the 'paint' event. + */ + invalidate(): void; /** * Sets the item as dragging item for current drag-drop operation. */ @@ -4265,6 +4460,12 @@ declare namespace Electron { debugger: Debugger; } + namespace WebContents { + interface NewWindowEvent extends Event { + newGuest?: BrowserWindow; + } + } + interface BeginFrameSubscriptionCallback { ( /** @@ -4430,7 +4631,7 @@ declare namespace Electron { [key: string]: string; } - type NewWindowDisposition = 'default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'other'; + type NewWindowDisposition = 'default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'; /** * Specifies the action to take place when ending webContents.findInPage request. @@ -4440,7 +4641,7 @@ declare namespace Electron { */ type StopFindInPageAtion = 'clearSelection' | 'keepSelection' | 'activateSelection'; - type CursorType = 'default' | 'crosshair' | 'pointer' | 'text' | 'wait' | 'help' | 'e-resize' | 'n-resize' | 'ne-resize' | 'nw-resize' | 's-resize' | 'se-resize' | 'sw-resize' | 'w-resize' | 'ns-resize' | 'ew-resize' | 'nesw-resize' | 'nwse-resize' | 'col-resize' | 'row-resize' | 'm-panning' | 'e-panning' | 'n-panning' | 'ne-panning' | 'nw-panning' | 's-panning' | 'se-panning' | 'sw-panning' | 'w-panning' | 'move' | 'vertical-text' | 'cell' | 'context-menu' | 'alias' | 'progress' | 'nodrop' | 'copy' | 'none' | 'not-allowed' | 'zoom-in' | 'zoom-out' | 'grab' | 'grabbing' | 'custom'; + type CursorType = 'default' | 'crosshair' | 'pointer' | 'text' | 'wait' | 'help' | 'e-resize' | 'n-resize' | 'ne-resize' | 'nw-resize' | 's-resize' | 'se-resize' | 'sw-resize' | 'w-resize' | 'ns-resize' | 'ew-resize' | 'nesw-resize' | 'nwse-resize' | 'col-resize' | 'row-resize' | 'm-panning' | 'e-panning' | 'n-panning' | 'ne-panning' | 'nw-panning' | 's-panning' | 'se-panning' |'sw-panning' | 'w-panning' | 'move' | 'vertical-text' | 'cell' | 'context-menu' | 'alias' | 'progress' | 'nodrop' | 'copy' | 'none' | 'not-allowed' | 'zoom-in' | 'zoom-out' | 'grab' | 'grabbing' | 'custom'; interface LoadURLOptions { /** @@ -4873,6 +5074,15 @@ declare namespace Electron { * A list of strings which specifies the blink features to be disabled separated by ,. */ disableblinkfeatures: string; + /** + * A value that links the webview to a specific webContents. + * When a webview first loads a new webContents is created and this attribute is set + * to its instance identifier. Setting this attribute on a new or existing webview connects + * it to the existing webContents that currently renders in a different webview. + * + * The existing webview will see the destroy event and will then create a new webContents when a new url is loaded. + */ + guestinstance: string; /** * Loads the url in the webview, the url must contain the protocol prefix, e.g. the http:// or file://. */ @@ -5411,7 +5621,7 @@ declare namespace Electron { screen: Electron.Screen; session: typeof Electron.Session; systemPreferences: Electron.SystemPreferences; - Tray: Electron.Tray; + Tray: typeof Electron.Tray; webContents: Electron.WebContentsStatic; } diff --git a/src/vs/base/node/stdFork.ts b/src/vs/base/node/stdFork.ts index 44c6a3f3b17..83dc15268ab 100644 --- a/src/vs/base/node/stdFork.ts +++ b/src/vs/base/node/stdFork.ts @@ -50,6 +50,7 @@ function generatePatchedEnv(env: any, stdInPipeName: string, stdOutPipeName: str newEnv['STDOUT_PIPE_NAME'] = stdOutPipeName; newEnv['STDERR_PIPE_NAME'] = stdErrPipeName; newEnv['ELECTRON_RUN_AS_NODE'] = '1'; + newEnv['ELECTRON_NO_ASAR'] = '1'; return newEnv; } diff --git a/src/vs/base/parts/tree/browser/tree.css b/src/vs/base/parts/tree/browser/tree.css index a51fc66bdc6..2d2f61abc41 100644 --- a/src/vs/base/parts/tree/browser/tree.css +++ b/src/vs/base/parts/tree/browser/tree.css @@ -55,8 +55,6 @@ border-radius: 10px; font-size: 12px; position: absolute; - top: 0; - left: 0; } /* for OS X ballistic scrolling */ diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 0a0013a2bf4..0b57fc3713b 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -9,7 +9,7 @@ import * as path from 'path'; import * as platform from 'vs/base/common/platform'; import * as objects from 'vs/base/common/objects'; import { IStorageService } from 'vs/code/electron-main/storage'; -import { shell, screen, BrowserWindow } from 'electron'; +import { shell, screen, BrowserWindow, systemPreferences } from 'electron'; import { TPromise, TValueCallback } from 'vs/base/common/winjs.base'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { ILogService } from 'vs/code/electron-main/log'; @@ -99,6 +99,7 @@ export interface IWindowConfiguration extends ParsedArgs { zoomLevel?: number; fullscreen?: boolean; + highContrast?: boolean; workspacePath?: string; @@ -158,7 +159,9 @@ export class VSCodeWindow { this.restoreWindowState(config.state); // For VS theme we can show directly because background is white - const usesLightTheme = /vs($| )/.test(this.storageService.getItem(VSCodeWindow.colorThemeStorageKey)); + const themeId = this.storageService.getItem(VSCodeWindow.colorThemeStorageKey); + const usesLightTheme = /vs($| )/.test(themeId); + const usesHighContrastTheme = /hc-black($| )/.test(themeId) || (platform.isWindows && systemPreferences.isInvertedColorScheme()); if (!global.windowShow) { global.windowShow = Date.now(); } @@ -171,7 +174,7 @@ export class VSCodeWindow { height: this.windowState.height, x: this.windowState.x, y: this.windowState.y, - backgroundColor: usesLightTheme ? '#FFFFFF' : platform.isMacintosh ? '#171717' : '#1E1E1E', // https://github.com/electron/electron/issues/5150 + backgroundColor: usesHighContrastTheme ? '#000000' : usesLightTheme ? '#FFFFFF' : platform.isMacintosh ? '#171717' : '#1E1E1E', // https://github.com/electron/electron/issues/5150 minWidth: VSCodeWindow.MIN_WIDTH, minHeight: VSCodeWindow.MIN_HEIGHT, show: !isFullscreenOrMaximized, @@ -369,6 +372,17 @@ export class VSCodeWindow { this.sendWhenReady('vscode:leaveFullScreen'); }); + // React to HC color scheme changes (Windows) + if (platform.isWindows) { + systemPreferences.on('inverted-color-scheme-changed', () => { + if (systemPreferences.isInvertedColorScheme()) { + this.sendWhenReady('vscode:enterHighContrast'); + } else { + this.sendWhenReady('vscode:leaveHighContrast'); + } + }); + } + // Window Failed to load this._win.webContents.on('did-fail-load', (event: Event, errorCode: string, errorDescription: string) => { console.warn('[electron event]: fail to load, ', errorDescription); @@ -463,6 +477,9 @@ export class VSCodeWindow { // Set fullscreen state windowConfiguration.fullscreen = this._win.isFullScreen(); + // Set High Contrast state + windowConfiguration.highContrast = platform.isWindows && systemPreferences.isInvertedColorScheme(); + // Config (combination of process.argv and window configuration) const environment = parseArgs(process.argv); const config = objects.assign(environment, windowConfiguration); diff --git a/src/vs/code/node/sharedProcess.ts b/src/vs/code/node/sharedProcess.ts index 880458ff00f..6d2fa73bcb8 100644 --- a/src/vs/code/node/sharedProcess.ts +++ b/src/vs/code/node/sharedProcess.ts @@ -24,7 +24,8 @@ const boostrapPath = URI.parse(require.toUrl('bootstrap')).fsPath; function _spawnSharedProcess(initData: ISharedProcessInitData, options: ISharedProcessOptions): cp.ChildProcess { const execArgv = []; const env = assign({}, process.env, { - AMD_ENTRYPOINT: 'vs/code/node/sharedProcessMain' + AMD_ENTRYPOINT: 'vs/code/node/sharedProcessMain', + ELECTRON_NO_ASAR: '1' }); if (options.allowOutput) { diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 4e2513c6260..5fb30c54bc3 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -135,6 +135,16 @@ function main() { webFrame.setZoomLevel(zoomLevel); } + // Handle high contrast mode + if (configuration.highContrast) { + var themeStorageKey = 'storage://global/workbench.theme'; + var hcTheme = 'hc-black vscode-theme-defaults-themes-hc_black-json'; + if (window.localStorage.getItem(themeStorageKey) !== hcTheme) { + window.localStorage.setItem(themeStorageKey, hcTheme); + window.document.body.className = 'monaco-shell ' + hcTheme; + } + } + // Load the loader and start loading the workbench const rootUrl = uriFromPath(configuration.appRoot) + '/out'; diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index 909749f069f..f3fe3e1185f 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -95,7 +95,8 @@ export class ExtensionHostProcessWorker { AMD_ENTRYPOINT: 'vs/workbench/node/extensionHostProcess', PIPE_LOGGING: 'true', VERBOSE_LOGGING: true, - VSCODE_WINDOW_ID: String(this.windowService.getWindowId()) + VSCODE_WINDOW_ID: String(this.windowService.getWindowId()), + ELECTRON_NO_ASAR: '1' }), // We only detach the extension host on windows. Linux and Mac orphan by default // and detach under Linux and Mac create another process group. diff --git a/src/vs/workbench/electron-browser/integration.ts b/src/vs/workbench/electron-browser/integration.ts index 8010c7ec0ec..df680ab91d6 100644 --- a/src/vs/workbench/electron-browser/integration.ts +++ b/src/vs/workbench/electron-browser/integration.ts @@ -24,6 +24,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IThemeService, VS_HC_THEME, VS_DARK_THEME } from 'vs/workbench/services/themes/common/themeService'; import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser/windowService'; import { AutoSaveConfiguration } from 'vs/platform/files/common/files'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; @@ -74,7 +75,8 @@ export class ElectronIntegration { @IContextMenuService private contextMenuService: IContextMenuService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IUntitledEditorService private untitledEditorService: IUntitledEditorService, - @IEnvironmentService private environmentService: IEnvironmentService + @IEnvironmentService private environmentService: IEnvironmentService, + @IThemeService private themeService: IThemeService ) { } @@ -145,6 +147,19 @@ export class ElectronIntegration { }); }); + // High Contrast Events + ipc.on('vscode:enterHighContrast', (event) => { + this.partService.joinCreation().then(() => { + this.themeService.setColorTheme(VS_HC_THEME, false); + }); + }); + + ipc.on('vscode:leaveHighContrast', (event) => { + this.partService.joinCreation().then(() => { + this.themeService.setColorTheme(VS_DARK_THEME, false); + }); + }); + // Configuration changes let previousConfiguredZoomLevel: number; this.configurationService.onDidUpdateConfiguration(e => { diff --git a/src/vs/workbench/services/themes/common/themeService.ts b/src/vs/workbench/services/themes/common/themeService.ts index 01d78d2e874..60adbc87b10 100644 --- a/src/vs/workbench/services/themes/common/themeService.ts +++ b/src/vs/workbench/services/themes/common/themeService.ts @@ -10,6 +10,10 @@ import Event from 'vs/base/common/event'; export let IThemeService = createDecorator('themeService'); +export const VS_LIGHT_THEME = 'vs'; +export const VS_DARK_THEME = 'vs-dark'; +export const VS_HC_THEME = 'hc-black'; + export interface IThemeService { _serviceBrand: any; setColorTheme(themeId: string, broadcastToAllWindows: boolean): TPromise; diff --git a/src/vs/workbench/services/themes/electron-browser/themeService.ts b/src/vs/workbench/services/themes/electron-browser/themeService.ts index fce74dd687e..10966a451ec 100644 --- a/src/vs/workbench/services/themes/electron-browser/themeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/themeService.ts @@ -11,7 +11,7 @@ import Json = require('vs/base/common/json'); import { IThemeExtensionPoint } from 'vs/platform/theme/common/themeExtensionPoint'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/platform/extensions/common/extensionsRegistry'; -import { IThemeService, IThemeData, IThemeSetting, IThemeDocument } from 'vs/workbench/services/themes/common/themeService'; +import { IThemeService, IThemeData, IThemeSetting, IThemeDocument, VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME } from 'vs/workbench/services/themes/common/themeService'; import { TokenStylesContribution, EditorStylesContribution, SearchViewStylesContribution, TerminalStylesContribution } from 'vs/workbench/services/themes/electron-browser/stylesContributions'; import { getBaseThemeId } from 'vs/platform/theme/common/themes'; import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser/windowService'; @@ -44,9 +44,9 @@ const oldDefaultThemeExtensionId = 'vscode-theme-colorful-defaults'; function validateThemeId(theme: string): string { // migrations switch (theme) { - case 'vs': return `vs ${defaultThemeExtensionId}-themes-light_vs-json`; - case 'vs-dark': return `vs-dark ${defaultThemeExtensionId}-themes-dark_vs-json`; - case 'hc-black': return `hc-black ${defaultThemeExtensionId}-themes-hc_black-json`; + case VS_LIGHT_THEME: return `vs ${defaultThemeExtensionId}-themes-light_vs-json`; + case VS_DARK_THEME: return `vs-dark ${defaultThemeExtensionId}-themes-dark_vs-json`; + case VS_HC_THEME: return `hc-black ${defaultThemeExtensionId}-themes-hc_black-json`; case `vs ${oldDefaultThemeExtensionId}-themes-light_plus-tmTheme`: return `vs ${defaultThemeExtensionId}-themes-light_plus-json`; case `vs-dark ${oldDefaultThemeExtensionId}-themes-dark_plus-tmTheme`: return `vs-dark ${defaultThemeExtensionId}-themes-dark_plus-json`; } @@ -58,7 +58,7 @@ let themesExtPoint = ExtensionsRegistry.registerExtensionPoint