1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68

content / browser / android / nfc_host_browsertest.cc [blame]

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