diff options
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.cc | 109 |
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_); } |