Commit 3a227073 authored by Kevin McNee's avatar Kevin McNee Committed by Commit Bot

Workaround PDF viewer brokenness when created in portal contents

A portal WebContents has TabHelpers even when embedded. When the helpers
are added, the portal WebContents is assigned a distinct tab ID. This is
an issue when attempting to load the PDF viewer as
ExtensionTabUtil::GetTabById cannot find the specified tab ID in the
TabStripModel.

Until we have a more thorough plan to deal with issue 1042323, we have
the PDF viewer load without a tab id when created in a portal.

Bug: 932691
Change-Id: Idbde43efcc1c0453abcea9b507cf01e9ef81f5f5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2033325Reviewed-by: default avatarLucas Gadani <lfg@chromium.org>
Reviewed-by: default avatarZachary Kuznia <zork@chromium.org>
Commit-Queue: Kevin McNee <mcnee@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737854}
parent 2f5df311
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/prerender/prerender_contents.h" #include "chrome/browser/prerender/prerender_contents.h"
#include "components/sessions/core/session_id.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
...@@ -66,7 +67,19 @@ void StreamsPrivateAPI::SendExecuteMimeTypeHandlerEvent( ...@@ -66,7 +67,19 @@ void StreamsPrivateAPI::SendExecuteMimeTypeHandlerEvent(
// will take ownership of the stream. // will take ownership of the stream.
GURL handler_url(Extension::GetBaseURLFromExtensionId(extension_id).spec() + GURL handler_url(Extension::GetBaseURLFromExtensionId(extension_id).spec() +
handler->handler_url()); handler->handler_url());
int tab_id = ExtensionTabUtil::GetTabId(web_contents);
// If this is an inner contents, then (a) it's a guest view and doesn't have a
// tab id anyway, or (b) it's a portal. In the portal case, providing a
// distinct tab id breaks the pdf viewer / extension APIs. For now we just
// indicate that a portal contents has no tab id. Unfortunately, this will
// still be broken in subtle ways once the portal is activated (e.g. some
// forms of zooming won't work).
// TODO(1042323): Present a coherent representation of a tab id for portal
// contents.
int tab_id = web_contents->GetOuterWebContents()
? SessionID::InvalidValue().id()
: ExtensionTabUtil::GetTabId(web_contents);
std::unique_ptr<StreamContainer> stream_container( std::unique_ptr<StreamContainer> stream_container(
new StreamContainer(tab_id, embedded, handler_url, extension_id, new StreamContainer(tab_id, embedded, handler_url, extension_id,
std::move(transferrable_loader), original_url)); std::move(transferrable_loader), original_url));
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "chrome/browser/devtools/devtools_window_testing.h" #include "chrome/browser/devtools/devtools_window_testing.h"
#include "chrome/browser/pdf/pdf_extension_test_util.h"
#include "chrome/browser/task_manager/providers/task.h" #include "chrome/browser/task_manager/providers/task.h"
#include "chrome/browser/task_manager/task_manager_browsertest_util.h" #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
#include "chrome/browser/task_manager/task_manager_tester.h" #include "chrome/browser/task_manager/task_manager_tester.h"
...@@ -239,3 +240,26 @@ IN_PROC_BROWSER_TEST_F(PortalBrowserTest, TaskManagerOrderingOfDependentRows) { ...@@ -239,3 +240,26 @@ IN_PROC_BROWSER_TEST_F(PortalBrowserTest, TaskManagerOrderingOfDependentRows) {
kNumTabs * kPortalsPerTab, expected_portal_title); kNumTabs * kPortalsPerTab, expected_portal_title);
EXPECT_THAT(GetRendererTaskTitles(tester.get()), expected_titles); EXPECT_THAT(GetRendererTaskTitles(tester.get()), expected_titles);
} }
IN_PROC_BROWSER_TEST_F(PortalBrowserTest, PdfViewerLoadsInPortal) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL url(embedded_test_server()->GetURL("/title1.html"));
ui_test_utils::NavigateToURL(browser(), url);
WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_EQ(true,
content::EvalJs(contents,
"new Promise((resolve) => {\n"
" let portal = document.createElement('portal');\n"
" portal.src = '/pdf/test.pdf';\n"
" portal.onload = () => { resolve(true); }\n"
" document.body.appendChild(portal);\n"
"});"));
std::vector<WebContents*> inner_web_contents =
contents->GetInnerWebContents();
ASSERT_EQ(1u, inner_web_contents.size());
WebContents* portal_contents = inner_web_contents[0];
EXPECT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(portal_contents));
}
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