diff options
Diffstat (limited to 'WebKit/android/jni')
-rw-r--r-- | WebKit/android/jni/PictureSet.cpp | 98 | ||||
-rw-r--r-- | WebKit/android/jni/PictureSet.h | 6 | ||||
-rw-r--r-- | WebKit/android/jni/WebCoreFrameBridge.cpp | 3 | ||||
-rw-r--r-- | WebKit/android/jni/WebHistory.cpp | 5 | ||||
-rw-r--r-- | WebKit/android/jni/WebViewCore.cpp | 140 | ||||
-rw-r--r-- | WebKit/android/jni/WebViewCore.h | 9 |
6 files changed, 135 insertions, 126 deletions
diff --git a/WebKit/android/jni/PictureSet.cpp b/WebKit/android/jni/PictureSet.cpp index 6f57c67..410769e 100644 --- a/WebKit/android/jni/PictureSet.cpp +++ b/WebKit/android/jni/PictureSet.cpp @@ -76,9 +76,9 @@ void PictureSet::add(const Pictures* temp) void PictureSet::add(const SkRegion& area, SkPicture* picture, uint32_t elapsed, bool split) { - DBG_SET_LOGD("%p {%d,%d,r=%d,b=%d} elapsed=%d split=%d", this, + DBG_SET_LOGD("%p area={%d,%d,r=%d,b=%d} pict=%p elapsed=%d split=%d", this, area.getBounds().fLeft, area.getBounds().fTop, - area.getBounds().fRight, area.getBounds().fBottom, + area.getBounds().fRight, area.getBounds().fBottom, picture, elapsed, split); picture->safeRef(); /* if nothing is drawn beneath part of the new picture, mark it as a base */ @@ -207,7 +207,7 @@ void PictureSet::checkDimensions(int width, int height, SkRegion* inval) void PictureSet::clear() { - // dump(__FUNCTION__); + DBG_SET_LOG(""); Pictures* last = mPictures.end(); for (Pictures* working = mPictures.begin(); working != last; working++) { working->mArea.setEmpty(); @@ -219,7 +219,6 @@ void PictureSet::clear() bool PictureSet::draw(SkCanvas* canvas) { - DBG_SET_LOG(""); validate(__FUNCTION__); Pictures* first = mPictures.begin(); Pictures* last = mPictures.end(); @@ -242,7 +241,7 @@ bool PictureSet::draw(SkCanvas* canvas) break; } } - DBG_SET_LOGD("first=%d last=%d", first - mPictures.begin(), + DBG_SET_LOGD("%p first=%d last=%d", this, first - mPictures.begin(), last - mPictures.begin()); uint32_t maxElapsed = 0; for (working = first; working != last; working++) { @@ -309,20 +308,32 @@ bool PictureSet::draw(SkCanvas* canvas) void PictureSet::dump(const char* label) const { #if PICTURE_SET_DUMP - DBG_SET_LOGD("%p %s (%d)", this, label, mPictures.size()); + DBG_SET_LOGD("%p %s (%d) (w=%d,h=%d)", this, label, mPictures.size(), + mWidth, mHeight); const Pictures* last = mPictures.end(); for (const Pictures* working = mPictures.begin(); working != last; working++) { const SkIRect& bounds = working->mArea.getBounds(); + const SkIRect& unsplit = working->mUnsplit; MeasureStream measure; if (working->mPicture != NULL) working->mPicture->serialize(&measure); - LOGD(" [%d] {%d,%d,r=%d,b=%d} elapsed=%d split=%s" - " wroteElapsed=%s base=%s pictSize=%d", + LOGD(" [%d]" + " mArea.bounds={%d,%d,r=%d,b=%d}" + " mPicture=%p" + " mUnsplit={%d,%d,r=%d,b=%d}" + " mElapsed=%d" + " mSplit=%s" + " mWroteElapsed=%s" + " mBase=%s" + " pict-size=%d", working - mPictures.begin(), bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, + working->mPicture, + unsplit.fLeft, unsplit.fTop, unsplit.fRight, unsplit.fBottom, working->mElapsed, working->mSplit ? "true" : "false", - working->mWroteElapsed ? "true" : "false", - working->mBase ? "true" : "false", measure.mTotal); + working->mWroteElapsed ? "true" : "false", + working->mBase ? "true" : "false", + measure.mTotal); } #endif } @@ -465,7 +476,7 @@ bool PictureSet::reuseSubdivided(const SkRegion& inval) void PictureSet::set(const PictureSet& src) { - DBG_SET_LOG("start"); + DBG_SET_LOGD("start %p src=%p", this, &src); clear(); mWidth = src.mWidth; mHeight = src.mHeight; @@ -514,55 +525,35 @@ void PictureSet::setPicture(size_t i, SkPicture* p) void PictureSet::split(PictureSet* out) const { dump(__FUNCTION__); + DBG_SET_LOGD("%p", this); SkIRect totalBounds; out->mWidth = mWidth; out->mHeight = mHeight; totalBounds.set(0, 0, mWidth, mHeight); SkRegion* total = new SkRegion(totalBounds); const Pictures* last = mPictures.end(); + const Pictures* working; uint32_t balance = 0; - bool firstTime = true; - const Pictures* singleton = NULL; - int singleOut = -1; - for (const Pictures* working = mPictures.begin(); working != last; working++) { + int multiUnsplitFastPictures = 0; // > 1 has more than 1 + for (working = mPictures.begin(); working != last; working++) { + if (working->mElapsed >= MAX_DRAW_TIME || working->mSplit) + continue; + if (++multiUnsplitFastPictures > 1) + break; + } + for (working = mPictures.begin(); working != last; working++) { uint32_t elapsed = working->mElapsed; if (elapsed < MAX_DRAW_TIME) { - if (working->mSplit) { + bool split = working->mSplit; + DBG_SET_LOGD("elapsed=%d working=%p total->getBounds()=" + "{%d,%d,r=%d,b=%d} split=%s", elapsed, working, + total->getBounds().fLeft, total->getBounds().fTop, + total->getBounds().fRight, total->getBounds().fBottom, + split ? "true" : "false"); + if (multiUnsplitFastPictures <= 1 || split) { total->op(working->mArea, SkRegion::kDifference_Op); - DBG_SET_LOGD("%p total->getBounds()={%d,%d,r=%d,b=%d", this, - total->getBounds().fLeft, total->getBounds().fTop, - total->getBounds().fRight, total->getBounds().fBottom); - singleOut = out->mPictures.end() - out->mPictures.begin(); - out->add(working->mArea, working->mPicture, elapsed, true); - continue; - } - if (firstTime) { - singleton = working; - DBG_SET_LOGD("%p firstTime working=%p working->mArea=" - "{%d,%d,r=%d,b=%d}", this, working, - working->mArea.getBounds().fLeft, - working->mArea.getBounds().fTop, - working->mArea.getBounds().fRight, - working->mArea.getBounds().fBottom); - out->add(working->mArea, working->mPicture, elapsed, false); - firstTime = false; - } else { - if (singleOut >= 0) { - Pictures& outWork = out->mPictures[singleOut]; - DBG_SET_LOGD("%p clear singleton outWork=%p outWork->mArea=" - "{%d,%d,r=%d,b=%d}", this, &outWork, - outWork.mArea.getBounds().fLeft, - outWork.mArea.getBounds().fTop, - outWork.mArea.getBounds().fRight, - outWork.mArea.getBounds().fBottom); - outWork.mArea.setEmpty(); - outWork.mPicture->safeUnref(); - outWork.mPicture = NULL; - singleOut = -1; - } - singleton = NULL; - } - if (balance < elapsed) + out->add(working->mArea, working->mPicture, elapsed, split); + } else if (balance < elapsed) balance = elapsed; continue; } @@ -600,9 +591,10 @@ void PictureSet::split(PictureSet* out) const top = bottom; } } - DBG_SET_LOGD("%p w=%d h=%d total->isEmpty()=%s singleton=%p", - this, mWidth, mHeight, total->isEmpty() ? "true" : "false", singleton); - if (total->isEmpty() == false && singleton == NULL) + DBG_SET_LOGD("%p w=%d h=%d total->isEmpty()=%s multiUnsplitFastPictures=%d", + this, mWidth, mHeight, total->isEmpty() ? "true" : "false", + multiUnsplitFastPictures); + if (!total->isEmpty() && multiUnsplitFastPictures > 1) out->add(*total, NULL, balance, false); delete total; validate(__FUNCTION__); diff --git a/WebKit/android/jni/PictureSet.h b/WebKit/android/jni/PictureSet.h index 17a7b25..ce94fc0 100644 --- a/WebKit/android/jni/PictureSet.h +++ b/WebKit/android/jni/PictureSet.h @@ -57,7 +57,7 @@ namespace android { virtual ~PictureSet(); void add(const SkRegion& area, SkPicture* picture, uint32_t elapsed, bool split); - const SkIRect& bounds(size_t i) { + const SkIRect& bounds(size_t i) const { return mPictures[i].mArea.getBounds(); } bool build(); // Update mWidth/mHeight, and adds any additional inval region @@ -71,10 +71,10 @@ namespace android { void set(const PictureSet& ); void setDrawTimes(const PictureSet& ); void setPicture(size_t i, SkPicture* p); - size_t size() { return mPictures.size(); } + size_t size() const { return mPictures.size(); } void split(PictureSet* result) const; void toPicture(SkPicture* ) const; - bool upToDate(size_t i) { return mPictures[i].mPicture != NULL; } + bool upToDate(size_t i) const { return mPictures[i].mPicture != NULL; } int width() const { return mWidth; } void dump(const char* label) const; bool validate(const char* label) const; diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp index 860109b..e14a534 100644 --- a/WebKit/android/jni/WebCoreFrameBridge.cpp +++ b/WebKit/android/jni/WebCoreFrameBridge.cpp @@ -687,6 +687,9 @@ static void CreateFrame(JNIEnv* env, jobject obj, jobject javaview, jobject jAss InspectorClientAndroid* inspectorC = new InspectorClientAndroid; // Create a new page WebCore::Page* page = new WebCore::Page(chromeC, contextMenuC, editorC, dragC, inspectorC); + // 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); diff --git a/WebKit/android/jni/WebHistory.cpp b/WebKit/android/jni/WebHistory.cpp index 028d62e..8a75230 100644 --- a/WebKit/android/jni/WebHistory.cpp +++ b/WebKit/android/jni/WebHistory.cpp @@ -231,10 +231,7 @@ jbyteArray WebHistory::Flatten(JNIEnv* env, WTF::Vector<char>& v, WebCore::Histo return NULL; // Write our flattened data to the java array. - jbyte* bytes = env->GetByteArrayElements(b, NULL); - if (bytes) - memcpy(bytes, v.data(), v.size()); - env->ReleaseByteArrayElements(b, bytes, 0); + env->SetByteArrayRegion(b, 0, v.size(), (const jbyte*)v.data()); return b; } diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index 64bfd8f..12dc9ef 100644 --- a/WebKit/android/jni/WebViewCore.cpp +++ b/WebKit/android/jni/WebViewCore.cpp @@ -280,6 +280,7 @@ void WebViewCore::reset(bool fromConstructor) m_useReplay = false; m_skipContentDraw = false; m_findIsUp = false; + m_domtree_version = 0; } static bool layoutIfNeededRecursive(WebCore::Frame* f) @@ -382,16 +383,19 @@ void WebViewCore::recordPictureSet(PictureSet* content) m_frameCacheOutOfDate = true; WebCore::IntRect oldBounds = oldFocusNode ? oldFocusNode->getRect() : WebCore::IntRect(0,0,0,0); - DBG_NAV_LOGD_THROTTLE("m_lastFocused=%p oldFocusNode=%p" + DBG_NAV_LOGD("m_lastFocused=%p oldFocusNode=%p" " m_lastFocusedBounds={%d,%d,%d,%d} oldBounds={%d,%d,%d,%d}", m_lastFocused, oldFocusNode, m_lastFocusedBounds.x(), m_lastFocusedBounds.y(), m_lastFocusedBounds.width(), m_lastFocusedBounds.height(), oldBounds.x(), oldBounds.y(), oldBounds.width(), oldBounds.height()); + unsigned latestVersion = m_mainFrame->document()->domTreeVersion(); if (m_lastFocused != oldFocusNode || m_lastFocusedBounds != oldBounds - || m_findIsUp) { + || m_findIsUp || latestVersion != m_domtree_version) { m_lastFocused = oldFocusNode; m_lastFocusedBounds = oldBounds; - DBG_NAV_LOG("call updateFrameCache"); + DBG_NAV_LOGD("call updateFrameCache m_domtree_version=%d latest=%d", + m_domtree_version, latestVersion); + m_domtree_version = latestVersion; updateFrameCache(); } } @@ -508,8 +512,8 @@ void WebViewCore::rebuildPictureSet(PictureSet* pictureSet) if (pictureSet->upToDate(index)) continue; const SkIRect& inval = pictureSet->bounds(index); - DBG_SET_LOGD("draw [%d] {%d,%d,w=%d,h=%d}", index, inval.fLeft, - inval.fTop, inval.width(), inval.height()); + DBG_SET_LOGD("pictSet=%p [%d] {%d,%d,w=%d,h=%d}", pictureSet, index, + inval.fLeft, inval.fTop, inval.width(), inval.height()); pictureSet->setPicture(index, rebuildPicture(inval)); } pictureSet->validate(__FUNCTION__); @@ -599,21 +603,13 @@ void WebViewCore::sendRecomputeFocus() checkException(env); } -void WebViewCore::viewInvalidate(const SkIRect& rect) -{ - LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!"); - JNIEnv* env = JSC::Bindings::getJNIEnv(); - env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_sendViewInvalidate, - rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); - checkException(env); -} - void WebViewCore::viewInvalidate(const WebCore::IntRect& rect) -{ +{ LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!"); JNIEnv* env = JSC::Bindings::getJNIEnv(); - env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_sendViewInvalidate, - rect.x(), rect.y(), rect.right(), rect.bottom()); + env->CallVoidMethod(m_javaGlue->object(env).get(), + m_javaGlue->m_sendViewInvalidate, + rect.x(), rect.y(), rect.right(), rect.bottom()); checkException(env); } @@ -749,12 +745,12 @@ void WebViewCore::setScrollOffset(int dx, int dy) if (m_scrollOffsetX != dx || m_scrollOffsetY != dy) { m_scrollOffsetX = dx; m_scrollOffsetY = dy; - m_mainFrame->sendScrollEvent(); // The visible rect is located within our coordinate space so it // contains the actual scroll position. Setting the location makes hit // testing work correctly. m_mainFrame->view()->platformWidget()->setLocation(m_scrollOffsetX, m_scrollOffsetY); + m_mainFrame->sendScrollEvent(); } } @@ -1011,7 +1007,10 @@ void WebViewCore::drawPlugins() if (!inval.isEmpty()) { // inval.getBounds() is our rectangle - this->viewInvalidate(inval.getBounds()); + const SkIRect& bounds = inval.getBounds(); + WebCore::IntRect r(bounds.fLeft, bounds.fTop, + bounds.width(), bounds.height()); + this->viewInvalidate(r); } } @@ -1021,7 +1020,7 @@ void WebViewCore::setFinalFocus(WebCore::Frame* frame, WebCore::Node* node, int x, int y, bool block) { DBG_NAV_LOGD("frame=%p node=%p x=%d y=%d", frame, node, x, y); - bool result = finalKitFocus(frame, node, x, y); + bool result = finalKitFocus(frame, node, x, y, false); if (block) { m_blockFocusChange = true; if (!result && node) @@ -1082,12 +1081,16 @@ bool WebViewCore::commonKitFocus(int generation, int buildGeneration, releaseFrameCache(newCache); if (!node && ignoreNullFocus) return true; - finalKitFocus(frame, node, x, y); + finalKitFocus(frame, node, x, y, false); return true; } +// Update mouse position and may change focused node. +// If donotChangeDOMFocus is true, the function does not changed focused node +// in the DOM tree. Changing the focus in DOM may trigger onblur event +// handler on the current focused node before firing mouse up and down events. bool WebViewCore::finalKitFocus(WebCore::Frame* frame, WebCore::Node* node, - int x, int y) + int x, int y, bool donotChangeDOMFocus) { if (!frame) frame = m_mainFrame; @@ -1103,41 +1106,48 @@ bool WebViewCore::finalKitFocus(WebCore::Frame* frame, WebCore::Node* node, WebCore::MouseEventMoved, 1, false, false, false, false, WebCore::currentTime()); frame->eventHandler()->handleMouseMoveEvent(mouseEvent); } - WebCore::Document* oldDoc = oldFocusNode ? oldFocusNode->document() : 0; - if (!node) { - if (oldFocusNode) - oldDoc->setFocusedNode(0); - return false; - } else if (!valid) { - DBG_NAV_LOGD("sendMarkNodeInvalid node=%p", node); - sendMarkNodeInvalid(node); - if (oldFocusNode) + + if (!donotChangeDOMFocus) { + WebCore::Document* oldDoc = oldFocusNode ? oldFocusNode->document() : 0; + if (!node) { + if (oldFocusNode) + oldDoc->setFocusedNode(0); + return false; + } else if (!valid) { + DBG_NAV_LOGD("sendMarkNodeInvalid node=%p", node); + sendMarkNodeInvalid(node); + if (oldFocusNode) + oldDoc->setFocusedNode(0); + return false; + } + // If we jump frames (docs), kill the focus on the old doc + if (oldFocusNode && node->document() != oldDoc) { oldDoc->setFocusedNode(0); - return false; - } - // If we jump frames (docs), kill the focus on the old doc - builder.setLastFocus(node); - if (oldFocusNode && node->document() != oldDoc) { - oldDoc->setFocusedNode(0); - } - if (!node->isTextNode()) - static_cast<WebCore::Element*>(node)->focus(false); - if (node->document()->focusedNode() != node) { - // This happens when Element::focus() fails as we may try to set the - // focus to a node which WebCore doesn't recognize as a focusable node. - // So we need to do some extra work, as it does in Element::focus(), - // besides calling Document::setFocusedNode. - if (oldFocusNode) { - // copied from clearSelectionIfNeeded in FocusController.cpp - WebCore::SelectionController* s = oldDoc->frame()->selection(); - if (!s->isNone()) - s->clear(); } - //setFocus on things that WebCore doesn't recognize as supporting focus - //for instance, if there is an onclick element that does not support focus - node->document()->setFocusedNode(node); + if (!node->isTextNode()) + static_cast<WebCore::Element*>(node)->focus(false); + if (node->document()->focusedNode() != node) { + // This happens when Element::focus() fails as we may try to set the + // focus to a node which WebCore doesn't recognize as a focusable node. + // So we need to do some extra work, as it does in Element::focus(), + // besides calling Document::setFocusedNode. + if (oldFocusNode) { + // copied from clearSelectionIfNeeded in FocusController.cpp + WebCore::SelectionController* s = oldDoc->frame()->selection(); + if (!s->isNone()) + s->clear(); + } + //setFocus on things that WebCore doesn't recognize as supporting focus + //for instance, if there is an onclick element that does not support focus + node->document()->setFocusedNode(node); + } + } else { // !donotChangeDOMFocus + if (!node || !valid) + return false; } + DBG_NAV_LOGD("setFocusedNode node=%p", node); + builder.setLastFocus(node); m_lastFocused = node; m_lastFocusedBounds = node->getRect(); return true; @@ -1175,7 +1185,7 @@ WebCore::Frame* WebViewCore::changedKitFocus(WebCore::Frame* frame, WebCore::Node* current = FrameLoaderClientAndroid::get(m_mainFrame)->getCacheBuilder().currentFocus(); if (current == node) return frame; - return finalKitFocus(frame, node, x, y) ? frame : m_mainFrame; + return finalKitFocus(frame, node, x, y, false) ? frame : m_mainFrame; } static int findTextBoxIndex(WebCore::Node* node, const WebCore::IntPoint& pt) @@ -1470,6 +1480,10 @@ public: // index is listIndex of the selected item, or -1 if nothing is selected. virtual void replyInt(int index) { + if (-2 == index) { + // Special value for cancel. Do nothing. + return; + } // If the select element no longer exists, do to a page change, etc, silently return. if (!m_select || !FrameLoaderClientAndroid::get(m_viewImpl->m_mainFrame)->getCacheBuilder().validNode(m_frame, m_select)) return; @@ -1493,8 +1507,8 @@ public: } // Response if the listbox allows multiple selection. array stores the listIndices - // of selected positions. - virtual void replyIntArray(const int* array, int count) + // of selected positions. + virtual void replyIntArray(const int* array, int count) { // If the select element no longer exists, do to a page change, etc, silently return. if (!m_select || !FrameLoaderClientAndroid::get(m_viewImpl->m_mainFrame)->getCacheBuilder().validNode(m_frame, m_select)) @@ -1540,9 +1554,9 @@ static jobjectArray makeLabelArray(JNIEnv* env, const uint16_t** labels, size_t void WebViewCore::listBoxRequest(WebCoreReply* reply, const uint16_t** labels, size_t count, const int enabled[], size_t enabledCount, bool multiple, const int selected[], size_t selectedCountOrSelection) { - // Reuse m_popupReply - Release(m_popupReply); - m_popupReply = 0; + // If m_popupReply is not null, then we already have a list showing. + if (m_popupReply != 0) + return; LOG_ASSERT(m_javaGlue->m_obj, "No java widget associated with this view!"); @@ -1661,7 +1675,7 @@ void WebViewCore::touchUp(int touchGeneration, int buildGeneration, return; // short circuit if a newer touch has been generated } if (retry) - finalKitFocus(frame, node, x, y); + finalKitFocus(frame, node, x, y, true); // don't change DOM focus else if (!commonKitFocus(touchGeneration, buildGeneration, frame, node, x, y, false)) { return; @@ -1692,7 +1706,7 @@ bool WebViewCore::handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* node // so when attempting to get the default, the point chosen would be follow the wrong link. if (nodePtr->hasTagName(WebCore::HTMLNames::areaTag)) { webFrame->setUserInitiatedClick(true); - WebCore::EventTargetNodeCast(nodePtr)->dispatchSimulatedClick(0, + WebCore::EventTargetNodeCast(nodePtr)->dispatchSimulatedClick(0, true, true); webFrame->setUserInitiatedClick(false); return true; @@ -1940,7 +1954,7 @@ static void SetScrollOffset(JNIEnv *env, jobject obj, jint dx, jint dy) viewImpl->setScrollOffset(dx, dy); } -static void SetGlobalBounds(JNIEnv *env, jobject obj, jint x, jint y, jint h, +static void SetGlobalBounds(JNIEnv *env, jobject obj, jint x, jint y, jint h, jint v) { WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj); @@ -1949,7 +1963,7 @@ static void SetGlobalBounds(JNIEnv *env, jobject obj, jint x, jint y, jint h, viewImpl->setGlobalBounds(x, y, h, v); } -static jboolean Key(JNIEnv *env, jobject obj, jint keyCode, jint unichar, +static jboolean Key(JNIEnv *env, jobject obj, jint keyCode, jint unichar, jint repeatCount, jboolean isShift, jboolean isAlt, jboolean isDown) { #ifdef ANDROID_INSTRUMENT diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h index fcd5574..29bdf37 100644 --- a/WebKit/android/jni/WebViewCore.h +++ b/WebKit/android/jni/WebViewCore.h @@ -119,9 +119,11 @@ namespace android { */ void contentDraw(); - // invalidate the view/display, NOT the content/DOM + /** Invalidate the view/screen, NOT the content/DOM, but expressed in + * content/DOM coordinates (i.e. they need to eventually be scaled, + * by webview into view.java coordinates + */ void viewInvalidate(const WebCore::IntRect& rect); - void viewInvalidate(const SkIRect& rect); /** * Invalidate part of the content that may be offscreen at the moment @@ -381,6 +383,7 @@ namespace android { WebCore::Node* m_snapAnchorNode; int m_screenWidth; int m_scale; + unsigned m_domtree_version; SkTDArray<PluginWidgetAndroid*> m_plugins; WebCore::Timer<WebViewCore> m_pluginInvalTimer; @@ -393,7 +396,7 @@ namespace android { bool commonKitFocus(int generation, int buildGeneration, WebCore::Frame* frame, WebCore::Node* node, int x, int y, bool ignoreNullFocus); - bool finalKitFocus(WebCore::Frame* frame, WebCore::Node* node, int x, int y); + bool finalKitFocus(WebCore::Frame* frame, WebCore::Node* node, int x, int y, bool donotChangeDOMFocus); void doMaxScroll(CacheBuilder::Direction dir); SkPicture* rebuildPicture(const SkIRect& inval); void rebuildPictureSet(PictureSet* ); |