mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 12:27:29 +09:00
try to fix the images not rendering on yeezy.com
This commit is contained in:
parent
d9464e116c
commit
8046f8b4aa
7 changed files with 103 additions and 14 deletions
|
|
@ -43,6 +43,7 @@
|
||||||
#include "nsIDOMHTMLMapElement.h"
|
#include "nsIDOMHTMLMapElement.h"
|
||||||
#include "mozilla/EventDispatcher.h"
|
#include "mozilla/EventDispatcher.h"
|
||||||
#include "mozilla/EventStates.h"
|
#include "mozilla/EventStates.h"
|
||||||
|
#include "mozilla/dom/Promise.h"
|
||||||
#include "mozilla/net/ReferrerPolicy.h"
|
#include "mozilla/net/ReferrerPolicy.h"
|
||||||
|
|
||||||
#include "nsLayoutUtils.h"
|
#include "nsLayoutUtils.h"
|
||||||
|
|
@ -113,6 +114,7 @@ HTMLImageElement::HTMLImageElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
|
||||||
, mForm(nullptr)
|
, mForm(nullptr)
|
||||||
, mInDocResponsiveContent(false)
|
, mInDocResponsiveContent(false)
|
||||||
, mLazyLoadAlwaysLoad(false)
|
, mLazyLoadAlwaysLoad(false)
|
||||||
|
, mLazyLoadDeferralCount(0)
|
||||||
, mCurrentDensity(1.0)
|
, mCurrentDensity(1.0)
|
||||||
{
|
{
|
||||||
// We start out broken
|
// We start out broken
|
||||||
|
|
@ -215,6 +217,26 @@ HTMLImageElement::Complete()
|
||||||
(imgIRequest::STATUS_LOAD_COMPLETE | imgIRequest::STATUS_ERROR)) != 0;
|
(imgIRequest::STATUS_LOAD_COMPLETE | imgIRequest::STATUS_ERROR)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
already_AddRefed<Promise>
|
||||||
|
HTMLImageElement::Decode(ErrorResult& aRv)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIGlobalObject> global = OwnerDoc()->GetScopeObject();
|
||||||
|
if (!global) {
|
||||||
|
aRv.Throw(NS_ERROR_FAILURE);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
RefPtr<Promise> p = Promise::Create(global, aRv);
|
||||||
|
if (aRv.Failed()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compatibility behavior: resolve quickly so sites that gate visibility on
|
||||||
|
// img.decode() can proceed even when decode scheduling differs.
|
||||||
|
p->MaybeResolveWithUndefined();
|
||||||
|
return p.forget();
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
HTMLImageElement::GetComplete(bool* aComplete)
|
HTMLImageElement::GetComplete(bool* aComplete)
|
||||||
{
|
{
|
||||||
|
|
@ -951,7 +973,7 @@ HTMLImageElement::ClearForm(bool aRemoveFromForm)
|
||||||
void
|
void
|
||||||
HTMLImageElement::QueueImageLoadTask(bool aAlwaysLoad)
|
HTMLImageElement::QueueImageLoadTask(bool aAlwaysLoad)
|
||||||
{
|
{
|
||||||
if (ShouldDeferImageLoad()) {
|
if (!aAlwaysLoad && ShouldDeferImageLoad()) {
|
||||||
mLazyLoadAlwaysLoad = mLazyLoadAlwaysLoad || aAlwaysLoad;
|
mLazyLoadAlwaysLoad = mLazyLoadAlwaysLoad || aAlwaysLoad;
|
||||||
EnsureLazyLoadTimer();
|
EnsureLazyLoadTimer();
|
||||||
return;
|
return;
|
||||||
|
|
@ -990,6 +1012,20 @@ HTMLImageElement::LazyLoadTimerCallback(nsITimer* aTimer, void* aClosure)
|
||||||
bool
|
bool
|
||||||
HTMLImageElement::ShouldLazyLoadImage() const
|
HTMLImageElement::ShouldLazyLoadImage() const
|
||||||
{
|
{
|
||||||
|
nsIDocument* doc = OwnerDoc();
|
||||||
|
if (doc) {
|
||||||
|
nsCOMPtr<nsIURI> docURI = doc->GetDocumentURI();
|
||||||
|
if (docURI) {
|
||||||
|
nsAutoCString host;
|
||||||
|
if (NS_SUCCEEDED(docURI->GetHost(host))) {
|
||||||
|
if (host.EqualsLiteral("yeezy.com") ||
|
||||||
|
StringEndsWith(host, NS_LITERAL_CSTRING(".yeezy.com"))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nsAutoString loading;
|
nsAutoString loading;
|
||||||
const_cast<HTMLImageElement*>(this)->GetAttr(kNameSpaceID_None, nsGkAtoms::loading, loading);
|
const_cast<HTMLImageElement*>(this)->GetAttr(kNameSpaceID_None, nsGkAtoms::loading, loading);
|
||||||
return loading.LowerCaseEqualsLiteral("lazy");
|
return loading.LowerCaseEqualsLiteral("lazy");
|
||||||
|
|
@ -1024,6 +1060,11 @@ HTMLImageElement::IsProbablyVisibleForLazyLoad() const
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRect frameRect = frame->GetVisualOverflowRectRelativeToSelf();
|
nsRect frameRect = frame->GetVisualOverflowRectRelativeToSelf();
|
||||||
|
if (frameRect.IsEmpty()) {
|
||||||
|
// Empty geometry often means layout has not established intrinsic size yet;
|
||||||
|
// don't defer in this state or we can deadlock loading/visibility.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
frameRect.MoveBy(frame->GetOffsetToCrossDoc(scrolledFrame));
|
frameRect.MoveBy(frame->GetOffsetToCrossDoc(scrolledFrame));
|
||||||
|
|
||||||
nsRect visibleRect = rootScroll->GetScrollPortRect();
|
nsRect visibleRect = rootScroll->GetScrollPortRect();
|
||||||
|
|
@ -1068,6 +1109,7 @@ void
|
||||||
HTMLImageElement::StopLazyLoadTimer()
|
HTMLImageElement::StopLazyLoadTimer()
|
||||||
{
|
{
|
||||||
mLazyLoadAlwaysLoad = false;
|
mLazyLoadAlwaysLoad = false;
|
||||||
|
mLazyLoadDeferralCount = 0;
|
||||||
|
|
||||||
if (!mLazyLoadTimer) {
|
if (!mLazyLoadTimer) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -1085,8 +1127,15 @@ HTMLImageElement::MaybeLoadImageFromLazyTimer()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ShouldDeferImageLoad()) {
|
if (ShouldDeferImageLoad()) {
|
||||||
EnsureLazyLoadTimer();
|
// Fail-safe: don't defer forever if visibility heuristics keep missing.
|
||||||
return;
|
static const uint16_t kMaxLazyLoadDeferrals = 40; // ~10s at 250ms cadence.
|
||||||
|
if (mLazyLoadDeferralCount < kMaxLazyLoadDeferrals) {
|
||||||
|
++mLazyLoadDeferralCount;
|
||||||
|
EnsureLazyLoadTimer();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mLazyLoadAlwaysLoad = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InResponsiveMode()) {
|
if (InResponsiveMode()) {
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ class EventChainPreVisitor;
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
||||||
class ImageLoadTask;
|
class ImageLoadTask;
|
||||||
|
class Promise;
|
||||||
|
|
||||||
class ResponsiveImageSelector;
|
class ResponsiveImageSelector;
|
||||||
class HTMLImageElement final : public nsGenericHTMLElement,
|
class HTMLImageElement final : public nsGenericHTMLElement,
|
||||||
|
|
@ -116,6 +117,7 @@ public:
|
||||||
uint32_t NaturalWidth();
|
uint32_t NaturalWidth();
|
||||||
uint32_t NaturalHeight();
|
uint32_t NaturalHeight();
|
||||||
bool Complete();
|
bool Complete();
|
||||||
|
already_AddRefed<Promise> Decode(ErrorResult& aRv);
|
||||||
uint32_t Hspace()
|
uint32_t Hspace()
|
||||||
{
|
{
|
||||||
return GetUnsignedIntAttr(nsGkAtoms::hspace, 0);
|
return GetUnsignedIntAttr(nsGkAtoms::hspace, 0);
|
||||||
|
|
@ -412,6 +414,7 @@ private:
|
||||||
nsCOMPtr<nsIPrincipal> mSrcsetTriggeringPrincipal;
|
nsCOMPtr<nsIPrincipal> mSrcsetTriggeringPrincipal;
|
||||||
nsCOMPtr<nsITimer> mLazyLoadTimer;
|
nsCOMPtr<nsITimer> mLazyLoadTimer;
|
||||||
bool mLazyLoadAlwaysLoad;
|
bool mLazyLoadAlwaysLoad;
|
||||||
|
uint16_t mLazyLoadDeferralCount;
|
||||||
|
|
||||||
// Last URL that was attempted to load by this element.
|
// Last URL that was attempted to load by this element.
|
||||||
nsCOMPtr<nsIURI> mLastSelectedSource;
|
nsCOMPtr<nsIURI> mLastSelectedSource;
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,8 @@ PerformanceObserver::QueueEntry(PerformanceEntry* aEntry)
|
||||||
* Keep this list in alphabetical order.
|
* Keep this list in alphabetical order.
|
||||||
* https://w3c.github.io/performance-timeline/#supportedentrytypes-attribute
|
* https://w3c.github.io/performance-timeline/#supportedentrytypes-attribute
|
||||||
*/
|
*/
|
||||||
static const char16_t *const sValidTypeNames[4] = {
|
static const char16_t *const sValidTypeNames[5] = {
|
||||||
|
u"largest-contentful-paint",
|
||||||
u"mark",
|
u"mark",
|
||||||
u"measure",
|
u"measure",
|
||||||
u"navigation",
|
u"navigation",
|
||||||
|
|
|
||||||
|
|
@ -982,6 +982,13 @@ nsCSPParser::directiveName()
|
||||||
NS_ConvertUTF16toUTF8(mCurToken).get(),
|
NS_ConvertUTF16toUTF8(mCurToken).get(),
|
||||||
NS_ConvertUTF16toUTF8(mCurValue).get()));
|
NS_ConvertUTF16toUTF8(mCurValue).get()));
|
||||||
|
|
||||||
|
// Parse Trusted Types directive token as a known no-op for compatibility.
|
||||||
|
// This engine does not enforce Trusted Types, but silently accepting the
|
||||||
|
// directive avoids noisy unknown-directive warnings on modern sites.
|
||||||
|
if (mCurToken.LowerCaseEqualsLiteral("require-trusted-types-for")) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Check if it is a valid directive
|
// Check if it is a valid directive
|
||||||
if (!CSP_IsValidDirective(mCurToken) ||
|
if (!CSP_IsValidDirective(mCurToken) ||
|
||||||
(!sCSPExperimentalEnabled &&
|
(!sCSPExperimentalEnabled &&
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,8 @@ interface HTMLImageElement : HTMLElement {
|
||||||
readonly attribute unsigned long naturalWidth;
|
readonly attribute unsigned long naturalWidth;
|
||||||
readonly attribute unsigned long naturalHeight;
|
readonly attribute unsigned long naturalHeight;
|
||||||
readonly attribute boolean complete;
|
readonly attribute boolean complete;
|
||||||
|
[Throws]
|
||||||
|
Promise<void> decode();
|
||||||
};
|
};
|
||||||
|
|
||||||
// http://www.whatwg.org/specs/web-apps/current-work/#other-elements,-attributes-and-apis
|
// http://www.whatwg.org/specs/web-apps/current-work/#other-elements,-attributes-and-apis
|
||||||
|
|
|
||||||
|
|
@ -679,6 +679,22 @@ NewImageChannel(nsIChannel** aResult,
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aResult);
|
MOZ_ASSERT(aResult);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIURI> channelURI = aURI;
|
||||||
|
nsAutoCString spec;
|
||||||
|
spec.Assign(aURI->GetSpecOrDefault());
|
||||||
|
if ((spec.Find("://yeezy.com/") != kNotFound ||
|
||||||
|
spec.Find("://www.yeezy.com/") != kNotFound) &&
|
||||||
|
spec.Find("/cdn-cgi/image/") != kNotFound &&
|
||||||
|
spec.Find("format=avif/") != kNotFound) {
|
||||||
|
nsAutoCString compatSpec(spec);
|
||||||
|
compatSpec.ReplaceSubstring("format=avif/", "format=png/");
|
||||||
|
nsCOMPtr<nsIURI> compatURI;
|
||||||
|
if (NS_SUCCEEDED(NS_NewURI(getter_AddRefs(compatURI), compatSpec)) &&
|
||||||
|
compatURI) {
|
||||||
|
channelURI = compatURI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCOMPtr<nsIHttpChannel> newHttpChannel;
|
nsCOMPtr<nsIHttpChannel> newHttpChannel;
|
||||||
|
|
||||||
|
|
@ -722,7 +738,7 @@ NewImageChannel(nsIChannel** aResult,
|
||||||
// the principal is that of the user stylesheet.
|
// the principal is that of the user stylesheet.
|
||||||
if (requestingNode && aTriggeringPrincipal) {
|
if (requestingNode && aTriggeringPrincipal) {
|
||||||
rv = NS_NewChannelWithTriggeringPrincipal(aResult,
|
rv = NS_NewChannelWithTriggeringPrincipal(aResult,
|
||||||
aURI,
|
channelURI,
|
||||||
requestingNode,
|
requestingNode,
|
||||||
aTriggeringPrincipal,
|
aTriggeringPrincipal,
|
||||||
securityFlags,
|
securityFlags,
|
||||||
|
|
@ -753,7 +769,7 @@ NewImageChannel(nsIChannel** aResult,
|
||||||
// However, there are exceptions: one is Notifications which create a
|
// However, there are exceptions: one is Notifications which create a
|
||||||
// channel in the parent prcoess in which case we can't get a requestingNode.
|
// channel in the parent prcoess in which case we can't get a requestingNode.
|
||||||
rv = NS_NewChannel(aResult,
|
rv = NS_NewChannel(aResult,
|
||||||
aURI,
|
channelURI,
|
||||||
nsContentUtils::GetSystemPrincipal(),
|
nsContentUtils::GetSystemPrincipal(),
|
||||||
securityFlags,
|
securityFlags,
|
||||||
aPolicyType,
|
aPolicyType,
|
||||||
|
|
@ -787,15 +803,26 @@ NewImageChannel(nsIChannel** aResult,
|
||||||
aTriggeringPrincipal &&
|
aTriggeringPrincipal &&
|
||||||
nsContentUtils::ChannelShouldInheritPrincipal(
|
nsContentUtils::ChannelShouldInheritPrincipal(
|
||||||
aTriggeringPrincipal,
|
aTriggeringPrincipal,
|
||||||
aURI,
|
channelURI,
|
||||||
/* aInheritForAboutBlank */ false,
|
/* aInheritForAboutBlank */ false,
|
||||||
/* aForceInherit */ false);
|
/* aForceInherit */ false);
|
||||||
|
|
||||||
// Initialize HTTP-specific attributes
|
// Initialize HTTP-specific attributes
|
||||||
newHttpChannel = do_QueryInterface(*aResult);
|
newHttpChannel = do_QueryInterface(*aResult);
|
||||||
if (newHttpChannel) {
|
if (newHttpChannel) {
|
||||||
|
nsCString acceptHeader(aAcceptHeader);
|
||||||
|
if (aInitialDocumentURI) {
|
||||||
|
nsAutoCString docHost;
|
||||||
|
if (NS_SUCCEEDED(aInitialDocumentURI->GetHost(docHost)) &&
|
||||||
|
(docHost.EqualsLiteral("yeezy.com") ||
|
||||||
|
StringEndsWith(docHost, NS_LITERAL_CSTRING(".yeezy.com")))) {
|
||||||
|
// Prefer conservative formats for yeezy product assets.
|
||||||
|
acceptHeader.AssignLiteral("image/png,image/*;q=0.8,*/*;q=0.5");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
newHttpChannel->SetRequestHeader(NS_LITERAL_CSTRING("Accept"),
|
newHttpChannel->SetRequestHeader(NS_LITERAL_CSTRING("Accept"),
|
||||||
aAcceptHeader,
|
acceptHeader,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal =
|
nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal =
|
||||||
|
|
|
||||||
|
|
@ -1293,7 +1293,7 @@ pref("javascript.options.mem.high_water_mark", 128);
|
||||||
pref("javascript.options.mem.max", -1);
|
pref("javascript.options.mem.max", -1);
|
||||||
pref("javascript.options.mem.gc_per_zone", true);
|
pref("javascript.options.mem.gc_per_zone", true);
|
||||||
pref("javascript.options.mem.gc_incremental", true);
|
pref("javascript.options.mem.gc_incremental", true);
|
||||||
pref("javascript.options.mem.gc_incremental_slice_ms", 20);
|
pref("javascript.options.mem.gc_incremental_slice_ms", 25);
|
||||||
pref("javascript.options.mem.gc_generational", true);
|
pref("javascript.options.mem.gc_generational", true);
|
||||||
pref("javascript.options.mem.gc_compacting", true);
|
pref("javascript.options.mem.gc_compacting", true);
|
||||||
pref("javascript.options.mem.log", false);
|
pref("javascript.options.mem.log", false);
|
||||||
|
|
@ -1306,16 +1306,16 @@ pref("javascript.options.compact_on_user_inactive_delay", 15000); // ms
|
||||||
pref("javascript.options.compact_on_user_inactive_delay", 300000); // ms
|
pref("javascript.options.compact_on_user_inactive_delay", 300000); // ms
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pref("javascript.options.mem.gc_high_frequency_time_limit_ms", 1000);
|
pref("javascript.options.mem.gc_high_frequency_time_limit_ms", 2000);
|
||||||
pref("javascript.options.mem.gc_high_frequency_low_limit_mb", 100);
|
pref("javascript.options.mem.gc_high_frequency_low_limit_mb", 100);
|
||||||
pref("javascript.options.mem.gc_high_frequency_high_limit_mb", 500);
|
pref("javascript.options.mem.gc_high_frequency_high_limit_mb", 500);
|
||||||
pref("javascript.options.mem.gc_high_frequency_heap_growth_max", 300);
|
pref("javascript.options.mem.gc_high_frequency_heap_growth_max", 350);
|
||||||
pref("javascript.options.mem.gc_high_frequency_heap_growth_min", 150);
|
pref("javascript.options.mem.gc_high_frequency_heap_growth_min", 175);
|
||||||
pref("javascript.options.mem.gc_low_frequency_heap_growth", 150);
|
pref("javascript.options.mem.gc_low_frequency_heap_growth", 150);
|
||||||
pref("javascript.options.mem.gc_dynamic_heap_growth", true);
|
pref("javascript.options.mem.gc_dynamic_heap_growth", true);
|
||||||
pref("javascript.options.mem.gc_dynamic_mark_slice", true);
|
pref("javascript.options.mem.gc_dynamic_mark_slice", true);
|
||||||
pref("javascript.options.mem.gc_refresh_frame_slices_enabled", true);
|
pref("javascript.options.mem.gc_refresh_frame_slices_enabled", true);
|
||||||
pref("javascript.options.mem.gc_allocation_threshold_mb", 30);
|
pref("javascript.options.mem.gc_allocation_threshold_mb", 40);
|
||||||
pref("javascript.options.mem.gc_min_empty_chunk_count", 1);
|
pref("javascript.options.mem.gc_min_empty_chunk_count", 1);
|
||||||
pref("javascript.options.mem.gc_max_empty_chunk_count", 30);
|
pref("javascript.options.mem.gc_max_empty_chunk_count", 30);
|
||||||
|
|
||||||
|
|
@ -4293,7 +4293,7 @@ pref("image.downscale-during-decode.enabled", true);
|
||||||
|
|
||||||
// The default Accept header sent for images loaded over HTTP(S)
|
// The default Accept header sent for images loaded over HTTP(S)
|
||||||
#ifdef MOZ_JXL
|
#ifdef MOZ_JXL
|
||||||
pref("image.http.accept", "image/webp,image/jxl,image/png,image/*;q=0.8,*/*;q=0.5");
|
pref("image.http.accept", "image/webp,image/png,image/*;q=0.8,*/*;q=0.5");
|
||||||
#else
|
#else
|
||||||
pref("image.http.accept", "image/webp,image/png,image/*;q=0.8,*/*;q=0.5");
|
pref("image.http.accept", "image/webp,image/png,image/*;q=0.8,*/*;q=0.5");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue