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