Commit 468814db authored by John Abd-El-Malek's avatar John Abd-El-Malek Committed by Commit Bot

WebLayer: delete a tab if its first navigation is a download.

Bug: 1127518
Change-Id: I9639b5b047033ec92331a2dc5bb8541e4e08546c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2406667
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#806717}
parent 643971b5
...@@ -18,15 +18,19 @@ import org.junit.Rule; ...@@ -18,15 +18,19 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.net.test.util.TestWebServer; import org.chromium.net.test.util.TestWebServer;
import org.chromium.weblayer.Browser;
import org.chromium.weblayer.Download; import org.chromium.weblayer.Download;
import org.chromium.weblayer.DownloadCallback; import org.chromium.weblayer.DownloadCallback;
import org.chromium.weblayer.DownloadError; import org.chromium.weblayer.DownloadError;
import org.chromium.weblayer.DownloadState; import org.chromium.weblayer.DownloadState;
import org.chromium.weblayer.Profile; import org.chromium.weblayer.Profile;
import org.chromium.weblayer.Tab;
import org.chromium.weblayer.TabListCallback;
import org.chromium.weblayer.WebLayer; import org.chromium.weblayer.WebLayer;
import org.chromium.weblayer.shell.InstrumentationActivity; import org.chromium.weblayer.shell.InstrumentationActivity;
...@@ -179,6 +183,46 @@ public class DownloadCallbackTest { ...@@ -179,6 +183,46 @@ public class DownloadCallbackTest {
} }
} }
/**
* Verifies that if the first navigation in a Tab is for a download then it is deleted.
*/
@Test
@SmallTest
public void testFirstNavigationIsDownloadClosesTab() throws Throwable {
// Set up listening for the tab removal that we expect to happen.
CallbackHelper onTabRemovedCallbackHelper = new CallbackHelper();
TabListCallback tabListCallback = new TabListCallback() {
@Override
public void onTabRemoved(Tab tab) {
onTabRemovedCallbackHelper.notifyCalled();
}
};
Browser browser = mActivityTestRule.getActivity().getBrowser();
TestThreadUtils.runOnUiThreadBlocking(
() -> { browser.registerTabListCallback(tabListCallback); });
final String data = "download data";
final String contentDisposition = "attachment;filename=\"download.txt\"";
final String mimetype = "text/plain";
List<Pair<String, String>> downloadHeaders = new ArrayList<Pair<String, String>>();
downloadHeaders.add(Pair.create("Content-Disposition", contentDisposition));
downloadHeaders.add(Pair.create("Content-Type", mimetype));
downloadHeaders.add(Pair.create("Content-Length", Integer.toString(data.length())));
TestWebServer webServer = TestWebServer.start();
try {
final String pageUrl = webServer.setResponse("/download.txt", data, downloadHeaders);
TestThreadUtils.runOnUiThreadBlocking(() -> {
mActivity.getTab().getNavigationController().navigate(Uri.parse(pageUrl));
});
mCallback.waitForCompleted();
onTabRemovedCallbackHelper.waitForFirst();
} finally {
webServer.shutdown();
}
}
/** /**
* Verifies the DownloadCallback is informed of downloads resulting from the user clicking on a * Verifies the DownloadCallback is informed of downloads resulting from the user clicking on a
* download link. * download link.
......
...@@ -281,6 +281,10 @@ IN_PROC_BROWSER_TEST_F(DownloadBrowserTest, Cancel) { ...@@ -281,6 +281,10 @@ IN_PROC_BROWSER_TEST_F(DownloadBrowserTest, Cancel) {
} }
IN_PROC_BROWSER_TEST_F(DownloadBrowserTest, PauseResume) { IN_PROC_BROWSER_TEST_F(DownloadBrowserTest, PauseResume) {
// Add an initial navigation to avoid the tab being deleted if the first
// navigation is a download, since we use the tab for convenience in the
// lambda.
shell()->tab()->GetNavigationController()->Navigate(GURL("about:blank"));
set_started_callback(base::BindLambdaForTesting([&](Download* download) { set_started_callback(base::BindLambdaForTesting([&](Download* download) {
download->Pause(); download->Pause();
GURL url = embedded_test_server()->GetURL( GURL url = embedded_test_server()->GetURL(
......
...@@ -209,6 +209,16 @@ void DownloadManagerDelegateImpl::OnManagerInitialized() { ...@@ -209,6 +209,16 @@ void DownloadManagerDelegateImpl::OnManagerInitialized() {
void DownloadManagerDelegateImpl::OnDownloadUpdated( void DownloadManagerDelegateImpl::OnDownloadUpdated(
download::DownloadItem* item) { download::DownloadItem* item) {
// If this is the first navigation in a tab it should be closed. Wait until
// the target path is determined or the download is canceled to check.
if (!item->GetTargetFilePath().empty() ||
item->GetState() == download::DownloadItem::CANCELLED) {
content::WebContents* web_contents =
content::DownloadItemUtils::GetWebContents(item);
if (web_contents && web_contents->GetController().IsInitialNavigation())
web_contents->Close();
}
auto* delegate = GetDelegate(item); auto* delegate = GetDelegate(item);
if (item->GetState() == download::DownloadItem::COMPLETE || if (item->GetState() == download::DownloadItem::COMPLETE ||
item->GetState() == download::DownloadItem::CANCELLED || item->GetState() == download::DownloadItem::CANCELLED ||
......
...@@ -103,7 +103,8 @@ void Shell::SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure) { ...@@ -103,7 +103,8 @@ void Shell::SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure) {
Tab* Shell::tab() { Tab* Shell::tab() {
if (!browser()) if (!browser())
return nullptr; return nullptr;
CHECK(!browser()->GetTabs().empty()); if (browser()->GetTabs().empty())
return nullptr;
return browser()->GetTabs()[0]; return browser()->GetTabs()[0];
} }
......
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