diff options
author | Cary Clark <cary@android.com> | 2010-11-11 10:14:14 -0500 |
---|---|---|
committer | Cary Clark <cary@android.com> | 2010-11-11 13:00:17 -0500 |
commit | 2b36633c8e1183d3b024dea63d958eaff71bdc64 (patch) | |
tree | 47056c594121600289392f2951ccac4ed600aad1 /WebKit/android/nav | |
parent | 5d93c28b5a1fcbe16e88da9bc1260a75054f7992 (diff) | |
download | external_webkit-2b36633c8e1183d3b024dea63d958eaff71bdc64.zip external_webkit-2b36633c8e1183d3b024dea63d958eaff71bdc64.tar.gz external_webkit-2b36633c8e1183d3b024dea63d958eaff71bdc64.tar.bz2 |
use layer id to maintain selection
The pictures used to draw the page content can change
in response to refreshes, as the selection is moved or
as the screen is scrolled or zoomed.
Track the layer id, instead of the picture pointer,
to find the picture that contains the current selection.
Before, the selection would disappear as the screen
was pinched, or the highlight might disappear even
though the anchors draw, or the highlight and anchors
might be drawn offset from the screen data. This change
eliminates this class of bugs.
Change-Id: Ifc440b8aa0c9d6d232e298e42c4c544a41629442
http://b/3183492
Diffstat (limited to 'WebKit/android/nav')
-rw-r--r-- | WebKit/android/nav/CachedRoot.cpp | 9 | ||||
-rw-r--r-- | WebKit/android/nav/CachedRoot.h | 4 | ||||
-rw-r--r-- | WebKit/android/nav/SelectText.cpp | 11 | ||||
-rw-r--r-- | WebKit/android/nav/SelectText.h | 1 |
4 files changed, 20 insertions, 5 deletions
diff --git a/WebKit/android/nav/CachedRoot.cpp b/WebKit/android/nav/CachedRoot.cpp index 813357c..4ae66de 100644 --- a/WebKit/android/nav/CachedRoot.cpp +++ b/WebKit/android/nav/CachedRoot.cpp @@ -1661,7 +1661,7 @@ const CachedNode* CachedRoot::nextTextField(const CachedNode* start, return CachedFrame::nextTextField(start, framePtr, &startFound); } -SkPicture* CachedRoot::pictureAt(int* xPtr, int* yPtr) const +SkPicture* CachedRoot::pictureAt(int* xPtr, int* yPtr, int* id) const { #if USE(ACCELERATED_COMPOSITING) if (mRootLayer) { @@ -1675,13 +1675,18 @@ SkPicture* CachedRoot::pictureAt(int* xPtr, int* yPtr) const layer->bounds(&localBounds); *xPtr -= localBounds.fLeft; *yPtr -= localBounds.fTop; - if (picture) + if (picture) { + if (id) + *id = layer->uniqueId(); return picture; + } } } #endif DBG_NAV_LOGD("root mPicture=%p (%d,%d)", mPicture, mPicture ? mPicture->width() : 0, mPicture ? mPicture->height() : 0); + if (id) + *id = -1; return mPicture; } diff --git a/WebKit/android/nav/CachedRoot.h b/WebKit/android/nav/CachedRoot.h index 18bace3..a09e4fb 100644 --- a/WebKit/android/nav/CachedRoot.h +++ b/WebKit/android/nav/CachedRoot.h @@ -85,7 +85,9 @@ public: */ const CachedNode* nextTextField(const CachedNode* start, const CachedFrame** framePtr) const; - SkPicture* pictureAt(int* xPtr, int* yPtr) const; + SkPicture* pictureAt(int* xPtr, int* yPtr, int* id) const; + SkPicture* pictureAt(int* xPtr, int* yPtr) const { + return pictureAt(xPtr, yPtr, 0); } void reset(); CachedHistory* rootHistory() const { return mHistory; } const WebCore::LayerAndroid* rootLayer() const { return mRootLayer; } diff --git a/WebKit/android/nav/SelectText.cpp b/WebKit/android/nav/SelectText.cpp index e606f62..f6548cf 100644 --- a/WebKit/android/nav/SelectText.cpp +++ b/WebKit/android/nav/SelectText.cpp @@ -1290,8 +1290,12 @@ SelectText::~SelectText() void SelectText::draw(SkCanvas* canvas, LayerAndroid* layer) { - if (!m_picture || m_picture != layer->picture()) + if (m_layerId != layer->uniqueId()) return; + // reset m_picture to match m_layerId + m_picture->safeUnref(); + m_picture = layer->picture(); + m_picture->safeRef(); DBG_NAV_LOGD("m_extendSelection=%d m_drawPointer=%d layer [%d]", m_extendSelection, m_drawPointer, layer->uniqueId()); if (m_extendSelection) @@ -1330,6 +1334,8 @@ void SelectText::drawSelectionPointer(SkCanvas* canvas) void SelectText::drawSelectionRegion(SkCanvas* canvas) { + if (!m_picture) + return; m_selRegion.setEmpty(); SkIRect ivisBounds = m_visibleRect; ivisBounds.join(m_selStart); @@ -1512,6 +1518,7 @@ void SelectText::reset() m_startSelection = false; m_picture->safeUnref(); m_picture = 0; + m_layerId = 0; } void SelectText::selectAll() @@ -1548,7 +1555,7 @@ bool SelectText::startSelection(const CachedRoot* root, const IntRect& vis, { m_startOffset.set(x, y); m_picture->safeUnref(); - m_picture = root->pictureAt(&x, &y); + m_picture = root->pictureAt(&x, &y, &m_layerId); if (!m_picture) { DBG_NAV_LOG("picture==0"); return false; diff --git a/WebKit/android/nav/SelectText.h b/WebKit/android/nav/SelectText.h index d210117..8247356 100644 --- a/WebKit/android/nav/SelectText.h +++ b/WebKit/android/nav/SelectText.h @@ -73,6 +73,7 @@ private: SkIRect m_selEnd; int m_startBase; int m_endBase; + int m_layerId; SkIRect m_visibleRect; // constrains picture computations to visible area SkRegion m_selRegion; // computed from sel start, end SkPicture m_startControl; |