Skip to content

Commit

Permalink
Renamed importance to fetchpriority/priority
Browse files Browse the repository at this point in the history
Updated the Priority Hints interfaces to match the latest spec:
https://wicg.github.io/priority-hints/

This is just an in-place name change, changing the HTML attribute
from "importance" to "fetchimportance" and property of the Request
object from the fetch JavaScript API from "importance" to "priority".

Internally in the non-web-exposed code it was renamed from
"importance" to "fetch_priority_hint" and "FetchPriorityHint" for
consistency and to avoid collision with the existing "priority"
that is used internally (and to make it clear that it is a hint).

There were no functional or test changes other than those involved in
renaming the attributes.

There were also a few unrelated changes to fix lint warnings or tricium
suggestions on adjacent code that was touched as part of the rename.

Bug: 1301813
Change-Id: I9584011d93349debb18e951dc423231c4854a195
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3499120
Reviewed-by: Yoav Weiss <yoavweiss@chromium.org>
Reviewed-by: danakj <danakj@chromium.org>
Reviewed-by: Adam Rice <ricea@chromium.org>
Commit-Queue: Patrick Meenan <pmeenan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#977098}
  • Loading branch information
pmeenan authored and Chromium LUCI CQ committed Mar 3, 2022
1 parent 0aa929e commit a7b04c9
Show file tree
Hide file tree
Showing 81 changed files with 592 additions and 618 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,7 @@
"FOR"
"missing"
"importance"
"fetchpriority"
"screen"
"connection."
"ISO-8859-1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,7 @@
"FOR"
"missing"
"importance"
"fetchpriority"
"screen"
"connection."
"PARTICULAR"
Expand Down
1 change: 1 addition & 0 deletions net/data/fuzzer_dictionaries/net_url_request_fuzzer.dict
Original file line number Diff line number Diff line change
Expand Up @@ -1391,6 +1391,7 @@
"FOR"
"opening"
"importance"
"fetchpriority"
"screen"
"connection."
"ISO-8859-1"
Expand Down
13 changes: 6 additions & 7 deletions third_party/blink/public/mojom/fetch/fetch_api_request.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,12 @@ enum FetchCacheMode {
kUnspecifiedForceCacheMiss,
};

