OSDN Git Service

Fix WebView disappearing
authorChris Craik <ccraik@google.com>
Thu, 10 Mar 2016 18:27:38 +0000 (10:27 -0800)
committerChris Craik <ccraik@google.com>
Thu, 10 Mar 2016 18:49:45 +0000 (10:49 -0800)
bug:27528563

Change-Id: Ib9fefa18ef9fb8eb11edd097cbadf8ab2b911576

libs/hwui/RecordingCanvas.cpp
libs/hwui/tests/unit/FrameBuilderTests.cpp

index ddf0528..4e3ed36 100644 (file)
@@ -24,8 +24,8 @@
 namespace android {
 namespace uirenderer {
 
-
-static Rect sUnreasonablyLargeBounds(-10000, -10000, 10000, 10000);
+#define MIL_PIX 1000000
+static Rect sUnreasonablyLargeBounds(-MIL_PIX, -MIL_PIX, MIL_PIX, MIL_PIX);
 
 static const Rect& getConservativeOpBounds(const ClipBase* clip) {
     // if op is clipped, that rect can be used, but otherwise just use a conservatively large rect
@@ -595,7 +595,7 @@ void RecordingCanvas::callDrawGLFunction(Functor* functor) {
     mDisplayList->functors.push_back(functor);
     auto clip = getRecordedClip();
     addOp(alloc().create_trivial<FunctorOp>(
-            getConservativeOpBounds(clip), // TODO: explicitly define bounds
+            getConservativeOpBounds(clip),
             *(mState.currentSnapshot()->transform),
             clip,
             functor));
index 4c56a22..f147fd4 100644 (file)
@@ -349,6 +349,29 @@ RENDERTHREAD_TEST(FrameBuilder, textureLayer) {
     EXPECT_EQ(1, renderer.getIndex());
 }
 
+TEST(FrameBuilder, functor_reject) {
+    class FunctorTestRenderer : public TestRendererBase {
+    public:
+        void onFunctorOp(const FunctorOp& op, const BakedOpState& state) override {
+            EXPECT_EQ(0, mIndex++);
+        }
+    };
+    Functor noopFunctor;
+
+    // 1 million pixel tall view, scrolled down 80%
+    auto scrolledFunctorView = TestUtils::createNode(0, 0, 400, 1000000,
+            [&noopFunctor](RenderProperties& props, RecordingCanvas& canvas) {
+        canvas.translate(0, -800000);
+        canvas.callDrawGLFunction(&noopFunctor);
+    });
+
+    FrameBuilder frameBuilder(sEmptyLayerUpdateQueue, SkRect::MakeWH(200, 200), 200, 200,
+            TestUtils::createSyncedNodeList(scrolledFunctorView), sLightGeometry, nullptr);
+    FunctorTestRenderer renderer;
+    frameBuilder.replayBakedOps<TestDispatcher>(renderer);
+    EXPECT_EQ(1, renderer.getIndex()) << "Functor should not be rejected";
+}
+
 TEST(FrameBuilder, renderNode) {
     class RenderNodeTestRenderer : public TestRendererBase {
     public:
@@ -391,6 +414,7 @@ TEST(FrameBuilder, renderNode) {
             TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr);
     RenderNodeTestRenderer renderer;
     frameBuilder.replayBakedOps<TestDispatcher>(renderer);
+    EXPECT_EQ(2, renderer.getIndex());
 }
 
 TEST(FrameBuilder, clipped) {