@@ -698,11 +698,10 @@ function get_line_scrollbar(runtype) {
698
698
let w = ( window . innerWidth - vw )
699
699
let pseudoW = getElementProp ( "#D" , "content" , ":before" )
700
700
if ( pseudoW !== "x" ) {
701
- pseudoW = pseudoW * 1
702
- w = pseudoW - vw
701
+ if ( pseudoW == w - 1 ) { pseudoW = w } // allow for min-
702
+ w = ( pseudoW * 1 ) - vw
703
703
}
704
704
let wZoom = w
705
-
706
705
// section metric
707
706
if ( w > 0 ) { dScrollbar = "not zero" } else { dScrollbar = "zero" }
708
707
@@ -1663,12 +1662,10 @@ function get_resources() {
1663
1662
}
1664
1663
1665
1664
function get_screen_metrics ( runtype ) {
1666
- let t0 = performance . now ( ) ,
1667
- res = [ ]
1665
+ let res = [ ]
1668
1666
1669
1667
//trap resize event
1670
1668
if ( runtype !== "load" && runtype !== "screen" ) { runtype = "resize" }
1671
-
1672
1669
// this triggers zoom/viewport when not page load
1673
1670
// but ignore viewport on resize: which is called by scrollbar
1674
1671
// nothing else needs to wait here for any results
@@ -1681,13 +1678,12 @@ function get_screen_metrics(runtype) {
1681
1678
}
1682
1679
} )
1683
1680
}
1684
-
1685
- // temp so I can see the new viewport/scrollbar
1681
+ // resize to auto-update lineheight/scrollbar
1686
1682
if ( runtype == "resize" ) {
1687
1683
get_line_scrollbar ( "resize" )
1688
1684
}
1689
1685
1690
- // measure
1686
+ // MEASURE: ToDo: catch errors
1691
1687
let w1 = screen . width , h1 = screen . height ,
1692
1688
w2 = screen . availWidth , h2 = screen . availHeight ,
1693
1689
w3 = window . outerWidth , h3 = window . outerHeight ,
@@ -1696,92 +1692,32 @@ function get_screen_metrics(runtype) {
1696
1692
p3 = screen . availLeft , p4 = screen . availTop ,
1697
1693
p5 = window . screenX , p6 = window . screenY ,
1698
1694
p7 = window . mozInnerScreenX , p8 = window . mozInnerScreenY
1699
-
1700
- let innerW = getElementProp ( "#D" , "content" , ":before" ) ,
1701
- innerH = getElementProp ( "#D" , "content" , ":after" )
1702
- if ( innerW !== "x" && innerH !== "x" ) {
1703
- innerW = innerW * 1
1704
- innerH = innerH . slice ( 3 ) * 1
1705
- if ( innerW !== w || innerH !== h ) {
1706
- w = innerW
1707
- h = innerH
1708
- if ( gRun ) {
1709
- gLiesKnown . push ( "screen:inner window" )
1710
- gLiesBypassed . push ( "screen:inner window:" + w + " x " + h )
1711
- }
1712
- }
1713
- }
1714
-
1715
- let screenW = getElementProp ( "#S" , "content" , ":before" ) ,
1716
- screenH = getElementProp ( "#S" , "content" , ":after" )
1717
- if ( screenW !== "x" && screenH !== "x" ) {
1718
- screenW = screenW * 1
1719
- screenH = screenH . slice ( 3 ) * 1
1720
- if ( screenW !== w1 || screenH !== h1 ) {
1721
- w1 = screenW
1722
- h1 = screenH
1723
- if ( gRun ) {
1724
- gLiesKnown . push ( "screen:screen" )
1725
- gLiesBypassed . push ( "screen:screen:" + w1 + " x " + h1 )
1726
- }
1727
- }
1728
- }
1695
+ // temp lies
1696
+ //w1 = 1920; h1 = 1080
1697
+ //w2 = 1920, h2 = 1080,
1698
+ //w3 = 1920, h3 = 1080,
1699
+ //w = 1920; h = 1080
1729
1700
1730
1701
let mInner = w + " x " + h ,
1731
1702
mOuter = w3 + " x " + h3 ,
1732
1703
mScreen = w1 + " x " + h1 ,
1733
1704
mAvailable = w2 + " x " + h2
1705
+ //console.debug("reported", mInner, mScreen)
1734
1706
1707
+ // DISPLAY
1735
1708
dom . ScrRes = mScreen + " (" + p1 + "," + p2 + ")"
1736
1709
dom . ScrAvail = mAvailable + " (" + p3 + "," + p4 + ")"
1737
1710
dom . WndOut = mOuter + " (" + p5 + "," + p6 + ")"
1738
-
1739
- // x/y
1740
- let items = [ p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 ] ,
1741
- isXY = true
1711
+ dom . WndIn . innerHTML = mInner + " (" + p7 + "," + p8 + ")"
1712
+ // NOTATE
1713
+ let items = [ p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 ] , isXY = true
1742
1714
for ( let i = 0 ; i < items . length ; i ++ ) { if ( items [ i ] != 0 ) { isXY = false } }
1743
- // fs
1744
- let isFS = false
1745
- try { isFS = window . fullScreen ; dom . fsState = isFS } catch ( e ) { dom . fsState . innerHTML = zB0 }
1746
-
1747
- // section hash
1748
- // ToDo: needs better logic + prototype lie checks: e.g.
1749
- // if in FS all but available should be the same (ignore available)
1750
- // if not in FS all 4 values should be different?
1751
- if ( runtype == "load" || runtype == "screen" ) {
1752
- // make screen zoom resistant
1753
- let mScreen2 = ""
1754
- if ( isFF && Number . isInteger ( jsZoom ) && isOS !== "android" ) {
1755
- if ( jsZoom !== 100 ) {
1756
- if ( Number ( dpr2 ) !== NaN && Number ( dpr2 ) > 0 ) {
1757
- mScreen2 = 2 * Math . round ( ( w1 * dpr2 ) / 2 ) + " x " + 2 * Math . round ( ( h1 * dpr2 ) / 2 )
1758
- }
1759
- }
1760
- }
1761
- // note: FS would make these true
1762
- res . push ( "coordinates_zero:" + isXY )
1763
- let match = ( mScreen == mAvailable )
1764
- res . push ( "match_screen+available:" + match )
1765
- match = ( mInner == mOuter )
1766
- res . push ( "match_inner+outer:" + match )
1767
- match = ( mInner == mScreen )
1768
- res . push ( "match_inner+screen:" + match )
1769
-
1770
- // ToDo: improve (see above) and return screen + available screen
1771
- if ( isFS || mInner !== mScreen ) {
1772
- res . push ( "screen:" + ( mScreen2 == "" ? mScreen : mScreen2 ) )
1773
- } else {
1774
- res . push ( "screen:spoofed" )
1775
- }
1776
- }
1777
-
1778
- // RFP
1779
1715
if ( isFF ) {
1780
- // size
1716
+ // sizes
1781
1717
let m1 = true , m2 = true , r = "" , c = "#ff4f4f"
1782
- if ( w1 + "x" + h1 !== w2 + "x" + h2 ) { m1 = false }
1783
- else if ( w2 + "x" + h2 !== w3 + "x" + h3 ) { m1 = false }
1784
- else if ( w3 + "x" + h3 !== w + "x" + h ) { m1 = false }
1718
+ if ( mScreen !== mAvailable ) { m1 = false }
1719
+ else if ( mAvailable !== mOuter ) { m1 = false }
1720
+ else if ( mOuter !== mInner ) { m1 = false }
1785
1721
r = ( m1 ? sg : sb ) + "[sizes match x4]" + sc
1786
1722
// x/y
1787
1723
r += " +" + ( isXY ? sg : sb ) + "[0,0 x4]" + sc
@@ -1790,25 +1726,101 @@ function get_screen_metrics(runtype) {
1790
1726
if ( m1 && m2 ) { c = "#8cdc8c" }
1791
1727
items = document . getElementsByClassName ( "group" )
1792
1728
for ( let i = 0 ; i < items . length ; i ++ ) { items [ i ] . style . color = c }
1729
+ // inner: LB/NW
1730
+ if ( isOS !== "android" && jsZoom == 100 ) {
1731
+ dom . WndIn . innerHTML = mInner + " (" + p7 + "," + p8 + ")" + return_lb_nw ( w , h )
1732
+ }
1793
1733
}
1734
+ // THE REST
1735
+ get_orientation ( runtype ) // nothing stable
1736
+ get_mm_metrics ( runtype ) // not reliable due to extension APIs
1794
1737
1795
- // inner
1796
- let strTemp = w + " x " + h + " (" + p7 + "," + p8 + ")"
1797
- if ( isOS == "android" ) {
1798
- dom . WndIn = strTemp
1799
- } else {
1800
- // LB/NW
1801
- if ( isFF ) {
1802
- if ( jsZoom == 100 ) { strTemp += return_lb_nw ( w , h ) }
1738
+ // METRICS
1739
+ if ( runtype !== "resize" ) {
1740
+ // allow 1px less due to min-
1741
+ // inner
1742
+ let innerW = getElementProp ( "#D" , "content" , ":before" ) ,
1743
+ innerH = getElementProp ( "#D" , "content" , ":after" )
1744
+ if ( innerW !== "x" && innerH !== "x" ) {
1745
+ innerW = innerW * 1
1746
+ innerH = innerH . slice ( 3 ) * 1
1747
+ // round up 1px
1748
+ if ( innerW == w - 1 ) { innerW = w }
1749
+ if ( innerH == h - 1 ) { innerH = h }
1750
+ if ( innerW !== w || innerH !== h ) {
1751
+ if ( gRun ) {
1752
+ gLiesKnown . push ( "screen:inner window" )
1753
+ gLiesBypassed . push ( "screen:inner window:" + innerW + " x " + innerH )
1754
+ }
1755
+ }
1756
+ }
1757
+ // screen
1758
+ let screenW = getElementProp ( "#S" , "content" , ":before" ) ,
1759
+ screenH = getElementProp ( "#S" , "content" , ":after" ) ,
1760
+ screenBypass = false
1761
+ if ( screenW !== "x" && screenH !== "x" ) {
1762
+ screenW = screenW * 1
1763
+ screenH = screenH . slice ( 3 ) * 1
1764
+ // round up 1px: helps 100%-zoom recalc
1765
+ if ( screenW == w1 - 1 ) { screenW = w1 }
1766
+ if ( screenH == h1 - 1 ) { screenH = h1 }
1767
+ if ( screenW !== w1 || screenH !== h1 ) {
1768
+ screenBypass = true
1769
+ w1 = screenW
1770
+ h1 = screenH
1771
+ mScreen = w1 + " x " + h1
1772
+ if ( gRun ) { gLiesKnown . push ( "screen:screen" ) }
1773
+ }
1774
+ }
1775
+ // debug missing ranges
1776
+ //console.debug(jsZoom+ "%", innerW, innerH, screenW, screenH)
1777
+
1778
+ // ToDo: HARDEN: due to zoom and limited ranges: often a css pseudo value can be invalid
1779
+ // since this is excluded in resize events, we can afford to spend some perf to
1780
+ // inject bisecting css rules
1781
+
1782
+ // FS
1783
+ let isFS = false
1784
+ try { isFS = window . fullScreen ; dom . fsState = isFS } catch ( e ) { dom . fsState . innerHTML = zB0 }
1785
+ // calc screen at 100%
1786
+ if ( isFF && Number . isInteger ( jsZoom ) && isOS !== "android" ) {
1787
+ if ( jsZoom !== 100 ) {
1788
+ if ( Number ( dpr2 ) !== NaN && Number ( dpr2 ) > 0 ) {
1789
+ let w100 = 2 * Math . round ( ( w1 * dpr2 ) / 2 )
1790
+ let h100 = 2 * Math . round ( ( h1 * dpr2 ) / 2 )
1791
+ // rounding fixups
1792
+ let common = [ 360 , 600 , 640 , 720 , 768 , 800 , 810 , 834 , 864 , 900 , 1024 , 1050 , 1080 , 1112 , 1152 , 1200 , 1280 , 1360 , 1366 , 1440 , 1536 , 1600 , 1680 , 1920 , 2048 , 2560 , ]
1793
+ for ( let i = 0 ; i < common . length ; i ++ ) {
1794
+ let real = common [ i ]
1795
+ if ( w100 >= real - 2 && w100 <= real + 2 ) {
1796
+ //if (w100 !== real) {console.debug("changed width", w100, "to", real, jsZoom +"%")} // temp debug
1797
+ w100 = real
1798
+ }
1799
+ if ( h100 >= real - 2 && h100 <= real + 2 ) {
1800
+ //if (h100 !== real) {console.debug("changed height", h100, "to", real, jsZoom +"%")} // temp debug
1801
+ h100 = real
1802
+ }
1803
+ }
1804
+ mScreen = w100 + " x " + h100
1805
+ //console.debug("recalculated 100% zoom screen", mScreen)
1806
+ }
1807
+ }
1803
1808
}
1804
- dom . WndIn . innerHTML = strTemp
1805
- }
1806
- // the rest
1807
- get_orientation ( runtype )
1808
- get_mm_metrics ( runtype )
1809
1809
1810
- // section metrics
1811
- if ( runtype == "load" || runtype == "screen" ) {
1810
+ // metrics: don't let FS affect stability, no comparisons due to bypasses and recalc at 100% zoom
1811
+ res . push ( "coordinates_zero:" + isXY ) // FF: mozInnerScreenY is not zero at FS
1812
+ if ( screenBypass ) {
1813
+ // bypass
1814
+ res . push ( "screen:" + mScreen )
1815
+ if ( gRun ) { gLiesBypassed . push ( "screen:screen:" + mScreen ) }
1816
+ } else {
1817
+ // fall back to prototype
1818
+ let scrLies = false
1819
+ if ( protoLies . includes ( "Screen.width" ) ) { scrLies = true }
1820
+ if ( protoLies . includes ( "Screen.height" ) ) { scrLies = true }
1821
+ res . push ( "screen:" + ( scrLies ? "fake" : mScreen ) )
1822
+ }
1823
+ //console.debug("fullscreen:", jsZoom + " %", isFS, "\n - "+ sha1(res) + "\n - " + res.join("\n - "))
1812
1824
return ( res )
1813
1825
}
1814
1826
}
0 commit comments