Content and viewport rects set in one step.

Bug 5342918
 The content rect of the WebView was being retrieved during
 the draw while the viewport rect was being set when the
 draw functor was setup. During animations, the content
 rect was changing between the time the draw functor was
 retrieved and it was executed. The content rect is now
 being set with the viewport rect.

 Wekbkit Change: I05d68dcc

Change-Id: I1b0978eeb27d9f1deddfeba3ede869f735f74394
This commit is contained in:
George Mount
2011-11-15 11:27:47 -08:00
parent de8c5ec889
commit 82ed95f410

View File

@@ -361,6 +361,7 @@ public class WebView extends AbsoluteLayout
private final Rect mGLRectViewport = new Rect();
private final Rect mViewRectViewport = new Rect();
private final RectF mVisibleContentRect = new RectF();
private boolean mGLViewportEmpty = false;
/**
@@ -4586,11 +4587,14 @@ public class WebView extends AbsoluteLayout
+ " extras=" + extras);
}
calcOurContentVisibleRectF(mVisibleContentRect);
if (canvas.isHardwareAccelerated()) {
int functor = nativeGetDrawGLFunction(mNativeClass,
mGLViewportEmpty ? null : mGLRectViewport, mGLViewportEmpty ? null : mViewRectViewport, getScale(), extras);
((HardwareCanvas) canvas).callDrawGLFunction(functor);
Rect glRectViewport = mGLViewportEmpty ? null : mGLRectViewport;
Rect viewRectViewport = mGLViewportEmpty ? null : mViewRectViewport;
int functor = nativeGetDrawGLFunction(mNativeClass, glRectViewport,
viewRectViewport, mVisibleContentRect, getScale(), extras);
((HardwareCanvas) canvas).callDrawGLFunction(functor);
if (mHardwareAccelSkia != getSettings().getHardwareAccelSkiaEnabled()) {
mHardwareAccelSkia = getSettings().getHardwareAccelSkiaEnabled();
nativeUseHardwareAccelSkia(mHardwareAccelSkia);
@@ -4606,7 +4610,8 @@ public class WebView extends AbsoluteLayout
canvas.setDrawFilter(df);
// XXX: Revisit splitting content. Right now it causes a
// synchronization problem with layers.
int content = nativeDraw(canvas, color, extras, false);
int content = nativeDraw(canvas, mVisibleContentRect, color,
extras, false);
canvas.setDrawFilter(null);
if (!mBlockWebkitViewMessages && content != 0) {
mWebViewCore.sendMessage(EventHub.SPLIT_PICTURE_SET, content, 0);
@@ -5776,8 +5781,9 @@ public class WebView extends AbsoluteLayout
} else {
mGLViewportEmpty = true;
}
calcOurContentVisibleRectF(mVisibleContentRect);
nativeUpdateDrawGLFunction(mGLViewportEmpty ? null : mGLRectViewport,
mGLViewportEmpty ? null : mViewRectViewport);
mGLViewportEmpty ? null : mViewRectViewport, mVisibleContentRect);
}
/**
@@ -8774,7 +8780,6 @@ public class WebView extends AbsoluteLayout
mSendScrollEvent = false;
recordNewContentSize(draw.mContentSize.x,
draw.mContentSize.y, updateLayout);
if (isPictureAfterFirstLayout) {
// Reset the last sent data here since dealing with new page.
mLastWidthSent = 0;
@@ -9345,7 +9350,8 @@ public class WebView extends AbsoluteLayout
* @hide only needs to be accessible to Browser and testing
*/
public void drawPage(Canvas canvas) {
nativeDraw(canvas, 0, 0, false);
calcOurContentVisibleRectF(mVisibleContentRect);
nativeDraw(canvas, mVisibleContentRect, 0, 0, false);
}
/**
@@ -9476,13 +9482,14 @@ public class WebView extends AbsoluteLayout
* MUST be passed to WebViewCore with SPLIT_PICTURE_SET message so that the
* native allocation can be freed.
*/
private native int nativeDraw(Canvas canvas, int color, int extra,
boolean splitIfNeeded);
private native int nativeDraw(Canvas canvas, RectF visibleRect,
int color, int extra, boolean splitIfNeeded);
private native void nativeDumpDisplayTree(String urlOrNull);
private native boolean nativeEvaluateLayersAnimations(int nativeInstance);
private native int nativeGetDrawGLFunction(int nativeInstance, Rect rect,
Rect viewRect, float scale, int extras);
private native void nativeUpdateDrawGLFunction(Rect rect, Rect viewRect);
Rect viewRect, RectF visibleRect, float scale, int extras);
private native void nativeUpdateDrawGLFunction(Rect rect, Rect viewRect,
RectF visibleRect);
private native void nativeExtendSelection(int x, int y);
private native int nativeFindAll(String findLower, String findUpper,
boolean sameAsLastSearch);