From 4d65af3c60e1b977938afccaf76546b56368084b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 13 Jun 2016 21:19:56 +0900 Subject: [PATCH] Add ready-to-show event --- atom/browser/api/atom_api_window.cc | 4 ++++ atom/browser/api/atom_api_window.h | 1 + atom/browser/native_window.cc | 17 +++++++++++++++++ atom/browser/native_window.h | 4 ++++ atom/browser/native_window_observer.h | 3 +++ 5 files changed, 29 insertions(+) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 5a93f27d2de..0d72a74f7d5 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -156,6 +156,10 @@ void Window::OnWindowHide() { Emit("hide"); } +void Window::OnReadyToShow() { + Emit("ready-to-show"); +} + void Window::OnWindowMaximize() { Emit("maximize"); } diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 286b4726215..9d3f7ef2402 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -61,6 +61,7 @@ class Window : public mate::TrackableObject, void OnWindowFocus() override; void OnWindowShow() override; void OnWindowHide() override; + void OnReadyToShow() override; void OnWindowMaximize() override; void OnWindowUnmaximize() override; void OnWindowMinimize() override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 8a00a88d547..ab8b4f97b20 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -560,6 +560,19 @@ void NativeWindow::BeforeUnloadDialogCancelled() { window_unresposive_closure_.Cancel(); } +void NativeWindow::DidFirstVisuallyNonEmptyPaint() { + // When there is a non-empty first paint, resize the RenderWidget to force + // Chromium to draw. + const auto view = web_contents()->GetRenderWidgetHostView(); + view->Show(); + view->SetSize(GetContentSize()); + + // Emit the ReadyToShow event in next tick in case of pending drawing work. + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&NativeWindow::NotifyReadyToShow, GetWeakPtr())); +} + bool NativeWindow::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(NativeWindow, message) @@ -601,6 +614,10 @@ void NativeWindow::NotifyWindowUnresponsive() { OnRendererUnresponsive()); } +void NativeWindow::NotifyReadyToShow() { + FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnReadyToShow()); +} + void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback, const SkBitmap& bitmap, content::ReadbackResponse response) { diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index ffcdcc4da27..796cf21326a 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -275,6 +275,7 @@ class NativeWindow : public base::SupportsUserData, // content::WebContentsObserver: void RenderViewCreated(content::RenderViewHost* render_view_host) override; void BeforeUnloadDialogCancelled() override; + void DidFirstVisuallyNonEmptyPaint() override; bool OnMessageReceived(const IPC::Message& message) override; private: @@ -284,6 +285,9 @@ class NativeWindow : public base::SupportsUserData, // Dispatch unresponsive event to observers. void NotifyWindowUnresponsive(); + // Dispatch ReadyToShow event to observers. + void NotifyReadyToShow(); + // Called when CapturePage has done. void OnCapturePageDone(const CapturePageCallback& callback, const SkBitmap& bitmap, diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index cfbae95bda1..73bf4362f57 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -48,6 +48,9 @@ class NativeWindowObserver { // Called when window is hidden. virtual void OnWindowHide() {} + // Called when window is ready to show. + virtual void OnReadyToShow() {} + // Called when window state changed. virtual void OnWindowMaximize() {} virtual void OnWindowUnmaximize() {}