Merge remote-tracking branch 'atom/master'
This commit is contained in:
commit
dd7036035a
17 changed files with 240 additions and 21 deletions
|
@ -45,6 +45,9 @@ BrowserWindow::_init = ->
|
||||||
@on 'focus', (event) =>
|
@on 'focus', (event) =>
|
||||||
app.emit 'browser-window-focus', event, this
|
app.emit 'browser-window-focus', event, this
|
||||||
|
|
||||||
|
# Notify the creation of the window.
|
||||||
|
app.emit 'browser-window-created', {}, this
|
||||||
|
|
||||||
BrowserWindow.getFocusedWindow = ->
|
BrowserWindow.getFocusedWindow = ->
|
||||||
windows = BrowserWindow.getAllWindows()
|
windows = BrowserWindow.getAllWindows()
|
||||||
return window for window in windows when window.isFocused()
|
return window for window in windows when window.isFocused()
|
||||||
|
|
|
@ -357,6 +357,17 @@ NativeWindowMac::NativeWindowMac(
|
||||||
styleMask |= NSTexturedBackgroundWindowMask;
|
styleMask |= NSTexturedBackgroundWindowMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string titleBarStyle = "default";
|
||||||
|
options.Get(switches::kTitleBarStyle, &titleBarStyle);
|
||||||
|
|
||||||
|
if (base::mac::IsOSYosemiteOrLater()) {
|
||||||
|
// New title bar styles are available in Yosemite or newer
|
||||||
|
if ((titleBarStyle == "hidden") || (titleBarStyle == "hidden-inset")) {
|
||||||
|
styleMask |= NSFullSizeContentViewWindowMask;
|
||||||
|
styleMask |= NSUnifiedTitleAndToolbarWindowMask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
window_.reset([[AtomNSWindow alloc]
|
window_.reset([[AtomNSWindow alloc]
|
||||||
initWithContentRect:cocoa_bounds
|
initWithContentRect:cocoa_bounds
|
||||||
styleMask:styleMask
|
styleMask:styleMask
|
||||||
|
@ -382,6 +393,20 @@ NativeWindowMac::NativeWindowMac(
|
||||||
// We will manage window's lifetime ourselves.
|
// We will manage window's lifetime ourselves.
|
||||||
[window_ setReleasedWhenClosed:NO];
|
[window_ setReleasedWhenClosed:NO];
|
||||||
|
|
||||||
|
// Configure title bar look on Yosemite or newer
|
||||||
|
if (base::mac::IsOSYosemiteOrLater()) {
|
||||||
|
if ((titleBarStyle == "hidden") || (titleBarStyle == "hidden-inset")) {
|
||||||
|
[window_ setTitlebarAppearsTransparent:YES];
|
||||||
|
[window_ setTitleVisibility:NSWindowTitleHidden];
|
||||||
|
if (titleBarStyle == "hidden-inset") {
|
||||||
|
NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"];
|
||||||
|
toolbar.showsBaselineSeparator = NO;
|
||||||
|
[window_ setToolbar:toolbar];
|
||||||
|
[toolbar release];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// On OS X the initial window size doesn't include window frame.
|
// On OS X the initial window size doesn't include window frame.
|
||||||
bool use_content_size = false;
|
bool use_content_size = false;
|
||||||
options.Get(switches::kUseContentSize, &use_content_size);
|
options.Get(switches::kUseContentSize, &use_content_size);
|
||||||
|
|
|
@ -37,13 +37,18 @@ wrapWithActivateUvLoop = (func) ->
|
||||||
process.activateUvLoop()
|
process.activateUvLoop()
|
||||||
func.apply this, arguments
|
func.apply this, arguments
|
||||||
process.nextTick = wrapWithActivateUvLoop process.nextTick
|
process.nextTick = wrapWithActivateUvLoop process.nextTick
|
||||||
global.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.
|
|
||||||
if process.type is 'browser'
|
if process.type is '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.setTimeout = wrapWithActivateUvLoop timers.setTimeout
|
||||||
global.setInterval = wrapWithActivateUvLoop timers.setInterval
|
global.setInterval = wrapWithActivateUvLoop timers.setInterval
|
||||||
|
global.setImmediate = wrapWithActivateUvLoop timers.setImmediate
|
||||||
|
global.clearImmediate = wrapWithActivateUvLoop timers.clearImmediate
|
||||||
|
else
|
||||||
|
# There are no setImmediate under renderer process by default, so we need to
|
||||||
|
# manually setup them here.
|
||||||
|
global.setImmediate = setImmediate
|
||||||
|
global.clearImmediate = clearImmediate
|
||||||
|
|
|
@ -42,6 +42,9 @@ const char kAcceptFirstMouse[] = "accept-first-mouse";
|
||||||
// Whether window size should include window frame.
|
// Whether window size should include window frame.
|
||||||
const char kUseContentSize[] = "use-content-size";
|
const char kUseContentSize[] = "use-content-size";
|
||||||
|
|
||||||
|
// The requested title bar style for the window
|
||||||
|
const char kTitleBarStyle[] = "title-bar-style";
|
||||||
|
|
||||||
// The WebPreferences.
|
// The WebPreferences.
|
||||||
const char kWebPreferences[] = "web-preferences";
|
const char kWebPreferences[] = "web-preferences";
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ extern const char kAlwaysOnTop[];
|
||||||
extern const char kNodeIntegration[];
|
extern const char kNodeIntegration[];
|
||||||
extern const char kAcceptFirstMouse[];
|
extern const char kAcceptFirstMouse[];
|
||||||
extern const char kUseContentSize[];
|
extern const char kUseContentSize[];
|
||||||
|
extern const char kTitleBarStyle[];
|
||||||
extern const char kWebPreferences[];
|
extern const char kWebPreferences[];
|
||||||
extern const char kZoomFactor[];
|
extern const char kZoomFactor[];
|
||||||
extern const char kAutoHideMenuBar[];
|
extern const char kAutoHideMenuBar[];
|
||||||
|
|
46
docs-translations/zh-CN/api/accelerator.md
Normal file
46
docs-translations/zh-CN/api/accelerator.md
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# Accelerator
|
||||||
|
|
||||||
|
An accelerator is a string that represents a keyboard shortcut. It can contain
|
||||||
|
multiple modifiers and key codes, combined by the `+` character.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
* `Command+A`
|
||||||
|
* `Ctrl+Shift+Z`
|
||||||
|
|
||||||
|
## Platform notice
|
||||||
|
|
||||||
|
On Linux and Windows, the `Command` key does not have any effect so
|
||||||
|
use `CommandOrControl` which represents `Command` on OS X and `Control` on
|
||||||
|
Linux and Windows to define some accelerators.
|
||||||
|
|
||||||
|
The `Super` key is mapped to the `Windows` key on Windows and Linux and
|
||||||
|
`Cmd` on OS X.
|
||||||
|
|
||||||
|
## Available modifiers
|
||||||
|
|
||||||
|
* `Command` (or `Cmd` for short)
|
||||||
|
* `Control` (or `Ctrl` for short)
|
||||||
|
* `CommandOrControl` (or `CmdOrCtrl` for short)
|
||||||
|
* `Alt`
|
||||||
|
* `Shift`
|
||||||
|
* `Super`
|
||||||
|
|
||||||
|
## Available key codes
|
||||||
|
|
||||||
|
* `0` to `9`
|
||||||
|
* `A` to `Z`
|
||||||
|
* `F1` to `F24`
|
||||||
|
* Punctuations like `~`, `!`, `@`, `#`, `$`, etc.
|
||||||
|
* `Plus`
|
||||||
|
* `Space`
|
||||||
|
* `Backspace`
|
||||||
|
* `Delete`
|
||||||
|
* `Insert`
|
||||||
|
* `Return` (or `Enter` as alias)
|
||||||
|
* `Up`, `Down`, `Left` and `Right`
|
||||||
|
* `Home` and `End`
|
||||||
|
* `PageUp` and `PageDown`
|
||||||
|
* `Escape` (or `Esc` for short)
|
||||||
|
* `VolumeUp`, `VolumeDown` and `VolumeMute`
|
||||||
|
* `MediaNextTrack`, `MediaPreviousTrack`, `MediaStop` and `MediaPlayPause`
|
60
docs-translations/zh-CN/api/global-shortcut.md
Normal file
60
docs-translations/zh-CN/api/global-shortcut.md
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# global-shortcut
|
||||||
|
|
||||||
|
`global-shortcut` 模块可以便捷的为您设置(注册/注销)各种自定义操作的快捷键.
|
||||||
|
|
||||||
|
**Note**: 使用此模块注册的快捷键是系统全局的(QQ截图那种), 不要在应用模块(app module)响应 `ready`
|
||||||
|
消息前使用此模块(注册快捷键).
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var app = require('app');
|
||||||
|
var globalShortcut = require('global-shortcut');
|
||||||
|
|
||||||
|
app.on('ready', function() {
|
||||||
|
// Register a 'ctrl+x' shortcut listener.
|
||||||
|
var ret = globalShortcut.register('ctrl+x', function() {
|
||||||
|
console.log('ctrl+x is pressed');
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
console.log('registration failed');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check whether a shortcut is registered.
|
||||||
|
console.log(globalShortcut.isRegistered('ctrl+x'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.on('will-quit', function() {
|
||||||
|
// Unregister a shortcut.
|
||||||
|
globalShortcut.unregister('ctrl+x');
|
||||||
|
|
||||||
|
// Unregister all shortcuts.
|
||||||
|
globalShortcut.unregisterAll();
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Methods
|
||||||
|
|
||||||
|
`global-shortcut` 模块包含以下函数:
|
||||||
|
|
||||||
|
### `globalShortcut.register(accelerator, callback)`
|
||||||
|
|
||||||
|
* `accelerator` [Accelerator](accelerator.md)
|
||||||
|
* `callback` Function
|
||||||
|
|
||||||
|
注册 `accelerator` 快捷键. 当用户按下注册的快捷键时将会调用 `callback` 函数.
|
||||||
|
|
||||||
|
### `globalShortcut.isRegistered(accelerator)`
|
||||||
|
|
||||||
|
* `accelerator` [Accelerator](accelerator.md)
|
||||||
|
|
||||||
|
查询 `accelerator` 快捷键是否已经被注册过了,将会返回 `true`(已被注册) 或 `false`(未注册).
|
||||||
|
|
||||||
|
### `globalShortcut.unregister(accelerator)`
|
||||||
|
|
||||||
|
* `accelerator` [Accelerator](accelerator.md)
|
||||||
|
|
||||||
|
注销全局快捷键 `accelerator`.
|
||||||
|
|
||||||
|
### `globalShortcut.unregisterAll()`
|
||||||
|
|
||||||
|
注销本应用注册的所有全局快捷键.
|
|
@ -118,6 +118,15 @@ Returns:
|
||||||
|
|
||||||
Emitted when a [browserWindow](browser-window.md) gets focused.
|
Emitted when a [browserWindow](browser-window.md) gets focused.
|
||||||
|
|
||||||
|
### Event: 'browser-window-created'
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
* `event` Event
|
||||||
|
* `window` BrowserWindow
|
||||||
|
|
||||||
|
Emitted when a new [browserWindow](browser-window.md) is created.
|
||||||
|
|
||||||
### Event: 'select-certificate'
|
### Event: 'select-certificate'
|
||||||
|
|
||||||
Emitted when a client certificate is requested.
|
Emitted when a client certificate is requested.
|
||||||
|
|
|
@ -70,6 +70,16 @@ Properties `width` and `height` are required.
|
||||||
Linux.
|
Linux.
|
||||||
* `standard-window` Boolean - Uses the OS X's standard window instead of the
|
* `standard-window` Boolean - Uses the OS X's standard window instead of the
|
||||||
textured window. Defaults to `true`.
|
textured window. Defaults to `true`.
|
||||||
|
* `title-bar-style` String, OS X - specifies the style of window title bar.
|
||||||
|
This option is supported on OS X 10.10 Yosemite and newer. There are three
|
||||||
|
possible values:
|
||||||
|
* `default` or not specified results in the standard gray opaque Mac title
|
||||||
|
bar.
|
||||||
|
* `hidden` results in a hidden title bar and a full size content window, yet
|
||||||
|
the title bar still has the standard window controls ("traffic lights") in
|
||||||
|
the top left.
|
||||||
|
* `hidden-inset` results in a hidden title bar with an alternative look
|
||||||
|
where the traffic light buttons are slightly more inset from the window edge.
|
||||||
* `web-preferences` Object - Settings of web page's features, properties:
|
* `web-preferences` Object - Settings of web page's features, properties:
|
||||||
* `node-integration` Boolean - Whether node integration is enabled. Default
|
* `node-integration` Boolean - Whether node integration is enabled. Default
|
||||||
is `true`.
|
is `true`.
|
||||||
|
|
|
@ -13,6 +13,20 @@ var BrowserWindow = require('browser-window');
|
||||||
var win = new BrowserWindow({ width: 800, height: 600, frame: false });
|
var win = new BrowserWindow({ width: 800, height: 600, frame: false });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Alternatives on Mac
|
||||||
|
|
||||||
|
On Mac OS X 10.10 Yosemite and newer, there's an alternative way to specify
|
||||||
|
a chromeless window. Instead of setting `frame` to `false` which disables
|
||||||
|
both the titlebar and window controls, you may want to have the title bar
|
||||||
|
hidden and your content extend to the full window size, yet still preserve
|
||||||
|
the window controls ("traffic lights") for standard window actions.
|
||||||
|
You can do so by specifying the new `title-bar-style` option:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var BrowserWindow = require('browser-window');
|
||||||
|
var win = new BrowserWindow({ width: 800, height: 600, 'title-bar-style': 'hidden' });
|
||||||
|
```
|
||||||
|
|
||||||
## Transparent window
|
## Transparent window
|
||||||
|
|
||||||
By setting the `transparent` option to `true`, you can also make the frameless
|
By setting the `transparent` option to `true`, you can also make the frameless
|
||||||
|
|
|
@ -170,11 +170,11 @@ if (process.platform == 'darwin') {
|
||||||
{
|
{
|
||||||
label: 'Hide Others',
|
label: 'Hide Others',
|
||||||
accelerator: 'Command+Shift+H',
|
accelerator: 'Command+Shift+H',
|
||||||
role: 'hideothers:'
|
role: 'hideothers'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Show All',
|
label: 'Show All',
|
||||||
role: 'unhide:'
|
role: 'unhide'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
|
|
|
@ -26,19 +26,30 @@ describe 'app module', ->
|
||||||
assert.equal app.getName(), 'test-name'
|
assert.equal app.getName(), 'test-name'
|
||||||
app.setName 'Electron Test'
|
app.setName 'Electron Test'
|
||||||
|
|
||||||
describe 'focus/blur event', ->
|
describe 'BrowserWindow events', ->
|
||||||
w = null
|
w = null
|
||||||
beforeEach ->
|
|
||||||
w.destroy() if w?
|
|
||||||
w = new BrowserWindow(show: false, width: 400, height: 400)
|
|
||||||
afterEach ->
|
afterEach ->
|
||||||
w.destroy() if w?
|
w.destroy() if w?
|
||||||
w = null
|
w = null
|
||||||
it 'should emit focus event', (done) ->
|
|
||||||
|
it 'should emit browser-window-focus event when window is focused', (done) ->
|
||||||
|
app.once 'browser-window-focus', (e, window) ->
|
||||||
|
assert.equal w.id, window.id
|
||||||
|
done()
|
||||||
|
w = new BrowserWindow(show: false)
|
||||||
|
w.emit 'focus'
|
||||||
|
|
||||||
|
it 'should emit browser-window-blur event when window is blured', (done) ->
|
||||||
app.once 'browser-window-blur', (e, window) ->
|
app.once 'browser-window-blur', (e, window) ->
|
||||||
assert.equal w.id, window.id
|
assert.equal w.id, window.id
|
||||||
done()
|
done()
|
||||||
app.once 'browser-window-focus', (e, window) ->
|
w = new BrowserWindow(show: false)
|
||||||
assert.equal w.id, window.id
|
w.emit 'blur'
|
||||||
|
|
||||||
|
it 'should emit browser-window-created event when window is created', (done) ->
|
||||||
|
app.once 'browser-window-created', (e, window) ->
|
||||||
|
setImmediate ->
|
||||||
|
assert.equal w.id, window.id
|
||||||
|
done()
|
||||||
|
w = new BrowserWindow(show: false)
|
||||||
w.emit 'blur'
|
w.emit 'blur'
|
||||||
w.emit 'focus'
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ path = require 'path'
|
||||||
remote = require 'remote'
|
remote = require 'remote'
|
||||||
http = require 'http'
|
http = require 'http'
|
||||||
url = require 'url'
|
url = require 'url'
|
||||||
|
os = require 'os'
|
||||||
|
|
||||||
BrowserWindow = remote.require 'browser-window'
|
BrowserWindow = remote.require 'browser-window'
|
||||||
|
|
||||||
|
@ -160,6 +161,22 @@ describe 'browser-window module', ->
|
||||||
assert.equal size[0], 400
|
assert.equal size[0], 400
|
||||||
assert.equal size[1], 400
|
assert.equal size[1], 400
|
||||||
|
|
||||||
|
describe '"title-bar-style" option', ->
|
||||||
|
return if process.platform isnt 'darwin'
|
||||||
|
return if parseInt(os.release().split('.')[0]) < 14 # only run these tests on Yosemite or newer
|
||||||
|
|
||||||
|
it 'creates browser window with hidden title bar', ->
|
||||||
|
w.destroy()
|
||||||
|
w = new BrowserWindow(show: false, width: 400, height: 400, 'title-bar-style': 'hidden')
|
||||||
|
contentSize = w.getContentSize()
|
||||||
|
assert.equal contentSize[1], 400
|
||||||
|
|
||||||
|
it 'creates browser window with hidden inset title bar', ->
|
||||||
|
w.destroy()
|
||||||
|
w = new BrowserWindow(show: false, width: 400, height: 400, 'title-bar-style': 'hidden-inset')
|
||||||
|
contentSize = w.getContentSize()
|
||||||
|
assert.equal contentSize[1], 400
|
||||||
|
|
||||||
describe '"enable-larger-than-screen" option', ->
|
describe '"enable-larger-than-screen" option', ->
|
||||||
return if process.platform is 'linux'
|
return if process.platform is 'linux'
|
||||||
|
|
||||||
|
|
7
spec/fixtures/module/preload-node-off.js
vendored
Normal file
7
spec/fixtures/module/preload-node-off.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
setImmediate(function() {
|
||||||
|
try {
|
||||||
|
console.log([typeof process, typeof setImmediate, typeof global].join(' '));
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
|
}
|
||||||
|
});
|
|
@ -3,13 +3,13 @@ path = require 'path'
|
||||||
http = require 'http'
|
http = require 'http'
|
||||||
|
|
||||||
describe '<webview> tag', ->
|
describe '<webview> tag', ->
|
||||||
|
@timeout 10000
|
||||||
|
|
||||||
fixtures = path.join __dirname, 'fixtures'
|
fixtures = path.join __dirname, 'fixtures'
|
||||||
|
|
||||||
webview = null
|
webview = null
|
||||||
|
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
webview = new WebView
|
webview = new WebView
|
||||||
|
|
||||||
afterEach ->
|
afterEach ->
|
||||||
document.body.removeChild webview
|
document.body.removeChild webview
|
||||||
|
|
||||||
|
@ -84,6 +84,14 @@ describe '<webview> tag', ->
|
||||||
webview.src = "file://#{fixtures}/pages/e.html"
|
webview.src = "file://#{fixtures}/pages/e.html"
|
||||||
document.body.appendChild webview
|
document.body.appendChild webview
|
||||||
|
|
||||||
|
it 'preload script can still use "process" in required modules when nodeintegration is off', (done) ->
|
||||||
|
webview.addEventListener 'console-message', (e) ->
|
||||||
|
assert.equal e.message, 'object function object'
|
||||||
|
done()
|
||||||
|
webview.setAttribute 'preload', "#{fixtures}/module/preload-node-off.js"
|
||||||
|
webview.src = "file://#{fixtures}/api/blank.html"
|
||||||
|
document.body.appendChild webview
|
||||||
|
|
||||||
it 'receives ipc message in preload script', (done) ->
|
it 'receives ipc message in preload script', (done) ->
|
||||||
message = 'boom!'
|
message = 'boom!'
|
||||||
listener = (e) ->
|
listener = (e) ->
|
||||||
|
|
2
vendor/brightray
vendored
2
vendor/brightray
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 9b3695cfd5c48a4cdc90e84a863851001ce8dd10
|
Subproject commit 1cfc13fec13a36f3682ee702c32dc2cf22363143
|
2
vendor/node
vendored
2
vendor/node
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 9da7dd871c313d318bc1447a83ba3c7618bbbc18
|
Subproject commit fdb584a0b42e89885f74ed68f279318b0fbff37f
|
Loading…
Reference in a new issue