blob: 1a4e254ccbd91c86a2448e6181be86d506c5a5bf [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include "base/test/bind.h"
#include "base/test/scoped_run_loop_timeout.h"
#include "chrome/test/payments/payment_request_platform_browsertest_base.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/prerender_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace payments {
namespace {
class PaymentRequestForPrerenderBrowserTest
: public PaymentRequestPlatformBrowserTestBase {
public:
PaymentRequestForPrerenderBrowserTest()
: prerender_helper_(base::BindRepeating(
&PaymentRequestForPrerenderBrowserTest::GetActiveWebContents,
base::Unretained(this))) {}
void SetUpOnMainThread() override {
prerender_helper_.SetUpOnMainThread(https_server());
PaymentRequestPlatformBrowserTestBase::SetUpOnMainThread();
}
// PaymentRequestTestObserver
void OnAppListReady() override {
is_app_list_ready_fired_ = true;
PaymentRequestPlatformBrowserTestBase::OnAppListReady();
}
protected:
bool is_app_list_ready_fired_ = false;
content::test::PrerenderTestHelper prerender_helper_;
};
IN_PROC_BROWSER_TEST_F(PaymentRequestForPrerenderBrowserTest,
ShowAfterPrerendered) {
// Navigate to an initial page.
NavigateTo("/payment_request_creator.html");
// Start a prerender.
GURL prerender_url =
https_server()->GetURL("/payment_request_no_shipping_test.html");
int prerender_id = prerender_helper_.AddPrerender(prerender_url);
content::RenderFrameHost* prerender_render_frame_host =
prerender_helper_.GetPrerenderedMainFrameHost(prerender_id);
ResetEventWaiterForSingleEvent(TestEvent::kAppListReady);
// Try to show PaymentRequest by JS.
EXPECT_TRUE(content::ExecJs(prerender_render_frame_host,
"document.getElementById('buy').click();",
content::EXECUTE_SCRIPT_NO_USER_GESTURE));
// Run the loop to give the test a chance to fail if is_app_list_ready_fired_
// is set to true too early.
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(is_app_list_ready_fired_);
// Activate the prerendered page.
prerender_helper_.NavigatePrimaryPage(prerender_url);
WaitForObservedEvent();
EXPECT_TRUE(is_app_list_ready_fired_);
}
IN_PROC_BROWSER_TEST_F(PaymentRequestForPrerenderBrowserTest,
AbortAfterPrerendered) {
// Navigate to an initial page.
NavigateTo("/payment_request_creator.html");
// Start a prerender.
auto prerender_url =
https_server()->GetURL("/payment_request_abort_test.html");
int prerender_id = prerender_helper_.AddPrerender(prerender_url);
auto* prerender_render_frame_host =
prerender_helper_.GetPrerenderedMainFrameHost(prerender_id);
ResetEventWaiterForSingleEvent(TestEvent::kAbortCalled);
// Try to show PaymentRequest by JS.
EXPECT_TRUE(content::ExecJs(prerender_render_frame_host,
"document.getElementById('buy').click();",
content::EXECUTE_SCRIPT_NO_USER_GESTURE));
EXPECT_TRUE(content::ExecJs(prerender_render_frame_host,
"document.getElementById('abort').click();",
content::EXECUTE_SCRIPT_NO_USER_GESTURE));
// Activate the prerendered page.
prerender_helper_.NavigatePrimaryPage(prerender_url);
WaitForObservedEvent();
ExpectBodyContains({R"(Aborted)"});
}
} // namespace
} // namespace payments