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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
content / browser / service_worker / payment_handler_support.cc [blame]
// Copyright 2018 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/browser/service_worker/payment_handler_support.h"
#include "base/functional/bind.h"
#include "base/task/sequenced_task_runner.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/storage_partition_impl.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/common/content_client.h"
namespace content {
namespace {
// An instance of this class is created and passed ownership into
// ContentBrowserClient::ShowPaymentHandlerWindow(), to handle these 2 different
// scenarios:
// - If the embedder supports opening Payment Handler window,
// ContentBrowserClient::ShowPaymentHandlerWindow() returns true and tries to
// open the window, then finally invokes
// ShowPaymentHandlerWindowReplier::Run() to notify the result. In such a
// case, the response callback |response_callback| of Mojo call
// ServiceWorkerHost.OpenPaymentHandlerWindow() is bound into |callback| and
// invoked there.
// - Otherwise ContentBrowserClient::ShowPaymentHandlerWindow() just returns
// false and does nothing else, then |this| will be dropped silently without
// invoking Run(). In such a case, dtor of |this| invokes |fallback| (which
// e.g. opens a normal window), |response_callback| is bound into |fallback|
// and invoked there.
class ShowPaymentHandlerWindowReplier {
public:
ShowPaymentHandlerWindowReplier(
PaymentHandlerSupport::ShowPaymentHandlerWindowCallback callback,
PaymentHandlerSupport::OpenWindowFallback fallback,
blink::mojom::ServiceWorkerHost::OpenPaymentHandlerWindowCallback
response_callback)
: callback_(std::move(callback)),
fallback_(std::move(fallback)),
response_callback_(std::move(response_callback)) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
}
ShowPaymentHandlerWindowReplier(const ShowPaymentHandlerWindowReplier&) =
delete;
ShowPaymentHandlerWindowReplier& operator=(
const ShowPaymentHandlerWindowReplier&) = delete;
~ShowPaymentHandlerWindowReplier() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (response_callback_) {
DCHECK(fallback_);
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(std::move(fallback_), std::move(response_callback_)));
}
}
void Run(bool success, int render_process_id, int render_frame_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::move(callback_).Run(std::move(response_callback_), success,
render_process_id, render_frame_id);
}
private:
PaymentHandlerSupport::ShowPaymentHandlerWindowCallback callback_;
PaymentHandlerSupport::OpenWindowFallback fallback_;
blink::mojom::ServiceWorkerHost::OpenPaymentHandlerWindowCallback
response_callback_;
};
} // namespace
// static
void PaymentHandlerSupport::ShowPaymentHandlerWindow(
const GURL& url,
ServiceWorkerContextCore* context,
ShowPaymentHandlerWindowCallback callback,
OpenWindowFallback fallback,
blink::mojom::ServiceWorkerHost::OpenPaymentHandlerWindowCallback
response_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(context);
GetContentClient()->browser()->ShowPaymentHandlerWindow(
context->wrapper()->storage_partition()->browser_context(), url,
base::BindOnce(&ShowPaymentHandlerWindowReplier::Run,
std::make_unique<ShowPaymentHandlerWindowReplier>(
std::move(callback), std::move(fallback),
std::move(response_callback))));
}
} // namespace content