blob: f5fc6079d3fad4a0d66bb5afe62d55321a0de8f4 [file] [log] [blame]
// Copyright 2015 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 THIRD_PARTY_BLINK_RENDERER_CORE_ORIGIN_TRIALS_ORIGIN_TRIAL_CONTEXT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_ORIGIN_TRIALS_ORIGIN_TRIAL_CONTEXT_H_
#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/platform/supplementable.h"
#include "third_party/blink/renderer/platform/wtf/hash_set.h"
#include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class ExecutionContext;
// The Origin Trials Framework provides limited access to experimental features,
// on a per-origin basis (origin trials). This class provides the implementation
// to check if the experimental feature should be enabled for the current
// context. This class is not for direct use by feature implementers.
// Instead, the OriginTrials generated namespace provides a method for each
// trial to check if it is enabled. Experimental features must be defined in
// runtime_enabled_features.json5, which is used to generate origin_trials.h/cc.
//
// Origin trials are defined by string names, provided by the implementers. The
// framework does not maintain an enum or constant list for trial names.
// Instead, the name provided by the feature implementation is validated against
// any provided tokens.
//
// For more information, see https://github.com/jpchase/OriginTrials.
class CORE_EXPORT OriginTrialContext final
: public GarbageCollectedFinalized<OriginTrialContext>,
public Supplement<ExecutionContext> {
USING_GARBAGE_COLLECTED_MIXIN(OriginTrialContext)
public:
static const char kSupplementName[];
OriginTrialContext(ExecutionContext&, std::unique_ptr<TrialTokenValidator>);
// Returns the OriginTrialContext for a specific ExecutionContext, if one
// exists.
static const OriginTrialContext* From(const ExecutionContext*);
// Returns the OriginTrialContext for a specific ExecutionContext, creating
// one if one does not already exist.
static OriginTrialContext* FromOrCreate(ExecutionContext*);
// Parses an Origin-Trial header as specified in
// https://jpchase.github.io/OriginTrials/#header into individual tokens.
// Returns null if the header value was malformed and could not be parsed.
// If the header does not contain any tokens, this returns an empty vector.
static std::unique_ptr<Vector<String>> ParseHeaderValue(
const String& header_value);
static void AddTokensFromHeader(ExecutionContext*,
const String& header_value);
static void AddTokens(ExecutionContext*, const Vector<String>* tokens);
// Returns the trial tokens that are active in a specific ExecutionContext.
// Returns null if no tokens were added to the ExecutionContext.
static std::unique_ptr<Vector<String>> GetTokens(ExecutionContext*);
void AddToken(const String& token);
void AddTokens(const Vector<String>& tokens);
// Forces a given origin-trial-enabled feature to be enabled in this context
// and immediately adds required bindings to already initialized JS contexts.
void AddFeature(const String& feature);
// Returns true if the trial (and therefore the feature or features it
// controls) should be considered enabled for the current execution context.
bool IsTrialEnabled(const String& trial_name) const;
// Installs JavaScript bindings on the relevant objects for any features which
// should be enabled by the current set of trial tokens. This method is called
// every time a token is added to the document (including when tokens are
// added via script). JavaScript-exposed members will be properly visible, for
// existing objects in the V8 context. If the V8 context is not initialized,
// or there are no enabled features, or all enabled features are already
// initialized, this method returns without doing anything. That is, it is
// safe to call this method multiple times, even if no trials are newly
// enabled.
void InitializePendingFeatures();
void Trace(blink::Visitor*) override;
private:
// Validate the trial token. If valid, the trial named in the token is
// added to the list of enabled trials. Returns true or false to indicate if
// the token is valid.
bool EnableTrialFromToken(const String& token);
Vector<String> tokens_;
HashSet<String> enabled_trials_;
HashSet<String> installed_trials_;
std::unique_ptr<TrialTokenValidator> trial_token_validator_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_ORIGIN_TRIALS_ORIGIN_TRIAL_CONTEXT_H_