[M108 Migration] Support callback for customer app error page. 98/288898/13
authorfeifei08.liu <feifei08.liu@samsung.com>
Fri, 24 Feb 2023 07:11:33 +0000 (15:11 +0800)
committerBot Blink <blinkbot@samsung.com>
Thu, 2 Mar 2023 08:14:56 +0000 (08:14 +0000)
Currently WebBrowser load customer error page with below apis:
  callback "load,error"
  ewk_view_html_string_load
  ewk_view_html_string_override_current_entry_load
With these, it cannot meet all case in WebBrowser.
Customer Error Page will be stored as an independent entry.
It will cause issues related with navigation back/forward or reload.

Implement ewk_view_error_page_load_callback_set for app.
Interpose on the stage of NavigationThrottleEfl::WillFailRequest.
And pass customer error page in here.

For this implementation, customer error page will not store in navigation entry.

Currently, this change is supported for WebBrowser.

Reference:
- https://review.tizen.org/gerrit/279699/

Change-Id: I5dd1ac7bbac95b2c3456c35dbe569cf231aafef4
Signed-off-by: feifei08.liu <feifei08.liu@samsung.com>
tizen_src/ewk/efl_integration/browser/navigation_throttle_efl.cc
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/public/ewk_view.cc

index c4928a9a99fdc9c9d999c197c5b2b8a6296e7ee8..4bd6e0a5cb14aa9d9619948947b0c788a436ef12 100644 (file)
@@ -67,6 +67,22 @@ NavigationThrottleEfl::WillFailRequest() {
     int error_code = handle->GetNetErrorCode();
     web_view->InvokeLoadError(handle->GetURL(), error_code,
                               error_code == net::ERR_ABORTED);
+    // If app invoke load error page callback, means app want to display error
+    // page by itself. Provide detail error info and get customer error page
+    // from app side.
+    if (web_view->IsLoadErrorPageCallbackSet()) {
+      const char* error_page = web_view->InvokeViewLoadErrorPageCallback(
+          handle->GetURL(), error_code, "ERR_ABORTED");
+      if (error_page) {
+        LOG(ERROR) << "Already get customer error page";
+        // Currently return result with action NavigationThrottle::CANCEL, error
+        // code and error_page.
+        // TODO: Consider NavigationThrottle::CANCEL is suitable in here or not.
+        return content::NavigationThrottle::ThrottleCheckResult(
+            content::NavigationThrottle::CANCEL, handle->GetNetErrorCode(),
+            absl::make_optional(error_page));
+      }
+    }
 #if BUILDFLAG(IS_TIZEN_TV)
     // In VD tizen, WebBrowser will load error page by itself.
     if (IsWebBrowser())
index 6ac0fefc1430f03a28f0cef1934672632e656ec9..13839fe78a78dd5ca5d52c1f4f43831d9cf67af3 100644 (file)
@@ -1180,6 +1180,32 @@ void EWebView::InvokeLoadError(const GURL& url,
   SmartCallback<EWebViewCallbacks::LoadError>().call(&err);
 }
 
+void EWebView::SetViewLoadErrorPageCallback(
+    Ewk_View_Error_Page_Load_Callback callback,
+    void* user_data) {
+  load_error_page_cb_.Set(callback, user_data);
+}
+
+// Remove below code while ewk_error_cancellation_get has been implemented.
+const char* EWebView::InvokeViewLoadErrorPageCallback(
+    const GURL& url,
+    int error_code,
+    const std::string& error_description) {
+  std::unique_ptr<_Ewk_Error> err(
+      new _Ewk_Error(error_code, url.possibly_invalid_spec().c_str(),
+                     error_description.c_str()));
+  _Ewk_Error_Page error_page;
+
+  LOG(INFO) << "EWebView::InvokeLoadErrorPageCallback url: "
+            << url.spec().c_str() << ", error_code: " << error_code;
+
+  load_error_page_cb_.Run(evas_object_, err.get(), &error_page);
+  return error_page.content;
+}
+
+bool EWebView::IsLoadErrorPageCallbackSet() const {
+  return load_error_page_cb_.IsCallbackSet();
+}
 void EWebView::HandlePopupMenu(std::vector<blink::mojom::MenuItemPtr> items,
                                int selectedIndex,
                                bool multiple,
index 3e79d193492ef020169e4111f387fde5583f2f81..9a2c5911c50e7f8d2bc289ebbf256038f647e941 100644 (file)
@@ -149,6 +149,28 @@ class WebViewCallbackWithReturnValue {
   void* user_data_;
 };
 
+template <typename CallbackPtr, typename... CallbackParameter>
+class WebViewErrorPageLoadCallback {
+ public:
+  WebViewErrorPageLoadCallback() { Set(nullptr, nullptr); }
+
+  void Set(CallbackPtr cb, void* data) {
+    callback_ = cb;
+    user_data_ = data;
+  }
+
+  bool IsCallbackSet() const { return callback_; }
+
+  void Run(Evas_Object* webview, CallbackParameter... param) {
+    if (IsCallbackSet())
+      callback_(webview, param..., user_data_);
+  }
+
+ private:
+  CallbackPtr callback_;
+  void* user_data_;
+};
+
 template <typename CallbackPtr, typename... CallbackParameter>
 class WebViewExceededQuotaCallback {
  public:
@@ -482,6 +504,14 @@ class EWebView {
   Ewk_User_Media_Permission_Query_Result
   InvokeViewUserMediaPermissionQueryCallback(
       _Ewk_User_Media_Permission_Query* user_media_permission_query_context);
+
+  void SetViewLoadErrorPageCallback(Ewk_View_Error_Page_Load_Callback callback,
+                                    void* user_data);
+  const char* InvokeViewLoadErrorPageCallback(
+      const GURL& url,
+      int error_code,
+      const std::string& error_description);
+  bool IsLoadErrorPageCallbackSet() const;
   void SetViewUnfocusAllowCallback(Ewk_View_Unfocus_Allow_Callback callback,
                                    void* user_data);
   bool InvokeViewUnfocusAllowCallback(Ewk_Unfocus_Direction direction,
@@ -807,6 +837,10 @@ class EWebView {
                                  Ewk_View_User_Media_Permission_Query_Callback,
                                  _Ewk_User_Media_Permission_Query*>
       user_media_permission_query_cb_;
+  WebViewErrorPageLoadCallback<Ewk_View_Error_Page_Load_Callback,
+                               Ewk_Error*,
+                               Ewk_Error_Page*>
+      load_error_page_cb_;
   WebViewCallback<Ewk_View_Unfocus_Allow_Callback, Ewk_Unfocus_Direction>
       unfocus_allow_cb_;
   WebViewCallback<Ewk_View_Notification_Permission_Callback,
index 9c76b0c3cf4ed28624924a0f1d97b551cc8ad359..b27d04c7bf76525320753efdbe663cd339a3f971 100644 (file)
@@ -1705,11 +1705,18 @@ void ewk_view_request_manifest(Evas_Object* o,
 void ewk_view_media_device_list_get(Evas_Object* o, Ewk_Media_Device_List_Get_Callback callback, void* user_data) {
   //TODO
 }
+
 void ewk_view_run_mixed_content_confirm_callback_set(
     Evas_Object* /* ewkView */,
     Ewk_View_Run_Mixed_Content_Confirm_Callback /* callback */,
     void* /* user_data */) {}
-void ewk_view_error_page_load_callback_set(Evas_Object* ewk_view, Ewk_View_Error_Page_Load_Callback callback, void* user_data) {}
+
+void ewk_view_error_page_load_callback_set(Evas_Object* ewk_view, Ewk_View_Error_Page_Load_Callback callback, void* user_data)
+{
+  EWK_VIEW_IMPL_GET_OR_RETURN(ewk_view, impl);
+  EINA_SAFETY_ON_NULL_RETURN(callback);
+  impl->SetViewLoadErrorPageCallback(callback, user_data);
+}
 
 Eina_Bool ewk_view_add_item_to_back_forward_list(Evas_Object* o, const Ewk_Back_Forward_List_Item* item)
 {