summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Scott <phanna@android.com>2009-11-23 08:19:13 -0500
committerPatrick Scott <phanna@android.com>2009-11-23 09:04:25 -0500
commit4ceb72860b5e5d1431e3a528e70b49d4358fecdb (patch)
treeb6b54295b9cfc600ee34a5209065e8a844d297d2
parent5c8e67320b039ad4e9fdd0300118c6f87fd28091 (diff)
downloadexternal_webkit-4ceb72860b5e5d1431e3a528e70b49d4358fecdb.zip
external_webkit-4ceb72860b5e5d1431e3a528e70b49d4358fecdb.tar.gz
external_webkit-4ceb72860b5e5d1431e3a528e70b49d4358fecdb.tar.bz2
Move the benchmark code inside libwebcore.so
This adds about 8k of code to the library but it allows the benchmark to run without modifying the library. This makes it ideal when testing libwebcore.so since it is the exact same as our running library. It also makes it possible to always build the benchmark app.
-rw-r--r--Android.mk2
-rw-r--r--WebKit/Android.mk3
-rw-r--r--WebKit/android/benchmark/Android.mk (renamed from perf/Android.mk)12
-rw-r--r--WebKit/android/benchmark/Intercept.cpp (renamed from perf/Intercept.cpp)0
-rw-r--r--WebKit/android/benchmark/Intercept.h (renamed from perf/Intercept.h)0
-rw-r--r--WebKit/android/benchmark/MyJavaVM.cpp (renamed from perf/MyJavaVM.cpp)0
-rw-r--r--WebKit/android/benchmark/MyJavaVM.h (renamed from perf/MyJavaVM.h)0
-rw-r--r--WebKit/android/benchmark/main.cpp64
-rw-r--r--WebKit/android/jni/WebCoreJniOnLoad.cpp178
-rw-r--r--perf/main.cpp234
10 files changed, 246 insertions, 247 deletions
diff --git a/Android.mk b/Android.mk
index b5e2ecf..884b084 100644
--- a/Android.mk
+++ b/Android.mk
@@ -332,7 +332,7 @@ include $(BUILD_SHARED_LIBRARY)
include $(BASE_PATH)/WebKit/android/wds/client/Android.mk
# Build the performance command line tool.
-#include $(BASE_PATH)/perf/Android.mk
+include $(BASE_PATH)/WebKit/android/benchmark/Android.mk
# Build the webkit merge tool.
include $(BASE_PATH)/WebKitTools/android/webkitmerge/Android.mk
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index a95f6a9..990e896 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -31,6 +31,9 @@ LOCAL_SRC_FILES := \
android/TimeCounter.cpp \
android/sort.cpp \
\
+ android/benchmark/Intercept.cpp \
+ android/benchmark/MyJavaVM.cpp \
+ \
android/icu/unicode/ucnv.cpp \
\
android/jni/GeolocationPermissionsBridge.cpp \
diff --git a/perf/Android.mk b/WebKit/android/benchmark/Android.mk
index a3a5050..5b189e1 100644
--- a/perf/Android.mk
+++ b/WebKit/android/benchmark/Android.mk
@@ -28,26 +28,14 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
- Intercept.cpp \
- MyJavaVM.cpp \
main.cpp
# Pull the webkit definitions from the base webkit makefile.
-#LOCAL_STATIC_LIBRARIES := libwebcore $(WEBKIT_STATIC_LIBRARIES)
LOCAL_SHARED_LIBRARIES := libwebcore $(WEBKIT_SHARED_LIBRARIES)
LOCAL_LDLIBS := $(WEBKIT_LDLIBS)
-LOCAL_C_INCLUDES := $(WEBKIT_C_INCLUDES) \
- external/webkit
-LOCAL_CFLAGS := $(WEBKIT_CFLAGS)
LOCAL_MODULE := webcore_test
-# Do this dependency by hand. The reason we have to do this is because the
-# headers that this program pulls in are generated during the build of webcore.
-# We make all of our object files depend on those files so that they are built
-# before we try to compile our sources.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(filter %.h, $(WEBKIT_GENERATED_SOURCES))
-
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
diff --git a/perf/Intercept.cpp b/WebKit/android/benchmark/Intercept.cpp
index c31fe5e..c31fe5e 100644
--- a/perf/Intercept.cpp
+++ b/WebKit/android/benchmark/Intercept.cpp
diff --git a/perf/Intercept.h b/WebKit/android/benchmark/Intercept.h
index a5e50c7..a5e50c7 100644
--- a/perf/Intercept.h
+++ b/WebKit/android/benchmark/Intercept.h
diff --git a/perf/MyJavaVM.cpp b/WebKit/android/benchmark/MyJavaVM.cpp
index 82eea2a..82eea2a 100644
--- a/perf/MyJavaVM.cpp
+++ b/WebKit/android/benchmark/MyJavaVM.cpp
diff --git a/perf/MyJavaVM.h b/WebKit/android/benchmark/MyJavaVM.h
index 36d478d..36d478d 100644
--- a/perf/MyJavaVM.h
+++ b/WebKit/android/benchmark/MyJavaVM.h
diff --git a/WebKit/android/benchmark/main.cpp b/WebKit/android/benchmark/main.cpp
new file mode 100644
index 0000000..c1f1a31
--- /dev/null
+++ b/WebKit/android/benchmark/main.cpp
@@ -0,0 +1,64 @@
+/*
+ * 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 APPLE COMPUTER, INC. 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.
+ */
+
+#define LOG_TAG "webcore_test"
+
+#include <stdlib.h>
+#include <getopt.h>
+#include <utils/Log.h>
+
+namespace android {
+extern void benchmark(const char*, int, int ,int);
+}
+
+int main(int argc, char** argv) {
+ int width = 800;
+ int height = 600;
+ int reloadCount = 0;
+ while (true) {
+ int c = getopt(argc, argv, "d:r:");
+ if (c == -1)
+ break;
+ else if (c == 'd') {
+ char* x = strchr(optarg, 'x');
+ if (x) {
+ width = atoi(optarg);
+ height = atoi(x + 1);
+ LOGD("Rendering page at %dx%d", width, height);
+ }
+ } else if (c == 'r') {
+ reloadCount = atoi(optarg);
+ if (reloadCount < 0)
+ reloadCount = 0;
+ LOGD("Reloading %d times", reloadCount);
+ }
+ }
+ if (optind >= argc) {
+ LOGE("Please supply a file to read\n");
+ return 1;
+ }
+
+ android::benchmark(argv[optind], reloadCount, width, height);
+}
diff --git a/WebKit/android/jni/WebCoreJniOnLoad.cpp b/WebKit/android/jni/WebCoreJniOnLoad.cpp
index 9eb7fca..616526b 100644
--- a/WebKit/android/jni/WebCoreJniOnLoad.cpp
+++ b/WebKit/android/jni/WebCoreJniOnLoad.cpp
@@ -27,6 +27,44 @@
#include "config.h"
+#include "BackForwardList.h"
+#include "ChromeClientAndroid.h"
+#include "ContextMenuClientAndroid.h"
+#include "CookieClient.h"
+#include "DragClientAndroid.h"
+#include "EditorClientAndroid.h"
+#include "Frame.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClientAndroid.h"
+#include "FrameView.h"
+#include "GraphicsContext.h"
+#include "HistoryItem.h"
+#include "InspectorClientAndroid.h"
+#include "IntRect.h"
+#include "JavaSharedClient.h"
+#include "jni_utility.h"
+#include "Page.h"
+#include "PlatformGraphicsContext.h"
+#include "ResourceRequest.h"
+#include "ScriptController.h"
+#include "SecurityOrigin.h"
+#include "SelectionController.h"
+#include "Settings.h"
+#include "SharedBuffer.h"
+#include "SubstituteData.h"
+#include "TimerClient.h"
+#include "TextEncoding.h"
+#include "WebCoreViewBridge.h"
+#include "WebFrameView.h"
+#include "WebViewCore.h"
+
+#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkImageEncoder.h"
+
+#include "benchmark/Intercept.h"
+#include "benchmark/MyJavaVM.h"
+
#include "jni_utility.h"
#include <jni.h>
#include <utils/Log.h>
@@ -108,3 +146,143 @@ EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
return JNI_VERSION_1_4;
}
+
+class MyJavaSharedClient : public TimerClient, public CookieClient {
+public:
+ MyJavaSharedClient() : m_hasTimer(false) {}
+ virtual void setSharedTimer(long long timemillis) { m_hasTimer = true; }
+ virtual void stopSharedTimer() { m_hasTimer = false; }
+ virtual void setSharedTimerCallback(void (*f)()) { m_func = f; }
+ virtual void signalServiceFuncPtrQueue() {}
+
+ // Cookie methods that do nothing.
+ virtual void setCookies(const KURL&, const String&) {}
+ virtual String cookies(const KURL&) { return ""; }
+ virtual bool cookiesEnabled() { return false; }
+
+ bool m_hasTimer;
+ void (*m_func)();
+};
+
+static void historyItemChanged(HistoryItem* i) {
+ if (i->bridge())
+ i->bridge()->updateHistoryItem(i);
+}
+
+namespace android {
+
+EXPORT void benchmark(const char* url, int reloadCount, int width, int height) {
+ ScriptController::initializeThreading();
+
+ // Setting this allows data: urls to load from a local file.
+ SecurityOrigin::setLocalLoadPolicy(SecurityOrigin::AllowLocalLoadsForAll);
+
+ // Create the fake JNIEnv and JavaVM
+ InitializeJavaVM();
+
+ // The real function is private to libwebcore but we know what it does.
+ notifyHistoryItemChanged = historyItemChanged;
+
+ // Implement the shared timer callback
+ MyJavaSharedClient client;
+ JavaSharedClient::SetTimerClient(&client);
+ JavaSharedClient::SetCookieClient(&client);
+
+ // Create the page with all the various clients
+ ChromeClientAndroid* chrome = new ChromeClientAndroid;
+ EditorClientAndroid* editor = new EditorClientAndroid;
+ Page* page = new Page(chrome, new ContextMenuClientAndroid, editor,
+ new DragClientAndroid, new InspectorClientAndroid, NULL);
+ editor->setPage(page);
+
+ // Create MyWebFrame that intercepts network requests
+ MyWebFrame* webFrame = new MyWebFrame(page);
+ webFrame->setUserAgent("Performance testing"); // needs to be non-empty
+ chrome->setWebFrame(webFrame);
+ // ChromeClientAndroid maintains the reference.
+ Release(webFrame);
+
+ // Create the Frame and the FrameLoaderClient
+ FrameLoaderClientAndroid* loader = new FrameLoaderClientAndroid(webFrame);
+ RefPtr<Frame> frame = Frame::create(page, NULL, loader);
+ loader->setFrame(frame.get());
+
+ // Build our View system, resize it to the given dimensions and release our
+ // references. Note: We keep a referenec to frameView so we can layout and
+ // draw later without risk of it being deleted.
+ WebViewCore* webViewCore = new WebViewCore(JSC::Bindings::getJNIEnv(),
+ MY_JOBJECT, frame.get());
+ RefPtr<FrameView> frameView = FrameView::create(frame.get());
+ WebFrameView* webFrameView = new WebFrameView(frameView.get(), webViewCore);
+ frame->setView(frameView);
+ frameView->resize(width, height);
+ Release(webViewCore);
+ Release(webFrameView);
+
+ // Initialize the frame and turn of low-bandwidth display (it fails an
+ // assertion in the Cache code)
+ frame->init();
+ frame->selection()->setFocused(true);
+
+ // Set all the default settings the Browser normally uses.
+ Settings* s = frame->settings();
+ s->setLayoutAlgorithm(Settings::kLayoutNormal); // Normal layout for now
+ s->setStandardFontFamily("sans-serif");
+ s->setFixedFontFamily("monospace");
+ s->setSansSerifFontFamily("sans-serif");
+ s->setSerifFontFamily("serif");
+ s->setCursiveFontFamily("cursive");
+ s->setFantasyFontFamily("fantasy");
+ s->setMinimumFontSize(8);
+ s->setMinimumLogicalFontSize(8);
+ s->setDefaultFontSize(16);
+ s->setDefaultFixedFontSize(13);
+ s->setLoadsImagesAutomatically(true);
+ s->setJavaScriptEnabled(true);
+ s->setDefaultTextEncodingName("latin1");
+ s->setPluginsEnabled(false);
+ s->setShrinksStandaloneImagesToFit(false);
+ s->setUseWideViewport(false);
+
+ // Finally, load the actual data
+ ResourceRequest req(url);
+ frame->loader()->load(req, false);
+
+ do {
+ // Layout the page and service the timer
+ frameView->layout();
+ while (client.m_hasTimer) {
+ client.m_func();
+ JavaSharedClient::ServiceFunctionPtrQueue();
+ }
+ JavaSharedClient::ServiceFunctionPtrQueue();
+
+ // Layout more if needed.
+ while (frameView->needsLayout())
+ frameView->layout();
+ JavaSharedClient::ServiceFunctionPtrQueue();
+
+ if (reloadCount)
+ frame->loader()->reload(true);
+ } while (reloadCount--);
+
+ // Draw into an offscreen bitmap
+ SkBitmap bmp;
+ bmp.setConfig(SkBitmap::kARGB_8888_Config, width, height);
+ bmp.allocPixels();
+ SkCanvas canvas(bmp);
+ PlatformGraphicsContext ctx(&canvas, NULL);
+ GraphicsContext gc(&ctx);
+ frameView->paintContents(&gc, IntRect(0, 0, width, height));
+
+ // Write the bitmap to the sdcard
+ SkImageEncoder* enc = SkImageEncoder::Create(SkImageEncoder::kPNG_Type);
+ enc->encodeFile("/sdcard/webcore_test.png", bmp, 100);
+ delete enc;
+
+ // Tear down the world.
+ frame->loader()->detachFromParent();
+ delete page;
+}
+
+} // namespace android
diff --git a/perf/main.cpp b/perf/main.cpp
deleted file mode 100644
index 37ed8a7..0000000
--- a/perf/main.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * 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 APPLE COMPUTER, INC. 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.
- */
-
-#define LOG_TAG "webcore_test"
-
-#include "config.h"
-
-#include "BackForwardList.h"
-#include "ChromeClientAndroid.h"
-#include "ContextMenuClientAndroid.h"
-#include "CookieClient.h"
-#include "DragClientAndroid.h"
-#include "EditorClientAndroid.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "FrameLoaderClientAndroid.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "HistoryItem.h"
-#include "InspectorClientAndroid.h"
-#include "Intercept.h"
-#include "IntRect.h"
-#include "JavaSharedClient.h"
-#include "jni_utility.h"
-#include "MyJavaVM.h"
-#include "Page.h"
-#include "PlatformGraphicsContext.h"
-#include "ResourceRequest.h"
-#include "ScriptController.h"
-#include "SecurityOrigin.h"
-#include "SelectionController.h"
-#include "Settings.h"
-#include "SharedBuffer.h"
-#include "SubstituteData.h"
-#include "TimerClient.h"
-#include "TextEncoding.h"
-#include "WebCoreViewBridge.h"
-#include "WebFrameView.h"
-#include "WebViewCore.h"
-
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkImageEncoder.h"
-
-#include <getopt.h>
-#include <utils/Log.h>
-
-using namespace android;
-using namespace WebCore;
-
-class MyJavaSharedClient : public TimerClient, public CookieClient {
-public:
- MyJavaSharedClient() : m_hasTimer(false) {}
- virtual void setSharedTimer(long long timemillis) { m_hasTimer = true; }
- virtual void stopSharedTimer() { m_hasTimer = false; }
- virtual void setSharedTimerCallback(void (*f)()) { m_func = f; }
- virtual void signalServiceFuncPtrQueue() {}
-
- // Cookie methods that do nothing.
- virtual void setCookies(const KURL&, const String&) {}
- virtual String cookies(const KURL&) { return ""; }
- virtual bool cookiesEnabled() { return false; }
-
- bool m_hasTimer;
- void (*m_func)();
-};
-
-static void historyItemChanged(HistoryItem* i) {
- if (i->bridge())
- i->bridge()->updateHistoryItem(i);
-}
-
-int main(int argc, char** argv) {
- int width = 800;
- int height = 600;
- int reloadCount = 0;
- while (true) {
- int c = getopt(argc, argv, "d:r:");
- if (c == -1)
- break;
- else if (c == 'd') {
- char* x = strchr(optarg, 'x');
- if (x) {
- width = atoi(optarg);
- height = atoi(x + 1);
- LOGD("Rendering page at %dx%d", width, height);
- }
- } else if (c == 'r') {
- reloadCount = atoi(optarg);
- if (reloadCount < 0)
- reloadCount = 0;
- LOGD("Reloading %d times", reloadCount);
- }
- }
- if (optind >= argc) {
- LOGE("Please supply a file to read\n");
- return 1;
- }
- ScriptController::initializeThreading();
-
- // Setting this allows data: urls to load from a local file.
- SecurityOrigin::setLocalLoadPolicy(SecurityOrigin::AllowLocalLoadsForAll);
-
- // Create the fake JNIEnv and JavaVM
- InitializeJavaVM();
-
- // The real function is private to libwebcore but we know what it does.
- notifyHistoryItemChanged = historyItemChanged;
-
- // Implement the shared timer callback
- MyJavaSharedClient client;
- JavaSharedClient::SetTimerClient(&client);
- JavaSharedClient::SetCookieClient(&client);
-
- // Create the page with all the various clients
- ChromeClientAndroid* chrome = new ChromeClientAndroid;
- EditorClientAndroid* editor = new EditorClientAndroid;
- Page* page = new Page(chrome, new ContextMenuClientAndroid, editor,
- new DragClientAndroid, new InspectorClientAndroid, NULL);
- editor->setPage(page);
-
- // Create MyWebFrame that intercepts network requests
- MyWebFrame* webFrame = new MyWebFrame(page);
- webFrame->setUserAgent("Performance testing"); // needs to be non-empty
- chrome->setWebFrame(webFrame);
- // ChromeClientAndroid maintains the reference.
- Release(webFrame);
-
- // Create the Frame and the FrameLoaderClient
- FrameLoaderClientAndroid* loader = new FrameLoaderClientAndroid(webFrame);
- RefPtr<Frame> frame = Frame::create(page, NULL, loader);
- loader->setFrame(frame.get());
-
- // Build our View system, resize it to the given dimensions and release our
- // references. Note: We keep a referenec to frameView so we can layout and
- // draw later without risk of it being deleted.
- WebViewCore* webViewCore = new WebViewCore(JSC::Bindings::getJNIEnv(),
- MY_JOBJECT, frame.get());
- RefPtr<FrameView> frameView = FrameView::create(frame.get());
- WebFrameView* webFrameView = new WebFrameView(frameView.get(), webViewCore);
- frame->setView(frameView);
- frameView->resize(width, height);
- Release(webViewCore);
- Release(webFrameView);
-
- // Initialize the frame and turn of low-bandwidth display (it fails an
- // assertion in the Cache code)
- frame->init();
- frame->selection()->setFocused(true);
-
- // Set all the default settings the Browser normally uses.
- Settings* s = frame->settings();
- s->setLayoutAlgorithm(Settings::kLayoutNormal); // Normal layout for now
- s->setStandardFontFamily("sans-serif");
- s->setFixedFontFamily("monospace");
- s->setSansSerifFontFamily("sans-serif");
- s->setSerifFontFamily("serif");
- s->setCursiveFontFamily("cursive");
- s->setFantasyFontFamily("fantasy");
- s->setMinimumFontSize(8);
- s->setMinimumLogicalFontSize(8);
- s->setDefaultFontSize(16);
- s->setDefaultFixedFontSize(13);
- s->setLoadsImagesAutomatically(true);
- s->setJavaScriptEnabled(true);
- s->setDefaultTextEncodingName("latin1");
- s->setPluginsEnabled(false);
- s->setShrinksStandaloneImagesToFit(false);
- s->setUseWideViewport(false);
-
- // Finally, load the actual data
- ResourceRequest req(argv[optind]);
- frame->loader()->load(req, false);
-
- do {
- // Layout the page and service the timer
- frameView->layout();
- while (client.m_hasTimer) {
- client.m_func();
- JavaSharedClient::ServiceFunctionPtrQueue();
- }
- JavaSharedClient::ServiceFunctionPtrQueue();
-
- // Layout more if needed.
- while (frameView->needsLayout())
- frameView->layout();
- JavaSharedClient::ServiceFunctionPtrQueue();
-
- if (reloadCount)
- frame->loader()->reload(true);
- } while (reloadCount--);
-
- // Draw into an offscreen bitmap
- SkBitmap bmp;
- bmp.setConfig(SkBitmap::kARGB_8888_Config, width, height);
- bmp.allocPixels();
- SkCanvas canvas(bmp);
- PlatformGraphicsContext ctx(&canvas, NULL);
- GraphicsContext gc(&ctx);
- frameView->paintContents(&gc, IntRect(0, 0, width, height));
-
- // Write the bitmap to the sdcard
- SkImageEncoder* enc = SkImageEncoder::Create(SkImageEncoder::kPNG_Type);
- enc->encodeFile("/sdcard/webcore_test.png", bmp, 100);
- delete enc;
-
- // Tear down the world.
- frame->loader()->detachFromParent();
- delete page;
-
- return 0;
-}