Commit eb605d8b authored by mdjones's avatar mdjones Committed by Commit bot

Initial tests for ReaderModeManager

This adds the mock classes and a initial tests for the
ReaderModeManager.

BUG=

Review URL: https://codereview.chromium.org/1469973002

Cr-Commit-Position: refs/heads/master@{#361226}
parent 70c88376
...@@ -1190,6 +1190,13 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -1190,6 +1190,13 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
return mContextualSearchManager; return mContextualSearchManager;
} }
/**
* @return The {@code ReaderModeManager} or {@code null} if none;
*/
public ReaderModeManager getReaderModeManager() {
return mReaderModeManager;
}
/** /**
* Create a full-screen manager to be used by this activity. * Create a full-screen manager to be used by this activity.
* @param controlContainer The control container that will be controlled by the full-screen * @param controlContainer The control container that will be controlled by the full-screen
......
...@@ -71,7 +71,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver ...@@ -71,7 +71,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
private int mTabId; private int mTabId;
// The ReaderModePanel that this class is managing. // The ReaderModePanel that this class is managing.
private ReaderModePanel mReaderModePanel; protected ReaderModePanel mReaderModePanel;
// The ChromeActivity that this panel exists in. // The ChromeActivity that this panel exists in.
private ChromeActivity mChromeActivity; private ChromeActivity mChromeActivity;
...@@ -289,7 +289,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver ...@@ -289,7 +289,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
return tab.getWebContents(); return tab.getWebContents();
} }
private WebContentsObserver createWebContentsObserver(WebContents webContents) { protected WebContentsObserver createWebContentsObserver(WebContents webContents) {
final int readerTabId = mTabModelSelector.getCurrentTabId(); final int readerTabId = mTabModelSelector.getCurrentTabId();
if (readerTabId == Tab.INVALID_TAB_ID) return null; if (readerTabId == Tab.INVALID_TAB_ID) return null;
...@@ -348,7 +348,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver ...@@ -348,7 +348,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
* showing. * showing.
* @param reason The reason the panel is requesting to be shown. * @param reason The reason the panel is requesting to be shown.
*/ */
private void requestReaderPanelShow(StateChangeReason reason) { protected void requestReaderPanelShow(StateChangeReason reason) {
int currentTabId = mTabModelSelector.getCurrentTabId(); int currentTabId = mTabModelSelector.getCurrentTabId();
if (currentTabId == Tab.INVALID_TAB_ID) return; if (currentTabId == Tab.INVALID_TAB_ID) return;
...@@ -368,7 +368,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver ...@@ -368,7 +368,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
* @param reason The reason the panel is closing. * @param reason The reason the panel is closing.
* @param animate True if the panel should animate closed. * @param animate True if the panel should animate closed.
*/ */
private void closeReaderPanel(StateChangeReason reason, boolean animate) { protected void closeReaderPanel(StateChangeReason reason, boolean animate) {
if (mReaderModePanel == null) return; if (mReaderModePanel == null) return;
mReaderModePanel.closePanel(reason, animate); mReaderModePanel.closePanel(reason, animate);
} }
......
// Copyright 2015 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.dom_distiller;
import android.content.Context;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
import org.chromium.chrome.browser.compositor.bottombar.readermode.ReaderModeBarControl;
import org.chromium.chrome.browser.compositor.bottombar.readermode.ReaderModePanel;
import org.chromium.chrome.browser.compositor.scene_layer.ContextualSearchSceneLayer;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel.MockTabModelDelegate;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver;
/**
* Tests logic in the ReaderModeManager.
*/
public class ReaderModeManagerTest extends InstrumentationTestCase {
MockOverlayPanelManager mPanelManager;
ReaderModeManagerWrapper mReaderManager;
MockReaderModePanel mPanel;
/**
* A mock TabModelSelector for creating tabs.
*/
private static class ReaderModeMockTabModelSelector extends MockTabModelSelector {
public ReaderModeMockTabModelSelector() {
super(2, 0,
new MockTabModelDelegate() {
@Override
public Tab createTab(int id, boolean incognito) {
return new Tab(id, incognito, null);
}
});
}
}
/**
* Mock OverlayPanelManager for recording but not actually performing events. This will also
* detect calls to show/hide panel that do not pass through the ReaderModeManager's methods.
*/
private static class MockOverlayPanelManager extends OverlayPanelManager {
private int mRequestPanelShowCount;
private int mPanelHideCount;
@Override
public void requestPanelShow(OverlayPanel p, StateChangeReason r) {
mRequestPanelShowCount++;
}
@Override
public void notifyPanelClosed(OverlayPanel p, StateChangeReason r) {
mPanelHideCount++;
}
public int getRequestPanelShowCount() {
return mRequestPanelShowCount;
}
public int getPanelHideCount() {
return mPanelHideCount;
}
}
/**
* A wrapper for the ReaderModeManager; this is used for recording and triggering events
* manually.
*/
private static class ReaderModeManagerWrapper extends ReaderModeManager {
public ReaderModeManagerWrapper() {
super(new ReaderModeMockTabModelSelector(), null);
}
@Override
protected void requestReaderPanelShow(StateChangeReason reason) {
// Skip tab checks and request the panel be shown.
mReaderModePanel.requestPanelShow(reason);
}
@Override
public WebContentsObserver createWebContentsObserver(WebContents webContents) {
// Do not attempt to create or attach a WebContentsObserver.
return null;
}
}
/**
* Mock ReaderModePanel.
*/
private static class MockReaderModePanel extends ReaderModePanel {
public MockReaderModePanel(Context context, OverlayPanelManager manager) {
super(context, null, manager, null);
}
@Override
public ContextualSearchSceneLayer createNewReaderModeSceneLayer() {
return null;
}
@Override
protected ReaderModeBarControl getReaderModeBarControl() {
return new MockReaderModeBarControl();
}
/**
* This class is overridden to be completely inert; it would otherwise call many native
* methods.
*/
private static class MockReaderModeBarControl extends ReaderModeBarControl {
public MockReaderModeBarControl() {
super(null, null, null, null);
}
@Override
public void setBarText(int stringId) {}
@Override
public void inflate() {}
@Override
public void invalidate() {}
}
/**
* Override creation and destruction of the ContentViewCore as they rely on native methods.
*/
private static class MockOverlayPanelContent extends OverlayPanelContent {
public MockOverlayPanelContent() {
super(null, null, null);
}
@Override
public void removeLastHistoryEntry(String url, long timeInMs) {}
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
mPanelManager = new MockOverlayPanelManager();
mReaderManager = new ReaderModeManagerWrapper();
mPanel = new MockReaderModePanel(getInstrumentation().getTargetContext(), mPanelManager);
mReaderManager.setReaderModePanel(mPanel);
}
// Start ReaderModeManager test suite.
/**
* Tests that the panel behaves appropriately with infobar events.
*/
@SmallTest
@Feature({"ReaderModeManager"})
public void testInfoBarEvents() {
mReaderManager.onAddInfoBar(null, null, true);
assertEquals(0, mPanelManager.getRequestPanelShowCount());
assertEquals(1, mPanelManager.getPanelHideCount());
mReaderManager.onRemoveInfoBar(null, null, true);
assertEquals(1, mPanelManager.getRequestPanelShowCount());
assertEquals(1, mPanelManager.getPanelHideCount());
}
/**
* Tests that the panel behaves appropriately with fullscreen events.
*/
@SmallTest
@Feature({"ReaderModeManager"})
public void testFullscreenEvents() {
mReaderManager.onToggleFullscreenMode(null, true);
assertEquals(0, mPanelManager.getRequestPanelShowCount());
assertEquals(1, mPanelManager.getPanelHideCount());
mReaderManager.onToggleFullscreenMode(null, false);
assertEquals(1, mPanelManager.getRequestPanelShowCount());
assertEquals(1, mPanelManager.getPanelHideCount());
}
// TODO(mdjones): Test add/remove infobar while fullscreen is enabled.
// TODO(mdjones): Test onclosebuttonpressed disables Reader Mode for a particular tab.
// TODO(mdjones): Test onorientationchanged closes and re-opens panel.
// TODO(mdjones): Test tab events.
// TODO(mdjones): Test distillability callback.
}
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