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())
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,
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:
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,
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,
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)
{