summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCary Clark <cary@android.com>2010-11-11 10:14:14 -0500
committerCary Clark <cary@android.com>2010-11-11 13:00:17 -0500
commit2b36633c8e1183d3b024dea63d958eaff71bdc64 (patch)
tree47056c594121600289392f2951ccac4ed600aad1
parent5d93c28b5a1fcbe16e88da9bc1260a75054f7992 (diff)
downloadexternal_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
-rw-r--r--WebKit/android/nav/CachedRoot.cpp9
-rw-r--r--WebKit/android/nav/CachedRoot.h4
-rw-r--r--WebKit/android/nav/SelectText.cpp11
-rw-r--r--WebKit/android/nav/SelectText.h1
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;