Add "enable-larger-than-screen" option for BrowserWindow.

From now on BrowserWindow can only be resized larger than screen or
moved out of screen when this option is set to "true".

Fixes #582.
This commit is contained in:
Cheng Zhao 2014-08-17 12:23:00 +08:00
parent 78afa29ade
commit 2a9f5a5fb8
8 changed files with 51 additions and 17 deletions

View file

@ -58,6 +58,7 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
const mate::Dictionary& options)
: content::WebContentsObserver(web_contents),
has_frame_(true),
enable_larger_than_screen_(false),
is_closed_(false),
node_integration_("except-iframe"),
has_dialog_attached_(false),
@ -66,6 +67,7 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
inspectable_web_contents_(
brightray::InspectableWebContents::Create(web_contents)) {
options.Get(switches::kFrame, &has_frame_);
options.Get(switches::kEnableLargerThanScreen, &enable_larger_than_screen_);
// Read icon before window is created.
options.Get(switches::kIcon, &icon_);

View file

@ -251,6 +251,9 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
// Whether window has standard frame.
bool has_frame_;
// Whether window can be resized larger than screen.
bool enable_larger_than_screen_;
// Window icon.
gfx::ImageSkia icon_;

View file

@ -108,10 +108,12 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
@end
@interface AtomNSWindow : EventProcessingWindow {
@protected
@private
atom::NativeWindowMac* shell_;
bool enable_larger_than_screen_;
}
- (void)setShell:(atom::NativeWindowMac*)shell;
- (void)setEnableLargerThanScreen:(bool)enable;
@end
@implementation AtomNSWindow
@ -120,9 +122,16 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
shell_ = shell;
}
- (void)setEnableLargerThanScreen:(bool)enable {
enable_larger_than_screen_ = enable;
}
// Enable the window to be larger than screen.
- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen*)screen {
return frameRect;
if (enable_larger_than_screen_)
return frameRect;
else
return [super constrainFrameRect:frameRect toScreen:screen];
}
- (IBAction)reload:(id)sender {
@ -213,6 +222,7 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
defer:YES];
[atomWindow setShell:this];
[atomWindow setEnableLargerThanScreen:enable_larger_than_screen_];
window_.reset(atomWindow);
AtomNSWindowDelegate* delegate =

View file

@ -114,16 +114,18 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
menu_bar_alt_pressed_(false),
keyboard_event_handler_(new views::UnhandledKeyboardEventHandler),
use_content_size_(false),
resizable_(true),
// We need to set a default maximum window size here otherwise Windows
// will not allow us to resize the window larger than scree.
// Setting directly to INT_MAX somehow doesn't work, so we just devide
// by 10, which should still be large enough.
maximum_size_(INT_MAX / 10, INT_MAX / 10) {
resizable_(true) {
options.Get(switches::kResizable, &resizable_);
options.Get(switches::kTitle, &title_);
options.Get(switches::kAutoHideMenuBar, &menu_bar_autohide_);
if (enable_larger_than_screen_)
// We need to set a default maximum window size here otherwise Windows
// will not allow us to resize the window larger than scree.
// Setting directly to INT_MAX somehow doesn't work, so we just devide
// by 10, which should still be large enough.
maximum_size_.set(INT_MAX / 10, INT_MAX / 10);
int width = 800, height = 600;
options.Get(switches::kWidth, &width);
options.Get(switches::kHeight, &height);

View file

@ -51,6 +51,9 @@ const char kZoomFactor[] = "zoom-factor";
// The menu bar is hidden unless "Alt" is pressed.
const char kAutoHideMenuBar[] = "auto-hide-menu-bar";
// Enable window to be resized larger than screen.
const char kEnableLargerThanScreen[] = "enable-larger-than-screen";
} // namespace switches
} // namespace atom

View file

@ -33,6 +33,7 @@ extern const char kUseContentSize[];
extern const char kWebPreferences[];
extern const char kZoomFactor[];
extern const char kAutoHideMenuBar[];
extern const char kEnableLargerThanScreen[];
} // namespace switches

View file

@ -61,6 +61,8 @@ normal browsers, see [Web Security](web-security.md) for more.
mouse-down event that simultaneously activates the window
* `auto-hide-menu-bar` Boolean - Auto hide the menu bar unless the `Alt`
key is pressed.
* `enable-larger-than-screen` Boolean - Enable the window to be resized larger
than screen.
* `web-preferences` Object - Settings of web page's features
* `javascript` Boolean
* `web-security` Boolean

View file

@ -76,15 +76,6 @@ describe 'browser-window module', ->
assert.equal after[0], size[0]
assert.equal after[1], size[1]
it 'can set the window larger than screen', ->
size = require('screen').getPrimaryDisplay().size
size.width += 100
size.height += 100
w.setSize size.width, size.height
after = w.getSize()
assert.equal after[0], size.width
assert.equal after[1], size.height
describe 'BrowserWindow.setContentSize(width, height)', ->
it 'sets the content size', ->
size = [400, 400]
@ -110,6 +101,26 @@ describe 'browser-window module', ->
assert.equal size[0], 400
assert.equal size[1], 400
describe '"enable-larger-than-screen" option', ->
beforeEach ->
w.destroy()
w = new BrowserWindow(show: true, width: 400, height: 400, 'enable-larger-than-screen': true)
it 'can move the window out of screen', ->
w.setPosition -10, -10
after = w.getPosition()
assert.equal after[0], -10
assert.equal after[1], -10
it 'can set the window larger than screen', ->
size = require('screen').getPrimaryDisplay().size
size.width += 100
size.height += 100
w.setSize size.width, size.height
after = w.getSize()
assert.equal after[0], size.width
assert.equal after[1], size.height
describe 'beforeunload handler', ->
it 'returning true would not prevent close', (done) ->
w.on 'closed', ->