summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit')
-rw-r--r--WebKit/android/TimeCounter.cpp19
-rw-r--r--WebKit/android/TimeCounter.h17
-rw-r--r--WebKit/android/jni/WebSettings.cpp7
-rw-r--r--WebKit/android/jni/WebViewCore.cpp74
-rw-r--r--WebKit/android/nav/CacheBuilder.cpp8
-rw-r--r--WebKit/android/nav/FindCanvas.cpp25
6 files changed, 109 insertions, 41 deletions
diff --git a/WebKit/android/TimeCounter.cpp b/WebKit/android/TimeCounter.cpp
index c92afb2..0dc0f3e 100644
--- a/WebKit/android/TimeCounter.cpp
+++ b/WebKit/android/TimeCounter.cpp
@@ -56,18 +56,19 @@ uint32_t TimeCounter::sLastCounter[TimeCounter::TotalTimeCounterCount];
uint32_t TimeCounter::sStartTime[TimeCounter::TotalTimeCounterCount];
static const char* timeCounterNames[] = {
- "calculate style",
"css parsing",
+ "javascript",
+ "calculate style",
"Java callback (frame bridge)",
+ "parsing (may include calcStyle or Java callback)",
"layout",
"native 1 (frame bridge)",
- "parsing (may include calcStyle or Java callback)",
- "native 3 (resource load)",
- "native 2 (shared timer)",
+ "native 2 (resource load)",
+ "native 3 (shared timer)",
"build nav (webview core)",
- "draw content (webview core)",
"record content (webview core)",
- "native 4 (webview core)"
+ "native 4 (webview core)",
+ "draw content (webview ui)",
};
void TimeCounter::record(enum Type type, const char* functionName)
@@ -92,8 +93,6 @@ void TimeCounter::report(const KURL& url, int live, int dead)
int threadTime = get_thread_msec() - sStartThreadTime;
LOGD("*-* Total load time: %d ms, thread time: %d ms for %s\n",
totalTime, threadTime, urlString.utf8().data());
-// FIXME: JSGlobalObject no longer records time
-// JSC::JSGlobalObject::reportTimeCounter();
for (Type type = (Type) 0; type < TotalTimeCounterCount; type
= (Type) (type + 1)) {
char scratch[256];
@@ -115,8 +114,6 @@ void TimeCounter::reportNow()
LOGD("*-* Elapsed time: %d ms, ui thread time: %d ms, webcore thread time:"
" %d ms\n", elapsedTime, elapsedThreadTime, sEndWebCoreThreadTime -
sStartWebCoreThreadTime);
-// FIXME: JSGlobalObject no longer records time
-// JSC::JSGlobalObject::reportTimeCounter();
for (Type type = (Type) 0; type < TotalTimeCounterCount; type
= (Type) (type + 1)) {
if (sTotalTimeUsed[type] == sLastTimeUsed[type])
@@ -137,8 +134,6 @@ void TimeCounter::reportNow()
}
void TimeCounter::reset() {
-// FIXME: JSGlobalObject no longer records time
-// JSC::JSGlobalObject::resetTimeCounter();
bzero(sTotalTimeUsed, sizeof(sTotalTimeUsed));
bzero(sCounter, sizeof(sCounter));
LOGD("*-* Start browser instrument\n");
diff --git a/WebKit/android/TimeCounter.h b/WebKit/android/TimeCounter.h
index 58d2468..d1b2dff 100644
--- a/WebKit/android/TimeCounter.h
+++ b/WebKit/android/TimeCounter.h
@@ -41,18 +41,21 @@ namespace android {
class TimeCounter {
public:
enum Type {
- CalculateStyleTimeCounter,
+ // function base counters
CSSTimeCounter,
+ JavaScriptTimeCounter,
+ CalculateStyleTimeCounter,
JavaCallbackTimeCounter,
- LayoutTimeCounter,
- NativeCallbackTimeCounter,
ParsingTimeCounter,
- ResourceTimeCounter,
- SharedTimerTimeCounter,
+ LayoutTimeCounter,
+ // file base counters
+ NativeCallbackTimeCounter, // WebCoreFrameBridge.cpp
+ ResourceTimeCounter, // WebCoreResourceLoader.cpp
+ SharedTimerTimeCounter, // JavaBridge.cpp
WebViewCoreBuildNavTimeCounter,
- WebViewCoreDrawTimeCounter,
WebViewCoreRecordTimeCounter,
- WebViewCoreTimeCounter,
+ WebViewCoreTimeCounter, // WebViewCore.cpp
+ WebViewUIDrawTimeCounter,
TotalTimeCounterCount
};
diff --git a/WebKit/android/jni/WebSettings.cpp b/WebKit/android/jni/WebSettings.cpp
index 855abdd..407544a 100644
--- a/WebKit/android/jni/WebSettings.cpp
+++ b/WebKit/android/jni/WebSettings.cpp
@@ -305,8 +305,11 @@ public:
pluginDatabase->setPluginDirectories(paths);
// Set the home directory for plugin temporary files
WebCore::sPluginPath = paths[0];
- // Reload plugins.
- pluginDatabase->refresh();
+ // Reload plugins. We call Page::refreshPlugins() instead
+ // of pluginDatabase->refresh(), as we need to ensure that
+ // the list of mimetypes exposed by the browser are also
+ // updated.
+ WebCore::Page::refreshPlugins(false);
}
}
#endif
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index ee74685..d9f9cec 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -476,7 +476,7 @@ void WebViewCore::copyContentToPicture(SkPicture* picture)
bool WebViewCore::drawContent(SkCanvas* canvas, SkColor color)
{
#ifdef ANDROID_INSTRUMENT
- TimeCounterAuto counter(TimeCounter::WebViewCoreDrawTimeCounter);
+ TimeCounterAuto counter(TimeCounter::WebViewUIDrawTimeCounter);
#endif
DBG_SET_LOG("start");
m_contentMutex.lock();
@@ -1153,21 +1153,20 @@ bool WebViewCore::commonKitFocus(int generation, int buildGeneration,
bool WebViewCore::finalKitFocus(WebCore::Frame* frame, WebCore::Node* node,
int x, int y, bool donotChangeDOMFocus)
{
- if (!frame)
+ CacheBuilder& builder = FrameLoaderClientAndroid::
+ get(m_mainFrame)->getCacheBuilder();
+ if (!frame || builder.validNode(frame, NULL) == false)
frame = m_mainFrame;
- CacheBuilder& builder = FrameLoaderClientAndroid::get(m_mainFrame)->getCacheBuilder();
WebCore::Node* oldFocusNode = builder.currentFocus();
// mouse event expects the position in the window coordinate
m_mousePos = WebCore::IntPoint(x - m_scrollOffsetX, y - m_scrollOffsetY);
// validNode will still return true if the node is null, as long as we have
// a valid frame. Do not want to make a call on frame unless it is valid.
+ WebCore::PlatformMouseEvent mouseEvent(m_mousePos, m_mousePos,
+ WebCore::NoButton, WebCore::MouseEventMoved, 1, false, false, false,
+ false, WebCore::currentTime());
+ frame->eventHandler()->handleMouseMoveEvent(mouseEvent);
bool valid = builder.validNode(frame, node);
- if (valid) {
- WebCore::PlatformMouseEvent mouseEvent(m_mousePos, m_mousePos, WebCore::NoButton,
- WebCore::MouseEventMoved, 1, false, false, false, false, WebCore::currentTime());
- frame->eventHandler()->handleMouseMoveEvent(mouseEvent);
- }
-
if (!donotChangeDOMFocus) {
WebCore::Document* oldDoc = oldFocusNode ? oldFocusNode->document() : 0;
if (!node) {
@@ -1737,7 +1736,7 @@ void WebViewCore::touchUp(int touchGeneration, int buildGeneration,
" x=%d y=%d", m_touchGeneration, touchGeneration, x, y);
return; // short circuit if a newer touch has been generated
}
- if (retry)
+ if (retry || isClick)
finalKitFocus(frame, node, x, y, true); // don't change DOM focus
else if (!commonKitFocus(touchGeneration, buildGeneration,
frame, node, x, y, false)) {
@@ -2021,6 +2020,9 @@ static void SetScrollOffset(JNIEnv *env, jobject obj, jint dx, jint dy)
static void SetGlobalBounds(JNIEnv *env, jobject obj, jint x, jint y, jint h,
jint v)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "need viewImpl");
@@ -2131,6 +2133,9 @@ static bool RecordContent(JNIEnv *env, jobject obj, jobject region, jobject pt)
static void SplitContent(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
viewImpl->splitContent();
}
@@ -2174,6 +2179,9 @@ static void SendListBoxChoices(JNIEnv* env, jobject obj, jbooleanArray jArray,
static jstring FindAddress(JNIEnv *env, jobject obj, jstring addr)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
if (!addr)
return 0;
int length = env->GetStringLength(addr);
@@ -2194,6 +2202,9 @@ static jstring FindAddress(JNIEnv *env, jobject obj, jstring addr)
static jboolean HandleTouchEvent(JNIEnv *env, jobject obj, jint action, jint x, jint y)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
return viewImpl->handleTouchEvent(action, x, y);
@@ -2215,6 +2226,9 @@ static void TouchUp(JNIEnv *env, jobject obj, jint touchGeneration,
static jstring RetrieveHref(JNIEnv *env, jobject obj, jint frame,
jint node)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
WebCore::String result = viewImpl->retrieveHref((WebCore::Frame*) frame,
@@ -2252,6 +2266,9 @@ static void SetKitFocus(JNIEnv *env, jobject obj, jint moveGeneration,
static void UnblockFocus(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
viewImpl->unblockFocus();
@@ -2259,6 +2276,9 @@ static void UnblockFocus(JNIEnv *env, jobject obj)
static void UpdateFrameCache(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
viewImpl->updateFrameCache();
@@ -2266,6 +2286,9 @@ static void UpdateFrameCache(JNIEnv *env, jobject obj)
static jint GetContentMinPrefWidth(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
@@ -2284,6 +2307,9 @@ static jint GetContentMinPrefWidth(JNIEnv *env, jobject obj)
static void SetViewportSettingsFromNative(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
@@ -2303,6 +2329,9 @@ static void SetViewportSettingsFromNative(JNIEnv *env, jobject obj)
static void SetSnapAnchor(JNIEnv *env, jobject obj, jint x, jint y)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
@@ -2311,6 +2340,9 @@ static void SetSnapAnchor(JNIEnv *env, jobject obj, jint x, jint y)
static void SnapToAnchor(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
@@ -2319,6 +2351,9 @@ static void SnapToAnchor(JNIEnv *env, jobject obj)
static void SetBackgroundColor(JNIEnv *env, jobject obj, jint color)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
@@ -2327,6 +2362,9 @@ static void SetBackgroundColor(JNIEnv *env, jobject obj, jint color)
static jstring GetSelection(JNIEnv *env, jobject obj, jobject selRgn)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
SkRegion* selectionRegion = GraphicsJNI::getNativeRegion(env, selRgn);
@@ -2364,29 +2402,44 @@ static void RefreshPlugins(JNIEnv *env,
jobject obj,
jboolean reloadOpenPages)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
// Refresh the list of plugins, optionally reloading all open
// pages.
WebCore::refreshPlugins(reloadOpenPages);
}
static void RegisterURLSchemeAsLocal(JNIEnv* env, jobject obj, jstring scheme) {
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebCore::FrameLoader::registerURLSchemeAsLocal(to_string(env, scheme));
}
static void CheckNavCache(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
viewImpl->checkNavCache();
}
static void ClearContent(JNIEnv *env, jobject obj)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
viewImpl->clearContent();
}
static void CopyContentToPicture(JNIEnv *env, jobject obj, jobject pict)
{
+#ifdef ANDROID_INSTRUMENT
+ TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
+#endif
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
if (!viewImpl)
return;
@@ -2396,6 +2449,7 @@ static void CopyContentToPicture(JNIEnv *env, jobject obj, jobject pict)
static bool DrawContent(JNIEnv *env, jobject obj, jobject canv, jint color)
{
+ // Note: this is called from UI thread, don't count it for WebViewCoreTimeCounter
WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
return viewImpl->drawContent(canvas, color);
diff --git a/WebKit/android/nav/CacheBuilder.cpp b/WebKit/android/nav/CacheBuilder.cpp
index 8b31de6..9150830 100644
--- a/WebKit/android/nav/CacheBuilder.cpp
+++ b/WebKit/android/nav/CacheBuilder.cpp
@@ -1093,6 +1093,8 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
IntRect bounds;
IntRect absBounds;
WTF::Vector<IntRect>* columns = NULL;
+ int minimumFocusableWidth = MINIMUM_FOCUSABLE_WIDTH;
+ int minimumFocusableHeight = MINIMUM_FOCUSABLE_HEIGHT;
if (isArea) {
HTMLAreaElement* area = static_cast<HTMLAreaElement*>(node);
bounds = getAreaRect(area);
@@ -1224,6 +1226,8 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
style->textAlign() == WebCore::RIGHT ||
style->textAlign() == WebCore::WEBKIT_RIGHT;
}
+ minimumFocusableWidth += 4;
+ minimumFocusableHeight += 4;
}
takesFocus = true;
if (isAnchor) {
@@ -1255,9 +1259,9 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
bounds.setLocation(IntPoint(x, y));
bounds.setSize(IntSize(width, height));
}
- if (bounds.width() < MINIMUM_FOCUSABLE_WIDTH)
+ if (bounds.width() < minimumFocusableWidth)
continue;
- if (bounds.height() < MINIMUM_FOCUSABLE_HEIGHT)
+ if (bounds.height() < minimumFocusableHeight)
continue;
bounds.move(globalOffsetX, globalOffsetY);
}
diff --git a/WebKit/android/nav/FindCanvas.cpp b/WebKit/android/nav/FindCanvas.cpp
index 61bb07e..24b0129 100644
--- a/WebKit/android/nav/FindCanvas.cpp
+++ b/WebKit/android/nav/FindCanvas.cpp
@@ -275,8 +275,15 @@ void FindCanvas::findHelper(const void* text, size_t byteLength,
if (mWorkingIndex) {
SkPoint newY;
getTotalMatrix().mapXY(0, y, &newY);
- SkIRect bounds = mWorkingRegion.getBounds();
- if (bounds.fBottom < SkScalarRound(newY.fY)) {
+ SkIRect workingBounds = mWorkingRegion.getBounds();
+ int newYInt = SkScalarRound(newY.fY);
+ if (workingBounds.fTop > newYInt) {
+ // The new text is above the working region, so we know it's not
+ // a continuation.
+ resetWorkingCanvas();
+ mWorkingIndex = 0;
+ mWorkingRegion.setEmpty();
+ } else if (workingBounds.fBottom < newYInt) {
// Now we know that this line is lower than our partial match.
SkPaint clonePaint(paint);
clonePaint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
@@ -301,6 +308,9 @@ void FindCanvas::findHelper(const void* text, size_t byteLength,
mWorkingRegion.setEmpty();
}
}
+ // If neither one is true, then we are likely continuing on the same
+ // line, but are in a new draw call because the paint has changed. In
+ // this case, we can continue without adding a space.
}
// j is the position in the search text
// Start off with mWorkingIndex in case we are continuing from a prior call
@@ -396,21 +406,20 @@ void FindCanvas::findHelper(const void* text, size_t byteLength,
// call.
// Keep track of a partial match that may start on this line.
if (j > 0) { // if j is greater than 0, we have a partial match
- int partialIndex = index - j + mWorkingIndex;
+ int relativeCount = j - mWorkingIndex; // Number of characters in this
+ // part of the match.
+ int partialIndex = index - relativeCount; // Index that starts our
+ // partial match.
const uint16_t* partialGlyphs = chars + partialIndex;
- SkRect partial = (this->*addMatch)(partialIndex, paint, j,
+ SkRect partial = (this->*addMatch)(partialIndex, paint, relativeCount,
partialGlyphs, positions, y);
partial.inset(mOutset, mOutset);
- getTotalMatrix().mapRect(&partial);
SkIRect dest;
partial.roundOut(&dest);
// Only save a partial if it is in the current clip.
if (getTotalClip().contains(dest)) {
mWorkingRegion.op(dest, SkRegion::kUnion_Op);
mWorkingIndex = j;
- // From one perspective, it seems like we would want to draw here,
- // since we have all the information (paint, matrix, etc)
- // However, we only want to draw if we find the rest
return;
}
}