summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc109
1 files changed, 83 insertions, 26 deletions
diff --git a/chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc b/chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
index 95aaf0f19a2..37f0b2c2cfb 100644
--- a/chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
+++ b/chromium/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
@@ -4,7 +4,9 @@
#include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
+#include "base/metrics/histogram_macros.h"
#include "base/time/time.h"
+#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/origin_trials/trial_token.h"
#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
#include "third_party/blink/public/platform/platform.h"
@@ -15,10 +17,12 @@
#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/origin_trials/origin_trials.h"
#include "third_party/blink/renderer/core/workers/worklet_global_scope.h"
#include "third_party/blink/renderer/platform/bindings/origin_trial_features.h"
+#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin.h"
@@ -31,12 +35,8 @@ namespace blink {
namespace {
-static EnumerationHistogram& TokenValidationResultHistogram() {
- DEFINE_THREAD_SAFE_STATIC_LOCAL(
- EnumerationHistogram, histogram,
- ("OriginTrials.ValidationResult",
- static_cast<int>(OriginTrialTokenStatus::kLast)));
- return histogram;
+void RecordTokenValidationResultHistogram(OriginTrialTokenStatus status) {
+ UMA_HISTOGRAM_ENUMERATION("OriginTrials.ValidationResult", status);
}
bool IsWhitespace(UChar chr) {
@@ -238,7 +238,7 @@ void OriginTrialContext::ActivateNavigationFeaturesFromInitiator(
void OriginTrialContext::InitializePendingFeatures() {
if (!enabled_features_.size() && !navigation_activated_features_.size())
return;
- auto* document = DynamicTo<Document>(context_.Get());
+ auto* document = Document::DynamicFrom(context_.Get());
if (!document)
return;
LocalFrame* frame = document->GetFrame();
@@ -283,7 +283,8 @@ bool OriginTrialContext::IsFeatureEnabled(OriginTrialFeature feature) const {
// For the purposes of origin trials, we consider imported documents to be
// part of the master document. Thus, check if the trial is enabled in the
// master document and use that result.
- auto* document = DynamicTo<Document>(context_.Get());
+ auto* window = DynamicTo<LocalDOMWindow>(context_.Get());
+ auto* document = window ? window->document() : nullptr;
if (!document || !document->IsHTMLImport())
return false;
@@ -294,28 +295,95 @@ bool OriginTrialContext::IsFeatureEnabled(OriginTrialFeature feature) const {
return context->IsFeatureEnabled(feature);
}
+base::Time OriginTrialContext::GetFeatureExpiry(OriginTrialFeature feature) {
+ if (!IsFeatureEnabled(feature))
+ return base::Time();
+
+ auto it = feature_expiry_times_.find(feature);
+ if (it == feature_expiry_times_.end())
+ return base::Time();
+
+ return it->value;
+}
+
bool OriginTrialContext::IsNavigationFeatureActivated(
OriginTrialFeature feature) const {
return navigation_activated_features_.Contains(feature);
}
+void OriginTrialContext::AddForceEnabledTrials(
+ const Vector<String>& trial_names) {
+ bool is_valid = false;
+ for (const auto& trial_name : trial_names) {
+ DCHECK(origin_trials::IsTrialValid(trial_name));
+ is_valid |=
+ EnableTrialFromName(trial_name, /*expiry_time=*/base::Time::Max());
+ }
+
+ if (is_valid) {
+ // Only install pending features if at least one trial is valid. Otherwise
+ // there was no change to the list of enabled features.
+ InitializePendingFeatures();
+ }
+}
+
+bool OriginTrialContext::CanEnableTrialFromName(const StringView& trial_name) {
+ if (trial_name == "Portals" &&
+ !base::FeatureList::IsEnabled(features::kPortals)) {
+ return false;
+ }
+
+ return true;
+}
+
+bool OriginTrialContext::EnableTrialFromName(const String& trial_name,
+ base::Time expiry_time) {
+ bool did_enable_feature = false;
+ for (OriginTrialFeature feature :
+ origin_trials::FeaturesForTrial(trial_name)) {
+ if (!origin_trials::FeatureEnabledForOS(feature))
+ continue;
+
+ if (!CanEnableTrialFromName(trial_name))
+ continue;
+
+ did_enable_feature = true;
+ enabled_features_.insert(feature);
+
+ // Use the latest expiry time for the feature.
+ if (GetFeatureExpiry(feature) < expiry_time)
+ feature_expiry_times_.Set(feature, expiry_time);
+
+ // Also enable any features implied by this feature.
+ for (OriginTrialFeature implied_feature :
+ origin_trials::GetImpliedFeatures(feature)) {
+ enabled_features_.insert(implied_feature);
+
+ // Use the latest expiry time for the implied feature.
+ if (GetFeatureExpiry(implied_feature) < expiry_time)
+ feature_expiry_times_.Set(implied_feature, expiry_time);
+ }
+ }
+ return did_enable_feature;
+}
+
bool OriginTrialContext::EnableTrialFromToken(const SecurityOrigin* origin,
bool is_secure,
const String& token) {
DCHECK(!token.IsEmpty());
if (!trial_token_validator_) {
- TokenValidationResultHistogram().Count(
- static_cast<int>(OriginTrialTokenStatus::kNotSupported));
+ RecordTokenValidationResultHistogram(OriginTrialTokenStatus::kNotSupported);
return false;
}
bool valid = false;
StringUTF8Adaptor token_string(token);
std::string trial_name_str;
+ base::Time expiry_time;
OriginTrialTokenStatus token_result = trial_token_validator_->ValidateToken(
- token_string.AsStringPiece(), origin->ToUrlOrigin(), &trial_name_str,
- base::Time::Now());
+ token_string.AsStringPiece(), origin->ToUrlOrigin(), base::Time::Now(),
+ &trial_name_str, &expiry_time);
if (token_result == OriginTrialTokenStatus::kSuccess) {
String trial_name =
String::FromUTF8(trial_name_str.data(), trial_name_str.size());
@@ -324,18 +392,7 @@ bool OriginTrialContext::EnableTrialFromToken(const SecurityOrigin* origin,
// is for deprecation trials.
if (is_secure ||
origin_trials::IsTrialEnabledForInsecureContext(trial_name)) {
- for (OriginTrialFeature feature :
- origin_trials::FeaturesForTrial(trial_name)) {
- if (origin_trials::FeatureEnabledForOS(feature)) {
- valid = true;
- enabled_features_.insert(feature);
- // Also enable any features implied by this feature.
- for (OriginTrialFeature implied_feature :
- origin_trials::GetImpliedFeatures(feature)) {
- enabled_features_.insert(implied_feature);
- }
- }
- }
+ valid = EnableTrialFromName(trial_name, expiry_time);
} else {
// Insecure origin and trial is restricted to secure origins.
token_result = OriginTrialTokenStatus::kInsecure;
@@ -343,11 +400,11 @@ bool OriginTrialContext::EnableTrialFromToken(const SecurityOrigin* origin,
}
}
- TokenValidationResultHistogram().Count(static_cast<int>(token_result));
+ RecordTokenValidationResultHistogram(token_result);
return valid;
}
-void OriginTrialContext::Trace(blink::Visitor* visitor) {
+void OriginTrialContext::Trace(Visitor* visitor) {
visitor->Trace(context_);
}