| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "android_webview/browser/aw_contents_origin_matcher.h" |
| |
| #include "android_webview/browser_jni_headers/AwContentsOriginMatcher_jni.h" |
| |
| #include "components/js_injection/common/origin_matcher.h" |
| #include "url/gurl.h" |
| #include "url/origin.h" |
| |
| namespace android_webview { |
| |
| AwContentsOriginMatcher::AwContentsOriginMatcher() |
| : origin_matcher_(std::make_unique<js_injection::OriginMatcher>()) {} |
| |
| AwContentsOriginMatcher::~AwContentsOriginMatcher() = default; |
| |
| bool AwContentsOriginMatcher::MatchesOrigin(const url::Origin& origin) { |
| base::AutoLock auto_lock(lock_); |
| return origin_matcher_->Matches(origin); |
| } |
| |
| std::vector<std::string> AwContentsOriginMatcher::UpdateRuleList( |
| const std::vector<std::string>& rules) { |
| std::vector<std::string> bad_rules; |
| std::unique_ptr<js_injection::OriginMatcher> new_matcher = |
| std::make_unique<js_injection::OriginMatcher>(); |
| for (const std::string& rule : rules) { |
| if (!new_matcher->AddRuleFromString(rule)) |
| bad_rules.push_back(rule); |
| } |
| |
| if (!bad_rules.empty()) |
| return bad_rules; |
| |
| { |
| // Swap the pointer while locked, then release the lock before running the |
| // destructor on the old (swapped-out) pointer. |
| base::AutoLock auto_lock(lock_); |
| origin_matcher_.swap(new_matcher); |
| } |
| return bad_rules; |
| } |
| |
| jboolean AwContentsOriginMatcher::MatchesOrigin( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jstring>& jorigin) { |
| const url::Origin origin = url::Origin::Create( |
| GURL(base::android::ConvertJavaStringToUTF8(env, jorigin))); |
| return MatchesOrigin(origin); |
| } |
| |
| base::android::ScopedJavaLocalRef<jobjectArray> |
| AwContentsOriginMatcher::UpdateRuleList( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobjectArray>& jrules) { |
| std::vector<std::string> rules; |
| base::android::AppendJavaStringArrayToStringVector(env, jrules, &rules); |
| std::vector<std::string> bad_rules = UpdateRuleList(rules); |
| return base::android::ToJavaArrayOfStrings(env, bad_rules); |
| } |
| |
| void AwContentsOriginMatcher::Destroy(JNIEnv* env) { |
| Release(); |
| } |
| |
| static jlong JNI_AwContentsOriginMatcher_Init( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& caller) { |
| AwContentsOriginMatcher* matcher = new AwContentsOriginMatcher(); |
| // We are handing over the raw pointer java so we manually increment the |
| // reference count instead of using ref_pointer directly because leaving this |
| // scope would decrement it. |
| matcher->AddRef(); |
| return reinterpret_cast<intptr_t>(matcher); |
| } |
| |
| } // namespace android_webview |