fix: setContentProtection(true)
after hide on Windows (#45889)
fix: content protection after hide on Windows
5789117
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
parent
179fde9278
commit
6eb4932c68
8 changed files with 60 additions and 11 deletions
|
@ -724,6 +724,10 @@ void BaseWindow::SetContentProtection(bool enable) {
|
||||||
return window_->SetContentProtection(enable);
|
return window_->SetContentProtection(enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BaseWindow::IsContentProtected() const {
|
||||||
|
return window_->IsContentProtected();
|
||||||
|
}
|
||||||
|
|
||||||
void BaseWindow::SetFocusable(bool focusable) {
|
void BaseWindow::SetFocusable(bool focusable) {
|
||||||
return window_->SetFocusable(focusable);
|
return window_->SetFocusable(focusable);
|
||||||
}
|
}
|
||||||
|
@ -1261,6 +1265,7 @@ void BaseWindow::BuildPrototype(v8::Isolate* isolate,
|
||||||
.SetMethod("isDocumentEdited", &BaseWindow::IsDocumentEdited)
|
.SetMethod("isDocumentEdited", &BaseWindow::IsDocumentEdited)
|
||||||
.SetMethod("setIgnoreMouseEvents", &BaseWindow::SetIgnoreMouseEvents)
|
.SetMethod("setIgnoreMouseEvents", &BaseWindow::SetIgnoreMouseEvents)
|
||||||
.SetMethod("setContentProtection", &BaseWindow::SetContentProtection)
|
.SetMethod("setContentProtection", &BaseWindow::SetContentProtection)
|
||||||
|
.SetMethod("_isContentProtected", &BaseWindow::IsContentProtected)
|
||||||
.SetMethod("setFocusable", &BaseWindow::SetFocusable)
|
.SetMethod("setFocusable", &BaseWindow::SetFocusable)
|
||||||
.SetMethod("isFocusable", &BaseWindow::IsFocusable)
|
.SetMethod("isFocusable", &BaseWindow::IsFocusable)
|
||||||
.SetMethod("setMenu", &BaseWindow::SetMenu)
|
.SetMethod("setMenu", &BaseWindow::SetMenu)
|
||||||
|
|
|
@ -177,6 +177,7 @@ class BaseWindow : public gin_helper::TrackableObject<BaseWindow>,
|
||||||
bool IsDocumentEdited() const;
|
bool IsDocumentEdited() const;
|
||||||
void SetIgnoreMouseEvents(bool ignore, gin_helper::Arguments* args);
|
void SetIgnoreMouseEvents(bool ignore, gin_helper::Arguments* args);
|
||||||
void SetContentProtection(bool enable);
|
void SetContentProtection(bool enable);
|
||||||
|
bool IsContentProtected() const;
|
||||||
void SetFocusable(bool focusable);
|
void SetFocusable(bool focusable);
|
||||||
bool IsFocusable() const;
|
bool IsFocusable() const;
|
||||||
void SetMenu(v8::Isolate* isolate, v8::Local<v8::Value> menu);
|
void SetMenu(v8::Isolate* isolate, v8::Local<v8::Value> menu);
|
||||||
|
|
|
@ -186,6 +186,7 @@ class NativeWindow : public base::SupportsUserData,
|
||||||
virtual bool IsDocumentEdited() const;
|
virtual bool IsDocumentEdited() const;
|
||||||
virtual void SetIgnoreMouseEvents(bool ignore, bool forward) = 0;
|
virtual void SetIgnoreMouseEvents(bool ignore, bool forward) = 0;
|
||||||
virtual void SetContentProtection(bool enable) = 0;
|
virtual void SetContentProtection(bool enable) = 0;
|
||||||
|
virtual bool IsContentProtected() const = 0;
|
||||||
virtual void SetFocusable(bool focusable) {}
|
virtual void SetFocusable(bool focusable) {}
|
||||||
virtual bool IsFocusable() const;
|
virtual bool IsFocusable() const;
|
||||||
virtual void SetMenu(ElectronMenuModel* menu) {}
|
virtual void SetMenu(ElectronMenuModel* menu) {}
|
||||||
|
|
|
@ -110,6 +110,7 @@ class NativeWindowMac : public NativeWindow,
|
||||||
bool IsHiddenInMissionControl() const override;
|
bool IsHiddenInMissionControl() const override;
|
||||||
void SetHiddenInMissionControl(bool hidden) override;
|
void SetHiddenInMissionControl(bool hidden) override;
|
||||||
void SetContentProtection(bool enable) override;
|
void SetContentProtection(bool enable) override;
|
||||||
|
bool IsContentProtected() const override;
|
||||||
void SetFocusable(bool focusable) override;
|
void SetFocusable(bool focusable) override;
|
||||||
bool IsFocusable() const override;
|
bool IsFocusable() const override;
|
||||||
void SetParentWindow(NativeWindow* parent) override;
|
void SetParentWindow(NativeWindow* parent) override;
|
||||||
|
|
|
@ -1170,6 +1170,10 @@ void NativeWindowMac::SetContentProtection(bool enable) {
|
||||||
setSharingType:enable ? NSWindowSharingNone : NSWindowSharingReadOnly];
|
setSharingType:enable ? NSWindowSharingNone : NSWindowSharingReadOnly];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NativeWindowMac::IsContentProtected() const {
|
||||||
|
return [window_ sharingType] == NSWindowSharingNone;
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowMac::SetFocusable(bool focusable) {
|
void NativeWindowMac::SetFocusable(bool focusable) {
|
||||||
// No known way to unfocus the window if it had the focus. Here we do not
|
// No known way to unfocus the window if it had the focus. Here we do not
|
||||||
// want to call Focus(false) because it moves the window to the back, i.e.
|
// want to call Focus(false) because it moves the window to the back, i.e.
|
||||||
|
|
|
@ -1317,17 +1317,15 @@ void NativeWindowViews::SetIgnoreMouseEvents(bool ignore, bool forward) {
|
||||||
|
|
||||||
void NativeWindowViews::SetContentProtection(bool enable) {
|
void NativeWindowViews::SetContentProtection(bool enable) {
|
||||||
#if BUILDFLAG(IS_WIN)
|
#if BUILDFLAG(IS_WIN)
|
||||||
HWND hwnd = GetAcceleratedWidget();
|
widget()->native_widget_private()->SetAllowScreenshots(!enable);
|
||||||
DWORD affinity = enable ? WDA_EXCLUDEFROMCAPTURE : WDA_NONE;
|
#endif
|
||||||
::SetWindowDisplayAffinity(hwnd, affinity);
|
}
|
||||||
if (!layered_) {
|
|
||||||
// Workaround to prevent black window on screen capture after hiding and
|
bool NativeWindowViews::IsContentProtected() const {
|
||||||
// showing the BrowserWindow.
|
#if BUILDFLAG(IS_WIN)
|
||||||
LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
|
return !widget()->native_widget_private()->AreScreenshotsAllowed();
|
||||||
ex_style |= WS_EX_LAYERED;
|
#else // Not implemented on Linux
|
||||||
::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
|
return false;
|
||||||
layered_ = true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ class NativeWindowViews : public NativeWindow,
|
||||||
double GetOpacity() const override;
|
double GetOpacity() const override;
|
||||||
void SetIgnoreMouseEvents(bool ignore, bool forward) override;
|
void SetIgnoreMouseEvents(bool ignore, bool forward) override;
|
||||||
void SetContentProtection(bool enable) override;
|
void SetContentProtection(bool enable) override;
|
||||||
|
bool IsContentProtected() const override;
|
||||||
void SetFocusable(bool focusable) override;
|
void SetFocusable(bool focusable) override;
|
||||||
bool IsFocusable() const override;
|
bool IsFocusable() const override;
|
||||||
void SetMenu(ElectronMenuModel* menu_model) override;
|
void SetMenu(ElectronMenuModel* menu_model) override;
|
||||||
|
|
|
@ -296,6 +296,44 @@ describe('BrowserWindow module', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ifdescribe(process.platform !== 'linux')('BrowserWindow.getContentProtection', () => {
|
||||||
|
afterEach(closeAllWindows);
|
||||||
|
it('can set content protection', async () => {
|
||||||
|
const w = new BrowserWindow({ show: false });
|
||||||
|
// @ts-expect-error This is a private API
|
||||||
|
expect(w._isContentProtected()).to.equal(false);
|
||||||
|
|
||||||
|
const shown = once(w, 'show');
|
||||||
|
|
||||||
|
w.show();
|
||||||
|
await shown;
|
||||||
|
|
||||||
|
w.setContentProtection(true);
|
||||||
|
// @ts-expect-error This is a private API
|
||||||
|
expect(w._isContentProtected()).to.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not remove content protection after the window is hidden and shown', async () => {
|
||||||
|
const w = new BrowserWindow({ show: false });
|
||||||
|
|
||||||
|
const hidden = once(w, 'hide');
|
||||||
|
const shown = once(w, 'show');
|
||||||
|
|
||||||
|
w.show();
|
||||||
|
await shown;
|
||||||
|
|
||||||
|
w.setContentProtection(true);
|
||||||
|
|
||||||
|
w.hide();
|
||||||
|
await hidden;
|
||||||
|
w.show();
|
||||||
|
await shown;
|
||||||
|
|
||||||
|
// @ts-expect-error This is a private API
|
||||||
|
expect(w._isContentProtected()).to.equal(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('BrowserWindow.loadURL(url)', () => {
|
describe('BrowserWindow.loadURL(url)', () => {
|
||||||
let w: BrowserWindow;
|
let w: BrowserWindow;
|
||||||
const scheme = 'other';
|
const scheme = 'other';
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue