blob: 1f2d8b8bbe5066ff09d53cc649ada78cadbecc2c [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_PUBLIC_BROWSER_WEB_UI_DATA_SOURCE_H_
#define CONTENT_PUBLIC_BROWSER_WEB_UI_DATA_SOURCE_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <string_view>
#include <vector>
#include "base/containers/span.h"
#include "base/functional/callback.h"
#include "base/values.h"
#include "content/common/content_export.h"
#include "services/network/public/mojom/content_security_policy.mojom-forward.h"
#include "ui/base/webui/web_ui_util.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace base {
class RefCountedMemory;
} // namespace base
namespace webui {
struct LocalizedString;
struct ResourcePath;
} // namespace webui
namespace content {
class BrowserContext;
// A data source that can help with implementing the common operations needed by
// WebUI pages.
class WebUIDataSource {
public:
virtual ~WebUIDataSource() {}
// Creates a WebUIDataSource and adds it to the BrowserContext, which owns it.
// Callers just get a raw pointer, which they don't own.
// `source_name` is the key for URL lookups, allowing the source to serve
// content for URLs that match the patterns:
// - chrome://source_name/*
// - chrome-untrusted://<host>/*
// (source_name is of the form "chrome-untrusted://<host>")
//
// Though the parent class URLDataSource supports source names like
// "your-scheme://" which would serve URLs of the form
// "your-scheme://anything", this is explicitly disallowed for
// WebUIDataSource for simplicity.
CONTENT_EXPORT static WebUIDataSource* CreateAndAdd(
BrowserContext* browser_context,
const std::string& source_name);
CONTENT_EXPORT static void Update(BrowserContext* browser_context,
const std::string& source_name,
const base::Value::Dict& update);
// Adds a string keyed to its name to our dictionary.
virtual void AddString(std::string_view name, std::u16string_view value) = 0;
// Adds a string keyed to its name to our dictionary.
virtual void AddString(std::string_view name, std::string_view value) = 0;
// Adds a localized string with resource |ids| keyed to its name to our
// dictionary.
virtual void AddLocalizedString(std::string_view name, int ids) = 0;
// Calls AddLocalizedString() in a for-loop for |strings|. Reduces code size
// vs. reimplementing the same for-loop.
virtual void AddLocalizedStrings(
base::span<const webui::LocalizedString> strings) = 0;
// Add strings from `localized_strings` to our dictionary.
virtual void AddLocalizedStrings(
const base::Value::Dict& localized_strings) = 0;
// Adds a boolean keyed to its name to our dictionary.
virtual void AddBoolean(std::string_view name, bool value) = 0;
// Adds a signed 32-bit integer keyed to its name to our dictionary. Larger
// integers may not be exactly representable in JavaScript. See
// MAX_SAFE_INTEGER in /v8/src/globals.h.
virtual void AddInteger(std::string_view name, int32_t value) = 0;
// Adds a double keyed to its name to our dictionary.
virtual void AddDouble(std::string_view name, double value) = 0;
// Call this to enable a virtual "strings.js" (or "strings.m.js" for modules)
// URL that provides translations and dynamic data when requested.
virtual void UseStringsJs() = 0;
// Adds a mapping between a path name and a resource to return.
virtual void AddResourcePath(std::string_view path, int resource_id) = 0;
// Calls AddResourcePath() in a for-loop for |paths|. Reduces code size vs.
// reimplementing the same for-loop.
virtual void AddResourcePaths(
base::span<const webui::ResourcePath> paths) = 0;
// Sets the resource to returned when no other paths match.
virtual void SetDefaultResource(int resource_id) = 0;
// Used as a parameter to GotDataCallback. The caller has to run this callback
// with the result for the path that they filtered, passing ownership of the
// memory.
using GotDataCallback =
base::OnceCallback<void(scoped_refptr<base::RefCountedMemory>)>;
// Used by SetRequestFilter. The string parameter is the path of the request.
// The return value indicates if the callee wants to handle the request. Iff
// true is returned, |handle_request_callback| will be called to provide the
// request's response.
typedef base::RepeatingCallback<bool(const std::string&)>
ShouldHandleRequestCallback;
// Used by SetRequestFilter. The string parameter is the path of the request.
// This callback is only called if a prior call to ShouldHandleRequestCallback
// returned true. GotDataCallback should be used to provide the response
// bytes.
using HandleRequestCallback =
base::RepeatingCallback<void(const std::string&, GotDataCallback)>;
// Allows a caller to add a filter for URL requests.
virtual void SetRequestFilter(
const ShouldHandleRequestCallback& should_handle_request_callback,
const HandleRequestCallback& handle_request_callback) = 0;
// The following map to methods on URLDataSource. See the documentation there.
// Overrides the content security policy for a certain directive.
virtual void OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName directive,
const std::string& value) = 0;
// Using OverrideCrossOriginOpenerPolicy will result in the creation of double
// WebUIControllers. See https://crbug.com/328741392. Until this bug is fixed,
// usage of this API is discouraged.
// Adds cross origin opener, embedder, and resource policy headers.
virtual void OverrideCrossOriginOpenerPolicy(const std::string& value) = 0;
virtual void OverrideCrossOriginEmbedderPolicy(const std::string& value) = 0;
virtual void OverrideCrossOriginResourcePolicy(const std::string& value) = 0;
// Removes directives related to Trusted Types from the CSP header.
virtual void DisableTrustedTypesCSP() = 0;
// This method is deprecated and AddFrameAncestors should be used instead.
virtual void DisableDenyXFrameOptions() = 0;
virtual void AddFrameAncestor(const GURL& frame_ancestor) = 0;
// Replace i18n template strings in JS files. Needed for Web UIs that are
// using Polymer 3.
virtual void EnableReplaceI18nInJS() = 0;
// The |source_name| this WebUIDataSource was created with.
virtual std::string GetSource() = 0;
// The origin of URLs served by this data source.
//
// | source_name_ | origin |
// | ----------------------------- | ---------------------------- |
// | some-host | chrome://some-host |
// | chrome-untrusted://some-host/ | chrome-untrusted://some-host |
virtual url::Origin GetOrigin() = 0;
// Set supported scheme if not one of the default supported schemes.
virtual void SetSupportedScheme(std::string_view scheme) = 0;
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_WEB_UI_DATA_SOURCE_H_