blob: cab60a2fb9441cde0ff47189ab117bf3672a78ec [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// 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 <vector>
#include "base/callback.h"
#include "base/containers/span.h"
#include "base/strings/string_piece.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"
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() {}
// Calls `Create()` and `Add()` to internalize ownership of the
// WebUIDataSource instance. Callers just get a raw pointer, which they don't
// own. Prefer `CreateAndAdd` in new code.
CONTENT_EXPORT static WebUIDataSource* CreateAndAdd(
BrowserContext* browser_context,
const std::string& source_name);
// Creates a WebUIDataSource instance. Caller takes ownership of returned
// pointer. Prefer `CreateAndAdd()` when possible.
CONTENT_EXPORT static WebUIDataSource* Create(const std::string& source_name);
// Adds a WebUI data source to |browser_context|. TODO(dbeam): update this API
// to take a std::unique_ptr instead to make it clear that |source| can be
// destroyed and references should not be kept by callers. Use |Update()|
// if you need to change an existing data source.
CONTENT_EXPORT static void Add(BrowserContext* browser_context,
WebUIDataSource* source);
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(base::StringPiece name,
const std::u16string& value) = 0;
// Adds a string keyed to its name to our dictionary.
virtual void AddString(base::StringPiece name, const std::string& value) = 0;
// Adds a localized string with resource |ids| keyed to its name to our
// dictionary.
virtual void AddLocalizedString(base::StringPiece 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(base::StringPiece 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(base::StringPiece name, int32_t value) = 0;
// Adds a double keyed to its name to our dictionary.
virtual void AddDouble(base::StringPiece 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(base::StringPiece 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.
// NOTE: it's not acceptable to call DisableContentSecurityPolicy for new
// pages, see URLDataSource::ShouldAddContentSecurityPolicy and talk to
// tsepez.
// Currently only used by embedders for WebUIs with multiple instances.
virtual void DisableReplaceExistingSource() = 0;
virtual void DisableContentSecurityPolicy() = 0;
// Overrides the content security policy for a certain directive.
virtual void OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName directive,
const std::string& value) = 0;
// 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;
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_WEB_UI_DATA_SOURCE_H_