summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIain Merrick <husky@google.com>2010-11-04 17:25:14 +0000
committerIain Merrick <husky@google.com>2010-11-04 17:47:58 +0000
commit9d2b5a35cbe2528f07d9aa33b2b8cf025f266090 (patch)
treeeca248abc99c1c841caf515bdd607700cdc7a70e
parent9d150343add3ff7e3016bd3aaa2a0ba45aad423e (diff)
downloadexternal_webkit-9d2b5a35cbe2528f07d9aa33b2b8cf025f266090.zip
external_webkit-9d2b5a35cbe2528f07d9aa33b2b8cf025f266090.tar.gz
external_webkit-9d2b5a35cbe2528f07d9aa33b2b8cf025f266090.tar.bz2
Map Chromium error codes to WebKit error codes.
On network errors, we were seeing strange "Data connectivity problem" alert boxes. This is because we were using the HTTP status code instead of a real error code; and when there's a connection error, the HTTP status is uninitialised, so the "error code" was 0 (no error). Bug: 3140283 Change-Id: I0566c29359a0ecb2998573d1a2a77306922c87be
-rw-r--r--WebKit/Android.mk3
-rw-r--r--WebKit/android/WebCoreSupport/WebResponse.cpp10
-rw-r--r--WebKit/android/WebCoreSupport/WebResponse.h2
-rw-r--r--WebKit/android/WebCoreSupport/WebViewClientError.cpp117
-rw-r--r--WebKit/android/WebCoreSupport/WebViewClientError.h72
5 files changed, 199 insertions, 5 deletions
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index 038e3dc..b9bc5a8 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -39,7 +39,8 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
android/WebCoreSupport/WebRequest.cpp \
android/WebCoreSupport/WebRequestContext.cpp \
android/WebCoreSupport/WebResourceRequest.cpp \
- android/WebCoreSupport/WebResponse.cpp
+ android/WebCoreSupport/WebResponse.cpp \
+ android/WebCoreSupport/WebViewClientError.cpp
else
LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
android/WebCoreSupport/ResourceLoaderAndroid.cpp
diff --git a/WebKit/android/WebCoreSupport/WebResponse.cpp b/WebKit/android/WebCoreSupport/WebResponse.cpp
index 5c9b79b..bad733c 100644
--- a/WebKit/android/WebCoreSupport/WebResponse.cpp
+++ b/WebKit/android/WebCoreSupport/WebResponse.cpp
@@ -36,6 +36,9 @@ namespace android {
WebResponse::WebResponse(URLRequest* request)
: m_httpStatusCode(0)
{
+ // The misleadingly-named os_error() is actually a net::Error enum constant.
+ m_error = net::Error(request->status().os_error());
+
m_url = request->url().spec();
m_host = request->url().HostNoBrackets();
request->GetMimeType(&m_mime);
@@ -57,9 +60,9 @@ WebResponse::WebResponse(URLRequest* request)
}
WebResponse::WebResponse(const string &url, const string &mimeType, long long expectedSize, const string &encoding, int httpStatusCode)
- : m_encoding(encoding)
+ : m_error(net::OK)
+ , m_encoding(encoding)
, m_httpStatusCode(httpStatusCode)
- , m_httpStatusText("")
, m_expectedSize(expectedSize)
, m_mime(mimeType)
, m_url(url)
@@ -81,8 +84,7 @@ WebCore::ResourceResponse WebResponse::createResourceResponse()
WebCore::ResourceError WebResponse::createResourceError()
{
- // TODO: Last parameter is a localized string, get the correct one from android
- WebCore::ResourceError error(m_host.c_str(), m_httpStatusCode, m_url.c_str(), m_httpStatusText.c_str());
+ WebCore::ResourceError error(m_host.c_str(), ToWebViewClientError(m_error), m_url.c_str(), net::ErrorToString(m_error));
return error;
}
diff --git a/WebKit/android/WebCoreSupport/WebResponse.h b/WebKit/android/WebCoreSupport/WebResponse.h
index eafc4e3..3c7c601 100644
--- a/WebKit/android/WebCoreSupport/WebResponse.h
+++ b/WebKit/android/WebCoreSupport/WebResponse.h
@@ -28,6 +28,7 @@
#include "ChromiumIncludes.h"
#include "KURL.h"
+#include "WebViewClientError.h"
#include <map>
#include <string>
@@ -61,6 +62,7 @@ public:
WebCore::ResourceError createResourceError();
private:
+ net::Error m_error;
std::string m_encoding;
int m_httpStatusCode;
std::string m_host;
diff --git a/WebKit/android/WebCoreSupport/WebViewClientError.cpp b/WebKit/android/WebCoreSupport/WebViewClientError.cpp
new file mode 100644
index 0000000..8e50cfe
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/WebViewClientError.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebViewClientError.h"
+
+using namespace net;
+
+namespace android {
+
+WebViewClientError ToWebViewClientError(net::Error error) {
+ // Note: many net::Error constants don't have an obvious mapping.
+ // These will be handled by the default case, ERROR_UNKNOWN.
+ switch(error) {
+ case ERR_UNSUPPORTED_AUTH_SCHEME:
+ return ERROR_UNSUPPORTED_AUTH_SCHEME;
+
+ case ERR_INVALID_AUTH_CREDENTIALS:
+ case ERR_MISSING_AUTH_CREDENTIALS:
+ case ERR_MISCONFIGURED_AUTH_ENVIRONMENT:
+ return ERROR_AUTHENTICATION;
+
+ case ERR_TOO_MANY_REDIRECTS:
+ return ERROR_REDIRECT_LOOP;
+
+ case ERR_UPLOAD_FILE_CHANGED:
+ return ERROR_FILE_NOT_FOUND;
+
+ case ERR_INVALID_URL:
+ return ERROR_BAD_URL;
+
+ case ERR_DISALLOWED_URL_SCHEME:
+ case ERR_UNKNOWN_URL_SCHEME:
+ return ERROR_UNSUPPORTED_SCHEME;
+
+ case ERR_IO_PENDING:
+ case ERR_NETWORK_IO_SUSPENDED:
+ return ERROR_IO;
+
+ case ERR_CONNECTION_TIMED_OUT:
+ case ERR_TIMED_OUT:
+ return ERROR_TIMEOUT;
+
+ case ERR_FILE_TOO_BIG:
+ return ERROR_FILE;
+
+ case ERR_HOST_RESOLVER_QUEUE_TOO_LARGE:
+ case ERR_INSUFFICIENT_RESOURCES:
+ case ERR_OUT_OF_MEMORY:
+ return ERROR_TOO_MANY_REQUESTS;
+
+ case ERR_CONNECTION_CLOSED:
+ case ERR_CONNECTION_RESET:
+ case ERR_CONNECTION_REFUSED:
+ case ERR_CONNECTION_ABORTED:
+ case ERR_CONNECTION_FAILED:
+ case ERR_SOCKET_NOT_CONNECTED:
+ return ERROR_CONNECT;
+
+ case ERR_ADDRESS_INVALID:
+ case ERR_ADDRESS_UNREACHABLE:
+ case ERR_NAME_NOT_RESOLVED:
+ case ERR_NAME_RESOLUTION_FAILED:
+ return ERROR_HOST_LOOKUP;
+
+ case ERR_SSL_PROTOCOL_ERROR:
+ case ERR_SSL_CLIENT_AUTH_CERT_NEEDED:
+ case ERR_TUNNEL_CONNECTION_FAILED:
+ case ERR_NO_SSL_VERSIONS_ENABLED:
+ case ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
+ case ERR_SSL_RENEGOTIATION_REQUESTED:
+ case ERR_CERT_ERROR_IN_SSL_RENEGOTIATION:
+ case ERR_BAD_SSL_CLIENT_AUTH_CERT:
+ case ERR_SSL_NO_RENEGOTIATION:
+ case ERR_SSL_DECOMPRESSION_FAILURE_ALERT:
+ case ERR_SSL_BAD_RECORD_MAC_ALERT:
+ case ERR_SSL_UNSAFE_NEGOTIATION:
+ case ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
+ case ERR_SSL_SNAP_START_NPN_MISPREDICTION:
+ case ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED:
+ case ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY:
+ return ERROR_FAILED_SSL_HANDSHAKE;
+
+ case ERR_PROXY_AUTH_UNSUPPORTED:
+ case ERR_PROXY_AUTH_REQUESTED:
+ case ERR_PROXY_CONNECTION_FAILED:
+ case ERR_UNEXPECTED_PROXY_AUTH:
+ return ERROR_PROXY_AUTHENTICATION;
+
+ default:
+ return ERROR_UNKNOWN;
+ }
+}
+
+}
diff --git a/WebKit/android/WebCoreSupport/WebViewClientError.h b/WebKit/android/WebCoreSupport/WebViewClientError.h
new file mode 100644
index 0000000..847fb01
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/WebViewClientError.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebViewClientError_h
+#define WebViewClientError_h
+
+#include "ChromiumIncludes.h"
+
+namespace android {
+
+// This enum must be kept in sync with WebViewClient.java
+enum WebViewClientError {
+ /** Generic error */
+ ERROR_UNKNOWN = -1,
+ /** Server or proxy hostname lookup failed */
+ ERROR_HOST_LOOKUP = -2,
+ /** Unsupported authentication scheme (not basic or digest) */
+ ERROR_UNSUPPORTED_AUTH_SCHEME = -3,
+ /** User authentication failed on server */
+ ERROR_AUTHENTICATION = -4,
+ /** User authentication failed on proxy */
+ ERROR_PROXY_AUTHENTICATION = -5,
+ /** Failed to connect to the server */
+ ERROR_CONNECT = -6,
+ /** Failed to read or write to the server */
+ ERROR_IO = -7,
+ /** Connection timed out */
+ ERROR_TIMEOUT = -8,
+ /** Too many redirects */
+ ERROR_REDIRECT_LOOP = -9,
+ /** Unsupported URI scheme */
+ ERROR_UNSUPPORTED_SCHEME = -10,
+ /** Failed to perform SSL handshake */
+ ERROR_FAILED_SSL_HANDSHAKE = -11,
+ /** Malformed URL */
+ ERROR_BAD_URL = -12,
+ /** Generic file error */
+ ERROR_FILE = -13,
+ /** File not found */
+ ERROR_FILE_NOT_FOUND = -14,
+ /** Too many requests during this load */
+ ERROR_TOO_MANY_REQUESTS = -15,
+};
+
+// Get the closest WebViewClient match to the given Chrome error code.
+WebViewClientError ToWebViewClientError(net::Error);
+
+} // namespace android
+
+#endif // WebViewClientError_h