Skip to content

Commit

Permalink
fix: normalize behavior of win.setOpacity() for invalid number valu…
Browse files Browse the repository at this point in the history
…es across operating systems (#19723)

* fix: normalize behavior of `win.setOpacity()` for invalid number values across operating systems

* expect -> assert

* assert 2

* fix `this` scoping

* fix equality

* tests
  • Loading branch information
erickzhao authored and ckerr committed Aug 15, 2019
1 parent a50e3b3 commit dbf8872
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 17 deletions.
4 changes: 3 additions & 1 deletion atom/browser/native_window_mac.mm
Expand Up @@ -22,6 +22,7 @@
#include "atom/common/options_switches.h"
#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/numerics/ranges.h"
#include "base/strings/sys_string_conversions.h"
#include "components/remote_cocoa/app_shim/bridged_native_widget_impl.h"
#include "content/public/browser/browser_accessibility_state.h"
Expand Down Expand Up @@ -1047,7 +1048,8 @@ void ViewDidMoveToSuperview(NSView* self, SEL _cmd) {
}

void NativeWindowMac::SetOpacity(const double opacity) {
[window_ setAlphaValue:opacity];
const double boundedOpacity = base::ClampToRange(opacity, 0.0, 1.0);
[window_ setAlphaValue:boundedOpacity];
}

double NativeWindowMac::GetOpacity() {
Expand Down
8 changes: 6 additions & 2 deletions atom/browser/native_window_views.cc
Expand Up @@ -25,6 +25,7 @@
#include "atom/common/draggable_region.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/options_switches.h"
#include "base/numerics/ranges.h"
#include "base/strings/utf_string_conversions.h"
#include "content/public/browser/browser_thread.h"
#include "native_mate/dictionary.h"
Expand Down Expand Up @@ -866,16 +867,19 @@ bool NativeWindowViews::HasShadow() {

void NativeWindowViews::SetOpacity(const double opacity) {
#if defined(OS_WIN)
const double boundedOpacity = base::ClampToRange(opacity, 0.0, 1.0);
HWND hwnd = GetAcceleratedWidget();
if (!layered_) {
LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
ex_style |= WS_EX_LAYERED;
::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
layered_ = true;
}
::SetLayeredWindowAttributes(hwnd, 0, opacity * 255, LWA_ALPHA);
::SetLayeredWindowAttributes(hwnd, 0, boundedOpacity * 255, LWA_ALPHA);
opacity_ = boundedOpacity;
#else
opacity_ = 1.0; // setOpacity unsupported on Linux
#endif
opacity_ = opacity;
}

double NativeWindowViews::GetOpacity() {
Expand Down
56 changes: 42 additions & 14 deletions spec/api-browser-window-spec.js
Expand Up @@ -1214,23 +1214,51 @@ describe('BrowserWindow module', () => {
})

describe('BrowserWindow.setOpacity(opacity)', () => {
it('make window with initial opacity', () => {
w.destroy()
w = new BrowserWindow({
show: false,
width: 400,
height: 400,
opacity: 0.5
describe('Windows and Mac', () => {
before(function () {
if (process.platform === 'linux') {
this.skip()
}
})
assert.strictEqual(w.getOpacity(), 0.5)
})
it('allows setting the opacity', () => {
assert.doesNotThrow(() => {
w.setOpacity(0.0)

it('makes a window with initial opacity', () => {
w.destroy()
w = new BrowserWindow({ show: false, opacity: 0.5 })
assert.strictEqual(w.getOpacity(), 0.5)
})

it('allows setting the opacity', () => {
assert.doesNotThrow(() => {
w.setOpacity(0.0)
assert.strictEqual(w.getOpacity(), 0.0)
w.setOpacity(0.5)
assert.strictEqual(w.getOpacity(), 0.5)
w.setOpacity(1.0)
assert.strictEqual(w.getOpacity(), 1.0)
})
})

it('clamps opacity to [0.0...1.0]', () => {
w.setOpacity(100)
assert.strictEqual(w.getOpacity(), 1.0)
w.setOpacity(-100)
assert.strictEqual(w.getOpacity(), 0.0)
})
})

describe('Linux', () => {
before(function () {
if (process.platform !== 'linux') {
this.skip()
}
})

it('sets 1 regardless of parameter', () => {
w.destroy()
w = new BrowserWindow({ show: false, opacity: 0.5 })
w.setOpacity(0)
assert.strictEqual(w.getOpacity(), 1.0)
w.setOpacity(0.5)
assert.strictEqual(w.getOpacity(), 0.5)
w.setOpacity(1.0)
assert.strictEqual(w.getOpacity(), 1.0)
})
})
Expand Down

0 comments on commit dbf8872

Please sign in to comment.