// Corresponds to Fetch request's "importance mode"
// Currently discussed at: https://github.com/WICG/priority-hints
// TODO(domfarolino): add a spec link to this once specified.
enum FetchImportanceMode {
kImportanceLow,
kImportanceAuto,
kImportanceHigh
// Corresponds to Fetch request's "priority"
// Spec: https://wicg.github.io/priority-hints/
enum FetchPriorityHint {
kLow,
kAuto,
kHigh
};

// Request headers for FetchAPIRequest. This is typemapped to a container with a
Expand Down
4 changes: 2 additions & 2 deletions third_party/blink/renderer/bindings/generated_in_core.gni
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,8 @@ generated_enumeration_sources_in_core = [
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_edit_context_input_panel_policy.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_ending_type.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_ending_type.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_fetch_priority.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_fetch_priority.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_fill_mode.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_fill_mode.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_font_face_load_status.cc",
Expand Down Expand Up @@ -472,8 +474,6 @@ generated_enumeration_sources_in_core = [
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_credentials.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_destination.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_destination.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_importance.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_importance.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_mode.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_mode.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_redirect.cc",
Expand Down
4 changes: 2 additions & 2 deletions third_party/blink/renderer/core/fetch/fetch_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ void FetchManager::Loader::PerformHTTPFetch() {
}
request.SetCacheMode(fetch_request_data_->CacheMode());
request.SetRedirectMode(fetch_request_data_->Redirect());
request.SetFetchImportanceMode(fetch_request_data_->Importance());
request.SetFetchPriorityHint(fetch_request_data_->FetchPriorityHint());
request.SetPriority(fetch_request_data_->Priority());
request.SetUseStreamOnResponse(true);
request.SetReferrerString(fetch_request_data_->ReferrerString());
Expand Down Expand Up @@ -862,7 +862,7 @@ void FetchManager::Loader::PerformDataFetch() {
request.SetHttpMethod(fetch_request_data_->Method());
request.SetCredentialsMode(network::mojom::CredentialsMode::kOmit);
request.SetRedirectMode(RedirectMode::kError);
request.SetFetchImportanceMode(fetch_request_data_->Importance());
request.SetFetchPriorityHint(fetch_request_data_->FetchPriorityHint());
request.SetPriority(fetch_request_data_->Priority());
// We intentionally skip 'setExternalRequestStateFromRequestorAddressSpace',
// as 'data:' can never be external.
Expand Down
15 changes: 2 additions & 13 deletions third_party/blink/renderer/core/fetch/fetch_request_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ FetchRequestData* FetchRequestData::CloneExceptBody() {
request->mime_type_ = mime_type_;
request->integrity_ = integrity_;
request->priority_ = priority_;
request->importance_ = importance_;
request->fetch_priority_hint_ = fetch_priority_hint_;
request->original_destination_ = original_destination_;
request->keepalive_ = keepalive_;
request->is_history_navigation_ = is_history_navigation_;
Expand Down Expand Up @@ -258,18 +258,7 @@ FetchRequestData* FetchRequestData::Pass(ScriptState* script_state) {
FetchRequestData::~FetchRequestData() {}

FetchRequestData::FetchRequestData(ExecutionContext* execution_context)
: method_(http_names::kGET),
header_list_(MakeGarbageCollected<FetchHeaderList>()),
destination_(network::mojom::RequestDestination::kEmpty),
referrer_string_(Referrer::ClientReferrerString()),
referrer_policy_(network::mojom::ReferrerPolicy::kDefault),
mode_(network::mojom::RequestMode::kNoCors),
credentials_(network::mojom::CredentialsMode::kOmit),
cache_mode_(mojom::FetchCacheMode::kDefault),
redirect_(network::mojom::RedirectMode::kFollow),
importance_(mojom::FetchImportanceMode::kImportanceAuto),
priority_(ResourceLoadPriority::kUnresolved),
keepalive_(false),
: referrer_string_(Referrer::ClientReferrerString()),
url_loader_factory_(execution_context),
execution_context_(execution_context) {}

Expand Down
42 changes: 26 additions & 16 deletions third_party/blink/renderer/core/fetch/fetch_request_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,21 @@ class CORE_EXPORT FetchRequestData final
credentials_ = credentials;
}
network::mojom::CredentialsMode Credentials() const { return credentials_; }
void SetCacheMode(mojom::FetchCacheMode cache_mode) {
void SetCacheMode(mojom::blink::FetchCacheMode cache_mode) {
cache_mode_ = cache_mode;
}
mojom::FetchCacheMode CacheMode() const { return cache_mode_; }
mojom::blink::FetchCacheMode CacheMode() const { return cache_mode_; }
void SetRedirect(network::mojom::RedirectMode redirect) {
redirect_ = redirect;
}
network::mojom::RedirectMode Redirect() const { return redirect_; }
void SetImportance(mojom::FetchImportanceMode importance) {
importance_ = importance;
void SetFetchPriorityHint(
mojom::blink::FetchPriorityHint fetch_priority_hint) {
fetch_priority_hint_ = fetch_priority_hint;
}
mojom::blink::FetchPriorityHint FetchPriorityHint() const {
return fetch_priority_hint_;
}
mojom::FetchImportanceMode Importance() const { return importance_; }
FetchHeaderList* HeaderList() const { return header_list_.Get(); }
void SetHeaderList(FetchHeaderList* header_list) {
header_list_ = header_list;
Expand Down Expand Up @@ -162,37 +165,44 @@ class CORE_EXPORT FetchRequestData final
private:
FetchRequestData* CloneExceptBody();

AtomicString method_;
AtomicString method_ = http_names::kGET;
KURL url_;
Member<FetchHeaderList> header_list_;
Member<FetchHeaderList> header_list_ =
MakeGarbageCollected<FetchHeaderList>();
// FIXME: Support m_skipServiceWorkerFlag;
network::mojom::RequestDestination destination_;
network::mojom::RequestDestination destination_ =
network::mojom::RequestDestination::kEmpty;
scoped_refptr<const SecurityOrigin> origin_;
WTF::Vector<KURL> navigation_redirect_chain_;
scoped_refptr<const SecurityOrigin> isolated_world_origin_;
// FIXME: Support m_forceOriginHeaderFlag;
AtomicString referrer_string_;
network::mojom::ReferrerPolicy referrer_policy_;
network::mojom::ReferrerPolicy referrer_policy_ =
network::mojom::ReferrerPolicy::kDefault;
// FIXME: Support m_authenticationFlag;
// FIXME: Support m_synchronousFlag;
network::mojom::RequestMode mode_;
network::mojom::CredentialsMode credentials_;
network::mojom::RequestMode mode_ = network::mojom::RequestMode::kNoCors;
network::mojom::CredentialsMode credentials_ =
network::mojom::CredentialsMode::kOmit;
// TODO(yiyix): |cache_mode_| is exposed but does not yet affect fetch
// behavior. We must transfer the mode to the network layer and service
// worker.
mojom::FetchCacheMode cache_mode_;
network::mojom::RedirectMode redirect_;
mojom::FetchImportanceMode importance_;
mojom::blink::FetchCacheMode cache_mode_ =
mojom::blink::FetchCacheMode::kDefault;
network::mojom::RedirectMode redirect_ =
network::mojom::RedirectMode::kFollow;
mojom::blink::FetchPriorityHint fetch_priority_hint_ =
mojom::blink::FetchPriorityHint::kAuto;
absl::optional<network::mojom::blink::TrustTokenParams> trust_token_params_;
// FIXME: Support m_useURLCredentialsFlag;
// FIXME: Support m_redirectCount;
Member<BodyStreamBuffer> buffer_;
String mime_type_;
String integrity_;
ResourceLoadPriority priority_;
ResourceLoadPriority priority_ = ResourceLoadPriority::kUnresolved;
network::mojom::RequestDestination original_destination_ =
network::mojom::RequestDestination::kEmpty;
bool keepalive_;
bool keepalive_ = false;
bool is_history_navigation_ = false;
// A specific factory that should be used for this request instead of whatever
// the system would otherwise decide to use to load this request.
Expand Down
40 changes: 19 additions & 21 deletions third_party/blink/renderer/core/fetch/request.cc
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ FetchRequestData* CreateCopyOfFetchRequestDataForFetch(
request->SetCacheMode(original->CacheMode());
request->SetRedirect(original->Redirect());
request->SetIntegrity(original->Integrity());
request->SetImportance(original->Importance());
request->SetFetchPriorityHint(original->FetchPriorityHint());
request->SetPriority(original->Priority());
request->SetKeepalive(original->Keepalive());
request->SetIsHistoryNavigation(original->IsHistoryNavigation());
Expand Down Expand Up @@ -118,8 +118,8 @@ static bool AreAnyMembersPresent(const RequestInit* init) {
return init->hasMethod() || init->hasHeaders() || init->hasBody() ||
init->hasReferrer() || init->hasReferrerPolicy() || init->hasMode() ||
init->hasCredentials() || init->hasCache() || init->hasRedirect() ||
init->hasIntegrity() || init->hasKeepalive() ||
init->hasImportance() || init->hasSignal() || init->hasTrustToken();
init->hasIntegrity() || init->hasKeepalive() || init->hasPriority() ||
init->hasSignal() || init->hasTrustToken();
}

static BodyStreamBuffer* ExtractBody(ScriptState* script_state,
Expand Down Expand Up @@ -441,17 +441,15 @@ Request* Request::CreateRequestWithRequestOrString(
request->SetMode(network::mojom::RequestMode::kCors);
}

// This is not yet standardized, but we can assume the following:
// "If |init|'s importance member is present, set |request|'s importance
// mode to it." For more information see Priority Hints at
// https://crbug.com/821464.
if (init->hasImportance()) {
// "If |init|'s priority member is present, set |request|'s priority
// to it." For more information see Priority Hints at
// https://wicg.github.io/priority-hints/#fetch-integration
if (init->hasPriority()) {
UseCounter::Count(execution_context, WebFeature::kPriorityHints);
if (init->importance() == "low") {
request->SetImportance(mojom::blink::FetchImportanceMode::kImportanceLow);
} else if (init->importance() == "high") {
request->SetImportance(
mojom::blink::FetchImportanceMode::kImportanceHigh);
if (init->priority() == "low") {
request->SetFetchPriorityHint(mojom::blink::FetchPriorityHint::kLow);
} else if (init->priority() == "high") {
request->SetFetchPriorityHint(mojom::blink::FetchPriorityHint::kHigh);
}
}

Expand Down Expand Up @@ -912,20 +910,20 @@ String Request::credentials() const {
String Request::cache() const {
// "The cache attribute's getter must return request's cache mode."
switch (request_->CacheMode()) {
case mojom::FetchCacheMode::kDefault:
case mojom::blink::FetchCacheMode::kDefault:
return "default";
case mojom::FetchCacheMode::kNoStore:
case mojom::blink::FetchCacheMode::kNoStore:
return "no-store";
case mojom::FetchCacheMode::kBypassCache:
case mojom::blink::FetchCacheMode::kBypassCache:
return "reload";
case mojom::FetchCacheMode::kValidateCache:
case mojom::blink::FetchCacheMode::kValidateCache:
return "no-cache";
case mojom::FetchCacheMode::kForceCache:
case mojom::blink::FetchCacheMode::kForceCache:
return "force-cache";
case mojom::FetchCacheMode::kOnlyIfCached:
case mojom::blink::FetchCacheMode::kOnlyIfCached:
return "only-if-cached";
case mojom::FetchCacheMode::kUnspecifiedOnlyIfCachedStrict:
case mojom::FetchCacheMode::kUnspecifiedForceCacheMiss:
case mojom::blink::FetchCacheMode::kUnspecifiedOnlyIfCachedStrict:
case mojom::blink::FetchCacheMode::kUnspecifiedForceCacheMiss:
NOTREACHED();
break;
}
Expand Down
2 changes: 1 addition & 1 deletion third_party/blink/renderer/core/fetch/request.idl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ enum RequestCredentials { "omit", "same-origin", "include" };
enum RequestRedirect { "follow", "error", "manual" };
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache",
"only-if-cached" };
enum RequestImportance {"low", "auto", "high"};
enum FetchPriority {"low", "auto", "high"};

// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies

Expand Down
2 changes: 1 addition & 1 deletion third_party/blink/renderer/core/fetch/request_init.idl
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ dictionary RequestInit {
RequestRedirect redirect;
DOMString integrity;
boolean keepalive;
[RuntimeEnabled=PriorityHints] RequestImportance importance;
[RuntimeEnabled=PriorityHints] FetchPriority priority;
AbortSignal? signal;
// Even though Trust Tokens operations are only available in secure
// contexts, this has to be enforced after the fact because the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
"event",
"exportparts",
"face",
"fetchpriority",
"focusgroup",
"for",
"form",
Expand All @@ -113,7 +114,6 @@
"id",
"imagesizes",
"imagesrcset",
"importance",
"incremental",
"inert",
"initiallyopen",
Expand Down
4 changes: 2 additions & 2 deletions third_party/blink/renderer/core/html/html_image_element.cc
Original file line number Diff line number Diff line change
Expand Up @@ -339,11 +339,11 @@ void HTMLImageElement::ParseAttribute(
(loading == LoadingAttributeValue::kAuto)) {
GetImageLoader().LoadDeferredImage(referrer_policy_);
}
} else if (name == html_names::kImportanceAttr &&
} else if (name == html_names::kFetchpriorityAttr &&
RuntimeEnabledFeatures::PriorityHintsEnabled(
GetExecutionContext())) {
// We only need to keep track of usage here, as the communication of the
// |importance| attribute to the loading pipeline takes place in
// |fetchpriority| attribute to the loading pipeline takes place in
// ImageLoader.
UseCounter::Count(GetDocument(), WebFeature::kPriorityHints);
} else if (name == html_names::kCrossoriginAttr) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
readonly attribute DOMString currentSrc;
[CEReactions, Reflect, ReflectOnly=("","no-referrer","origin","no-referrer-when-downgrade","origin-when-cross-origin","unsafe-url"), ReflectMissing="", ReflectInvalid=""] attribute DOMString referrerPolicy;
[CEReactions, Reflect, ReflectOnly=("async", "sync", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString decoding;
[CEReactions, MeasureAs=PriorityHints, RuntimeEnabled=PriorityHints, Reflect, ReflectOnly=("low", "auto", "high"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString importance;
[CEReactions, MeasureAs=PriorityHints, RuntimeEnabled=PriorityHints, Reflect, ReflectOnly=("low", "auto", "high"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString fetchpriority;
[RuntimeEnabled=LazyImageLoading, CEReactions, Reflect, ReflectOnly=("lazy", "eager", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString loading;

// Attribution Reporting
Expand Down
5 changes: 2 additions & 3 deletions third_party/blink/renderer/core/html/html_link_element.cc
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ HTMLLinkElement::HTMLLinkElement(Document& document,
: HTMLElement(html_names::kLinkTag, document),
link_loader_(
MakeGarbageCollected<LinkLoader>(this, GetLoadingTaskRunner())),
referrer_policy_(network::mojom::ReferrerPolicy::kDefault),
sizes_(MakeGarbageCollected<DOMTokenList>(*this, html_names::kSizesAttr)),
rel_list_(MakeGarbageCollected<RelList>(this)),
blocking_attribute_(MakeGarbageCollected<BlockingAttribute>(this)),
Expand Down Expand Up @@ -144,11 +143,11 @@ void HTMLLinkElement::ParseAttribute(
Process();
} else if (name == html_names::kIntegrityAttr) {
integrity_ = value;
} else if (name == html_names::kImportanceAttr &&
} else if (name == html_names::kFetchpriorityAttr &&
RuntimeEnabledFeatures::PriorityHintsEnabled(
GetExecutionContext())) {
UseCounter::Count(GetDocument(), WebFeature::kPriorityHints);
importance_ = value;
fetch_priority_hint_ = value;
} else if (name == html_names::kResourcesAttr &&
LinkWebBundle::IsFeatureEnabled(GetExecutionContext())) {
resources_->DidUpdateAttributeValue(params.old_value, value);
Expand Down
7 changes: 4 additions & 3 deletions third_party/blink/renderer/core/html/html_link_element.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class CORE_EXPORT HTMLLinkElement final : public HTMLElement,
String TypeValue() const { return type_; }
String AsValue() const { return as_; }
String IntegrityValue() const { return integrity_; }
String ImportanceValue() const { return importance_; }
String FetchPriorityHintValue() const { return fetch_priority_hint_; }
network::mojom::ReferrerPolicy GetReferrerPolicy() const {
return referrer_policy_;
}
Expand Down Expand Up @@ -166,8 +166,9 @@ class CORE_EXPORT HTMLLinkElement final : public HTMLElement,
String as_;
String media_;
String integrity_;
String importance_;
network::mojom::ReferrerPolicy referrer_policy_;
String fetch_priority_hint_;
network::mojom::ReferrerPolicy referrer_policy_ =
network::mojom::ReferrerPolicy::kDefault;
Member<DOMTokenList> sizes_;
Vector<gfx::Size> icon_sizes_;
Member<RelList> rel_list_;
Expand Down
2 changes: 1 addition & 1 deletion third_party/blink/renderer/core/html/html_link_element.idl
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
[Reflect, ReflectOnly=("script","style","image", "track", "font", "fetch")] attribute DOMString as;
[CEReactions, Reflect, ReflectOnly=("","no-referrer","origin","no-referrer-when-downgrade","origin-when-cross-origin","unsafe-url"), ReflectMissing="", ReflectInvalid=""] attribute DOMString referrerPolicy;
[PutForwards=value] readonly attribute DOMTokenList sizes;
[CEReactions, MeasureAs=PriorityHints, RuntimeEnabled=PriorityHints, Reflect, ReflectOnly=("low", "auto", "high"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString importance;
[CEReactions, MeasureAs=PriorityHints, RuntimeEnabled=PriorityHints, Reflect, ReflectOnly=("low", "auto", "high"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString fetchpriority;
[CEReactions, Reflect] attribute DOMString imageSrcset;
[CEReactions, Reflect] attribute DOMString imageSizes;

Expand Down
8 changes: 4 additions & 4 deletions third_party/blink/renderer/core/html/html_script_element.cc
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,10 @@ void HTMLScriptElement::ParseAttribute(
// flag is set has an async content attribute added, the element's
// |non-blocking| flag must be unset."
loader_->HandleAsyncAttribute();
} else if (params.name == html_names::kImportanceAttr &&
} else if (params.name == html_names::kFetchpriorityAttr &&
RuntimeEnabledFeatures::PriorityHintsEnabled(
GetExecutionContext())) {
// The only thing we need to do for the the importance attribute/Priority
// The only thing we need to do for the the fetchpriority attribute/Priority
// Hints is count usage upon parsing. Processing the value happens when the
// element loads.
UseCounter::Count(GetDocument(), WebFeature::kPriorityHints);
Expand Down Expand Up @@ -242,8 +242,8 @@ String HTMLScriptElement::ReferrerPolicyAttributeValue() const {
return FastGetAttribute(html_names::kReferrerpolicyAttr);
}

String HTMLScriptElement::ImportanceAttributeValue() const {
return FastGetAttribute(html_names::kImportanceAttr);
String HTMLScriptElement::FetchPriorityAttributeValue() const {
return FastGetAttribute(html_names::kFetchpriorityAttr);
}

String HTMLScriptElement::ChildTextContent() {
Expand Down
Loading

0 comments on commit a7b04c9

Please sign in to comment.