Commit b1892d69 authored by Tanya Gupta's avatar Tanya Gupta Committed by Chromium LUCI CQ

[LongScreenshots ] Created test for compositor of LongScreenshots

Bug: 1153969
Change-Id: Ib4310ee117e1833f02a78cf93f802c434428b423
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2599444Reviewed-by: default avatarTanya Gupta <tgupta@chromium.org>
Reviewed-by: default avatarMehran Mahmoudi <mahmoudi@chromium.org>
Reviewed-by: default avatarRamya Nagarajan <ramyan@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Commit-Queue: Tanya Gupta <tgupta@chromium.org>
Cr-Commit-Position: refs/heads/master@{#841690}
parent 000b7760
...@@ -906,6 +906,7 @@ junit_binary("chrome_junit_tests") { ...@@ -906,6 +906,7 @@ junit_binary("chrome_junit_tests") {
"//components/omnibox/browser:browser_java", "//components/omnibox/browser:browser_java",
"//components/optimization_guide/proto:optimization_guide_proto_java", "//components/optimization_guide/proto:optimization_guide_proto_java",
"//components/page_info/android:java", "//components/page_info/android:java",
"//components/paint_preview/player/android:java",
"//components/payments/content/android:java", "//components/payments/content/android:java",
"//components/payments/content/android:service_java", "//components/payments/content/android:service_java",
"//components/payments/mojom:mojom_java", "//components/payments/mojom:mojom_java",
...@@ -969,7 +970,7 @@ junit_binary("chrome_junit_tests") { ...@@ -969,7 +970,7 @@ junit_binary("chrome_junit_tests") {
"//url/mojom:url_mojom_gurl_java", "//url/mojom:url_mojom_gurl_java",
] ]
deps += feed_test_deps deps += chrome_junit_test_java_deps
data_deps = [ "//testing/buildbot/filters:chrome_junit_tests_filters" ] data_deps = [ "//testing/buildbot/filters:chrome_junit_tests_filters" ]
......
...@@ -41,6 +41,8 @@ chrome_test_java_sources += omnibox_test_java_sources ...@@ -41,6 +41,8 @@ chrome_test_java_sources += omnibox_test_java_sources
chrome_test_java_sources += tab_management_test_java_sources chrome_test_java_sources += tab_management_test_java_sources
chrome_test_java_sources += share_test_java_sources chrome_test_java_sources += share_test_java_sources
chrome_junit_test_java_sources += share_junit_test_java_sources chrome_junit_test_java_sources += share_junit_test_java_sources
chrome_junit_test_java_deps = share_junit_test_java_deps
chrome_junit_test_java_deps += feed_test_deps
if (enable_arcore) { if (enable_arcore) {
chrome_java_sources += [ chrome_java_sources += [
......
...@@ -4,10 +4,13 @@ ...@@ -4,10 +4,13 @@
package org.chromium.chrome.browser.share.long_screenshots; package org.chromium.chrome.browser.share.long_screenshots;
import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Rect; import android.graphics.Rect;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.UnguessableToken; import org.chromium.base.UnguessableToken;
import org.chromium.components.paint_preview.common.proto.PaintPreview.PaintPreviewProto; import org.chromium.components.paint_preview.common.proto.PaintPreview.PaintPreviewProto;
...@@ -22,32 +25,34 @@ import org.chromium.url.GURL; ...@@ -22,32 +25,34 @@ import org.chromium.url.GURL;
* captured webpage. * captured webpage.
*/ */
public class LongScreenshotsCompositor { public class LongScreenshotsCompositor {
private Context mContext;
private PlayerCompositorDelegate mDelegate; private PlayerCompositorDelegate mDelegate;
private Callback<Bitmap> mBitmapCallback; private Callback<Bitmap> mBitmapCallback;
private Rect mRect; private Rect mRect;
private static PlayerCompositorDelegate.Factory sCompositorDelegateFactory =
new CompositorDelegateFactory();
/** /**
* Creates a new {@link LongScreenshotsCompositor}. * Creates a new {@link LongScreenshotsCompositor}.
* *
* @param url The URL for which the content should be composited for. * @param url The URL for which the content should be composited for.
* @param context An instance of current Android {@link Context}.
* @param nativePaintPreviewServiceProvider The native paint preview service. * @param nativePaintPreviewServiceProvider The native paint preview service.
* @param directoryKey The key for the directory storing the data. * @param directoryKey The key for the directory storing the data.
* @param rect The area of the captured webpage that should be composited. * @param rect The area of the captured webpage that should be composited.
* @param response The proto with the address of the captured bitmap. * @param response The proto with the address of the captured bitmap.
* @param bitmapCallback Callback to process the composited bitmap. * @param bitmapCallback Callback to process the composited bitmap.
*/ */
public LongScreenshotsCompositor(GURL url, Context context, public LongScreenshotsCompositor(GURL url,
NativePaintPreviewServiceProvider nativePaintPreviewServiceProvider, NativePaintPreviewServiceProvider nativePaintPreviewServiceProvider,
String directoryKey, PaintPreviewProto response, Rect rect, String directoryKey, PaintPreviewProto response, Rect rect,
Callback<Bitmap> bitmapCallback) { Callback<Bitmap> bitmapCallback) {
mContext = context;
mBitmapCallback = bitmapCallback; mBitmapCallback = bitmapCallback;
mRect = rect; mRect = rect;
mDelegate = new PlayerCompositorDelegateImpl(nativePaintPreviewServiceProvider, response, // TODO(tgupta): Look into warmupCompositor
url, directoryKey, true, this::onCompositorReady, this::onCompositorError); mDelegate = getCompositorDelegateFactory().createForProto(nativePaintPreviewServiceProvider,
response, url, directoryKey, true, this::onCompositorReady,
this::onCompositorError);
} }
/** /**
...@@ -63,9 +68,11 @@ public class LongScreenshotsCompositor { ...@@ -63,9 +68,11 @@ public class LongScreenshotsCompositor {
* method initializes a sub-component for each frame and adds the view for the root frame to * method initializes a sub-component for each frame and adds the view for the root frame to
* {@link #mHostView}. * {@link #mHostView}.
*/ */
private void onCompositorReady(UnguessableToken rootFrameGuid, UnguessableToken[] frameGuids, @VisibleForTesting
protected void onCompositorReady(UnguessableToken rootFrameGuid, UnguessableToken[] frameGuids,
int[] frameContentSize, int[] scrollOffsets, int[] subFramesCount, int[] frameContentSize, int[] scrollOffsets, int[] subFramesCount,
UnguessableToken[] subFrameGuids, int[] subFrameClipRects) { UnguessableToken[] subFrameGuids, int[] subFrameClipRects) {
// TODO(tgupta): Keep track of the returned id.
mDelegate.requestBitmap(mRect, 1, mBitmapCallback, this::onError); mDelegate.requestBitmap(mRect, 1, mBitmapCallback, this::onError);
} }
...@@ -83,4 +90,35 @@ public class LongScreenshotsCompositor { ...@@ -83,4 +90,35 @@ public class LongScreenshotsCompositor {
mDelegate = null; mDelegate = null;
} }
} }
static class CompositorDelegateFactory implements PlayerCompositorDelegate.Factory {
@Override
public PlayerCompositorDelegate create(NativePaintPreviewServiceProvider service,
@NonNull GURL url, String directoryKey, boolean mainFrameMode,
@NonNull PlayerCompositorDelegate.CompositorListener compositorListener,
Callback<Integer> compositorErrorCallback) {
return new PlayerCompositorDelegateImpl(service, null, url, directoryKey, mainFrameMode,
compositorListener, compositorErrorCallback);
}
@Override
public PlayerCompositorDelegate createForProto(NativePaintPreviewServiceProvider service,
@Nullable PaintPreviewProto proto, @NonNull GURL url, String directoryKey,
boolean mainFrameMode,
@NonNull PlayerCompositorDelegate.CompositorListener compositorListener,
Callback<Integer> compositorErrorCallback) {
return new PlayerCompositorDelegateImpl(service, proto, url, directoryKey,
mainFrameMode, compositorListener, compositorErrorCallback);
}
}
private PlayerCompositorDelegate.Factory getCompositorDelegateFactory() {
return sCompositorDelegateFactory;
}
@VisibleForTesting
public static void overrideCompositorDelegateFactoryForTesting(
PlayerCompositorDelegate.Factory factory) {
sCompositorDelegateFactory = factory; // IN-TEST
}
} }
...@@ -114,7 +114,7 @@ public class LongScreenshotsEntry implements LongScreenshotsTabService.CapturePr ...@@ -114,7 +114,7 @@ public class LongScreenshotsEntry implements LongScreenshotsTabService.CapturePr
public void processCapturedTab(PaintPreviewProto response, int status) { public void processCapturedTab(PaintPreviewProto response, int status) {
// TODO(tgupta): Process a non success status // TODO(tgupta): Process a non success status
mCompositor = new LongScreenshotsCompositor(new GURL(response.getMetadata().getUrl()), mCompositor = new LongScreenshotsCompositor(new GURL(response.getMetadata().getUrl()),
mContext, mLongScreenshotsTabService, DIR_NAME, response, mLongScreenshotsTabService, DIR_NAME, response,
new Rect(mStartXAxis, mStartYAxis, mEndXAxis, mEndYAxis), this::onBitmapResult); new Rect(mStartXAxis, mStartYAxis, mEndXAxis, mEndYAxis), this::onBitmapResult);
} }
......
include_rules = [ include_rules = [
"+components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player",
"+content/public/android/java/src/org/chromium/content_public/browser", "+content/public/android/java/src/org/chromium/content_public/browser",
] ]
\ No newline at end of file
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.share.long_screenshots;
import static org.junit.Assert.assertEquals;
import android.graphics.Bitmap;
import android.graphics.Rect;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.Callback;
import org.chromium.base.UnguessableToken;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.paint_preview.common.proto.PaintPreview.PaintPreviewProto;
import org.chromium.components.paintpreview.browser.NativePaintPreviewServiceProvider;
import org.chromium.components.paintpreview.player.PlayerCompositorDelegate;
import org.chromium.url.GURL;
/**
* Test for {@link LongScreenshotsCompositor}.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
@Features.EnableFeatures(ChromeFeatureList.CHROME_SHARE_LONG_SCREENSHOT)
public class LongScreenshotsCompositorTest {
private TestPlayerCompositorDelegate mCompositorDelegate;
private Bitmap mTestBitmap = Bitmap.createBitmap(512, 1024, Bitmap.Config.ARGB_8888);
private Rect mRect = new Rect(0, 100, 200, 1100);
@Mock
private GURL mTestGurl;
@Mock
private NativePaintPreviewServiceProvider mNativePaintPreviewServiceProvider;
/**
* Implementation of {@link PlayerCompositorDelegate.Factory} for tests.
*/
class TestCompositorDelegateFactory implements PlayerCompositorDelegate.Factory {
@Override
public PlayerCompositorDelegate create(NativePaintPreviewServiceProvider service, GURL url,
String directoryKey, boolean mainFrameMode,
@NonNull PlayerCompositorDelegate.CompositorListener compositorListener,
Callback<Integer> compositorErrorCallback) {
Assert.fail("create shouldn't be called");
return null;
}
@Override
public PlayerCompositorDelegate createForProto(NativePaintPreviewServiceProvider service,
@Nullable PaintPreviewProto proto, GURL url, String directoryKey,
boolean mainFrameMode,
@NonNull PlayerCompositorDelegate.CompositorListener compositorListener,
Callback<Integer> compositorErrorCallback) {
return mCompositorDelegate;
}
}
/**
* Implementation of {@link PlayerCompositorDelegate} for tests. TODO(tgupta): Consider moving
* this into its own class when it starts to get used more.
*/
class TestPlayerCompositorDelegate implements PlayerCompositorDelegate {
@Override
public void addMemoryPressureListener(Runnable runnable) {}
@Override
public int requestBitmap(UnguessableToken frameGuid, Rect clipRect, float scaleFactor,
Callback<Bitmap> bitmapCallback, Runnable errorCallback) {
Assert.fail("This version of requestBitmap should not be called");
return 0;
}
@Override
public int requestBitmap(Rect clipRect, float scaleFactor, Callback<Bitmap> bitmapCallback,
Runnable errorCallback) {
assertEquals(mRect, clipRect);
assertEquals(1f, scaleFactor, 0);
bitmapCallback.onResult(mTestBitmap);
return 1;
}
@Override
public boolean cancelBitmapRequest(int requestId) {
return false;
}
@Override
public void cancelAllBitmapRequests() {}
@Override
public GURL onClick(UnguessableToken frameGuid, int x, int y) {
return null;
}
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mCompositorDelegate = new TestPlayerCompositorDelegate();
LongScreenshotsCompositor.overrideCompositorDelegateFactoryForTesting(
new TestCompositorDelegateFactory());
}
@After
public void tearDown() {
LongScreenshotsCompositor.overrideCompositorDelegateFactoryForTesting(null);
}
@Test
public void testSuccessfullCompositing() {
Callback<Bitmap> onBitmapResult = new Callback<Bitmap>() {
@Override
public void onResult(Bitmap result) {
assertEquals(mTestBitmap, result);
}
};
LongScreenshotsCompositor compositor = new LongScreenshotsCompositor(mTestGurl,
mNativePaintPreviewServiceProvider, "test_directory_key",
PaintPreviewProto.getDefaultInstance(), mRect, onBitmapResult);
// Mimic the service calling onCompositorReady
compositor.onCompositorReady(null, null, null, null, null, null, null);
// RequestBitmap in mCompositorDelegate should match
}
}
...@@ -18,8 +18,16 @@ share_test_java_sources = [ ...@@ -18,8 +18,16 @@ share_test_java_sources = [
share_junit_test_java_sources = [ share_junit_test_java_sources = [
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinatorTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotCoordinatorTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/NotificationSharedPrefManagerTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/NotificationSharedPrefManagerTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java",
] ]
share_junit_test_java_deps = [
"//chrome/browser/paint_preview/android:java",
"//chrome/browser/paint_preview/android:java",
"//components/paint_preview/common/proto:proto_java",
"//components/paint_preview/player/android:java",
]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment