diff --git a/include/capi/cef_display_handler_capi.h b/include/capi/cef_display_handler_capi.h index 9922c5322..69f3d9251 100644 --- a/include/capi/cef_display_handler_capi.h +++ b/include/capi/cef_display_handler_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=ab31ef5d72b4b1c9809698e5fbbdae21918af713$ +// $hash=c7641e41aca6bf30b9c36092861f061d2b16ff82$ // #ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ @@ -132,6 +132,15 @@ typedef struct _cef_display_handler_t { int(CEF_CALLBACK* on_auto_resize)(struct _cef_display_handler_t* self, struct _cef_browser_t* browser, const cef_size_t* new_size); + + /// + // Called when the overall page loading progress has changed. |progress| + // ranges from 0.0 to 1.0. + /// + void(CEF_CALLBACK* on_loading_progress_change)( + struct _cef_display_handler_t* self, + struct _cef_browser_t* browser, + double progress); } cef_display_handler_t; #ifdef __cplusplus diff --git a/include/cef_display_handler.h b/include/cef_display_handler.h index b180d70c8..4fdc3c312 100644 --- a/include/cef_display_handler.h +++ b/include/cef_display_handler.h @@ -127,6 +127,14 @@ class CefDisplayHandler : public virtual CefBaseRefCounted { const CefSize& new_size) { return false; } + + /// + // Called when the overall page loading progress has changed. |progress| + // ranges from 0.0 to 1.0. + /// + /*--cef()--*/ + virtual void OnLoadingProgressChange(CefRefPtr browser, + double progress) {} }; #endif // CEF_INCLUDE_CEF_DISPLAY_HANDLER_H_ diff --git a/libcef/browser/browser_host_impl.cc b/libcef/browser/browser_host_impl.cc index 742341a57..d42e82429 100644 --- a/libcef/browser/browser_host_impl.cc +++ b/libcef/browser/browser_host_impl.cc @@ -2221,6 +2221,16 @@ void CefBrowserHostImpl::LoadingStateChanged(content::WebContents* source, } } +void CefBrowserHostImpl::LoadProgressChanged(content::WebContents* source, + double progress) { + if (client_.get()) { + CefRefPtr handler = client_->GetDisplayHandler(); + if (handler.get()) { + handler->OnLoadingProgressChange(this, progress); + } + } +} + void CefBrowserHostImpl::CloseContents(content::WebContents* source) { CEF_REQUIRE_UIT(); diff --git a/libcef/browser/browser_host_impl.h b/libcef/browser/browser_host_impl.h index e23bd9e2e..e8b7a04ae 100644 --- a/libcef/browser/browser_host_impl.h +++ b/libcef/browser/browser_host_impl.h @@ -407,6 +407,8 @@ class CefBrowserHostImpl : public CefBrowserHost, bool* was_blocked) override; void LoadingStateChanged(content::WebContents* source, bool to_different_document) override; + void LoadProgressChanged(content::WebContents* source, + double progress) override; void CloseContents(content::WebContents* source) override; void UpdateTargetURL(content::WebContents* source, const GURL& url) override; bool DidAddMessageToConsole(content::WebContents* source, diff --git a/libcef_dll/cpptoc/display_handler_cpptoc.cc b/libcef_dll/cpptoc/display_handler_cpptoc.cc index a3b18dd3b..4fb52e04f 100644 --- a/libcef_dll/cpptoc/display_handler_cpptoc.cc +++ b/libcef_dll/cpptoc/display_handler_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=f0405e9e04f7eaa587fefd5f00abeed44704773b$ +// $hash=0ba45406ca1fcca29b4d8085d6f7b3280477e13f$ // #include "libcef_dll/cpptoc/display_handler_cpptoc.h" @@ -214,6 +214,25 @@ display_handler_on_auto_resize(struct _cef_display_handler_t* self, return _retval; } +void CEF_CALLBACK +display_handler_on_loading_progress_change(struct _cef_display_handler_t* self, + cef_browser_t* browser, + double progress) { + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: browser; type: refptr_diff + DCHECK(browser); + if (!browser) + return; + + // Execute + CefDisplayHandlerCppToC::Get(self)->OnLoadingProgressChange( + CefBrowserCToCpp::Wrap(browser), progress); +} + } // namespace // CONSTRUCTOR - Do not edit by hand. @@ -228,6 +247,8 @@ CefDisplayHandlerCppToC::CefDisplayHandlerCppToC() { GetStruct()->on_status_message = display_handler_on_status_message; GetStruct()->on_console_message = display_handler_on_console_message; GetStruct()->on_auto_resize = display_handler_on_auto_resize; + GetStruct()->on_loading_progress_change = + display_handler_on_loading_progress_change; } template <> diff --git a/libcef_dll/ctocpp/display_handler_ctocpp.cc b/libcef_dll/ctocpp/display_handler_ctocpp.cc index e46d71f99..a3d13782a 100644 --- a/libcef_dll/ctocpp/display_handler_ctocpp.cc +++ b/libcef_dll/ctocpp/display_handler_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=ca92b50b1b21d6de1a591edce5025267abdd2342$ +// $hash=9506e4c51606a428b82d70eb5a2366fed4c1c61e$ // #include "libcef_dll/ctocpp/display_handler_ctocpp.h" @@ -202,6 +202,25 @@ bool CefDisplayHandlerCToCpp::OnAutoResize(CefRefPtr browser, return _retval ? true : false; } +void CefDisplayHandlerCToCpp::OnLoadingProgressChange( + CefRefPtr browser, + double progress) { + cef_display_handler_t* _struct = GetStruct(); + if (CEF_MEMBER_MISSING(_struct, on_loading_progress_change)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: browser; type: refptr_diff + DCHECK(browser.get()); + if (!browser.get()) + return; + + // Execute + _struct->on_loading_progress_change(_struct, CefBrowserCppToC::Wrap(browser), + progress); +} + // CONSTRUCTOR - Do not edit by hand. CefDisplayHandlerCToCpp::CefDisplayHandlerCToCpp() {} diff --git a/libcef_dll/ctocpp/display_handler_ctocpp.h b/libcef_dll/ctocpp/display_handler_ctocpp.h index 33a9d3861..e13e852c9 100644 --- a/libcef_dll/ctocpp/display_handler_ctocpp.h +++ b/libcef_dll/ctocpp/display_handler_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=f0d07bdd6b1de086c06a2e5ad7960d7cd7409894$ +// $hash=6fc6aa5750ef1aa3353c78daa018f761a7ba22a3$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_DISPLAY_HANDLER_CTOCPP_H_ @@ -54,6 +54,8 @@ class CefDisplayHandlerCToCpp int line) override; bool OnAutoResize(CefRefPtr browser, const CefSize& new_size) override; + void OnLoadingProgressChange(CefRefPtr browser, + double progress) override; }; #endif // CEF_LIBCEF_DLL_CTOCPP_DISPLAY_HANDLER_CTOCPP_H_ diff --git a/tests/ceftests/display_unittest.cc b/tests/ceftests/display_unittest.cc index b5ab624d4..73f95d7af 100644 --- a/tests/ceftests/display_unittest.cc +++ b/tests/ceftests/display_unittest.cc @@ -456,3 +456,71 @@ TEST(DisplayTest, OnConsoleMessageAssert) { handler->ExecuteTest(); ReleaseAndWaitForDestructor(handler); } + +namespace { + +const char kLoadinProgressUrl[] = "http://tests-display/loading-progress.html"; + +// Browser side. +class LoadingProgressTestHandler : public TestHandler { + public: + LoadingProgressTestHandler() {} + + void RunTest() override { + // Add the resources that we will navigate to/from. + AddResource(kLoadinProgressUrl, + "
Content
", + "text/html"); + + // Create the browser. + CreateBrowser(kLoadinProgressUrl); + + // Time out the test after a reasonable period of time. + SetTestTimeout(); + } + + void OnLoadingStateChange(CefRefPtr browser, + bool isLoading, + bool canGoBack, + bool canGoForward) override { + if (isLoading) + return; + + DestroyTest(); + } + + void OnLoadingProgressChange(CefRefPtr browser, + double progress) override { + if (!got_loading_progress_change0_) { + got_loading_progress_change0_.yes(); + EXPECT_GE(progress, 0.0); + } else if (!got_loading_progress_change1_) { + got_loading_progress_change1_.yes(); + EXPECT_LE(progress, 1.0); + } + } + + void DestroyTest() override { + EXPECT_TRUE(got_loading_progress_change0_); + EXPECT_TRUE(got_loading_progress_change1_); + TestHandler::DestroyTest(); + } + + private: + TrackCallback got_loading_progress_change0_; + TrackCallback got_loading_progress_change1_; + + IMPLEMENT_REFCOUNTING(LoadingProgressTestHandler); +}; + +} // namespace + +// Test OnLoadingProgressChange notification. +TEST(DisplayTest, LoadingProgress) { + CefRefPtr handler = + new LoadingProgressTestHandler(); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +}