1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/android/jni_android.h"
6 #include "base/android/jni_string.h"
7 #include "base/android/scoped_java_ref.h"
8 #include "base/bind.h"
9 #include "base/callback_helpers.h"
10 #include "chrome/android/chrome_jni_headers/CustomTabsConnection_jni.h"
11 #include "chrome/browser/android/customtabs/client_data_header_web_contents_observer.h"
12 #include "chrome/browser/android/customtabs/detached_resource_request.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/profiles/profile_android.h"
15 #include "content/public/common/referrer.h"
16 #include "net/url_request/referrer_policy.h"
17 #include "url/gurl.h"
18 
19 namespace customtabs {
20 
21 namespace {
22 
NotifyClientOfDetachedRequestCompletion(const base::android::ScopedJavaGlobalRef<jobject> & session,const GURL & url,int net_error)23 void NotifyClientOfDetachedRequestCompletion(
24     const base::android::ScopedJavaGlobalRef<jobject>& session,
25     const GURL& url,
26     int net_error) {
27   JNIEnv* env = base::android::AttachCurrentThread();
28   Java_CustomTabsConnection_notifyClientOfDetachedRequestCompletion(
29       env, session, base::android::ConvertUTF8ToJavaString(env, url.spec()),
30       net_error);
31 }
32 
33 }  // namespace
34 
JNI_CustomTabsConnection_CreateAndStartDetachedResourceRequest(JNIEnv * env,const base::android::JavaParamRef<jobject> & profile,const base::android::JavaParamRef<jobject> & session,const base::android::JavaParamRef<jstring> & package_name,const base::android::JavaParamRef<jstring> & url,const base::android::JavaParamRef<jstring> & origin,jint referrer_policy,jint motivation)35 static void JNI_CustomTabsConnection_CreateAndStartDetachedResourceRequest(
36     JNIEnv* env,
37     const base::android::JavaParamRef<jobject>& profile,
38     const base::android::JavaParamRef<jobject>& session,
39     const base::android::JavaParamRef<jstring>& package_name,
40     const base::android::JavaParamRef<jstring>& url,
41     const base::android::JavaParamRef<jstring>& origin,
42     jint referrer_policy,
43     jint motivation) {
44   DCHECK(profile && url && origin);
45 
46   Profile* native_profile = ProfileAndroid::FromProfileAndroid(profile);
47   DCHECK(native_profile);
48 
49   GURL native_url(base::android::ConvertJavaStringToUTF8(env, url));
50   GURL native_origin(base::android::ConvertJavaStringToUTF8(env, origin));
51   DCHECK(native_url.is_valid());
52   DCHECK(native_origin.is_valid());
53 
54   std::string native_package;
55   if (!package_name.is_null())
56     base::android::ConvertJavaStringToUTF8(env, package_name, &native_package);
57 
58   // Java only knows about the blink referrer policy.
59   net::ReferrerPolicy url_request_referrer_policy =
60       content::Referrer::ReferrerPolicyForUrlRequest(
61           content::Referrer::ConvertToPolicy(referrer_policy));
62   DetachedResourceRequest::Motivation request_motivation =
63       static_cast<DetachedResourceRequest::Motivation>(motivation);
64 
65   DetachedResourceRequest::OnResultCallback cb =
66       session.is_null()
67           ? base::DoNothing()
68           : base::BindOnce(&NotifyClientOfDetachedRequestCompletion,
69                            base::android::ScopedJavaGlobalRef<jobject>(session),
70                            native_url);
71 
72   DetachedResourceRequest::CreateAndStart(
73       native_profile, native_url, native_origin, url_request_referrer_policy,
74       request_motivation, native_package, std::move(cb));
75 }
76 
JNI_CustomTabsConnection_SetClientDataHeader(JNIEnv * env,const base::android::JavaParamRef<jobject> & jweb_contents,const base::android::JavaParamRef<jstring> & jheader)77 static void JNI_CustomTabsConnection_SetClientDataHeader(
78     JNIEnv* env,
79     const base::android::JavaParamRef<jobject>& jweb_contents,
80     const base::android::JavaParamRef<jstring>& jheader) {
81   auto* web_contents = content::WebContents::FromJavaWebContents(jweb_contents);
82   ClientDataHeaderWebContentsObserver::CreateForWebContents(web_contents);
83   ClientDataHeaderWebContentsObserver::FromWebContents(web_contents)
84       ->SetHeader(base::android::ConvertJavaStringToUTF8(jheader));
85 }
86 
87 }  // namespace customtabs
88