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") {
"//components/omnibox/browser:browser_java",
"//components/optimization_guide/proto:optimization_guide_proto_java",
"//components/page_info/android:java",
"//components/paint_preview/player/android:java",
"//components/payments/content/android:java",
"//components/payments/content/android:service_java",
"//components/payments/mojom:mojom_java",
......@@ -969,7 +970,7 @@ junit_binary("chrome_junit_tests") {
"//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" ]
......
......@@ -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 += share_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) {
chrome_java_sources += [
......
......@@ -4,10 +4,13 @@
package org.chromium.chrome.browser.share.long_screenshots;
import android.content.Context;
import android.graphics.Bitmap;
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.UnguessableToken;
import org.chromium.components.paint_preview.common.proto.PaintPreview.PaintPreviewProto;
......@@ -22,32 +25,34 @@ import org.chromium.url.GURL;
* captured webpage.
*/
public class LongScreenshotsCompositor {
private Context mContext;
private PlayerCompositorDelegate mDelegate;
private Callback<Bitmap> mBitmapCallback;
private Rect mRect;
private static PlayerCompositorDelegate.Factory sCompositorDelegateFactory =
new CompositorDelegateFactory();
/**
* Creates a new {@link LongScreenshotsCompositor}.
*
* @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 directoryKey The key for the directory storing the data.
* @param rect The area of the captured webpage that should be composited.
* @param response The proto with the address of the captured bitmap.
* @param bitmapCallback Callback to process the composited bitmap.
*/
public LongScreenshotsCompositor(GURL url, Context context,
public LongScreenshotsCompositor(GURL url,
NativePaintPreviewServiceProvider nativePaintPreviewServiceProvider,
String directoryKey, PaintPreviewProto response, Rect rect,
Callback<Bitmap> bitmapCallback) {
mContext = context;
mBitmapCallback = bitmapCallback;
mRect = rect;
mDelegate = new PlayerCompositorDelegateImpl(nativePaintPreviewServiceProvider, response,
url, directoryKey, true, this::onCompositorReady, this::onCompositorError);
// TODO(tgupta): Look into warmupCompositor
mDelegate = getCompositorDelegateFactory().createForProto(nativePaintPreviewServiceProvider,
response, url, directoryKey, true, this::onCompositorReady,
this::onCompositorError);
}
/**
......@@ -63,9 +68,11 @@ public class LongScreenshotsCompositor {
* method initializes a sub-component for each frame and adds the view for the root frame to
* {@link #mHostView}.
*/
private void onCompositorReady(UnguessableToken rootFrameGuid, UnguessableToken[] frameGuids,
@VisibleForTesting
protected void onCompositorReady(UnguessableToken rootFrameGuid, UnguessableToken[] frameGuids,
int[] frameContentSize, int[] scrollOffsets, int[] subFramesCount,
UnguessableToken[] subFrameGuids, int[] subFrameClipRects) {
// TODO(tgupta): Keep track of the returned id.
mDelegate.requestBitmap(mRect, 1, mBitmapCallback, this::onError);
}
......@@ -83,4 +90,35 @@ public class LongScreenshotsCompositor {
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
public void processCapturedTab(PaintPreviewProto response, int status) {
// TODO(tgupta): Process a non success status
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);
}
......
include_rules = [
"+components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player",
"+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 = [
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/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/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/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