diff options
| -rw-r--r-- | Android.mk | 2 | ||||
| -rw-r--r-- | WebCore/platform/android/RenderThemeAndroid.cpp | 77 | ||||
| -rw-r--r-- | WebCore/platform/android/RenderThemeAndroid.h | 7 | ||||
| -rw-r--r-- | WebCore/platform/text/StringHash.h | 9 | ||||
| -rw-r--r-- | WebCore/platform/text/android/TextBreakIteratorInternalICU.cpp | 3 | ||||
| -rw-r--r-- | WebKit/Android.mk | 3 | ||||
| -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.cpp | 64 | ||||
| -rw-r--r-- | WebKit/android/jni/WebCoreJniOnLoad.cpp | 178 | ||||
| -rw-r--r-- | perf/main.cpp | 234 |
14 files changed, 337 insertions, 252 deletions
@@ -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/WebCore/platform/android/RenderThemeAndroid.cpp b/WebCore/platform/android/RenderThemeAndroid.cpp index ff20014..4dafae2 100644 --- a/WebCore/platform/android/RenderThemeAndroid.cpp +++ b/WebCore/platform/android/RenderThemeAndroid.cpp @@ -29,6 +29,10 @@ #include "Color.h" #include "Element.h" #include "GraphicsContext.h" +#include "HTMLNames.h" +#include "HTMLOptionElement.h" +#include "HTMLSelectElement.h" +#include "Node.h" #include "PlatformGraphicsContext.h" #include "RenderSkinAndroid.h" #include "RenderSkinButton.h" @@ -120,6 +124,26 @@ Color RenderThemeAndroid::platformTextSearchHighlightColor() const return Color(Color::transparent); } +Color RenderThemeAndroid::platformActiveListBoxSelectionBackgroundColor() const +{ + return Color(Color::transparent); +} + +Color RenderThemeAndroid::platformInactiveListBoxSelectionBackgroundColor() const +{ + return Color(Color::transparent); +} + +Color RenderThemeAndroid::platformActiveListBoxSelectionForegroundColor() const +{ + return Color(Color::transparent); +} + +Color RenderThemeAndroid::platformInactiveListBoxSelectionForegroundColor() const +{ + return Color(Color::transparent); +} + int RenderThemeAndroid::baselinePosition(const RenderObject* obj) const { // From the description of this function in RenderTheme.h: @@ -236,8 +260,55 @@ void RenderThemeAndroid::adjustTextAreaStyle(CSSStyleSelector*, RenderStyle* sty bool RenderThemeAndroid::paintTextArea(RenderObject* obj, const RenderObject::PaintInfo& info, const IntRect& rect) { - if (obj->isMenuList()) - return paintCombo(obj, info, rect); + if (obj->isListBox()) { + paintCombo(obj, info, rect); + RenderStyle* style = obj->style(); + if (style) + style->setColor(Color::transparent); + Node* node = obj->node(); + if (!node || !node->hasTagName(HTMLNames::selectTag)) { + return true; + } + HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node); + // The first item may be visible. Make sure it does not draw. + // If it has a style, it overrides the RenderListBox's style, so we + // need to make sure both are set to transparent. + node = select->item(0); + if (node) { + RenderObject* renderer = node->renderer(); + if (renderer) { + RenderStyle* renderStyle = renderer->style(); + if (renderStyle) + renderStyle->setColor(Color::transparent); + } + } + // Find the first selected option, and draw its text. + // FIXME: In a later change, if there is more than one item selected, + // draw a string that says "X items" like iPhone Safari does + int index = select->selectedIndex(); + node = select->item(index); + if (!node || !node->hasTagName(HTMLNames::optionTag)) { + return true; + } + HTMLOptionElement* option = static_cast<HTMLOptionElement*>(node); + String label = option->textIndentedToRespectGroupLabel(); + SkRect r(rect); + + SkPaint paint; + paint.setAntiAlias(true); + paint.setTextEncoding(SkPaint::kUTF16_TextEncoding); + // Values for text size and positioning determined by trial and error + paint.setTextSize(r.height() - SkIntToScalar(6)); + + SkCanvas* canvas = getCanvasFromInfo(info); + int saveCount = canvas->save(); + r.fRight -= SkIntToScalar(RenderSkinCombo::extraWidth()); + canvas->clipRect(r); + canvas->drawText(label.characters(), label.length() << 1, + r.fLeft + SkIntToScalar(5), r.fBottom - SkIntToScalar(5), + paint); + canvas->restoreToCount(saveCount); + } return true; } @@ -255,6 +326,8 @@ void RenderThemeAndroid::adjustListboxStyle(CSSStyleSelector*, RenderStyle* styl { style->setPaddingRight(Length(RenderSkinCombo::extraWidth(), Fixed)); style->setMaxHeight(Length(style->fontSize() + LISTBOX_PADDING, Fixed)); + // Make webkit draw invisible, since it will simply draw the first element + style->setColor(Color::transparent); addIntrinsicMargins(style); } diff --git a/WebCore/platform/android/RenderThemeAndroid.h b/WebCore/platform/android/RenderThemeAndroid.h index 2e54302..ae1213c 100644 --- a/WebCore/platform/android/RenderThemeAndroid.h +++ b/WebCore/platform/android/RenderThemeAndroid.h @@ -63,7 +63,12 @@ public: virtual Color platformActiveSelectionForegroundColor() const; virtual Color platformInactiveSelectionForegroundColor() const; virtual Color platformTextSearchHighlightColor() const; - + + virtual Color platformActiveListBoxSelectionBackgroundColor() const; + virtual Color platformInactiveListBoxSelectionBackgroundColor() const; + virtual Color platformActiveListBoxSelectionForegroundColor() const; + virtual Color platformInactiveListBoxSelectionForegroundColor() const; + virtual void systemFont(int, WebCore::FontDescription&) const {} virtual int minimumMenuListSize(RenderStyle*) const { return 0; } diff --git a/WebCore/platform/text/StringHash.h b/WebCore/platform/text/StringHash.h index 885dd8b..fc6cb3c 100644 --- a/WebCore/platform/text/StringHash.h +++ b/WebCore/platform/text/StringHash.h @@ -48,8 +48,15 @@ namespace WebCore { return false; #if PLATFORM(ARM) || PLATFORM(SH4) - return memcmp(a->characters(), b->characters(), sizeof(UChar) * aLength) == 0; + const UChar* aChars = a->characters(); + const UChar* bChars = b->characters(); + for (unsigned i = 0; i != aLength; ++i) { + if (*aChars++ != *bChars++) + return false; + } + return true; #else + /* Do it 4-bytes-at-a-time on architectures where it's safe */ const uint32_t* aChars = reinterpret_cast<const uint32_t*>(a->characters()); const uint32_t* bChars = reinterpret_cast<const uint32_t*>(b->characters()); diff --git a/WebCore/platform/text/android/TextBreakIteratorInternalICU.cpp b/WebCore/platform/text/android/TextBreakIteratorInternalICU.cpp index fc31fc9..9732e92 100644 --- a/WebCore/platform/text/android/TextBreakIteratorInternalICU.cpp +++ b/WebCore/platform/text/android/TextBreakIteratorInternalICU.cpp @@ -30,12 +30,13 @@ namespace WebCore { const char* currentSearchLocaleID() { - // TODO(benm): Implement. Should return system locale. + // FIXME: Should use system locale. return ""; } const char* currentTextBreakLocaleID() { + // FIXME: Should use system locale. return "en_us"; } 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; -} |
