#ifndef COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_
#define COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_
#include <memory>
#include <optional>
#include <string>
#include "base/feature_list.h"
#include "base/time/time.h"
#include "base/values.h"
#include "third_party/blink/public/common/security/protocol_handler_security_level.h"
#include "url/gurl.h"
namespace custom_handlers {
namespace features {
BASE_DECLARE_FEATURE(kStripCredentialsForExternalProtocolHandler);
}
class ProtocolHandler {
public:
static ProtocolHandler CreateProtocolHandler(
const std::string& protocol,
const GURL& url,
blink::ProtocolHandlerSecurityLevel security_level =
blink::ProtocolHandlerSecurityLevel::kStrict);
ProtocolHandler(const std::string& protocol,
const GURL& url,
base::Time last_modified,
blink::ProtocolHandlerSecurityLevel security_level);
static ProtocolHandler CreateWebAppProtocolHandler(
const std::string& protocol,
const GURL& url,
const std::string& app_id);
static ProtocolHandler CreateExtensionProtocolHandler(
const std::string& protocol,
const GURL& url,
const std::string& extension_id);
ProtocolHandler(const std::string& protocol,
const GURL& url,
std::optional<std::string> app_id,
std::optional<std::string> extension_id,
base::Time last_modified,
blink::ProtocolHandlerSecurityLevel security_level);
ProtocolHandler(const ProtocolHandler& other);
~ProtocolHandler();
static ProtocolHandler CreateProtocolHandler(const base::Value::Dict& value);
static bool IsValidDict(const base::Value::Dict& value);
bool IsValid() const;
bool IsSameOrigin(const ProtocolHandler& handler) const;
static const ProtocolHandler& EmptyProtocolHandler();
GURL TranslateUrl(const GURL& url) const;
bool IsEquivalent(const ProtocolHandler& other) const;
base::Value::Dict Encode() const;
static std::u16string GetProtocolDisplayName(const std::string& protocol);
std::u16string GetProtocolDisplayName() const;
const std::string& protocol() const { return protocol_; }
const GURL& url() const { return url_; }
const std::optional<std::string>& web_app_id() const { return web_app_id_; }
const std::optional<std::string>& extension_id() const {
return extension_id_;
}
const base::Time& last_modified() const { return last_modified_; }
bool IsEmpty() const { return protocol_.empty(); }
bool IsExtensionHandler() const { return extension_id_.has_value(); }
#if !defined(NDEBUG)
std::string ToString() const;
#endif
bool operator==(const ProtocolHandler& other) const;
bool operator<(const ProtocolHandler& other) const;
private:
ProtocolHandler();
std::string protocol_;
GURL url_;
std::optional<std::string> web_app_id_;
std::optional<std::string> extension_id_;
base::Time last_modified_;
blink::ProtocolHandlerSecurityLevel security_level_;
};
}
#endif