summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
authorGrace Kloba <klobag@google.com>2009-11-24 14:22:22 -0800
committerGrace Kloba <klobag@google.com>2009-12-02 11:13:36 -0800
commit8ec4217018562da37ecf4144e582fa848b807263 (patch)
treee917a4c71fff6f8c4d065c130ba5bc1486d64e60 /WebKit
parent73b03f71b87666e532e997c6bcd3eb6a4fc3228d (diff)
downloadexternal_webkit-8ec4217018562da37ecf4144e582fa848b807263.zip
external_webkit-8ec4217018562da37ecf4144e582fa848b807263.tar.gz
external_webkit-8ec4217018562da37ecf4144e582fa848b807263.tar.bz2
Enable WebKit page cache through WebSettings.
Add setXX() for the meta data in Settings. Add CachedFramePlatformDataAndroid to preserve the state for the cachedFrame. http://b/issue?id=2284168
Diffstat (limited to 'WebKit')
-rw-r--r--WebKit/Android.mk1
-rw-r--r--WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.cpp66
-rw-r--r--WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.h63
-rw-r--r--WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp55
-rw-r--r--WebKit/android/jni/WebCoreFrameBridge.cpp16
-rw-r--r--WebKit/android/jni/WebSettings.cpp11
6 files changed, 176 insertions, 36 deletions
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index ac43360..00e54ae 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -16,6 +16,7 @@
##
LOCAL_SRC_FILES := \
+ android/WebCoreSupport/CachedFramePlatformDataAndroid.cpp \
android/WebCoreSupport/ChromeClientAndroid.cpp \
android/WebCoreSupport/ContextMenuClientAndroid.cpp \
android/WebCoreSupport/DragClientAndroid.cpp \
diff --git a/WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.cpp b/WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.cpp
new file mode 100644
index 0000000..30f374f
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009, 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 "CachedFramePlatformDataAndroid.h"
+#include "Settings.h"
+
+namespace android {
+
+CachedFramePlatformDataAndroid::CachedFramePlatformDataAndroid(WebCore::Settings* settings)
+{
+#ifdef ANDROID_META_SUPPORT
+ m_viewport_width = settings->viewportWidth();
+ m_viewport_height = settings->viewportHeight();
+ m_viewport_initial_scale = settings->viewportInitialScale();
+ m_viewport_minimum_scale = settings->viewportMinimumScale();
+ m_viewport_maximum_scale = settings->viewportMaximumScale();
+ m_viewport_target_densitydpi = settings->viewportTargetDensityDpi();
+ m_viewport_user_scalable = settings->viewportUserScalable();
+ m_format_detection_address = settings->formatDetectionAddress();
+ m_format_detection_email = settings->formatDetectionEmail();
+ m_format_detection_telephone = settings->formatDetectionTelephone();
+#endif
+
+}
+
+#ifdef ANDROID_META_SUPPORT
+void CachedFramePlatformDataAndroid::restoreMetadata(WebCore::Settings* settings)
+{
+ settings->setViewportWidth(m_viewport_width);
+ settings->setViewportHeight(m_viewport_height);
+ settings->setViewportInitialScale(m_viewport_initial_scale);
+ settings->setViewportMinimumScale(m_viewport_minimum_scale);
+ settings->setViewportMaximumScale(m_viewport_maximum_scale);
+ settings->setViewportTargetDensityDpi(m_viewport_target_densitydpi);
+ settings->setViewportUserScalable(m_viewport_user_scalable);
+ settings->setFormatDetectionAddress(m_format_detection_address);
+ settings->setFormatDetectionEmail(m_format_detection_email);
+ settings->setFormatDetectionTelephone(m_format_detection_telephone);
+}
+#endif
+
+}
diff --git a/WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.h b/WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.h
new file mode 100644
index 0000000..ac22d05
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/CachedFramePlatformDataAndroid.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2009, 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 CachedFramePlatformDatatAndroid_h
+#define CachedFramePlatformDatatAndroid_h
+
+#include "CachedFramePlatformData.h"
+
+namespace WebCore {
+ class Settings;
+}
+
+namespace android {
+
+class CachedFramePlatformDataAndroid : public WebCore::CachedFramePlatformData {
+public:
+ CachedFramePlatformDataAndroid(WebCore::Settings* settings);
+
+#ifdef ANDROID_META_SUPPORT
+ void restoreMetadata(WebCore::Settings* settings);
+#endif
+
+private:
+#ifdef ANDROID_META_SUPPORT
+ // meta data of the frame
+ int m_viewport_width;
+ int m_viewport_height;
+ int m_viewport_initial_scale;
+ int m_viewport_minimum_scale;
+ int m_viewport_maximum_scale;
+ int m_viewport_target_densitydpi;
+ bool m_viewport_user_scalable : 1;
+ bool m_format_detection_address : 1;
+ bool m_format_detection_email : 1;
+ bool m_format_detection_telephone : 1;
+#endif
+};
+
+}
+
+#endif \ No newline at end of file
diff --git a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
index 250382e..6338e26 100644
--- a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
+++ b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
@@ -29,6 +29,8 @@
#include "android_graphics.h"
#include "CString.h"
+#include "CachedFrame.h"
+#include "CachedFramePlatformDataAndroid.h"
#include "DocumentLoader.h"
#include "DOMImplementation.h"
#include "Frame.h"
@@ -817,12 +819,16 @@ String FrameLoaderClientAndroid::userAgent(const KURL& u) {
return m_webFrame->userAgentForURL(&u);
}
-void FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame*) {
- notImplemented();
+void FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame* cachedFrame) {
+ CachedFramePlatformDataAndroid* platformData = new CachedFramePlatformDataAndroid(m_frame->settings());
+ cachedFrame->setCachedFramePlatformData(platformData);
}
-void FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame*) {
- notImplemented();
+void FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame* cachedFrame) {
+ CachedFramePlatformDataAndroid* platformData = reinterpret_cast<CachedFramePlatformDataAndroid*>(cachedFrame->cachedFramePlatformData());
+#ifdef ANDROID_META_SUPPORT
+ platformData->restoreMetadata(m_frame->settings());
+#endif
}
void FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
@@ -834,30 +840,23 @@ void FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
m_frame->settings()->resetMetadataSettings();
#endif
- if (m_frame->settings() && !m_frame->settings()->usesPageCache()) {
- m_webFrame->transitionToCommitted(m_frame);
- return;
- }
-
- // Remember the old WebFrameView
- WebFrameView* webFrameView = static_cast<WebFrameView*> (
- m_frame->view()->platformWidget());
- Retain(webFrameView);
-
- // Remove the old FrameView
- m_frame->setView(NULL);
-
- // Create a new FrameView and associate it with the saved webFrameView
- RefPtr<FrameView> view = FrameView::create(m_frame);
- webFrameView->setView(view.get());
-
- Release(webFrameView);
-
- // Give the new FrameView to the Frame
- m_frame->setView(view);
-
- if (m_frame->ownerRenderer())
- m_frame->ownerRenderer()->setWidget(view.get());
+ // Save the old WebViewCore before creating a new FrameView. There is one
+ // WebViewCore per page. Each frame, including the main frame and sub frame,
+ // has a 1:1 FrameView and WebFrameView.
+ WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
+ Retain(webViewCore);
+
+ WebFrameView* oldFrameView = static_cast<WebFrameView*> (m_frame->view()->platformWidget());
+ // we only support opaque, white background for now
+ m_frame->createView(oldFrameView->getBounds().size(), Color::white, false, IntSize(), false);
+
+ // Create a new WebFrameView for the new FrameView
+ WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore);
+ // newFrameView attaches itself to FrameView which Retains the reference, so
+ // call Release for newFrameView
+ Release(newFrameView);
+ // WebFrameView Retains webViewCore, so call Release for webViewCore
+ Release(webViewCore);
m_webFrame->transitionToCommitted(m_frame);
}
diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp
index f88bf1b..36f58e9 100644
--- a/WebKit/android/jni/WebCoreFrameBridge.cpp
+++ b/WebKit/android/jni/WebCoreFrameBridge.cpp
@@ -882,14 +882,6 @@ static void CreateFrame(JNIEnv* env, jobject obj, jobject javaview, jobject jAss
// css files without explicit MIMETYPE is treated as generic text files in
// the Java side. So we can't enforce CSS MIMETYPE.
page->settings()->setEnforceCSSMIMETypeInStrictMode(false);
- /* TODO: Don't turn on PageCache until we can restore the ScrollView State.
- * This caused bug http://b/issue?id=1202983
- page->settings()->setUsesPageCache(true);
- // 10 is a random number chosen because it is small enough to give the user
- // a good back/forward page cache without allowing the page cache to get too
- // big.
- WebCore::pageCache()->setCapacity(10);
- */
editorC->setPage(page);
page->setGroupName("android.webkit");
@@ -1297,6 +1289,14 @@ static void ClearCache(JNIEnv *env, jobject obj)
WebCore::cache()->setDisabled(true);
WebCore::cache()->setDisabled(false);
}
+
+ // clear page cache
+ int pageCapacity = WebCore::pageCache()->capacity();
+ // Setting size to 0, makes all pages be released.
+ WebCore::pageCache()->setCapacity(0);
+ WebCore::pageCache()->releaseAutoreleasedPagesNow();
+ WebCore::pageCache()->setCapacity(pageCapacity);
+
#if USE(JSC)
// force JavaScript to GC when clear cache
WebCore::gcController().garbageCollectSoon();
diff --git a/WebKit/android/jni/WebSettings.cpp b/WebKit/android/jni/WebSettings.cpp
index 9892ad6..00fec85 100644
--- a/WebKit/android/jni/WebSettings.cpp
+++ b/WebKit/android/jni/WebSettings.cpp
@@ -38,6 +38,7 @@
#include "Geolocation.h"
#include "GeolocationPermissions.h"
#include "Page.h"
+#include "PageCache.h"
#include "RenderTable.h"
#include "Settings.h"
#include "WebCoreFrameBridge.h"
@@ -110,6 +111,7 @@ struct FieldIds {
mSupportMultipleWindows = env->GetFieldID(clazz, "mSupportMultipleWindows", "Z");
mShrinksStandaloneImagesToFit = env->GetFieldID(clazz, "mShrinksStandaloneImagesToFit", "Z");
mUseDoubleTree = env->GetFieldID(clazz, "mUseDoubleTree", "Z");
+ mPageCacheCapacity = env->GetFieldID(clazz, "mPageCacheCapacity", "I");
LOG_ASSERT(mLayoutAlgorithm, "Could not find field mLayoutAlgorithm");
LOG_ASSERT(mTextSize, "Could not find field mTextSize");
@@ -145,6 +147,7 @@ struct FieldIds {
LOG_ASSERT(mSupportMultipleWindows, "Could not find field mSupportMultipleWindows");
LOG_ASSERT(mShrinksStandaloneImagesToFit, "Could not find field mShrinksStandaloneImagesToFit");
LOG_ASSERT(mUseDoubleTree, "Could not find field mUseDoubleTree");
+ LOG_ASSERT(mPageCacheCapacity, "Could not find field mPageCacheCapacity");
jclass c = env->FindClass("java/lang/Enum");
LOG_ASSERT(c, "Could not find Enum class!");
@@ -189,6 +192,7 @@ struct FieldIds {
jfieldID mSupportMultipleWindows;
jfieldID mShrinksStandaloneImagesToFit;
jfieldID mUseDoubleTree;
+ jfieldID mPageCacheCapacity;
// Ordinal() method and value field for enums
jmethodID mOrdinal;
jfieldID mTextSizeValue;
@@ -364,6 +368,13 @@ public:
GeolocationPermissions::setDatabasePath(to_string(env,str));
WebCore::Geolocation::setDatabasePath(to_string(env,str));
}
+
+ size = env->GetIntField(obj, gFieldIds->mPageCacheCapacity);
+ if (size > 0) {
+ s->setUsesPageCache(true);
+ WebCore::pageCache()->setCapacity(size);
+ } else
+ s->setUsesPageCache(false);
}
};