| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_PDF_PDF_EXTENSION_TEST_BASE_H_ |
| #define CHROME_BROWSER_PDF_PDF_EXTENSION_TEST_BASE_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <variant> |
| #include <vector> |
| |
| #include "base/test/scoped_feature_list.h" |
| #include "chrome/browser/extensions/extension_apitest.h" |
| #include "chrome/browser/pdf/test_pdf_viewer_stream_manager.h" |
| #include "components/guest_view/browser/test_guest_view_manager.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/blink/public/common/input/web_mouse_event.h" |
| |
| class GURL; |
| |
| namespace content { |
| class BrowserContext; |
| class RenderFrameHost; |
| class WebContents; |
| } // namespace content |
| |
| namespace gfx { |
| class Point; |
| } |
| |
| class PDFExtensionTestBase : public extensions::ExtensionApiTest { |
| public: |
| PDFExtensionTestBase(); |
| |
| ~PDFExtensionTestBase() override; |
| |
| // extensions::ExtensionApiTest: |
| void SetUpCommandLine(base::CommandLine* command_line) override; |
| void SetUpOnMainThread() override; |
| void TearDownOnMainThread() override; |
| base::FilePath GetTestResourcesParentDir() override; |
| |
| bool PdfIsExpectedToLoad(const std::string& pdf_file); |
| |
| // Load the PDF at the given URL and ensure it has finished loading. Return |
| // true if it loads successfully or false if it fails. If it doesn't finish |
| // loading the test will hang. This is done from outside of the BrowserPlugin |
| // guest to ensure sending messages to/from the plugin works correctly from |
| // there, since the PdfScriptingApi relies on doing this as well. |
| testing::AssertionResult LoadPdf(const GURL& url); |
| |
| // Same as LoadPDF(), but loads into a new tab. |
| testing::AssertionResult LoadPdfInNewTab(const GURL& url); |
| |
| // Same as `LoadPdf()` but loads URLs where the first child of the primary |
| // main frame should be the embedder. This is a common case where an HTML page |
| // only embeds a single PDF. For GuestView PDF viewer, the embedder must be an |
| // embed element. |
| testing::AssertionResult LoadPdfInFirstChild(const GURL& url); |
| |
| // Same as `LoadPdf()` but allows the PDF embedder host to have multiple |
| // subframes. There are special cases where this can occur, such as |
| // crbug.com/40671023. |
| testing::AssertionResult LoadPdfAllowMultipleFrames(const GURL& url); |
| |
| // Same as `LoadPdf()`, but also returns a pointer to the extension host for |
| // the loaded PDF. Returns nullptr if the load fails or getting the extension |
| // host fails. The test will fail if the load fails. |
| content::RenderFrameHost* LoadPdfGetExtensionHost(const GURL& url); |
| |
| // Same as `LoadPdfGetExtensionHost()`, but loads the PDF into a new tab. |
| content::RenderFrameHost* LoadPdfInNewTabGetExtensionHost(const GURL& url); |
| |
| // Same as `LoadPdfInFirstChild()`, but also returns a pointer to the |
| // extension host for the loaded PDF. Returns nullptr if the load fails or |
| // getting the extension host fails. The test will fail if the load fails. |
| content::RenderFrameHost* LoadPdfInFirstChildGetExtensionHost( |
| const GURL& url); |
| |
| // Test if a page embedding a PDF can get selected text in the PDF. The test |
| // will fail if the hook for sending flush messages for every getSelectedText |
| // message fails to attach to `extension_host`. The test will fail if the |
| // result of getting selected text does not match `expect_success`. |
| void TestGetSelectedTextReply(content::RenderFrameHost* extension_host, |
| bool expect_success); |
| |
| content::WebContents* GetActiveWebContents(); |
| |
| // For OOPIF PDF viewer, returns the active `WebContents`, as there is only a |
| // single `WebContents`. For GuestView PDF viewer, returns the embedder |
| // `WebContents`. |
| content::WebContents* GetEmbedderWebContents(); |
| |
| // Resets the feature list, can be used when nested feature lists exist. |
| void ResetFeatureList(); |
| |
| protected: |
| guest_view::TestGuestViewManager* GetGuestViewManager(); |
| guest_view::TestGuestViewManager* GetGuestViewManagerForProfile( |
| content::BrowserContext* profile); |
| |
| pdf::TestPdfViewerStreamManager* GetTestPdfViewerStreamManager( |
| content::WebContents* contents); |
| |
| void CreateTestPdfViewerStreamManager(content::WebContents* contents); |
| |
| content::RenderFrameHost* GetOnlyPdfExtensionHostEnsureValid(); |
| |
| int CountPDFProcesses() const; |
| |
| // Checks if the full page PDF loaded. The test will fail if it does not meet |
| // the requirements of `ValidateFrameTree()`. |
| testing::AssertionResult EnsureFullPagePDFHasLoadedWithValidFrameTree( |
| content::WebContents* contents, |
| bool allow_multiple_frames); |
| |
| // Check if the PDF loaded in the first child frame of `contents`. The test |
| // will fail if it does not meet the requirements of `ValidateFrameTree()`. |
| testing::AssertionResult EnsurePDFHasLoadedInFirstChildWithValidFrameTree( |
| content::WebContents* contents); |
| |
| void SimulateMouseClickAt(content::RenderFrameHost* extension_host, |
| content::WebContents* contents, |
| int modifiers, |
| blink::WebMouseEvent::Button button, |
| const gfx::Point& point_in_extension); |
| |
| // Returns true if the test should use the OOPIF PDF viewer instead of the |
| // GuestView PDF viewer. |
| // TODO(crbug.com/40268279): Remove once only OOPIF PDF viewer is used. |
| virtual bool UseOopif() const; |
| |
| // Hook to register request handler for test server. |
| virtual void RegisterTestServerRequestHandler(); |
| |
| // Hooks to set up feature flags. |
| virtual std::vector<base::test::FeatureRefAndParams> GetEnabledFeatures() |
| const; |
| virtual std::vector<base::test::FeatureRef> GetDisabledFeatures() const; |
| |
| private: |
| // The test will fail if the frame tree does not have exactly one PDF |
| // extension host and one PDF content host. For GuestView PDF viewer, the test |
| // will also fail if there is not exactly one GuestView. |
| void ValidateFrameTree(content::WebContents* contents); |
| |
| base::test::ScopedFeatureList feature_list_; |
| std::variant<std::monostate, |
| std::unique_ptr<guest_view::TestGuestViewManagerFactory>, |
| std::unique_ptr<pdf::TestPdfViewerStreamManagerFactory>> |
| factory_; |
| }; |
| |
| #endif // CHROME_BROWSER_PDF_PDF_EXTENSION_TEST_BASE_H_ |