summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit')
-rw-r--r--WebKit/Android.mk2
-rw-r--r--WebKit/android/WebCoreSupport/PlatformBridge.cpp22
-rw-r--r--WebKit/android/WebCoreSupport/WebRequest.cpp11
-rw-r--r--WebKit/android/WebCoreSupport/WebRequestContext.cpp30
-rw-r--r--WebKit/android/WebCoreSupport/WebRequestContext.h12
-rw-r--r--WebKit/android/jni/DeviceOrientationClientImpl.cpp129
-rw-r--r--WebKit/android/jni/DeviceOrientationClientImpl.h70
-rw-r--r--WebKit/android/jni/DeviceOrientationManager.cpp41
-rw-r--r--WebKit/android/jni/DeviceOrientationManager.h20
-rw-r--r--WebKit/android/jni/WebCoreFrameBridge.cpp2
-rw-r--r--WebKit/android/jni/WebCoreJniOnLoad.cpp2
-rw-r--r--WebKit/android/jni/WebSettings.cpp9
-rw-r--r--WebKit/android/jni/WebViewCore.cpp38
-rw-r--r--WebKit/android/jni/WebViewCore.h4
-rw-r--r--WebKit/android/nav/CacheBuilder.cpp58
-rw-r--r--WebKit/android/nav/CachedColor.cpp58
-rw-r--r--WebKit/android/nav/CachedColor.h87
-rw-r--r--WebKit/android/nav/CachedFrame.cpp6
-rw-r--r--WebKit/android/nav/CachedFrame.h6
-rw-r--r--WebKit/android/nav/CachedNode.cpp1
-rw-r--r--WebKit/android/nav/CachedNode.h3
21 files changed, 569 insertions, 42 deletions
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index 4f16f4c..01ede0f 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -55,6 +55,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
\
android/icu/unicode/ucnv.cpp \
\
+ android/jni/DeviceOrientationClientImpl.cpp \
android/jni/DeviceOrientationManager.cpp \
android/jni/GeolocationPermissionsBridge.cpp \
android/jni/JavaBridge.cpp \
@@ -73,6 +74,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
android/jni/WebViewCore.cpp \
\
android/nav/CacheBuilder.cpp \
+ android/nav/CachedColor.cpp \
android/nav/CachedFrame.cpp \
android/nav/CachedHistory.cpp \
android/nav/CachedInput.cpp \
diff --git a/WebKit/android/WebCoreSupport/PlatformBridge.cpp b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
index 31e3101..754e4d9 100644
--- a/WebKit/android/WebCoreSupport/PlatformBridge.cpp
+++ b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
@@ -27,11 +27,13 @@
#include <PlatformBridge.h>
#include "CookieClient.h"
+#include "Document.h"
#include "FileSystemClient.h"
#include "FrameView.h"
#include "JavaSharedClient.h"
#include "KeyGeneratorClient.h"
#include "PluginView.h"
+#include "Settings.h"
#include "WebCoreFrameBridge.h"
#include "WebRequestContext.h"
#include "WebViewCore.h"
@@ -61,12 +63,17 @@ String PlatformBridge::getSignedPublicKeyAndChallengeString(unsigned index, cons
return client->getSignedPublicKeyAndChallengeString(index, challenge, url);
}
-void PlatformBridge::setCookies(const KURL& url, const String& value)
+void PlatformBridge::setCookies(const Document* document, const KURL& url, const String& value)
{
#if USE(CHROME_NETWORK_STACK)
std::string cookieValue(value.utf8().data());
GURL cookieGurl(url.string().utf8().data());
- WebRequestContext::GetAndroidContext()->cookie_store()->SetCookie(cookieGurl ,cookieValue);
+ WebRequestContext* androidContext;
+ if (document->settings() && document->settings()->privateBrowsingEnabled())
+ androidContext = WebRequestContext::GetAndroidPrivateBrowsingContext();
+ else
+ androidContext = WebRequestContext::GetAndroidContext();
+ androidContext->cookie_store()->SetCookie(cookieGurl, cookieValue);
#else
CookieClient* client = JavaSharedClient::GetCookieClient();
if (!client)
@@ -76,11 +83,16 @@ void PlatformBridge::setCookies(const KURL& url, const String& value)
#endif
}
-String PlatformBridge::cookies(const KURL& url)
+String PlatformBridge::cookies(const Document* document, const KURL& url)
{
#if USE(CHROME_NETWORK_STACK)
GURL cookieGurl(url.string().utf8().data());
- std::string cookies = WebRequestContext::GetAndroidContext()->cookie_store()->GetCookies(cookieGurl);
+ WebRequestContext* androidContext;
+ if (document->settings() && document->settings()->privateBrowsingEnabled())
+ androidContext = WebRequestContext::GetAndroidPrivateBrowsingContext();
+ else
+ androidContext = WebRequestContext::GetAndroidContext();
+ std::string cookies = androidContext->cookie_store()->GetCookies(cookieGurl);
String cookieString(cookies.c_str());
return cookieString;
#else
@@ -92,7 +104,7 @@ String PlatformBridge::cookies(const KURL& url)
#endif
}
-bool PlatformBridge::cookiesEnabled()
+bool PlatformBridge::cookiesEnabled(const Document* document)
{
CookieClient* client = JavaSharedClient::GetCookieClient();
if (!client)
diff --git a/WebKit/android/WebCoreSupport/WebRequest.cpp b/WebKit/android/WebCoreSupport/WebRequest.cpp
index 9118baf..79e780e 100644
--- a/WebKit/android/WebCoreSupport/WebRequest.cpp
+++ b/WebKit/android/WebCoreSupport/WebRequest.cpp
@@ -51,7 +51,6 @@ namespace {
WebRequest::WebRequest(WebUrlLoaderClient* loader, WebResourceRequest webResourceRequest)
: m_urlLoader(loader)
- , m_request(0)
{
GURL gurl(webResourceRequest.url());
m_request = new URLRequest(gurl, this);
@@ -81,6 +80,7 @@ void WebRequest::finish(bool success)
void WebRequest::AppendBytesToUpload(const char* bytes, int bytesLen)
{
+ // This should always be called after start and before finish.
m_request->AppendBytesToUpload(bytes, bytesLen);
}
@@ -100,8 +100,13 @@ void WebRequest::start(bool isPrivateBrowsing)
void WebRequest::cancel()
{
- if (m_request)
- m_request->Cancel();
+ // There is a possible race condition between the IO thread finishing the request and
+ // the WebCore thread cancelling it. If the request has already finished, do
+ // nothing to avoid sending duplicate finish messages to WebCore.
+ if (!m_request)
+ return;
+
+ m_request->Cancel();
finish(true);
}
diff --git a/WebKit/android/WebCoreSupport/WebRequestContext.cpp b/WebKit/android/WebCoreSupport/WebRequestContext.cpp
index 1de066e..6b2fe1b 100644
--- a/WebKit/android/WebCoreSupport/WebRequestContext.cpp
+++ b/WebKit/android/WebCoreSupport/WebRequestContext.cpp
@@ -36,10 +36,14 @@
#include <net/http/http_cache.h>
#include <net/http/http_network_layer.h>
#include <net/proxy/proxy_service.h>
+#include <wtf/text/CString.h>
namespace {
- // TODO: Get uastring from webcore
- std::string userAgent("Mozilla/5.0 (Linux; U; Android 2.1; en-gb; Nexus One Build/ERE21) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17");
+std::string userAgent("Mozilla/5.0 (Linux; U; Android 2.1; en-gb; Nexus One Build/ERE21) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17");
+std::string acceptLanguage("");
+
+Lock userAgentLock;
+Lock acceptLanguageLock;
}
namespace android {
@@ -48,17 +52,39 @@ std::string* WebRequestContext::s_dataDirectory(0);
WebRequestContext::WebRequestContext()
{
+ // Also hardcoded in FrameLoader.java
+ accept_charset_ = "utf-8, iso-8859-1, utf-16, *;q=0.7";
}
WebRequestContext::~WebRequestContext()
{
}
+void WebRequestContext::SetUserAgent(WTF::String string)
+{
+ AutoLock aLock(userAgentLock);
+ userAgent = string.utf8().data();
+ userAgent.append(" alternate http");
+}
+
const std::string& WebRequestContext::GetUserAgent(const GURL& url) const
{
+ AutoLock aLock(userAgentLock);
return userAgent;
}
+void WebRequestContext::SetAcceptLanguage(WTF::String string)
+{
+ AutoLock aLock(acceptLanguageLock);
+ acceptLanguage = string.utf8().data();
+}
+
+const std::string& WebRequestContext::GetAcceptLanguage() const
+{
+ AutoLock aLock(acceptLanguageLock);
+ return acceptLanguage;
+}
+
const std::string* WebRequestContext::GetDataDirectory()
{
if (!s_dataDirectory) {
diff --git a/WebKit/android/WebCoreSupport/WebRequestContext.h b/WebKit/android/WebCoreSupport/WebRequestContext.h
index c321528..a1f7973 100644
--- a/WebKit/android/WebCoreSupport/WebRequestContext.h
+++ b/WebKit/android/WebCoreSupport/WebRequestContext.h
@@ -31,16 +31,23 @@
// a subclass of a chrome class.
#if USE(CHROME_NETWORK_STACK)
-#include "net/http/http_cache.h"
-#include "net/url_request/url_request_context.h"
+#include "PlatformString.h"
+
+#include <net/http/http_cache.h>
+#include <net/url_request/url_request_context.h>
namespace android {
class WebRequestContext : public URLRequestContext {
public:
virtual const std::string& GetUserAgent(const GURL& url) const;
+ virtual const std::string& GetAcceptLanguage() const;
static WebRequestContext* GetAndroidContext();
static WebRequestContext* GetAndroidPrivateBrowsingContext();
+
+ static void SetUserAgent(WTF::String);
+ static void SetAcceptLanguage(WTF::String);
+
private:
static const std::string* GetDataDirectory();
static WebRequestContext* GetAndroidContextForPath(const char* cookiePath, const char* cachePath);
@@ -49,6 +56,7 @@ private:
// Caching this query from java
static std::string* s_dataDirectory;
+ static std::string* s_userAgent;
};
} // namespace android
diff --git a/WebKit/android/jni/DeviceOrientationClientImpl.cpp b/WebKit/android/jni/DeviceOrientationClientImpl.cpp
new file mode 100644
index 0000000..a295bf3
--- /dev/null
+++ b/WebKit/android/jni/DeviceOrientationClientImpl.cpp
@@ -0,0 +1,129 @@
+/*
+ * 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 "DeviceOrientationClientImpl.h"
+
+#include "WebViewCore.h"
+#include <DeviceOrientationController.h>
+#include <Frame.h>
+#include <JNIHelp.h>
+
+namespace android {
+
+using JSC::Bindings::getJNIEnv;
+
+enum javaDeviceOrientationServiceClassMethods {
+ DeviceOrientationServiceMethodStart = 0,
+ DeviceOrientationServiceMethodStop,
+ DeviceOrientationServiceMethodSuspend,
+ DeviceOrientationServiceMethodResume,
+ DeviceOrientationServiceMethodCount
+};
+static jmethodID javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodCount];
+
+DeviceOrientationClientImpl::DeviceOrientationClientImpl(WebViewCore* webViewCore)
+ : m_webViewCore(webViewCore)
+ , m_javaDeviceOrientationServiceObject(0)
+{
+ ASSERT(m_webViewCore);
+}
+
+DeviceOrientationClientImpl::~DeviceOrientationClientImpl()
+{
+ releaseJavaInstance();
+}
+
+jobject DeviceOrientationClientImpl::getJavaInstance()
+{
+ // Lazily get the Java object. We can't do this until the WebViewCore is all
+ // set up.
+ if (m_javaDeviceOrientationServiceObject)
+ return m_javaDeviceOrientationServiceObject;
+
+ JNIEnv* env = getJNIEnv();
+
+ ASSERT(m_webViewCore);
+ jobject object = m_webViewCore->getDeviceOrientationService();
+
+ // Get the Java DeviceOrientationService class.
+ jclass javaDeviceOrientationServiceClass = env->GetObjectClass(object);
+ ASSERT(javaDeviceOrientationServiceClass);
+
+ // Set up the methods we wish to call on the Java DeviceOrientationService
+ // class.
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart] =
+ env->GetMethodID(javaDeviceOrientationServiceClass, "start", "()V");
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop] =
+ env->GetMethodID(javaDeviceOrientationServiceClass, "stop", "()V");
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend] =
+ env->GetMethodID(javaDeviceOrientationServiceClass, "suspend", "()V");
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume] =
+ env->GetMethodID(javaDeviceOrientationServiceClass, "resume", "()V");
+
+ m_javaDeviceOrientationServiceObject = getJNIEnv()->NewGlobalRef(object);
+ getJNIEnv()->DeleteLocalRef(object);
+
+ ASSERT(m_javaDeviceOrientationServiceObject);
+ return m_javaDeviceOrientationServiceObject;
+}
+
+void DeviceOrientationClientImpl::releaseJavaInstance()
+{
+ ASSERT(m_javaDeviceOrientationServiceObject);
+ getJNIEnv()->DeleteGlobalRef(m_javaDeviceOrientationServiceObject);
+}
+
+void DeviceOrientationClientImpl::startUpdating()
+{
+ getJNIEnv()->CallVoidMethod(getJavaInstance(),
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart]);
+}
+
+void DeviceOrientationClientImpl::stopUpdating()
+{
+ getJNIEnv()->CallVoidMethod(getJavaInstance(),
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop]);
+}
+
+void DeviceOrientationClientImpl::onOrientationChange(PassRefPtr<DeviceOrientation> orientation)
+{
+ m_lastOrientation = orientation;
+ m_controller->didChangeDeviceOrientation(m_lastOrientation.get());
+}
+
+void DeviceOrientationClientImpl::suspend()
+{
+ getJNIEnv()->CallVoidMethod(getJavaInstance(),
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend]);
+}
+
+void DeviceOrientationClientImpl::resume()
+{
+ getJNIEnv()->CallVoidMethod(getJavaInstance(),
+ javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume]);
+}
+
+} // namespace android
diff --git a/WebKit/android/jni/DeviceOrientationClientImpl.h b/WebKit/android/jni/DeviceOrientationClientImpl.h
new file mode 100644
index 0000000..8514a6b
--- /dev/null
+++ b/WebKit/android/jni/DeviceOrientationClientImpl.h
@@ -0,0 +1,70 @@
+/*
+ * 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 DeviceOrientationClientImpl_h
+#define DeviceOrientationClientImpl_h
+
+#include <DeviceOrientation.h>
+#include <DeviceOrientationClient.h>
+#include <JNIUtility.h>
+#include <PassRefPtr.h>
+#include <RefPtr.h>
+
+using namespace WebCore;
+
+namespace android {
+
+class DeviceOrientationManager;
+class WebViewCore;
+
+class DeviceOrientationClientImpl : public DeviceOrientationClient {
+public:
+ DeviceOrientationClientImpl(WebViewCore*);
+
+ void onOrientationChange(PassRefPtr<DeviceOrientation>);
+ void suspend();
+ void resume();
+
+ // DeviceOrientationClient methods
+ virtual void startUpdating();
+ virtual void stopUpdating();
+ virtual DeviceOrientation* lastOrientation() const { return m_lastOrientation.get(); }
+ virtual void setController(DeviceOrientationController* controller) { m_controller = controller; }
+
+protected:
+ virtual ~DeviceOrientationClientImpl();
+
+ jobject getJavaInstance();
+ void releaseJavaInstance();
+
+ WebViewCore* m_webViewCore;
+ jobject m_javaDeviceOrientationServiceObject;
+ DeviceOrientationController* m_controller;
+ RefPtr<DeviceOrientation> m_lastOrientation;
+};
+
+} // namespace android
+
+#endif // DeviceOrientationClientImpl_h
diff --git a/WebKit/android/jni/DeviceOrientationManager.cpp b/WebKit/android/jni/DeviceOrientationManager.cpp
index 8a48ce8..621e646 100644
--- a/WebKit/android/jni/DeviceOrientationManager.cpp
+++ b/WebKit/android/jni/DeviceOrientationManager.cpp
@@ -26,7 +26,12 @@
#include "config.h"
#include "DeviceOrientationManager.h"
+#include "DeviceOrientationClientImpl.h"
+#include "DeviceOrientationController.h"
#include "WebViewCore.h"
+#include "Frame.h"
+#include "Page.h"
+
#include <DeviceOrientationClientMock.h>
#include <JNIHelp.h>
@@ -34,8 +39,9 @@ using namespace WebCore;
namespace android {
-DeviceOrientationManager::DeviceOrientationManager()
+DeviceOrientationManager::DeviceOrientationManager(WebViewCore* webViewCore)
: m_useMock(false)
+ , m_webViewCore(webViewCore)
{
}
@@ -51,16 +57,34 @@ void DeviceOrientationManager::setMockOrientation(PassRefPtr<DeviceOrientation>
static_cast<DeviceOrientationClientMock*>(client())->setOrientation(orientation);
};
+void DeviceOrientationManager::onOrientationChange(PassRefPtr<DeviceOrientation> orientation)
+{
+ ASSERT(!m_useMock);
+ static_cast<DeviceOrientationClientImpl*>(m_client.get())->onOrientationChange(orientation);
+}
+
+void DeviceOrientationManager::maybeSuspendClient()
+{
+ if (!m_useMock && m_client)
+ static_cast<DeviceOrientationClientImpl*>(m_client.get())->suspend();
+}
+
+void DeviceOrientationManager::maybeResumeClient()
+{
+ if (!m_useMock && m_client)
+ static_cast<DeviceOrientationClientImpl*>(m_client.get())->resume();
+}
+
DeviceOrientationClient* DeviceOrientationManager::client()
{
- // FIXME: Implement real client.
if (!m_client)
- m_client.set(m_useMock ? new DeviceOrientationClientMock() : 0);
+ m_client.set(m_useMock ? new DeviceOrientationClientMock
+ : static_cast<DeviceOrientationClient*>(new DeviceOrientationClientImpl(m_webViewCore)));
ASSERT(m_client);
return m_client.get();
}
-// JNI for android.webkit.MockDeviceOrientation
+// JNI for android.webkit.DeviceOrientationManager
static const char* javaDeviceOrientationManagerClass = "android/webkit/DeviceOrientationManager";
static WebViewCore* getWebViewCore(JNIEnv* env, jobject webViewCoreObject)
@@ -81,9 +105,16 @@ static void setMockOrientation(JNIEnv* env, jobject, jobject webViewCoreObject,
getWebViewCore(env, webViewCoreObject)->deviceOrientationManager()->setMockOrientation(orientation.release());
}
+static void onOrientationChange(JNIEnv* env, jobject, jobject webViewCoreObject, bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
+{
+ RefPtr<DeviceOrientation> orientation = DeviceOrientation::create(canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
+ getWebViewCore(env, webViewCoreObject)->deviceOrientationManager()->onOrientationChange(orientation.release());
+}
+
static JNINativeMethod gDeviceOrientationManagerMethods[] = {
{ "nativeUseMock", "(Landroid/webkit/WebViewCore;)V", (void*) useMock },
- { "nativeSetMockOrientation", "(Landroid/webkit/WebViewCore;ZDZDZD)V", (void*) setMockOrientation }
+ { "nativeSetMockOrientation", "(Landroid/webkit/WebViewCore;ZDZDZD)V", (void*) setMockOrientation },
+ { "nativeOnOrientationChange", "(Landroid/webkit/WebViewCore;ZDZDZD)V", (void*) onOrientationChange }
};
int register_device_orientation_manager(JNIEnv* env)
diff --git a/WebKit/android/jni/DeviceOrientationManager.h b/WebKit/android/jni/DeviceOrientationManager.h
index 0e43c18..a0da32f 100644
--- a/WebKit/android/jni/DeviceOrientationManager.h
+++ b/WebKit/android/jni/DeviceOrientationManager.h
@@ -26,9 +26,11 @@
#ifndef DeviceOrientationManager_h
#define DeviceOrientationManager_h
+#include <DeviceOrientation.h>
#include <DeviceOrientationClient.h>
-#include <PassRefPtr.h>
#include <OwnPtr.h>
+#include <PassRefPtr.h>
+#include <RefPtr.h>
namespace WebCore {
class DeviceOrientation;
@@ -36,20 +38,26 @@ class DeviceOrientation;
namespace android {
-// This class handles providing a client for DeviceOrientation. This is
-// non-trivial because of the need to be able to use and configure a mock
-// client. This class is owned by WebViewCore and exists to keep cruft out of
-// that class.
+class WebViewCore;
+
+// This class takes care of the fact that the client used for DeviceOrientation
+// may be either the real implementation or a mock. It also handles setting the
+// orientation on both the real and mock clients. This class is owned by
+// WebViewCore and exists to keep cruft out of that class.
class DeviceOrientationManager {
public:
- DeviceOrientationManager();
+ DeviceOrientationManager(WebViewCore*);
void useMock();
void setMockOrientation(PassRefPtr<WebCore::DeviceOrientation>);
+ void onOrientationChange(PassRefPtr<WebCore::DeviceOrientation>);
+ void maybeSuspendClient();
+ void maybeResumeClient();
WebCore::DeviceOrientationClient* client();
private:
bool m_useMock;
+ WebViewCore* m_webViewCore;
OwnPtr<WebCore::DeviceOrientationClient> m_client;
};
diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp
index 868233a..a868260 100644
--- a/WebKit/android/jni/WebCoreFrameBridge.cpp
+++ b/WebKit/android/jni/WebCoreFrameBridge.cpp
@@ -42,6 +42,7 @@
#include "DragClientAndroid.h"
#include "EditorClientAndroid.h"
#include "Element.h"
+#include "FocusController.h"
#include "Font.h"
#include "FormState.h"
#include "Frame.h"
@@ -940,6 +941,7 @@ static void CreateFrame(JNIEnv* env, jobject obj, jobject javaview, jobject jAss
// Set the frame to active to turn on keyboard focus.
frame->init();
frame->selection()->setFocused(true);
+ frame->page()->focusController()->setFocused(true);
deviceMotionC->setWebViewCore(webViewCore);
deviceOrientationC->setWebViewCore(webViewCore);
diff --git a/WebKit/android/jni/WebCoreJniOnLoad.cpp b/WebKit/android/jni/WebCoreJniOnLoad.cpp
index 57fccac..cb3fb57 100644
--- a/WebKit/android/jni/WebCoreJniOnLoad.cpp
+++ b/WebKit/android/jni/WebCoreJniOnLoad.cpp
@@ -35,6 +35,7 @@
#include "DeviceOrientationClientAndroid.h"
#include "DragClientAndroid.h"
#include "EditorClientAndroid.h"
+#include "FocusController.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameLoaderClientAndroid.h"
@@ -233,6 +234,7 @@ EXPORT void benchmark(const char* url, int reloadCount, int width, int height) {
// assertion in the Cache code)
frame->init();
frame->selection()->setFocused(true);
+ frame->page()->focusController()->setFocused(true);
deviceMotion->setWebViewCore(webViewCore);
deviceOrientation->setWebViewCore(webViewCore);
diff --git a/WebKit/android/jni/WebSettings.cpp b/WebKit/android/jni/WebSettings.cpp
index f389a39..9b84409 100644
--- a/WebKit/android/jni/WebSettings.cpp
+++ b/WebKit/android/jni/WebSettings.cpp
@@ -48,6 +48,7 @@
#if USE(V8)
#include "WorkerContextExecutionProxy.h"
#endif
+#include "WebRequestContext.h"
#include <JNIHelp.h>
#include <utils/misc.h>
@@ -76,6 +77,7 @@ struct FieldIds {
"Ljava/lang/String;");
mUserAgent = env->GetFieldID(clazz, "mUserAgent",
"Ljava/lang/String;");
+ mAcceptLanguage = env->GetFieldID(clazz, "mAcceptLanguage", "Ljava/lang/String;");
mMinimumFontSize = env->GetFieldID(clazz, "mMinimumFontSize", "I");
mMinimumLogicalFontSize = env->GetFieldID(clazz, "mMinimumLogicalFontSize", "I");
mDefaultFontSize = env->GetFieldID(clazz, "mDefaultFontSize", "I");
@@ -130,6 +132,7 @@ struct FieldIds {
LOG_ASSERT(mFantasyFontFamily, "Could not find field mFantasyFontFamily");
LOG_ASSERT(mDefaultTextEncoding, "Could not find field mDefaultTextEncoding");
LOG_ASSERT(mUserAgent, "Could not find field mUserAgent");
+ LOG_ASSERT(mAcceptLanguage, "Could not find field mAcceptLanguage");
LOG_ASSERT(mMinimumFontSize, "Could not find field mMinimumFontSize");
LOG_ASSERT(mMinimumLogicalFontSize, "Could not find field mMinimumLogicalFontSize");
LOG_ASSERT(mDefaultFontSize, "Could not find field mDefaultFontSize");
@@ -177,6 +180,7 @@ struct FieldIds {
jfieldID mFantasyFontFamily;
jfieldID mDefaultTextEncoding;
jfieldID mUserAgent;
+ jfieldID mAcceptLanguage;
jfieldID mMinimumFontSize;
jfieldID mMinimumLogicalFontSize;
jfieldID mDefaultFontSize;
@@ -295,6 +299,11 @@ public:
str = (jstring)env->GetObjectField(obj, gFieldIds->mUserAgent);
WebFrame::getWebFrame(pFrame)->setUserAgent(to_string(env, str));
+#if USE(CHROME_NETWORK_STACK)
+ WebRequestContext::SetUserAgent(to_string(env, str));
+ str = (jstring)env->GetObjectField(obj, gFieldIds->mAcceptLanguage);
+ WebRequestContext::SetAcceptLanguage(to_string(env, str));
+#endif
jint size = env->GetIntField(obj, gFieldIds->mMinimumFontSize);
s->setMinimumFontSize(size);
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index 6cd1280..72b4eac 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -244,6 +244,7 @@ struct WebViewCore::JavaGlue {
jmethodID m_populateVisitedLinks;
jmethodID m_geolocationPermissionsShowPrompt;
jmethodID m_geolocationPermissionsHidePrompt;
+ jmethodID m_getDeviceOrientationService;
jmethodID m_addMessageToConsole;
jmethodID m_getPluginClass;
jmethodID m_showFullScreenPlugin;
@@ -278,7 +279,8 @@ Mutex WebViewCore::gButtonMutex;
Mutex WebViewCore::gCursorBoundsMutex;
WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* mainframe)
- : m_pluginInvalTimer(this, &WebViewCore::pluginInvalTimerFired)
+ : m_pluginInvalTimer(this, &WebViewCore::pluginInvalTimerFired)
+ , m_deviceOrientationManager(this)
{
m_mainFrame = mainframe;
@@ -332,6 +334,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
m_javaGlue->m_populateVisitedLinks = GetJMethod(env, clazz, "populateVisitedLinks", "()V");
m_javaGlue->m_geolocationPermissionsShowPrompt = GetJMethod(env, clazz, "geolocationPermissionsShowPrompt", "(Ljava/lang/String;)V");
m_javaGlue->m_geolocationPermissionsHidePrompt = GetJMethod(env, clazz, "geolocationPermissionsHidePrompt", "()V");
+ m_javaGlue->m_getDeviceOrientationService = GetJMethod(env, clazz, "getDeviceOrientationService", "()Landroid/webkit/DeviceOrientationService;");
m_javaGlue->m_addMessageToConsole = GetJMethod(env, clazz, "addMessageToConsole", "(Ljava/lang/String;ILjava/lang/String;I)V");
m_javaGlue->m_getPluginClass = GetJMethod(env, clazz, "getPluginClass", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Class;");
m_javaGlue->m_showFullScreenPlugin = GetJMethod(env, clazz, "showFullScreenPlugin", "(Landroid/webkit/ViewManager$ChildView;I)V");
@@ -1846,7 +1849,6 @@ void WebViewCore::setSelection(int start, int end)
client->setUiGeneratedSelectionChange(false);
WebCore::Frame* focusedFrame = focus->document()->frame();
focusedFrame->revealSelection();
- setFocusControllerActive(focusedFrame, true);
}
String WebViewCore::modifySelection(const String& alter, const String& direction, const String& granularity)
@@ -1961,7 +1963,6 @@ void WebViewCore::passToJs(int generation, const WTF::String& current,
client->setUiGeneratedSelectionChange(false);
m_blockTextfieldUpdates = false;
m_textGeneration = generation;
- setFocusControllerActive(focus->document()->frame(), true);
WebCore::RenderTextControl* renderText =
static_cast<WebCore::RenderTextControl*>(renderer);
WTF::String test = renderText->text();
@@ -1997,18 +1998,9 @@ void WebViewCore::scrollFocusedTextInput(float xPercent, int y)
renderText->setScrollTop(y);
}
-void WebViewCore::setFocusControllerActive(WebCore::Frame* frame, bool active)
+void WebViewCore::setFocusControllerActive(bool active)
{
- if (!frame) {
- WebCore::Node* focus = currentFocus();
- if (focus)
- frame = focus->document()->frame();
- else
- frame = m_mainFrame;
- }
- WebCore::FocusController* controller = frame->page()->focusController();
- controller->setActive(active);
- controller->setFocused(active);
+ m_mainFrame->page()->focusController()->setActive(active);
}
void WebViewCore::saveDocumentState(WebCore::Frame* frame)
@@ -2489,7 +2481,6 @@ bool WebViewCore::handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* node
if (renderer && (renderer->isTextField() || renderer->isTextArea())) {
bool ime = !(static_cast<WebCore::HTMLInputElement*>(focusNode))
->readOnly();
- setFocusControllerActive(framePtr, ime);
if (ime) {
RenderTextControl* rtc
= static_cast<RenderTextControl*> (renderer);
@@ -2504,7 +2495,6 @@ bool WebViewCore::handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* node
// keyboard and disable the focus controller because no text input
// is needed.
bool keyboard = focusNode->isContentEditable();
- setFocusControllerActive(framePtr, keyboard);
if (keyboard) {
requestKeyboard(true);
} else {
@@ -2513,7 +2503,6 @@ bool WebViewCore::handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* node
}
} else {
// There is no focusNode, so the keyboard is not needed.
- setFocusControllerActive(framePtr, false);
clearTextEntry();
}
return handled;
@@ -2612,6 +2601,15 @@ void WebViewCore::geolocationPermissionsHidePrompt()
checkException(env);
}
+jobject WebViewCore::getDeviceOrientationService()
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ jobject object = env->CallObjectMethod(m_javaGlue->object(env).get(),
+ m_javaGlue->m_getDeviceOrientationService);
+ checkException(env);
+ return object;
+}
+
bool WebViewCore::jsConfirm(const WTF::String& url, const WTF::String& text)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
@@ -3033,7 +3031,7 @@ static void SetFocusControllerActive(JNIEnv *env, jobject obj, jboolean active)
LOGV("webviewcore::nativeSetFocusControllerActive()\n");
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in nativeSetFocusControllerActive");
- viewImpl->setFocusControllerActive(0, active);
+ viewImpl->setFocusControllerActive(active);
}
static void SaveDocumentState(JNIEnv *env, jobject obj, jint frame)
@@ -3384,6 +3382,8 @@ static void Pause(JNIEnv* env, jobject obj)
geolocation->suspend();
}
+ GET_NATIVE_VIEW(env, obj)->deviceOrientationManager()->maybeSuspendClient();
+
ANPEvent event;
SkANP::InitEvent(&event, kLifecycle_ANPEventType);
event.data.lifecycle.action = kPause_ANPLifecycleAction;
@@ -3401,6 +3401,8 @@ static void Resume(JNIEnv* env, jobject obj)
geolocation->resume();
}
+ GET_NATIVE_VIEW(env, obj)->deviceOrientationManager()->maybeResumeClient();
+
ANPEvent event;
SkANP::InitEvent(&event, kLifecycle_ANPEventType);
event.data.lifecycle.action = kResume_ANPLifecycleAction;
diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h
index fe29c81..11a7228 100644
--- a/WebKit/android/jni/WebViewCore.h
+++ b/WebKit/android/jni/WebViewCore.h
@@ -242,6 +242,8 @@ namespace android {
*/
void geolocationPermissionsHidePrompt();
+ jobject getDeviceOrientationService();
+
void addMessageToConsole(const String& message, unsigned int lineNumber, const String& sourceID, int msgLevel);
/**
@@ -350,7 +352,7 @@ namespace android {
* Set the FocusController's active and focused states, so that
* the caret will draw (true) or not.
*/
- void setFocusControllerActive(WebCore::Frame*, bool active);
+ void setFocusControllerActive(bool active);
void saveDocumentState(WebCore::Frame* frame);
diff --git a/WebKit/android/nav/CacheBuilder.cpp b/WebKit/android/nav/CacheBuilder.cpp
index c05395c..3453d20 100644
--- a/WebKit/android/nav/CacheBuilder.cpp
+++ b/WebKit/android/nav/CacheBuilder.cpp
@@ -929,6 +929,35 @@ static void AddLayer(CachedFrame* frame, size_t index, const IntPoint& location,
}
#endif
+static int FindColorIndex(WTF::Vector<CachedColor>& colorTracker,
+ const CachedColor& cachedColor)
+{
+ CachedColor* work = colorTracker.begin() - 1;
+ CachedColor* end = colorTracker.end();
+ while (++work < end) {
+ if (*work == cachedColor)
+ return work - colorTracker.begin();
+ }
+ int result = colorTracker.size();
+ colorTracker.grow(result + 1);
+ CachedColor& newColor = colorTracker.last();
+ newColor = cachedColor;
+ return result;
+}
+
+static void InitColor(CachedColor* color)
+{
+ color->setFillColor(RenderStyle::initialRingFillColor());
+ color->setInnerWidth(RenderStyle::initialRingInnerWidth());
+ color->setOuterWidth(RenderStyle::initialRingOuterWidth());
+ color->setOutset(RenderStyle::initialRingOutset());
+ color->setPressedInnerColor(RenderStyle::initialRingPressedInnerColor());
+ color->setPressedOuterColor(RenderStyle::initialRingPressedOuterColor());
+ color->setRadius(RenderStyle::initialRingRadius());
+ color->setSelectedInnerColor(RenderStyle::initialRingSelectedInnerColor());
+ color->setSelectedOuterColor(RenderStyle::initialRingSelectedOuterColor());
+}
+
// when new focus is found, push it's parent on a stack
// as long as more focii are found with the same (grand) parent, note it
// (which only requires retrieving the last parent on the stack)
@@ -956,6 +985,8 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
bzero(clipTracker.data(), sizeof(ClipColumnTracker));
WTF::Vector<TabIndexTracker> tabIndexTracker(1); // sentinel
bzero(tabIndexTracker.data(), sizeof(TabIndexTracker));
+ WTF::Vector<CachedColor> colorTracker(1);
+ InitColor(colorTracker.data());
#if DUMP_NAV_CACHE
char* frameNamePtr = cachedFrame->mDebug.mFrameName;
Builder(frame)->mDebug.frameName(frameNamePtr, frameNamePtr +
@@ -971,9 +1002,12 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
#if DUMP_NAV_CACHE
cachedParentNode.mDebug.mNodeIndex = nodeIndex;
#endif
+ cachedFrame->add(colorTracker[0]);
cachedFrame->add(cachedParentNode);
Node* node = parent;
int cacheIndex = 1;
+ int colorIndex = 0; // assume no special css ring colors
+ const void* lastStyleDataPtr = 0;
int textInputIndex = 0;
Node* focused = doc->focusedNode();
if (focused)
@@ -1108,6 +1142,7 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
TextDirection direction = LTR;
String exported;
CachedNodeType type = NORMAL_CACHEDNODETYPE;
+ CachedColor cachedColor;
CachedInput cachedInput;
IntRect bounds;
IntRect absBounds;
@@ -1303,6 +1338,28 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
globalOffsetX, globalOffsetY, &cachedNode.mCursorRing) == false)
continue;
keepTextNode:
+ if (nodeRenderer) { // area tags' node->renderer() == 0
+ RenderStyle* style = nodeRenderer->style();
+ const void* styleDataPtr = style->ringData();
+ // to save time, see if we're pointing to the same style data as before
+ if (lastStyleDataPtr != styleDataPtr) {
+ lastStyleDataPtr = styleDataPtr;
+ cachedColor.setFillColor(style->ringFillColor());
+ cachedColor.setInnerWidth(style->ringInnerWidth());
+ cachedColor.setOuterWidth(style->ringOuterWidth());
+ cachedColor.setOutset(style->ringOutset());
+ cachedColor.setPressedInnerColor(style->ringPressedInnerColor());
+ cachedColor.setPressedOuterColor(style->ringPressedOuterColor());
+ cachedColor.setRadius(style->ringRadius());
+ cachedColor.setSelectedInnerColor(style->ringSelectedInnerColor());
+ cachedColor.setSelectedOuterColor(style->ringSelectedOuterColor());
+ int oldSize = colorTracker.size();
+ colorIndex = FindColorIndex(colorTracker, cachedColor);
+ if (colorIndex == oldSize)
+ cachedFrame->add(cachedColor);
+ }
+ } else
+ colorIndex = 0;
IntRect clip = hasClip ? bounds : absBounds;
size_t clipIndex = clipTracker.size();
if (clipTracker.last().mNode == node)
@@ -1347,6 +1404,7 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
}
#endif
cachedNode.setNavableRects();
+ cachedNode.setColorIndex(colorIndex);
cachedNode.setExport(exported);
cachedNode.setHasCursorRing(hasCursorRing);
cachedNode.setHasMouseOver(hasMouseOver);
diff --git a/WebKit/android/nav/CachedColor.cpp b/WebKit/android/nav/CachedColor.cpp
new file mode 100644
index 0000000..c610022
--- /dev/null
+++ b/WebKit/android/nav/CachedColor.cpp
@@ -0,0 +1,58 @@
+/*
+ * 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 "CachedPrefix.h"
+#include "CachedColor.h"
+
+namespace android {
+
+#if DUMP_NAV_CACHE
+
+#define DEBUG_PRINT_COLOR(field) \
+ DUMP_NAV_LOGD("// SkColor " #field "=0x%08x;\n", b->field)
+
+CachedColor* CachedColor::Debug::base() const {
+ CachedColor* nav = (CachedColor*) ((char*) this - OFFSETOF(CachedColor, mDebug));
+ return nav;
+}
+
+void CachedColor::Debug::print() const
+{
+ CachedColor* b = base();
+ DEBUG_PRINT_COLOR(mFillColor);
+ DUMP_NAV_LOGD("// int mInnerWidth=%d;\n", b->mInnerWidth);
+ DUMP_NAV_LOGD("// int mOuterWidth=%d;\n", b->mOuterWidth);
+ DUMP_NAV_LOGD("// int mOutset=%d;\n", b->mOutset);
+ DEBUG_PRINT_COLOR(mPressedInnerColor);
+ DEBUG_PRINT_COLOR(mPressedOuterColor);
+ DUMP_NAV_LOGD("// int mRadius=%d;\n", b->mRadius);
+ DEBUG_PRINT_COLOR(mSelectedInnerColor);
+ DEBUG_PRINT_COLOR(mSelectedOuterColor);
+}
+
+#endif
+
+}
+
diff --git a/WebKit/android/nav/CachedColor.h b/WebKit/android/nav/CachedColor.h
new file mode 100644
index 0000000..4b39810
--- /dev/null
+++ b/WebKit/android/nav/CachedColor.h
@@ -0,0 +1,87 @@
+/*
+ * 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 CachedColor_H
+#define CachedColor_H
+
+#include "CachedDebug.h"
+#include "Color.h"
+#include "Length.h"
+#include "SkColor.h"
+
+using namespace WebCore;
+
+namespace android {
+
+class CachedColor {
+public:
+ CachedColor() {
+ // Initiaized to 0 in its array, so nothing to do in the
+ // constructor
+ }
+ bool operator==(const CachedColor& o) const {
+ return memcmp(&o, this, sizeof(this)) == 0; }
+ SkColor fillColor() const { return mFillColor; }
+ void init();
+ int innerWidth() const { return mInnerWidth; }
+ int outerWidth() const { return mOuterWidth; }
+ int outset() const { return mOutset; }
+ SkColor pressedInnerColor() const { return mPressedInnerColor; }
+ SkColor pressedOuterColor() const { return mPressedOuterColor; }
+ int radius() const { return mRadius; }
+ SkColor selectedInnerColor() const { return mSelectedInnerColor; }
+ SkColor selectedOuterColor() const { return mSelectedOuterColor; }
+ void setFillColor(const Color& c) { mFillColor = c.rgb(); }
+ void setInnerWidth(Length l) { mInnerWidth = l.value(); }
+ void setOuterWidth(Length l) { mOuterWidth = l.value(); }
+ void setOutset(Length l) { mOutset = l.value(); }
+ void setPressedInnerColor(const Color& c) { mPressedInnerColor = c.rgb(); }
+ void setPressedOuterColor(const Color& c) { mPressedOuterColor = c.rgb(); }
+ void setRadius(Length l) { mRadius = l.value(); }
+ void setSelectedInnerColor(const Color& c) { mSelectedInnerColor = c.rgb(); }
+ void setSelectedOuterColor(const Color& c) { mSelectedOuterColor = c.rgb(); }
+private:
+ SkColor mFillColor;
+ int mInnerWidth;
+ int mOuterWidth;
+ int mOutset;
+ SkColor mPressedInnerColor;
+ SkColor mPressedOuterColor;
+ int mRadius;
+ SkColor mSelectedInnerColor;
+ SkColor mSelectedOuterColor;
+#if DUMP_NAV_CACHE
+public:
+ class Debug {
+public:
+ CachedColor* base() const;
+ void print() const;
+ } mDebug;
+#endif
+};
+
+}
+
+#endif
diff --git a/WebKit/android/nav/CachedFrame.cpp b/WebKit/android/nav/CachedFrame.cpp
index 3bf16fc..4219d66 100644
--- a/WebKit/android/nav/CachedFrame.cpp
+++ b/WebKit/android/nav/CachedFrame.cpp
@@ -1423,6 +1423,12 @@ void CachedFrame::Debug::print() const
}
DUMP_NAV_LOGD("// }; // end of layers\n");
#endif // USE(ACCELERATED_COMPOSITING)
+ DUMP_NAV_LOGD("// CachedColor mCachedColors={ // count=%d\n", b->mCachedColors.size());
+ for (CachedColor* color = b->mCachedColors.begin();
+ color != b->mCachedColors.end(); color++) {
+ color->mDebug.print();
+ }
+ DUMP_NAV_LOGD("// }; // end of colors\n");
DUMP_NAV_LOGD("// CachedFrame mCachedFrames={ // count=%d\n", b->mCachedFrames.size());
for (CachedFrame* child = b->mCachedFrames.begin();
child != b->mCachedFrames.end(); child++)
diff --git a/WebKit/android/nav/CachedFrame.h b/WebKit/android/nav/CachedFrame.h
index caba482..590c75d 100644
--- a/WebKit/android/nav/CachedFrame.h
+++ b/WebKit/android/nav/CachedFrame.h
@@ -26,6 +26,7 @@
#ifndef CachedFrame_H
#define CachedFrame_H
+#include "CachedColor.h"
#include "CachedInput.h"
#include "CachedLayer.h"
#include "CachedNode.h"
@@ -70,6 +71,7 @@ public:
CURSOR_SET = 0
};
CachedFrame() {}
+ void add(CachedColor& color) { mCachedColors.append(color); }
void add(CachedInput& input) { mCachedTextInputs.append(input); }
#if USE(ACCELERATED_COMPOSITING)
void add(CachedLayer& layer) { mCachedLayers.append(layer); }
@@ -86,6 +88,9 @@ public:
bool checkVisited(const CachedNode* , CachedFrame::Direction ) const;
size_t childCount() { return mCachedFrames.size(); }
void clearCursor();
+ const CachedColor& color(const CachedNode* node) const {
+ return mCachedColors[node->colorIndex()];
+ }
const CachedNode* currentCursor() const { return currentCursor(NULL); }
const CachedNode* currentCursor(const CachedFrame** ) const;
const CachedNode* currentFocus() const { return currentFocus(NULL); }
@@ -226,6 +231,7 @@ private: // since computing these is complicated, protect them so that the
WebCore::IntRect mContents;
WebCore::IntRect mLocalViewBounds;
WebCore::IntRect mViewBounds;
+ WTF::Vector<CachedColor> mCachedColors;
WTF::Vector<CachedNode> mCachedNodes;
WTF::Vector<CachedFrame> mCachedFrames;
WTF::Vector<CachedInput> mCachedTextInputs;
diff --git a/WebKit/android/nav/CachedNode.cpp b/WebKit/android/nav/CachedNode.cpp
index dda9385..47711fd 100644
--- a/WebKit/android/nav/CachedNode.cpp
+++ b/WebKit/android/nav/CachedNode.cpp
@@ -404,6 +404,7 @@ void CachedNode::Debug::print() const
DUMP_NAV_LOGD("// int mNavableRects=%d;\n", b->mNavableRects);
DUMP_NAV_LOGD("// int mParentIndex=%d;\n", b->mParentIndex);
DUMP_NAV_LOGD("// int mTabIndex=%d;\n", b->mTabIndex);
+ DUMP_NAV_LOGD("// int mColorIndex=%d;\n", b->mColorIndex);
DUMP_NAV_LOGD("// Condition mCondition=%s;\n", condition(b->mCondition));
DUMP_NAV_LOGD("// Type mType=%s;\n", type(b->mType));
DEBUG_PRINT_BOOL(mClippedOut);
diff --git a/WebKit/android/nav/CachedNode.h b/WebKit/android/nav/CachedNode.h
index 2ade73b..0014e07 100644
--- a/WebKit/android/nav/CachedNode.h
+++ b/WebKit/android/nav/CachedNode.h
@@ -95,6 +95,7 @@ public:
WTF::Vector<WebCore::IntRect>* rings);
bool clip(const WebCore::IntRect& );
bool clippedOut() { return mClippedOut; }
+ int colorIndex() const { return mColorIndex; }
WebCore::IntRect cursorRingBounds(const CachedFrame* ) const;
void cursorRings(const CachedFrame* , WTF::Vector<WebCore::IntRect>* ) const;
bool disabled() const { return mDisabled; }
@@ -147,6 +148,7 @@ public:
WebCore::IntRect ring(const CachedFrame* , size_t part) const;
void setBounds(const WebCore::IntRect& bounds) { mBounds = bounds; }
void setClippedOut(bool clipped) { mClippedOut = clipped; }
+ void setColorIndex(int index) { mColorIndex = index; }
void setCondition(Condition condition) const { mCondition = condition; }
void setDataIndex(int index) { mDataIndex = index; }
void setDisabled(bool disabled) { mDisabled = disabled; }
@@ -190,6 +192,7 @@ private:
int mNavableRects; // FIXME: could be bitfield once I limit max number of rects
int mParentIndex;
int mTabIndex;
+ int mColorIndex; // index to ring color and other stylable properties
mutable Condition mCondition : 5; // why the node was not chosen on the first pass
CachedNodeType mType : 4;
bool mClippedOut : 1;