#ifndef ANDROID_WEBVIEW_BROWSER_AW_ORIGIN_MATCHED_HEADER_H_
#define ANDROID_WEBVIEW_BROWSER_AW_ORIGIN_MATCHED_HEADER_H_
#include "base/android/scoped_java_ref.h"
#include "base/containers/flat_map.h"
#include "base/containers/span.h"
#include "base/memory/raw_ref.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "components/origin_matcher/origin_matcher.h"
#include "third_party/jni_zero/jni_zero.h"
#include "url/origin.h"
namespace android_webview {
class AwOriginMatchedHeader
: public base::RefCountedThreadSafe<AwOriginMatchedHeader> {
public:
class LookupPredicate {
public:
LookupPredicate(const std::string& name,
const std::optional<std::string>& value)
: name_(name), value_(value) {}
bool operator()(const scoped_refptr<AwOriginMatchedHeader>& header) const {
return header->MatchesNameValue(*name_, *value_);
}
private:
const raw_ref<const std::string> name_;
const raw_ref<const std::optional<std::string>> value_;
};
AwOriginMatchedHeader(const AwOriginMatchedHeader&) = delete;
AwOriginMatchedHeader& operator=(const AwOriginMatchedHeader&) = delete;
AwOriginMatchedHeader(std::string name,
std::string value,
origin_matcher::OriginMatcher origin_matcher);
std::string_view name() const { return name_; }
std::string_view value() const { return value_; }
bool MatchesOrigin(const url::Origin& origin) const;
bool MatchesNameValue(const std::string& name,
const std::optional<std::string>& value) const;
scoped_refptr<AwOriginMatchedHeader> MergedWithMatcher(
origin_matcher::OriginMatcher&& other) const;
jni_zero::ScopedJavaLocalRef<jobject> ToJavaObject(JNIEnv* env);
static std::vector<std::pair<std::string_view, std::string>>
GetCombinedMatchingHeaders(
base::span<scoped_refptr<AwOriginMatchedHeader>> headers,
const url::Origin& origin);
private:
friend class base::RefCountedThreadSafe<AwOriginMatchedHeader>;
const std::string name_;
const std::string value_;
const origin_matcher::OriginMatcher matcher_;
~AwOriginMatchedHeader();
};
}
namespace jni_zero {
template <>
inline ScopedJavaLocalRef<jobject> ToJniType(
JNIEnv* env,
const scoped_refptr<android_webview::AwOriginMatchedHeader>& header) {
return header->ToJavaObject(env);
}
}
#endif