blob: 1db6a2e60d02aa71f3d6116a42ff798b7efa3e45 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_EVENT_DETAILS_H_
#define EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_EVENT_DETAILS_H_
#include <memory>
#include <optional>
#include <string>
#include "base/values.h"
#include "extensions/browser/extension_api_frame_id_map.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/extension_id.h"
#include "url/origin.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
namespace net {
class AuthChallengeInfo;
class HttpRequestHeaders;
class HttpResponseHeaders;
} // namespace net
namespace extensions {
class PermissionHelper;
struct WebRequestInfo;
// This helper class is used to construct the details for a webRequest event
// dictionary. Some keys are present on every event, others are only relevant
// for a few events. And some keys must only be added to the event details if
// requested at the registration of the event listener (in ExtraInfoSpec).
// This class provides setters that are aware of these rules.
//
// Not all keys are managed by this class. Keys that do not require a special
// treatment can be set using the generic SetBoolean / SetInteger / SetString
// methods (e.g. to set "error", "message", "redirectUrl", "stage" or "tabId").
//
// This class should be constructed on the IO thread. It can safely be used on
// other threads, as long as there is no concurrent access.
class WebRequestEventDetails {
public:
// Create a WebRequestEventDetails with the following keys:
// - method
// - requestId
// - tabId
// - timeStamp
// - type
// - url
WebRequestEventDetails(const WebRequestInfo& request, int extra_info_spec);
WebRequestEventDetails(const WebRequestEventDetails&) = delete;
WebRequestEventDetails& operator=(const WebRequestEventDetails&) = delete;
~WebRequestEventDetails();
// Sets the following key:
// - requestBody (on demand)
// Takes ownership of `request_body_data` in |*request|.
void SetRequestBody(WebRequestInfo* request);
// Sets the following key:
// - requestHeaders (on demand)
void SetRequestHeaders(const net::HttpRequestHeaders& request_headers);
// Sets the following keys:
// - challenger
// - isProxy
// - realm
// - scheme
void SetAuthInfo(const net::AuthChallengeInfo& auth_info);
// Sets the following keys:
// - responseHeaders (on demand)
// - statusCode
// - statusLine
void SetResponseHeaders(const WebRequestInfo& request,
const net::HttpResponseHeaders* response_headers);
// Sets the following key:
// - fromCache
// - ip
void SetResponseSource(const WebRequestInfo& request);
void SetBoolean(const std::string& key, bool value) { dict_.Set(key, value); }
void SetInteger(const std::string& key, int value) { dict_.Set(key, value); }
void SetString(const std::string& key, const std::string& value) {
dict_.Set(key, value);
}
// Create an event dictionary that contains all required keys, and also the
// extra keys as specified by the `extra_info_spec` filter. If the listener
// this event will be dispatched to doesn't have permission for the initiator
// then the initiator will not be populated.
// This can be called from any thread.
base::Value::Dict GetFilteredDict(int extra_info_spec,
PermissionHelper* permission_helper,
const ExtensionId& extension_id,
bool crosses_incognito) const;
// Get the internal dictionary, unfiltered. After this call, the internal
// dictionary is empty.
base::Value::Dict GetAndClearDict();
private:
// The details that are always included in a webRequest event object.
base::Value::Dict dict_;
// Extra event details: Only included when `extra_info_spec_` matches.
std::optional<base::Value::Dict> request_body_;
std::optional<base::Value::List> request_headers_;
std::optional<base::Value::List> response_headers_;
std::optional<url::Origin> initiator_;
int extra_info_spec_;
int render_process_id_;
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_EVENT_DETAILS_H_