Repository navigation
Generated sizes attribute can contain duplicate max-width conditions #1113
Description
Status (2026-10-11)
Fixed in PR #1177 (bugfix/1111 → development, approved by pirate-bot at 13fb6a0d). The PR fixes #1111 and #1113 together; they come from the same value.
- Fix: The
sizesattribute now gets onemax-widthcondition per breakpoint. The 2x entry used its doubled width as a second slot for the same breakpoint; both entries now use the CSS width, so the duplicate is dropped. - Scope: only sites with Retina images on, and only profiler-generated 2x candidates. Stored profiles are corrected too, with no JS change.
- Tests: two new tests in
tests/test-srcset.php, failing ondevelopment. - Not proven: the pixel size the live CDN delivers (the multiplier is taken from the plugin's own
dpr:2/2xusage).
Summary
With Retina Quality enabled, Optimole can emit multiple sizes clauses using the same max-width condition but different slot widths. Each breakpoint is expected to have an unambiguous effective slot declaration. Because only the first matching condition participates in browser selection, later duplicates are unreachable and can leave the browser using an unintended slot width.
Customer context
Product / area: Optimole page profiler and generated sizes attributes
Version: Customer version not provided; inspected source is v4.2.10
Environment: Responsive WordPress frontend with Retina Quality enabled
Integration / third party: Browser responsive-image selection
Reported error / symptom: Duplicate conditions such as two max-width: 768px entries
Impact: Conflicting responsive-image metadata can cause unintended candidate selection and oversized downloads.
Reproduction notes
Confirmed by direct code inspection and by support's inspection of the reported output; no local browser reproduction was performed.
- Enable Retina Quality for an image eligible for page-profiler-generated responsive candidates.
- Allow both 1x and 2x candidates for one breakpoint to survive candidate selection and filtering.
- Inspect the generated
sizesattribute on a later rendered response. - Observe repeated conditions such as
(max-width: 768px)paired with different slot widths.
Diagnosis
Conclusion
The profiler generates 1x and 2x resource candidates for the same breakpoint, multiplies each candidate's width by DPR, and carries both into PHP. PHP then uses each resource width as the CSS slot width for that shared breakpoint. Deduplication compares complete strings, so clauses with the same condition and different widths remain. The behavior is deterministic when both density candidates survive selection and filtering.
Where this likely occurs
assets/js/modules/srcset-detector.js—optmlSrcsetDetector._generateResponsiveSizes()lines 419–460 iterates both DPR multipliers for each breakpoint and assigns the same breakpoint to differently scaled widths.assets/js/modules/srcset-detector.js—optmlSrcsetDetector._selectBestVariations()lines 531–585 intentionally retains selected 1x and 2x entries and deduplicates by resource width rather than breakpoint.inc/tag_replacer.php—Optml_Tag_Replacer::add_missing_srcset_attributes()lines 487–517 creates asizesclause from every retained candidate using the DPR-scaled width.inc/tag_replacer.php—Optml_Tag_Replacer::add_missing_srcset_attributes()lines 553–578 appliesarray_unique()to complete clause strings, preserving same-breakpoint clauses with different widths.inc/tag_replacer.php—Optml_Tag_Replacer::enhance_existing_sizes()lines 647–676 has the same complete-string deduplication behavior when extending an existing simplesizesvalue.- Commits
8ab74741721cand49a757f34fd1introduced the relevant profiler and generation path; the behavior remains in inspected v4.2.10.
Engineering notes
The path is primarily reachable with Retina Quality enabled because add_missing_srcset_attributes() filters out entries with DPR greater than one when the setting is disabled. Both candidates also have to survive natural-dimension validation, the variation limit, and container filtering. The duplicate clauses represent resource-density alternatives as CSS slot alternatives, although a sizes media list resolves the first matching condition rather than selecting among conditions by DPR.
Test coverage status
tests/test-srcset.php lines 112–169 and 211–224 cover distinct breakpoints only. assets/js/modules/__tests__/srcset-detector.test.js covers retention of 1x and 2x candidates but does not inspect rendered same-breakpoint sizes clauses. No relevant test found during inspection supplies density variants sharing a breakpoint and checks condition uniqueness. Tests were not executed during this read-only investigation.
What to verify or explore next
- Reproduce with Retina Quality enabled and an image large enough for both density candidates to survive validation.
- Inspect generated
sizesoutput for repeated media conditions and record which clause appears first. - Compare selected resources before and after profile data is stored.
- Run the targeted PHP srcset suite and JavaScript
srcset-detectorsuite across images with and without existing simplesizesattributes.
Unknowns / follow-up
The exact ordering observed on the customer's page and the customer plugin version are unknown.
Confidence
Confidence: 97/100
Repository inspection confirms three independently verifiable defects in Optimole's page-profiler responsive-image path, and no matching GitHub issues were found. The reported Retina-disabled 1x behavior is intentional setting behavior covered by tests, so it is not included as a defect.
Source: HelpScout #3424946418
Generated by bug-report-triage (ID: bug-report-triage_6a87087cc5e402.90677248)
Activity
milicavs commentedon Oct 11, 2026
🧪 QA steps and test sandbox
With Retina images on, the
sizesattribute Optimole adds to profiled images lists the same screen width twice with two different image widths, for example(max-width: 768px) 412px, (max-width: 768px) 824px. Browsers only use the first match, so the second entry is dead weight and the image size the browser picks can be wrong.Requires: your own Optimole account (API key), since Optimole only rewrites images on a connected site.
13fb6a0On the sandbox:
debug.log, which the public site can't read.Reproduce on Optimole 4.2.16:
/?pagename=retina-teston a desktop browser and wait a few seconds, so Optimole profiles the page.sizesattribute of an image that got a generatedsrcset.(max-width: …px)condition appears twice, once with a width and once with double that width.(max-width: …px)condition appears once, with the smaller (CSS) width.Verify the fix on the same sandbox:
Edge cases
sizeshas one condition per breakpoint, same as before.srcsetstill lists both the 1x and the 2x candidate for each breakpoint.sizeswithout re-profiling.sizesattribute: it still renders, with no duplicate conditions added.Fix: #1177 (open, also fixes #1111)
pirate-bot commentedon Oct 11, 2026
QA agent — 🟢 Passing checks · Retina sizes are deduplicated, including profiles saved before the update.
Using a seeded connected account and local image delivery, the Retina setting survived save and reload. Fresh and pre-update profiles produced unique CSS-width clauses and correct Retina URL dimensions; the base build reproduced the duplicates. Retina-off output kept only 1x candidates, and the edge matrix passed. Both added tests passed on the candidate and failed on the base. Live CDN pixel dimensions were not verified.
Worth a human look
Checks (5 passed)
Full report, evidence and session trail