From d0bfc4d2a497af3bee0f8fe5a9652b49b152765a Mon Sep 17 00:00:00 2001 From: Felix Bruns Date: Fri, 27 Apr 2018 15:11:53 +0000 Subject: [PATCH] Add user_gesture parameter to OnBeforeBrowse (issue #1526) --- include/capi/cef_request_handler_capi.h | 7 +++++-- include/cef_request_handler.h | 5 ++++- libcef/browser/content_browser_client.cc | 3 ++- libcef_dll/cpptoc/request_handler_cpptoc.cc | 6 ++++-- libcef_dll/ctocpp/request_handler_ctocpp.cc | 5 +++-- libcef_dll/ctocpp/request_handler_ctocpp.h | 3 ++- tests/cefclient/browser/client_handler.cc | 1 + tests/cefclient/browser/client_handler.h | 1 + tests/ceftests/frame_unittest.cc | 1 + tests/ceftests/message_router_unittest.cc | 1 + tests/ceftests/navigation_unittest.cc | 19 +++++++++++++++++-- tests/ceftests/request_handler_unittest.cc | 2 ++ tests/ceftests/request_unittest.cc | 1 + tests/ceftests/routing_test_handler.cc | 1 + tests/ceftests/routing_test_handler.h | 1 + 15 files changed, 46 insertions(+), 11 deletions(-) diff --git a/include/capi/cef_request_handler_capi.h b/include/capi/cef_request_handler_capi.h index 359a92660..8c6f39e12 100644 --- a/include/capi/cef_request_handler_capi.h +++ b/include/capi/cef_request_handler_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=b8b5a62b11dbc48f0733c0522864e4dbda8b4f59$ +// $hash=95e44047a75693dbae0ab6b07b415d188252bfdf$ // #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_ @@ -112,12 +112,15 @@ typedef struct _cef_request_handler_t { // If the navigation is allowed cef_load_handler_t::OnLoadStart and // cef_load_handler_t::OnLoadEnd will be called. If the navigation is canceled // cef_load_handler_t::OnLoadError will be called with an |errorCode| value of - // ERR_ABORTED. + // ERR_ABORTED. The |user_gesture| value will be true (1) if the browser + // navigated via explicit user gesture (e.g. clicking a link) or false (0) if + // it navigated automatically (e.g. via the DomContentLoaded event). /// int(CEF_CALLBACK* on_before_browse)(struct _cef_request_handler_t* self, struct _cef_browser_t* browser, struct _cef_frame_t* frame, struct _cef_request_t* request, + int user_gesture, int is_redirect); /// diff --git a/include/cef_request_handler.h b/include/cef_request_handler.h index 2b003a861..7c535a55a 100644 --- a/include/cef_request_handler.h +++ b/include/cef_request_handler.h @@ -106,12 +106,15 @@ class CefRequestHandler : public virtual CefBaseRefCounted { // If the navigation is allowed CefLoadHandler::OnLoadStart and // CefLoadHandler::OnLoadEnd will be called. If the navigation is canceled // CefLoadHandler::OnLoadError will be called with an |errorCode| value of - // ERR_ABORTED. + // ERR_ABORTED. The |user_gesture| value will be true if the browser + // navigated via explicit user gesture (e.g. clicking a link) or false if it + // navigated automatically (e.g. via the DomContentLoaded event). /// /*--cef()--*/ virtual bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) { return false; } diff --git a/libcef/browser/content_browser_client.cc b/libcef/browser/content_browser_client.cc index 2bba826b8..7f43772c9 100644 --- a/libcef/browser/content_browser_client.cc +++ b/libcef/browser/content_browser_client.cc @@ -426,7 +426,8 @@ bool NavigationOnUIThread( request->SetReadOnly(true); ignore_navigation = handler->OnBeforeBrowse( - browser.get(), frame, request.get(), params.is_redirect()); + browser.get(), frame, request.get(), params.has_user_gesture(), + params.is_redirect()); } } } diff --git a/libcef_dll/cpptoc/request_handler_cpptoc.cc b/libcef_dll/cpptoc/request_handler_cpptoc.cc index 3cb901c05..89ad62234 100644 --- a/libcef_dll/cpptoc/request_handler_cpptoc.cc +++ b/libcef_dll/cpptoc/request_handler_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=b4c3eec00b1889871f4e13ea05d7c00a12da1fa0$ +// $hash=02ebd75f0920edad6a23db997a57f28fc921b045$ // #include "libcef_dll/cpptoc/request_handler_cpptoc.h" @@ -34,6 +34,7 @@ request_handler_on_before_browse(struct _cef_request_handler_t* self, cef_browser_t* browser, cef_frame_t* frame, cef_request_t* request, + int user_gesture, int is_redirect) { // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING @@ -56,7 +57,8 @@ request_handler_on_before_browse(struct _cef_request_handler_t* self, // Execute bool _retval = CefRequestHandlerCppToC::Get(self)->OnBeforeBrowse( CefBrowserCToCpp::Wrap(browser), CefFrameCToCpp::Wrap(frame), - CefRequestCToCpp::Wrap(request), is_redirect ? true : false); + CefRequestCToCpp::Wrap(request), user_gesture ? true : false, + is_redirect ? true : false); // Return type: bool return _retval; diff --git a/libcef_dll/ctocpp/request_handler_ctocpp.cc b/libcef_dll/ctocpp/request_handler_ctocpp.cc index 6be865d88..e08e82250 100644 --- a/libcef_dll/ctocpp/request_handler_ctocpp.cc +++ b/libcef_dll/ctocpp/request_handler_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=fbd234d6060aadc1bf5ee0efce5d8cb2c4a0e022$ +// $hash=83e35477036fe71704286b8089535e8787edf2c3$ // #include "libcef_dll/ctocpp/request_handler_ctocpp.h" @@ -30,6 +30,7 @@ bool CefRequestHandlerCToCpp::OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) { cef_request_handler_t* _struct = GetStruct(); if (CEF_MEMBER_MISSING(_struct, on_before_browse)) @@ -53,7 +54,7 @@ bool CefRequestHandlerCToCpp::OnBeforeBrowse(CefRefPtr browser, // Execute int _retval = _struct->on_before_browse( _struct, CefBrowserCppToC::Wrap(browser), CefFrameCppToC::Wrap(frame), - CefRequestCppToC::Wrap(request), is_redirect); + CefRequestCppToC::Wrap(request), user_gesture, is_redirect); // Return type: bool return _retval ? true : false; diff --git a/libcef_dll/ctocpp/request_handler_ctocpp.h b/libcef_dll/ctocpp/request_handler_ctocpp.h index 4921add54..fda995bfa 100644 --- a/libcef_dll/ctocpp/request_handler_ctocpp.h +++ b/libcef_dll/ctocpp/request_handler_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=cde69cb97f29cb75da85bb709470f73d9e57f5bc$ +// $hash=f8849fecaa6e2a36280b9c71b37bdfbe1600fb06$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_REQUEST_HANDLER_CTOCPP_H_ @@ -37,6 +37,7 @@ class CefRequestHandlerCToCpp bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override; bool OnOpenURLFromTab(CefRefPtr browser, CefRefPtr frame, diff --git a/tests/cefclient/browser/client_handler.cc b/tests/cefclient/browser/client_handler.cc index 222af55f7..c68d93396 100644 --- a/tests/cefclient/browser/client_handler.cc +++ b/tests/cefclient/browser/client_handler.cc @@ -635,6 +635,7 @@ void ClientHandler::OnLoadError(CefRefPtr browser, bool ClientHandler::OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) { CEF_REQUIRE_UI_THREAD(); diff --git a/tests/cefclient/browser/client_handler.h b/tests/cefclient/browser/client_handler.h index a95bb4cba..d00973f2d 100644 --- a/tests/cefclient/browser/client_handler.h +++ b/tests/cefclient/browser/client_handler.h @@ -208,6 +208,7 @@ class ClientHandler : public CefClient, bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) OVERRIDE; bool OnOpenURLFromTab( CefRefPtr browser, diff --git a/tests/ceftests/frame_unittest.cc b/tests/ceftests/frame_unittest.cc index 9ec9eb465..8a73171e8 100644 --- a/tests/ceftests/frame_unittest.cc +++ b/tests/ceftests/frame_unittest.cc @@ -480,6 +480,7 @@ class FrameNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { EXPECT_TRUE( expectations_->OnBeforeBrowse(browser, frame, request->GetURL())) diff --git a/tests/ceftests/message_router_unittest.cc b/tests/ceftests/message_router_unittest.cc index 1b8b42d59..84f1d59e4 100644 --- a/tests/ceftests/message_router_unittest.cc +++ b/tests/ceftests/message_router_unittest.cc @@ -229,6 +229,7 @@ class MRTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { message_router_->OnBeforeBrowse(browser, frame); return false; diff --git a/tests/ceftests/navigation_unittest.cc b/tests/ceftests/navigation_unittest.cc index e86ccb8fa..df3d9cd73 100644 --- a/tests/ceftests/navigation_unittest.cc +++ b/tests/ceftests/navigation_unittest.cc @@ -368,6 +368,7 @@ class HistoryNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { const NavListItem& item = kHNavList[nav_]; @@ -1455,6 +1456,7 @@ class OrderNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { EXPECT_EQ(RT_MAIN_FRAME, request->GetResourceType()); @@ -1896,13 +1898,22 @@ class LoadNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { EXPECT_EQ(RT_MAIN_FRAME, request->GetResourceType()); - if (mode_ == LOAD || request->GetURL() == kLoadNav1) + if (mode_ == LOAD || request->GetURL() == kLoadNav1) { EXPECT_EQ(TT_EXPLICIT, request->GetTransitionType()); - else + EXPECT_FALSE(user_gesture); + } else { EXPECT_EQ(TT_LINK, request->GetTransitionType()); + if (mode_ == LEFT_CLICK) { + EXPECT_TRUE(user_gesture); + } else { + EXPECT_FALSE(user_gesture); + } + } + EXPECT_GT(browser_id_current_, 0); EXPECT_EQ(browser_id_current_, browser->GetIdentifier()); @@ -2602,6 +2613,7 @@ class BrowseNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { const std::string& url = request->GetURL(); EXPECT_STREQ(kBrowseNavPageUrl, url.c_str()); @@ -2764,6 +2776,7 @@ class SameNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { const std::string& url = request->GetURL(); EXPECT_STREQ(expected_url_.c_str(), url.c_str()); @@ -2956,6 +2969,7 @@ class CancelBeforeNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { EXPECT_TRUE(got_loading_state_changed_start_); EXPECT_FALSE(got_before_browse_); @@ -3199,6 +3213,7 @@ class CancelAfterNavTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { EXPECT_TRUE(got_loading_state_changed_start_); EXPECT_FALSE(got_before_browse_); diff --git a/tests/ceftests/request_handler_unittest.cc b/tests/ceftests/request_handler_unittest.cc index 436f4a443..5f788034b 100644 --- a/tests/ceftests/request_handler_unittest.cc +++ b/tests/ceftests/request_handler_unittest.cc @@ -204,6 +204,7 @@ class NetNotifyTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { std::string url = request->GetURL(); @@ -576,6 +577,7 @@ class ResourceResponseTest : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { EXPECT_UI_THREAD(); EXPECT_EQ(0, browser_id_); diff --git a/tests/ceftests/request_unittest.cc b/tests/ceftests/request_unittest.cc index 5616d50f5..79b726f58 100644 --- a/tests/ceftests/request_unittest.cc +++ b/tests/ceftests/request_unittest.cc @@ -487,6 +487,7 @@ class TypeTestHandler : public TestHandler { bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override { browse_expectations_.GotRequest(request); diff --git a/tests/ceftests/routing_test_handler.cc b/tests/ceftests/routing_test_handler.cc index e0b14ac9b..f380625bf 100644 --- a/tests/ceftests/routing_test_handler.cc +++ b/tests/ceftests/routing_test_handler.cc @@ -83,6 +83,7 @@ void RoutingTestHandler::OnRenderProcessTerminated( bool RoutingTestHandler::OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) { message_router_->OnBeforeBrowse(browser, frame); return false; diff --git a/tests/ceftests/routing_test_handler.h b/tests/ceftests/routing_test_handler.h index a973ea6fe..16a33dd33 100644 --- a/tests/ceftests/routing_test_handler.h +++ b/tests/ceftests/routing_test_handler.h @@ -26,6 +26,7 @@ class RoutingTestHandler : public TestHandler, bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, + bool user_gesture, bool is_redirect) override; // Returns true if the router handled the navigation.