fix: ensure ready-to-show event is fired (#25448)
* fix: ensure ready-to-show event is fired * test: acutally draw something when capturePage
This commit is contained in:
parent
2091fd7dd9
commit
e5933c6910
3 changed files with 26 additions and 2 deletions
|
@ -157,12 +157,32 @@ void BrowserWindow::DidFirstVisuallyNonEmptyPaint() {
|
||||||
base::ThreadTaskRunnerHandle::Get()->PostTask(
|
base::ThreadTaskRunnerHandle::Get()->PostTask(
|
||||||
FROM_HERE, base::BindOnce(
|
FROM_HERE, base::BindOnce(
|
||||||
[](base::WeakPtr<BrowserWindow> self) {
|
[](base::WeakPtr<BrowserWindow> self) {
|
||||||
if (self)
|
if (self && !self->did_ready_to_show_fired_) {
|
||||||
|
self->did_ready_to_show_fired_ = true;
|
||||||
self->Emit("ready-to-show");
|
self->Emit("ready-to-show");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
GetWeakPtr()));
|
GetWeakPtr()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BrowserWindow::DidFinishLoad(content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& validated_url) {
|
||||||
|
// The DidFirstVisuallyNonEmptyPaint event is not very stable that, sometimes
|
||||||
|
// on some machines it might not be fired, and the actual behavior depends on
|
||||||
|
// the version of Chromium.
|
||||||
|
// To work around this bug, we ensure the ready-to-show event is emitted if it
|
||||||
|
// has not been emitted in did-finish-load event.
|
||||||
|
// Note that we use did-finish-load event instead of dom-ready event because
|
||||||
|
// the latter may actually be emitted before the ready-to-show event.
|
||||||
|
// See also https://github.com/electron/electron/issues/7779.
|
||||||
|
if (window()->IsVisible() || did_ready_to_show_fired_)
|
||||||
|
return;
|
||||||
|
if (render_frame_host->GetParent()) // child frame
|
||||||
|
return;
|
||||||
|
did_ready_to_show_fired_ = true;
|
||||||
|
Emit("ready-to-show");
|
||||||
|
}
|
||||||
|
|
||||||
void BrowserWindow::BeforeUnloadDialogCancelled() {
|
void BrowserWindow::BeforeUnloadDialogCancelled() {
|
||||||
WindowList::WindowCloseCancelled(window());
|
WindowList::WindowCloseCancelled(window());
|
||||||
// Cancel unresponsive event when window close is cancelled.
|
// Cancel unresponsive event when window close is cancelled.
|
||||||
|
|
|
@ -49,6 +49,8 @@ class BrowserWindow : public BaseWindow,
|
||||||
content::RenderViewHost* new_host) override;
|
content::RenderViewHost* new_host) override;
|
||||||
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
|
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
|
||||||
void DidFirstVisuallyNonEmptyPaint() override;
|
void DidFirstVisuallyNonEmptyPaint() override;
|
||||||
|
void DidFinishLoad(content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& validated_url) override;
|
||||||
void BeforeUnloadDialogCancelled() override;
|
void BeforeUnloadDialogCancelled() override;
|
||||||
void OnRendererUnresponsive(content::RenderProcessHost*) override;
|
void OnRendererUnresponsive(content::RenderProcessHost*) override;
|
||||||
void OnRendererResponsive(
|
void OnRendererResponsive(
|
||||||
|
@ -119,6 +121,8 @@ class BrowserWindow : public BaseWindow,
|
||||||
// it should be cancelled when we can prove that the window is responsive.
|
// it should be cancelled when we can prove that the window is responsive.
|
||||||
base::CancelableClosure window_unresponsive_closure_;
|
base::CancelableClosure window_unresponsive_closure_;
|
||||||
|
|
||||||
|
bool did_ready_to_show_fired_ = false;
|
||||||
|
|
||||||
#if defined(OS_MAC)
|
#if defined(OS_MAC)
|
||||||
std::vector<mojom::DraggableRegionPtr> draggable_regions_;
|
std::vector<mojom::DraggableRegionPtr> draggable_regions_;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1288,7 +1288,7 @@ describe('BrowserWindow module', () => {
|
||||||
|
|
||||||
it('preserves transparency', async () => {
|
it('preserves transparency', async () => {
|
||||||
const w = new BrowserWindow({ show: false, transparent: true });
|
const w = new BrowserWindow({ show: false, transparent: true });
|
||||||
w.loadURL('about:blank');
|
w.loadFile(path.join(fixtures, 'pages', 'theme-color.html'));
|
||||||
await emittedOnce(w, 'ready-to-show');
|
await emittedOnce(w, 'ready-to-show');
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue