| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test.h" |
| #include "content/public/test/content_browser_test.h" |
| #include "content/public/test/content_browser_test_utils.h" |
| #include "content/public/test/fenced_frame_test_util.h" |
| #include "content/shell/browser/shell.h" |
| #include "net/dns/mock_host_resolver.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "services/device/public/cpp/test/scoped_nfc_overrider.h" |
| #include "url/gurl.h" |
| |
| namespace content { |
| |
| class NFCHostBrowserTest : public ContentBrowserTest { |
| public: |
| NFCHostBrowserTest() { |
| https_server_.AddDefaultHandlers(GetTestDataFilePath()); |
| https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); |
| } |
| ~NFCHostBrowserTest() override = default; |
| |
| protected: |
| void SetUpOnMainThread() override { |
| host_resolver()->AddRule("*", "127.0.0.1"); |
| ASSERT_TRUE(https_server_.Start()); |
| ContentBrowserTest::SetUpOnMainThread(); |
| } |
| |
| WebContents* web_contents() const { return shell()->web_contents(); } |
| |
| // WebNFC needs HTTPS. |
| net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS}; |
| test::FencedFrameTestHelper fenced_frame_helper_; |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(NFCHostBrowserTest, FencedFrameCannotCloseNFC) { |
| device::ScopedNFCOverrider scoped_nfc_overrider; |
| |
| GURL main_url(https_server_.GetURL("/title1.html")); |
| EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
| |
| // Initialize NFC in the primary main frame. |
| EXPECT_EQ("success", EvalJs(web_contents()->GetPrimaryMainFrame(), R"( |
| const ndef = new NDEFReader(); |
| new Promise(async resolve => { |
| try { |
| await ndef.write("Hello"); |
| resolve('success'); |
| } catch (error) { |
| resolve('failure'); |
| } |
| }); |
| )")); |
| |
| // Ensure that fenced frame insertion cannot close the NFC connection. |
| GURL inner_url(https_server_.GetURL("/fenced_frames/title1.html")); |
| RenderFrameHost* fenced_frame_host = fenced_frame_helper_.CreateFencedFrame( |
| web_contents()->GetPrimaryMainFrame(), inner_url); |
| EXPECT_NE(nullptr, fenced_frame_host); |
| EXPECT_EQ(true, scoped_nfc_overrider.IsConnected()); |
| } |
| |
| } // namespace content |