chromium/content/browser/android/nfc_host_browsertest.cc

// 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/browser_test_utils.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