This patch enables proper functionality of ewk_error_* APIs.
References: https://review.tizen.org/gerrit/273622/
Change-Id: I150edcb9497529bac5b7f8eb2c08a596f8145cfc
Signed-off-by: Ayush Kumar <ayush.k123@samsung.com>
"browser/mime_override_manager_efl.h",
"browser/navigation_policy_handler_efl.cc",
"browser/navigation_policy_handler_efl.h",
+ "browser/navigation_throttle_efl.cc",
+ "browser/navigation_throttle_efl.h",
"browser/network_service/proxying_url_loader_efl.cc",
"browser/network_service/proxying_url_loader_efl.h",
"browser/network_service/proxying_url_loader_factory_efl.cc",
"private/ewk_cookie_manager_private.h",
"private/ewk_custom_handlers_private.cc",
"private/ewk_custom_handlers_private.h",
+ "private/ewk_error_private.cc",
"private/ewk_error_private.h",
"private/ewk_favicon_database_private.h",
"private/ewk_frame_private.cc",
--- /dev/null
+// Copyright 2019 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "browser/navigation_throttle_efl.h"
+
+#include "common/web_contents_utils.h"
+#include "content/public/browser/navigation_handle.h"
+#include "eweb_view.h"
+
+#if BUILDFLAG(IS_TIZEN_TV)
+#include "common/application_type.h"
+#endif
+
+namespace content {
+
+NavigationThrottleEfl::NavigationThrottleEfl(
+ NavigationHandle* navigation_handle)
+ : NavigationThrottle(navigation_handle) {}
+
+NavigationThrottleEfl::~NavigationThrottleEfl() = default;
+
+NavigationThrottle::ThrottleCheckResult
+NavigationThrottleEfl::WillFailRequest() {
+ auto* handle = navigation_handle();
+ auto* web_view =
+ web_contents_utils::WebViewFromWebContents(handle->GetWebContents());
+ if (web_view) {
+ int error_code = handle->GetNetErrorCode();
+ web_view->InvokeLoadError(handle->GetURL(), error_code,
+ error_code == net::ERR_ABORTED);
+#if BUILDFLAG(IS_TIZEN_TV)
+ // In VD tizen, WebBrowser will load error page by itself.
+ if (IsWebBrowser())
+ return NavigationThrottle::CANCEL_AND_IGNORE;
+#endif
+ }
+ return NavigationThrottle::PROCEED;
+}
+
+const char* NavigationThrottleEfl::GetNameForLogging() {
+ return "NavigationThrottleEfl";
+}
+
+} // namespace content
--- /dev/null
+// Copyright 2019 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NAVIGATION_THROTTLE_EFL_H_
+#define NAVIGATION_THROTTLE_EFL_H_
+
+#include "content/public/browser/navigation_throttle.h"
+
+namespace content {
+class NavigationThrottleEfl : public NavigationThrottle {
+ public:
+ explicit NavigationThrottleEfl(NavigationHandle* navigation_handle);
+
+ NavigationThrottleEfl(NavigationThrottleEfl&) = delete;
+ NavigationThrottleEfl& operator=(NavigationThrottleEfl&) = delete;
+
+ ~NavigationThrottleEfl() override;
+
+ NavigationThrottle::ThrottleCheckResult WillFailRequest() override;
+
+ const char* GetNameForLogging() override;
+};
+
+} // namespace content
+
+#endif // NAVIGATION_THROTTLE_EFL_H_
#include "base/callback.h"
#include "base/strings/string_number_conversions.h"
#include "browser/editor_client_observer.h"
+#include "browser/navigation_throttle_efl.h"
#include "browser/network_service/proxying_url_loader_factory_efl.h"
#include "browser/notification/notification_controller_efl.h"
#include "browser/quota_permission_context_efl.h"
#include "components/error_page/common/error.h"
#include "components/error_page/common/localized_error.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_iterator.h"
#include "content/public/browser/web_contents.h"
return new QuotaPermissionContextEfl();
}
+std::vector<std::unique_ptr<NavigationThrottle>>
+ContentBrowserClientEfl::CreateThrottlesForNavigation(
+ NavigationHandle* handle) {
+ std::vector<std::unique_ptr<NavigationThrottle>> throttles;
+ throttles.push_back(std::make_unique<NavigationThrottleEfl>(handle));
+ return throttles;
+}
+
std::string ContentBrowserClientEfl::GetProduct() {
return EflWebView::VersionInfo::GetInstance()->ProductNameAndVersionForUserAgent();
}
void SetPreferredLangs(const std::string& preferred_langs);
void AddAcceptLangsChangedCallback(AcceptLangsChangedCallback callback);
void RemoveAcceptLangsChangedCallback(AcceptLangsChangedCallback callback);
+ std::vector<std::unique_ptr<NavigationThrottle>> CreateThrottlesForNavigation(
+ NavigationHandle* handle) override;
private:
bool WillCreateURLLoaderFactory(
void EWebView::InvokeLoadError(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()));
+ bool is_cancellation) {
+ _Ewk_Error err(error_code, is_cancellation,
+ url.possibly_invalid_spec().c_str());
- SmartCallback<EWebViewCallbacks::LoadError>().call(err.get());
+ SmartCallback<EWebViewCallbacks::LoadError>().call(&err);
}
void EWebView::ShowPopupMenu(const std::vector<blink::MenuItemInfo>& items,
const char* base_uri,
const char* unreachable_uri = NULL);
- void InvokeLoadError(const GURL& url,
- int error_code,
- const std::string& error_description);
+ void InvokeLoadError(const GURL& url, int error_code, bool is_cancellation);
void SetViewAuthCallback(Ewk_View_Authentication_Callback callback,
void* user_data);
--- /dev/null
+// Copyright (C) 2012 Intel Corporation.
+// Copyright 2013 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "private/ewk_error_private.h"
+
+#include "base/notreached.h"
+#include "public/ewk_error.h"
+
+int ConvertErrorCode(int error_code) {
+ switch (error_code) {
+ case net::ERR_ABORTED:
+ return EWK_ERROR_CODE_CANCELED;
+
+ case net::ERR_FILE_EXISTS:
+ case net::ERR_FILE_NOT_FOUND:
+ case net::ERR_FILE_NO_SPACE:
+ case net::ERR_FILE_PATH_TOO_LONG:
+ case net::ERR_FILE_TOO_BIG:
+ case net::ERR_FILE_VIRUS_INFECTED:
+ return EWK_ERROR_CODE_FAILED_FILE_IO;
+
+ case net::ERR_CONNECTION_ABORTED:
+ case net::ERR_CONNECTION_CLOSED:
+ case net::ERR_CONNECTION_FAILED:
+ case net::ERR_CONNECTION_REFUSED:
+ case net::ERR_CONNECTION_RESET:
+ return EWK_ERROR_CODE_CANT_CONNECT;
+
+ case net::ERR_DNS_MALFORMED_RESPONSE:
+ case net::ERR_DNS_SERVER_REQUIRES_TCP:
+ case net::ERR_DNS_SERVER_FAILED:
+ case net::ERR_DNS_TIMED_OUT:
+ case net::ERR_DNS_CACHE_MISS:
+ case net::ERR_DNS_SEARCH_EMPTY:
+ case net::ERR_DNS_SORT_ERROR:
+ case net::ERR_HOST_RESOLVER_QUEUE_TOO_LARGE:
+ case net::ERR_NAME_NOT_RESOLVED:
+ case net::ERR_NAME_RESOLUTION_FAILED:
+ return EWK_ERROR_CODE_CANT_LOOKUP_HOST;
+
+ case net::ERR_BAD_SSL_CLIENT_AUTH_CERT:
+ case net::ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED:
+ case net::ERR_SSL_HANDSHAKE_NOT_COMPLETED:
+ return EWK_ERROR_CODE_FAILED_TLS_HANDSHAKE;
+
+ case net::ERR_CERT_AUTHORITY_INVALID:
+ case net::ERR_CERT_COMMON_NAME_INVALID:
+ case net::ERR_CERT_CONTAINS_ERRORS:
+ case net::ERR_CERT_DATE_INVALID:
+ case net::ERR_CERT_INVALID:
+ case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION:
+ case net::ERR_CERT_NON_UNIQUE_NAME:
+ case net::ERR_CERT_NO_REVOCATION_MECHANISM:
+ case net::ERR_CERT_REVOKED:
+ case net::ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
+ case net::ERR_CERT_WEAK_KEY:
+ case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
+ return EWK_ERROR_CODE_INVALID_CERTIFICATE;
+
+ case net::ERR_TIMED_OUT:
+ case net::ERR_CONNECTION_TIMED_OUT:
+ return EWK_ERROR_CODE_REQUEST_TIMEOUT;
+
+ case net::ERR_TOO_MANY_REDIRECTS:
+ return EWK_ERROR_CODE_TOO_MANY_REDIRECTS;
+
+ case net::ERR_TEMPORARILY_THROTTLED:
+ return EWK_ERROR_CODE_TOO_MANY_REQUESTS;
+
+ case net::ERR_ADDRESS_INVALID:
+ case net::ERR_INVALID_URL:
+ return EWK_ERROR_CODE_BAD_URL;
+
+ case net::ERR_DISALLOWED_URL_SCHEME:
+ case net::ERR_UNKNOWN_URL_SCHEME:
+ return EWK_ERROR_CODE_UNSUPPORTED_SCHEME;
+
+ case net::ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED:
+ case net::ERR_INVALID_AUTH_CREDENTIALS:
+ case net::ERR_MALFORMED_IDENTITY:
+ case net::ERR_MISCONFIGURED_AUTH_ENVIRONMENT:
+ case net::ERR_MISSING_AUTH_CREDENTIALS:
+ case net::ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION:
+ case net::ERR_PROXY_AUTH_UNSUPPORTED:
+ case net::ERR_UNEXPECTED_PROXY_AUTH:
+ case net::ERR_UNSUPPORTED_AUTH_SCHEME:
+ return EWK_ERROR_CODE_AUTHENTICATION;
+
+ case net::ERR_CACHE_CHECKSUM_MISMATCH:
+ case net::ERR_CACHE_CHECKSUM_READ_FAILURE:
+ case net::ERR_CACHE_LOCK_TIMEOUT:
+ case net::ERR_CACHE_RACE:
+ case net::ERR_IMPORT_SERVER_CERT_FAILED:
+ return EWK_ERROR_CODE_INTERNAL_SERVER;
+
+ default:
+ return EWK_ERROR_CODE_UNKNOWN;
+ }
+}
+
+const char* GetDescriptionFromErrorCode(int error_code) {
+ switch (ConvertErrorCode(error_code)) {
+ case EWK_ERROR_CODE_CANCELED:
+ return "User canceled";
+ case EWK_ERROR_CODE_CANT_SUPPORT_MIMETYPE:
+ return "Can't show page for this MIME Type";
+ case EWK_ERROR_CODE_FAILED_FILE_IO:
+ return "Error regarding to file io";
+ case EWK_ERROR_CODE_CANT_CONNECT:
+ return "Cannot connect to Network";
+ case EWK_ERROR_CODE_CANT_LOOKUP_HOST:
+ return "Fail to look up host from DNS";
+ case EWK_ERROR_CODE_FAILED_TLS_HANDSHAKE:
+ return "Fail to SSL/TLS handshake";
+ case EWK_ERROR_CODE_INVALID_CERTIFICATE:
+ return "Received certificate is invalid";
+ case EWK_ERROR_CODE_REQUEST_TIMEOUT:
+ return "Connection timeout";
+ case EWK_ERROR_CODE_TOO_MANY_REDIRECTS:
+ return "Too many redirects";
+ case EWK_ERROR_CODE_TOO_MANY_REQUESTS:
+ return "Too many requests during this load";
+ case EWK_ERROR_CODE_BAD_URL:
+ return "Malformed url";
+ case EWK_ERROR_CODE_UNSUPPORTED_SCHEME:
+ return "Unsupported scheme";
+ case EWK_ERROR_CODE_AUTHENTICATION:
+ return "User authentication failed on server";
+ case EWK_ERROR_CODE_INTERNAL_SERVER:
+ return "Web server has internal server error";
+ case EWK_ERROR_CODE_UNKNOWN:
+ return "Unknown";
+ default:
+ NOTREACHED();
+ return "Unknown";
+ }
+}
#define ewk_error_private_h
#include <Eina.h>
+#include "net/base/net_errors.h"
+
+int ConvertErrorCode(int error_code);
+const char* GetDescriptionFromErrorCode(int error_code);
struct _Ewk_Error {
int error_code;
+ bool is_cancellation;
Eina_Stringshare* url;
Eina_Stringshare* description;
Eina_Stringshare* domain;
- _Ewk_Error(int error_code_in, const char* url_in, const char* description_in)
- : error_code(error_code_in),
+ _Ewk_Error(int error_code_in, bool is_cancellation_in, const char* url_in)
+ : error_code(ConvertErrorCode(error_code_in)),
+ is_cancellation(is_cancellation_in),
url(eina_stringshare_add(url_in)),
- description(eina_stringshare_add(description_in)),
+ description(
+ eina_stringshare_add(GetDescriptionFromErrorCode(error_code_in))),
// Chromium always reports "net" as error domain anyways,
// so we just hardcode it.
- domain(eina_stringshare_add("net")) {
- }
+ domain(eina_stringshare_add("net")) {}
~_Ewk_Error() {
eina_stringshare_del(url);
#include "ewk_error_internal.h"
#include "components/error_page/common/error.h"
-#include "net/base/net_errors.h"
#include "private/ewk_error_private.h"
#include "private/ewk_private.h"
-static Ewk_Error_Code convertErrorCode(const Ewk_Error* error);
-
Ewk_Error_Type ewk_error_type_get(const Ewk_Error* error)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(error, EWK_ERROR_TYPE_NONE);
const char* ewk_error_url_get(const Ewk_Error* error)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL(error, 0);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(error, nullptr);
return error->url;
}
int ewk_error_code_get(const Ewk_Error* error)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(error, 0);
- return convertErrorCode(error);
+ return error->error_code;
}
const char* ewk_error_description_get(const Ewk_Error* error)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL(error, 0);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(error, nullptr);
return error->description;
}
Eina_Bool ewk_error_cancellation_get(const Ewk_Error* error)
{
- return EINA_FALSE;
-}
-
-static Ewk_Error_Code convertErrorCode(const Ewk_Error* error)
-{
- switch (error->error_code) {
- case net::ERR_ABORTED:
- return EWK_ERROR_CODE_CANCELED;
-
- case net::ERR_FILE_EXISTS:
- case net::ERR_FILE_NOT_FOUND:
- case net::ERR_FILE_NO_SPACE:
- case net::ERR_FILE_PATH_TOO_LONG:
- case net::ERR_FILE_TOO_BIG:
- case net::ERR_FILE_VIRUS_INFECTED:
- return EWK_ERROR_CODE_FAILED_FILE_IO;
-
- case net::ERR_CONNECTION_ABORTED:
- case net::ERR_CONNECTION_CLOSED:
- case net::ERR_CONNECTION_FAILED:
- case net::ERR_CONNECTION_REFUSED:
- case net::ERR_CONNECTION_RESET:
- return EWK_ERROR_CODE_CANT_CONNECT;
-
- case net::ERR_DNS_MALFORMED_RESPONSE:
- case net::ERR_DNS_SERVER_REQUIRES_TCP:
- case net::ERR_DNS_SERVER_FAILED:
- case net::ERR_DNS_TIMED_OUT:
- case net::ERR_DNS_CACHE_MISS:
- case net::ERR_DNS_SEARCH_EMPTY:
- case net::ERR_DNS_SORT_ERROR:
- case net::ERR_HOST_RESOLVER_QUEUE_TOO_LARGE:
- case net::ERR_NAME_NOT_RESOLVED:
- return EWK_ERROR_CODE_CANT_LOOKUP_HOST;
-
- case net::ERR_BAD_SSL_CLIENT_AUTH_CERT:
- case net::ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED:
- case net::ERR_SSL_HANDSHAKE_NOT_COMPLETED:
- return EWK_ERROR_CODE_FAILED_TLS_HANDSHAKE;
-
- case net::ERR_CERT_AUTHORITY_INVALID:
- case net::ERR_CERT_COMMON_NAME_INVALID:
- case net::ERR_CERT_CONTAINS_ERRORS:
- case net::ERR_CERT_DATE_INVALID:
- case net::ERR_CERT_INVALID:
- case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION:
- case net::ERR_CERT_NON_UNIQUE_NAME:
- case net::ERR_CERT_NO_REVOCATION_MECHANISM:
- case net::ERR_CERT_REVOKED:
- case net::ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
- case net::ERR_CERT_WEAK_KEY:
- case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
- return EWK_ERROR_CODE_INVALID_CERTIFICATE;
-
- case net::ERR_TIMED_OUT:
- case net::ERR_CONNECTION_TIMED_OUT:
- return EWK_ERROR_CODE_REQUEST_TIMEOUT;
-
- case net::ERR_TOO_MANY_REDIRECTS:
- return EWK_ERROR_CODE_TOO_MANY_REDIRECTS;
-
- case net::ERR_TEMPORARILY_THROTTLED:
- return EWK_ERROR_CODE_TOO_MANY_REQUESTS;
-
- case net::ERR_ADDRESS_INVALID:
- case net::ERR_INVALID_URL:
- return EWK_ERROR_CODE_BAD_URL;
- case net::ERR_DISALLOWED_URL_SCHEME:
- case net::ERR_UNKNOWN_URL_SCHEME:
- return EWK_ERROR_CODE_UNSUPPORTED_SCHEME;
-
- case net::ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED:
- case net::ERR_INVALID_AUTH_CREDENTIALS:
- case net::ERR_MALFORMED_IDENTITY:
- case net::ERR_MISCONFIGURED_AUTH_ENVIRONMENT:
- case net::ERR_MISSING_AUTH_CREDENTIALS:
- case net::ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION:
- case net::ERR_PROXY_AUTH_UNSUPPORTED:
- case net::ERR_UNEXPECTED_PROXY_AUTH:
- case net::ERR_UNSUPPORTED_AUTH_SCHEME:
- return EWK_ERROR_CODE_AUTHENTICATION;
-
- case net::ERR_CACHE_CHECKSUM_MISMATCH:
- case net::ERR_CACHE_CHECKSUM_READ_FAILURE:
- case net::ERR_CACHE_LOCK_TIMEOUT:
- case net::ERR_CACHE_RACE:
- case net::ERR_IMPORT_SERVER_CERT_FAILED:
- return EWK_ERROR_CODE_INTERNAL_SERVER;
-
- default:
- return EWK_ERROR_CODE_UNKNOWN;
- }
-}
+ EINA_SAFETY_ON_NULL_RETURN_VAL(error, EINA_FALSE);
+ return error->is_cancellation;
+}
\ No newline at end of file
if (!IsMainFrame(render_frame_host))
return;
- web_view_->InvokeLoadError(validated_url, error_code, std::string());
+ web_view_->InvokeLoadError(validated_url, error_code,
+ error_code == net::ERR_ABORTED);
}
void WebContentsDelegateEfl::DidUpdateFaviconURL(