diff --git a/.cron.yml b/.cron.yml index 79fda171bdc1..cc00de71eaa8 100644 --- a/.cron.yml +++ b/.cron.yml @@ -7,7 +7,6 @@ jobs: job: type: decision-task treeherder-symbol: Nd - triggered-by: nightly target-tasks-method: nightly_linux run-on-projects: - mozilla-central @@ -25,7 +24,6 @@ jobs: job: type: decision-task treeherder-symbol: Nd-OSX - triggered-by: nightly target-tasks-method: nightly_macosx run-on-projects: - date @@ -35,7 +33,6 @@ jobs: job: type: decision-task treeherder-symbol: Nd-Win64 - triggered-by: nightly target-tasks-method: nightly_win64 run-on-projects: - date @@ -45,7 +42,6 @@ jobs: job: type: decision-task treeherder-symbol: Na - triggered-by: nightly target-tasks-method: nightly_fennec run-on-projects: - mozilla-central diff --git a/.eslintignore b/.eslintignore index 1d23b919c616..bf90515d6887 100644 --- a/.eslintignore +++ b/.eslintignore @@ -217,6 +217,7 @@ dom/messagechannel/** dom/network/** dom/notification/** dom/offline/** +dom/payments/** dom/performance/** dom/permission/** dom/plugins/** diff --git a/browser/app/blocklist.xml b/browser/app/blocklist.xml index ba7321d391bf..3d49c0e75816 100644 --- a/browser/app/blocklist.xml +++ b/browser/app/blocklist.xml @@ -1,5 +1,5 @@ - + @@ -48,6 +48,10 @@ + + + + app.update.auto @@ -57,30 +61,26 @@ - - - - - - - - - + - + + + + + browser.startup.homepage @@ -88,15 +88,15 @@ - - - - + + + + @@ -105,14 +105,14 @@ - - - - + + + + @@ -189,6 +189,10 @@ + + + + @@ -197,32 +201,28 @@ - - - - - - - - browser.search.defaultenginename - + - + + + + + @@ -235,10 +235,6 @@ - - - - @@ -247,6 +243,10 @@ + + + + @@ -295,14 +295,14 @@ - - - - + + + + @@ -315,17 +315,17 @@ - + - + - + - + @@ -343,17 +343,17 @@ - + - + - + - + @@ -376,10 +376,6 @@ - - - - @@ -388,6 +384,10 @@ + + + + @@ -456,10 +456,6 @@ - - - - @@ -468,11 +464,7 @@ - - - - - + @@ -480,9 +472,13 @@ - + - + + + + + @@ -491,6 +487,10 @@ + + + + @@ -537,7 +537,7 @@ - + @@ -545,17 +545,17 @@ - + - + - + - + @@ -596,11 +596,11 @@ - + - + @@ -610,6 +610,10 @@ + + + + security.csp.enable @@ -618,10 +622,6 @@ - - - - @@ -650,23 +650,23 @@ - - - - + + + + - + - + @@ -682,11 +682,11 @@ - + - + @@ -698,17 +698,17 @@ - + - + - + - + @@ -722,15 +722,19 @@ - + - + - + + + + + @@ -738,10 +742,6 @@ - - - - @@ -750,6 +750,10 @@ + + + + @@ -758,10 +762,6 @@ - - - - @@ -782,14 +782,14 @@ - - - - + + + + @@ -807,10 +807,6 @@ - - - - browser.startup.homepage @@ -818,14 +814,14 @@ + + + + - - - - @@ -834,6 +830,10 @@ + + + + @@ -855,13 +855,17 @@ + + + + browser.startup.homepage - + @@ -869,24 +873,11 @@ - - - - - - - - - - - - - - + @@ -894,6 +885,19 @@ + + + + + + + + + + + + + @@ -902,10 +906,6 @@ - - - - @@ -929,14 +929,14 @@ - - - - + + + + @@ -945,11 +945,11 @@ - + - + @@ -961,6 +961,10 @@ + + + + @@ -969,14 +973,14 @@ - - - - + + + + @@ -985,10 +989,6 @@ - - - - @@ -1009,11 +1009,19 @@ + + + + - + + + + + @@ -1021,22 +1029,10 @@ - - - - - - - - - - - - @@ -1045,6 +1041,14 @@ + + + + + + + + browser.startup.homepage @@ -1052,19 +1056,19 @@ - + - + - + - + @@ -1075,10 +1079,6 @@ - - - - browser.startup.homepage @@ -1086,13 +1086,6 @@ - - - browser.startup.homepage - browser.search.defaultenginename - - - @@ -1102,11 +1095,14 @@ - - + + + browser.startup.homepage + browser.search.defaultenginename + - + @@ -1114,14 +1110,14 @@ + + + + - - - - @@ -1130,6 +1126,10 @@ + + + + @@ -1138,25 +1138,25 @@ - - - browser.startup.homepage - browser.search.defaultenginename - - + + + - - - - + + + browser.startup.homepage + browser.search.defaultenginename + + + @@ -1196,13 +1196,6 @@ - - - browser.startup.homepage - browser.search.defaultenginename - - - @@ -1211,6 +1204,13 @@ + + + browser.startup.homepage + browser.search.defaultenginename + + + @@ -1227,19 +1227,15 @@ - - - - - + - + - + @@ -1250,6 +1246,10 @@ + + + + @@ -1306,6 +1306,10 @@ + + + + @@ -1314,10 +1318,6 @@ - - - - @@ -1334,11 +1334,11 @@ - + - + @@ -1358,6 +1358,10 @@ + + + + @@ -1366,10 +1370,6 @@ - - - - @@ -1406,14 +1406,14 @@ - - - - + + + + @@ -1422,14 +1422,14 @@ - - - - + + + + @@ -1468,15 +1468,11 @@ - - - - - + @@ -1484,6 +1480,10 @@ + + + + @@ -1512,11 +1512,11 @@ - + - + @@ -1548,13 +1548,17 @@ + + + + - + - + @@ -1564,10 +1568,6 @@ - - - - @@ -1627,11 +1627,11 @@ - + - + @@ -1675,14 +1675,14 @@ - - - - + + + + @@ -1765,14 +1765,14 @@ - - - - + + + + @@ -1785,6 +1785,10 @@ + + + + @@ -1793,10 +1797,6 @@ - - - - @@ -1873,6 +1873,10 @@ + + + + @@ -1881,7 +1885,7 @@ - + @@ -1889,10 +1893,6 @@ - - - - @@ -1901,11 +1901,11 @@ - + - + @@ -1932,10 +1932,6 @@ - - - - @@ -1944,10 +1940,18 @@ + + + + + + + + @@ -1956,10 +1960,6 @@ - - - - @@ -1980,14 +1980,14 @@ - - - - + + + + @@ -2004,10 +2004,6 @@ - - - - @@ -2016,6 +2012,10 @@ + + + + @@ -3602,1166 +3602,1166 @@ - - L79XLVO2ZmtAu7FAG8Wmzw== - - - Ermw0Q== - - - fWK0j/Vi8vNWg3VAGjc02w== - - - ESCLRVuhcUZaluIgIVlRJx+O - - - ESDDtMgFFiaUfKo7HD9qImM7 - - - TurPPI6eivtNeGYdM0ZWXQ== - - - Hwexgn/ZCJicZPcsIyI8zxQ= - - - Aw== - - - YNOos6YJoPC77qwSGCpb7w== - - - Bydrxg== - - - DHmmaw== - - - STMAFQ== - - Nbc68Q8EHza72P/hSWcddw== - - - Bw== - - - a9/VeyVWrzFD7rM2PEHwQA== - - - dItWlz2V62Philqj9m6Pbg== - - - AN9bfYOvlR1t - - - EA== + RH7WhshwXRK6f0VfOfjXgQ== - BAAAAAABJ/v3ZwA= - - - STMAjg== - - - frj5jTuqBnQ4fljPvVU3KA== - - - AMs= - - - BAAAAAABFqoAZoI= - - - GN2Hrh9LtnM= - - - ByembA== - - - 45KI4WIxyXfNrdtdj7C6 - - - BAAAAAABI54PryQ= - - - CeFU2w== - - - ATFEdg== - - - KjoVfZ3by6+pL8fssyfM6A== - - - RnQ3dg5KdDZs0nyFZk4= - - - BwImeaRkSZQLYwFREwKo3R1Jn+8= - - - ESCis569omrbb20yySF39+aE - - - CLc= - - - eLumDUO40KwnecZLJxFM2A== - - - XhcFm2g619rt8Sro+a4rHA== - - - fbsHfUkagQtznc3rtY1uDg== - - - ESBqoILo90ntDW7OTK43MS2F - - - BYyEX2b5+K+myAIR7eXaRQ== - - - BAAAAAABLF5/Gog= - - - TA6BjA== - - - CqnbFQ== - - - BAAAAAABMYnGRuw= - - - WD1AyQAAAAAAJQ== - - - AJBQSPqrEvDE2Hz8xH39Low= - - - IyIVazG4RE9AERkb+ekH8w== - - - EM8bDLBnnoYe4LnWpLIhS4esr3I= - - - BydeGg== - - - Bg== - - - Cfk9oA== - - - BAAAAAABHJRKMpA= - - - Sx51x7V8pYe8rp7PMP/3qg== - - - FQ== - - - BAAAAAABAJmPjfQ= - - - Er0moq4zwH8ke2pYafIKdg== - - - BAAAAAABHkSl7L4= - - - BydiAg== - - - Eg== - - - Cj0= - - - Bydxog== - - - BAAAAAABHkSl5ao= - - - MABJSw== - - - ESCVop+Q4/OBgtf4WJkr01Gh - - - Pgyeh2mqlVzqI9hFntRbUQ== - - - ByfDtA== - - - Gd/pPu+qLnXUdvP9sW73CQ== - - - F5Bg6C237Q== - - - ESByYNtAIfizf2L3NMzCH8zZ - - - Ai7cBJYqBE0I9NdyoZfRrw== - - - AImQERVYPoeb - - - GpO48aJ8GngtwECqZhm/xA== - - - CdYL9vSQCEKzBwjO10ud2w== - - - BYOGvG32ukb1Yxj2oKoFyw== - - - a12RvBNhznU= - - - AKrMYlJmUUin8FOM/0TJrmk= - - - RUT1Gehd1KKYPfqOlgspoQ== - - - KuzHPJLdK5hNgJRo3R47Ag== - - - WJ2qHzWUqTk= - - - AQAAAAQ= - - - OE4/d+p3YRzzcSl+kmZ8Mw== - - - Byc85g== - - - BAAAAAABRE7wRk4= - - - ByeQ9g== - - - OYBKgxEHpW/8XGAGAlvJyMA= - - - bzTw0uq05TUYEGS98bh0Ww== - - - EEpERSryZFMagbsNw/WoWQ== - - - A4w= - - - Aw== - - - CSU= - - - BAAAAAABHkSHlSo= - - - QDi5sA== - - - Bydp0g== - - - BAAAAAABM6d3Z0s= - - - APt5i5rs4dIIQPwZdk9/ISc= - - - CjM= - - - BAAAAAABGMG0Gmw= - - - BAAAAAABHkSl6Co= - - - CWhp - - - cDggUYfwJ3A1YcdoeT6s4A== - - - CrTHPEE6AZSfI3jysin2bA== - - - ATE3ew== - - - BAAAAAABL07hTcY= - - - E5I2y6sIonl4a+TmlXc7fw== - - - VBSf+IncsTB3RZS4KFCJPQ== - - - DA== - - - YR0zGQAAAAAAAw== - - - UVKsEezpGWOVQ4W9esstng== - - - Ikdj3zYXXGsC/Afm9Tvx+g== - - - BAAAAAABHkSl6mw= - - - QDi5sQ== - - - BAAAAAABCUVQ9No= - - - BydSYg== - - - U4P1tUoxl/XkztlVHdtdgw== - - - ByfHkw== - - - TqfXw+FkhxfVgE9GVMgjWQ== - - - CMNfzETd7XxesS9FOUj9Mg== - - - YRJNfMoc12IpmW+Enpv3Pdo= - - - VfTSum25nb65YPlpuhJAvg== - - - UW3oKZKTDsrPy/rfwmGNaQ== - - - QAEy3RIAAAAAAAAMweH5dw== - - - AjpW - - - E77H6yvyFQjO0PcN3x0H+Q== - - - DL8= - - - B+U= - - - OUvvVscW0/NltofkmV9qmg== - - - EDQMI0tR4kSntv1O37N10g== - - - Cbssdw== - - - WX89jn8yGZVvoKTD9jDfRQ== - - - JV/LVzSKI/wsDgg3UuZHlA== - - - U+1Y1QpJc0FOR5JdCJ01gQ== - - - ESISuBo/wdW2tBztKmHdFCFz - - - NMpMcEnex3eXx4ohk9glcQ== - - - F6QlB/yX+A== - - - CgFBQgAAAUFcf/EVAAAAAg== - - - LizeWXFWP5pZPI/dLc+PVQ== - - - TrKEMhb2PKktH8lHg0AV5A== - - - GN2Hrh9LtnA= - - - AuhvPsYZfVP6UDsuyjeZ4Q== - - - cx0HrIEQg8JHWTP7DzOxSQ== - - - BAAAAAABJ/ufRdg= - - - FJl6tXgNpSg= - - - BAAAAAABIBnBjWg= - - - Fw== - - - F5BhE0zbgQ== - - - VLm3Xe60+1YgPpXCGtXLng== - - - e/fIfg2Dj2tkYIWVu2r82Cc= - - - Qh/O5w== - - - UMUwXwT1Z4juyQ/CNTf4mw== - - - QAAnEQ== - - - A4g= + BAAAAAABElatX7I= d8AtKymQwkOPDBj+hjPzFg== - - BAAAAAABJZbEU4I= - - - IIxFSyNM6mWtCgTG0IL3Og== - - - Ajp/ - - - Ew1ee9Jq7Q/Dig3ACF4V6Q== - - RVWTeb5EKqE7cy7MUD2oJ3M= - - - ORFgmCj072NjcJnrxOMfQA== - - - HxT1XSjIpzjMprp9Qu1gYQ== - - - BAAAAAABL07hUBg= - - - UoRGnb96CUDTxIqVry6LBg== - - - ESDYXNBhF+dePFjojs7u2vj1 - - - F5Bg+EziQQ== - - - Cfk9qg== - - - ATE0vw== - - - BydInw== - - - F7PAjw2k0dTX5escPnyVOBo= - - - Aa8e+91erglSMgsk/mtVaA== - - - TXxtAQ== - - - CskruA== - - - Ig== - - - U3SgRR3J+D6575WuCxuXeQ== - - - Cd/dug== - - - BAAAAAABAPpuVh0= - - - Byc68g== - - - SdegFrLaFTCsoMAW5ED+zA== - - - EAdmaA== - - - EQ== - - - BAAAAAABGMGjftY= - - - APdCebq8ZyZr/T0luxlicNw= - - - OfJBIhFwAdQ= - - - YUlF+VXF2FWFqCo472HfZlw= - - - BAAAAAABHkSHjz8= - - - BAAAAAABF2Tb8Bc= - - - BUrYjru5px1ym4QUN33TOQ== - - - IA== - - - RurwlgVMxeP6Zepun0LGZA== - - - SurdtfsuPcXXDpY2LkBpYO6BT7o= - - - ALxyZmb/WL/wAuUiPK5oK/g= - - - P6G7IYSL2RZxtzTh8I6qPA== - - - YR3YYQAAAAAABA== - - - BHk= + IHj3eiEK3K1Xrpu1uvtBuvE= ByfNeA== - - EqthLKdUgwI= - - - J8mznxvTvOR5p4Br3a3sm5j5iM0= - - - M64Z5ufZzDRVTHkJR1uXzw== - - - BydKkg== - - - OGPFrg== - - - LdbnCbsA9sOgI4mkUpWXPw== - - - e7wSpVxmgAS5/ioLi2iBIA== - - - Byemag== - - - FNISyWWTGi5Yco6fGh58/A== - - - cXXMzbWDHMIdCotb3h64yw== + + SurdtfsuPcXXDpY2LkBpYO6BT7o= - BAAAAAABA/A35EU= + BAAAAAABHkSHlSo= - - QZCrvA== + + VLm3Xe60+1YgPpXCGtXLng== - - BAAAAAABEAuMoRs= + + APt5i5rs4dIIQPwZdk9/ISc= - - Bye2Cg== - - - AJiWmg== - - - BQ== - - - BAAAAAABJpQ0AbA= - - - NTgf4iwIfeyJPIomw2dwSXEwtxQ= - - - AjqL - - - acI1CFIgmwSFBoU5+ahDgg== + + ESBrHE7sFC7CQ8EM681xA3CY - ESDu2nhlLPzfx+LYgjlYFP/k - - - buROL/l2GuXISv+/JVLkdA== - - - CqZgEvHAsnzkT//QV9KjXw== - - - HZyLf+K70FKc+jomm8DiDw== - - - Ew== + ESBqoILo90ntDW7OTK43MS2F - BAAAAAABKUXDqA8= - - - Qh/SnQ== - - - Xrr31RF0DoIzMKXS6XtD+g== - - - BAAAAAABCFiEp9s= - - - PAdKZPiaac2CvPxbOrsHOw== - - - a9rf7/BmG9JkKvRuy7J5QA== - - - QM1zZ4GZ4gfwpQtUYye3Ne0= - - - UbQGvw== - - - M0VSOewW3WI= - - - CcHC/g== - - - Xbevr3ut3Z9m1GuXC9SonA== - - - BAAAAAABKUXDqxw= - - - AQAAAAU= - - - Cfk9lw== - - - AIChpbGNqu4XKp9J70syKEs= - - - cJ+vg4742XhNgJW2ot9eIg== - - - QZBvapTZFvmYktEPsBYLQQ== - - - fMTRbGCp280pnyE/u53zbA== - - - ANX8SnNRxCmsE/GCl5hw+8A= - - - RFlmmjulj6Ve7PfBi44nnw== - - - XJ8pGvGNM9RIcLUG9YQjLQ== - - - Cyr1PA== - - - Gg== - - - DYifRdP6aQQ8MLbXZY2f5g== - - - CqL7CA== - - - UKKK5ol/rKBZchAAOnZjaA== - - - BAAAAAABLM/7qjk= - - - H08= - - - BAAAAAABKB/OGqI= - - - HNo1DR4XCe4mS1iUMsY6Wg== - - - Rvm2CEw2IC2Mu/ax0A46QQ== - - - ByfFnw== - - - F5BhENPfVw== - - - GN2Hrh9Ltm4= - - - UdNjvA== - - - Os2rnHWYhryvdOXfgan06A== - - - ESJJweWBPhoXAaB9c8SHwI4O - - - OhrtngFwotLcm4i+z00SjA== - - - BGU= - - - CcL+EA== - - - BAAAAAABJQcQRNU= - - - VOcIuNbTqkpOMUyI108FOg== - - - RnQ3dYovwvB0D5q2YGY= - - - TA5iEg== + BAAAAAABIBnBjWg= e0bEFhI16xx9U1yvlI56rA== - - L1fHogsVxmfMBka5q4uzaQ== - - - ezdAeCxKH7BFs7vn3byYaw== - - - HA== - - - AJiU+bpWh2Uc4xFRf8GM9yA= - - - AZ0= - - - CcHC1w== - - - UV9aaDeNRNtQuXjRYk4Skhg= - - - RdHgEmEIjdyRFWDRRlk= - - - AQw= - - - BAAAAAABK84yjs8= - - - FJl6tXgNpSk= - - - DjIvBkX+ECVbB/C3i6w2Gg== - - - BAAAAAAA+X/GIyk= - - - ESCC9oPNcRdPOox+SjWm9dTX - - - UU3AP1SMxmyhBFq7MRFZmf0= - - - ESDItX4ruWiLnrlz0rk4/bmz - - - BAAAAAABHhw1vwc= - - - BAAAAAABIg08D3U= - - - GN2Hrh9LtnI= - - - BAAAAAABJ/ufQg8= - - - QZCrvQ== - - - BAAAAAABMrS7t2g= - - - D9UltDPl4XVfSSqQOvdiwQ== - - - LTRcDHabRHU= + + cDggUYfwJ3A1YcdoeT6s4A== AUa47POQ1dN5 - - JLiDzgpL7oFNgJN+jIjt7w== + + RnQ3dg5KdDZs0nyFZk4= + + + BAAAAAABK84ykc0= + + + BAAAAAABL07hTcY= + + + BAAAAAABKUXDqxw= + + + D9UltDPl4XVfSSqQOvdiwQ== + + + BAAAAAABMYnGRuw= + + + DHmmaw== + + + A4w= + + + RFlmmjulj6Ve7PfBi44nnw== - Mq0P6o03FDk0B2bnJ+mYPGo= + YUlF+VXF2FWFqCo472HfZlw= - - ESAyW/JX3+hZIp44EAMlXU2b - - - Bydvrw== - - + Aw== - - GN2Hrh9Ltms= + + Bydp0g== - - Qh/QbQ== + + Ermwxw== - - DA== + + BAAAAAABL07hUBg= - - ZECgRdZEsns= + + A4g= + + + Pgyeh2mqlVzqI9hFntRbUQ== + + + CrTHPEE6AZSfI3jysin2bA== + + + Gg== + + + AJiWmg== + + + TA5iEg== + + + AN9bfYOvlR1t + + + BAAAAAABJZbEU4I= + + + CqL7CA== + + + BAAAAAABHhw1vwc= + + + ESJJweWBPhoXAaB9c8SHwI4O - AQAAAAM= + GN2Hrh9Ltm4= + + + e9JTGBe45yw= + + + UbQGvw== + + + P6G7IYSL2RZxtzTh8I6qPA== + + + Bydrxg== + + + BAAAAAABJQcQRNU= + + + RurwlgVMxeP6Zepun0LGZA== + + + AQAAAAU= + + + BAAAAAABAJmPjfQ= UUFV3S2cUidOOv7ESN65Ng== - Bydr0Q== - - - GdXz4L1b6FKNCMG9Jz2tjA== - - - BAAAAAABMxvC9bk= - - - TAA2G+UIK6mqznQKBT77NA== - - - RvCM2iRdkCE82ZOO2dU= - - - ESCyHU+xOECnh9Rf2IvgR8zS - - - ESByNJZ5TPjg9iZyL6a/h5Zx - - - fwAAAQAAAUrz/HmrAAAAAg== - - - BAAAAAABHkSl5AQ= - - - ByemaQ== - - - K1ftto7Xcb0YKwQ6uMvOIA== - - - BA== - - - L7tgs/W85vnhV7I7qJ6N/g== - - - Qh/SqA== - - - A9GPKQ8jv9oIxfwiOy7qxQ== - - - GtXUVojhwOTkaQ4bTKblEQ== - - - BAAAAAABIg08FMU= - - - ARQ= + Byc85g== - AQAAAAA= - - - BA== - - - COwoDFvz7GD8R2K7Lo0rYQ== - - - VN2yeFexyXjPf34fHGmbhg== - - - R4af5A== - - - BAAAAAABLF5/HXY= - - - Hnms0W0OxHSYE2F0XE97sw== - - - BAAAAAABBHYoIFs= - - - D/wZ7+m1Mv8SONSEFcs73w== - - - Byeaqw== - - - Ermwxw== - - - ESBrHE7sFC7CQ8EM681xA3CY - - - Rea7UUYH3jl33BryPIo= - - - eR1nUEz8k+nDSBD+bb5uIQ== - - - Ermwtg== - - - LAVIFm0MWZYH+Sv8Vf+IqkM= - - - STMAeg== - - - Byd5cg== - - - NvEJoRYL2yvAZrAjbDIipQ== - - - QDi5rw== - - - bAOrKSMsmA0MLJyAJ5BRsUM= - - - MABJTA== - - - Cw== - - - XLhHIg7vP+tWfRqvuKeAxw== - - - BAAAAAABJQdAjik= - - - JpUvYJyWjdGmeoH7YcYunw== - - - TA6EVg== - - - BAAAAAABHJRKNmk= + AQAAAAQ= - CeagHQ== - - - RH7WhshwXRK6f0VfOfjXgQ== - - - BAAAAAABJQcQQN0= - - - OnvXX72mvUI2Id/NMzegmg== + CcHC1w== - AjqK - - - DAk9hy8DhHSo+aQetvPB/fY= - - - ESD9YhzIEOwiOT7Nwip+E1KI - - - BXA= - - - By7fBTreouRwX/qrpgSUsg== - - - CSY= - - - F5Bg/C8eXg== - - - J2La+q+JOURNWkX60OP2lQ== - - - R/j2qA== - - - CdWFNw== - - - BAAAAAABElatX7I= - - - ESC8DawWRiAyEMd38UXbfgPR - - - BAAAAAABK84ykc0= - - - BAAAAAABHkSHki0= - - - e9JTGBe45yw= - - - AQAAAAI= + Ajp/ O2S99lVUxErLSk56GvWRv+E= - - OqQ2rV0ISTc308Z/oQgzFw== + + ARQ= - - Aw1SPC56593ZCZ9vCNHKwQ== + + CjM= - - JD1wxDd8IgmiqX7MyPPg1g== + + F5BhE0zbgQ== - - U3t2Vk8pfxTcaUPpIq0seQ== + + K1ftto7Xcb0YKwQ6uMvOIA== - - bx/XHJqcwxDOptxJ2lh5vw== + + UW3oKZKTDsrPy/rfwmGNaQ== - - LU4d0t7PAsZNgJGZcb+o/w== + + TA6BjA== - - LnfcUaXG/pxV2CpXM5+YSg== + + H08= - - sPNcCSE9Nkg3jy5IN1xe2Q== + + ESISuBo/wdW2tBztKmHdFCFz - - BAAAAAABCfhiO+s= - - - Ajp+ - - - ZgwfEqZnBsUNvNuZ77FbQA== - - - Iqpyf/YoGgvHc8HiDAxAI8o= - - - Jq6jgeApiT9O4W2Tx/NTRQ== - - - Iw== + + BAAAAAABFqoAZoI= - ANygrItIJ2rcKlyS3Lue07U= - - - ATFpsA== - - - IHj3eiEK3K1Xrpu1uvtBuvE= - - - cpqpXVWPk5AXzGw+zNIcBw== + R/j2qA== ESCEUbthDurBjJw0/h/FfuNY + + U3t2Vk8pfxTcaUPpIq0seQ== + + + Gd/pPu+qLnXUdvP9sW73CQ== + + + Byc68g== + + + BAAAAAABGMG0Gmw= + + + By7fBTreouRwX/qrpgSUsg== + + + ATFpsA== + + + QZCrvA== + + + a12RvBNhznU= + + + GN2Hrh9LtnI= + + + OhrtngFwotLcm4i+z00SjA== + + + Eg== + + + fwAAAQAAAUrz/HmrAAAAAg== + + + Bydxog== + + + GdXz4L1b6FKNCMG9Jz2tjA== + + + EA== + + + CqZgEvHAsnzkT//QV9KjXw== + + + ESCyHU+xOECnh9Rf2IvgR8zS + + + CqnbFQ== + + + Jq6jgeApiT9O4W2Tx/NTRQ== + + + YRJNfMoc12IpmW+Enpv3Pdo= + + + YNOos6YJoPC77qwSGCpb7w== + + + F7PAjw2k0dTX5escPnyVOBo= + + + BAAAAAABHkSl6mw= + + + CcL+EA== + + + Cd/dug== + + + RvCM2iRdkCE82ZOO2dU= + + + Rea7UUYH3jl33BryPIo= + + + Sx51x7V8pYe8rp7PMP/3qg== + + + MABJSw== + + + BAAAAAABMrS7t2g= + + + Ajp+ + + + YR0zGQAAAAAAAw== + + + F5Bg/C8eXg== + + + AKrMYlJmUUin8FOM/0TJrmk= + + + VOcIuNbTqkpOMUyI108FOg== + + + fMTRbGCp280pnyE/u53zbA== + + + HZyLf+K70FKc+jomm8DiDw== + + + DA== + + + GN2Hrh9Ltms= + + + ZECgRdZEsns= + + + HxT1XSjIpzjMprp9Qu1gYQ== + + + CdYL9vSQCEKzBwjO10ud2w== + + + CMNfzETd7XxesS9FOUj9Mg== + + + CLc= + + + ATFEdg== + + + BAAAAAABIg08D3U= + + + QDi5sQ== + + + Aa8e+91erglSMgsk/mtVaA== + + + ByfDtA== + + + A9GPKQ8jv9oIxfwiOy7qxQ== + + + AjqL + + + LnfcUaXG/pxV2CpXM5+YSg== + + + AImQERVYPoeb + + + BGU= + + + Hwexgn/ZCJicZPcsIyI8zxQ= + + + Fw== + + + UU3AP1SMxmyhBFq7MRFZmf0= + + + BHk= + + + ESByNJZ5TPjg9iZyL6a/h5Zx + + + XLhHIg7vP+tWfRqvuKeAxw== + + + BAAAAAABJpQ0AbA= + + + BAAAAAAA+X/GIyk= + + + Iw== + + + NTgf4iwIfeyJPIomw2dwSXEwtxQ= + + + Xbevr3ut3Z9m1GuXC9SonA== + + + Mq0P6o03FDk0B2bnJ+mYPGo= + + + Hnms0W0OxHSYE2F0XE97sw== + + + JLiDzgpL7oFNgJN+jIjt7w== + + + F5Bg6C237Q== + + + cJ+vg4742XhNgJW2ot9eIg== + + + DYifRdP6aQQ8MLbXZY2f5g== + + + e7wSpVxmgAS5/ioLi2iBIA== + + + Cfk9lw== + + + DA== + + + EqthLKdUgwI= + + + BAAAAAABCFiEp9s= + + + BAAAAAABJ/ufRdg= + + + M64Z5ufZzDRVTHkJR1uXzw== + + + BAAAAAABGMGjftY= + + + AJiU+bpWh2Uc4xFRf8GM9yA= + + + TqfXw+FkhxfVgE9GVMgjWQ== + + + ESC8DawWRiAyEMd38UXbfgPR + + + EAdmaA== + + + BAAAAAABJ/ufQg8= + + + BAAAAAABLM/7qjk= + + + BAAAAAABHkSl7L4= + + + F5Bg+EziQQ== + + + Aw== + + + IIxFSyNM6mWtCgTG0IL3Og== + + + DjIvBkX+ECVbB/C3i6w2Gg== + + + Cbssdw== + + + HA== + + + AZ0= + + + ESAyW/JX3+hZIp44EAMlXU2b + + + BAAAAAABKB/OGqI= + + + bzTw0uq05TUYEGS98bh0Ww== + + + BydKkg== + + + BAAAAAABIg08FMU= + + + QZCrvQ== + + + Qh/QbQ== + + + BAAAAAABHkSl6Co= + + + Iqpyf/YoGgvHc8HiDAxAI8o= + + + AMs= + + + MABJTA== + + + F5BhENPfVw== + + + U3SgRR3J+D6575WuCxuXeQ== + + + Qh/SnQ== + + + ZgwfEqZnBsUNvNuZ77FbQA== + + + ByfHkw== + + + Qh/O5w== + + + Cw== + + + ESCVop+Q4/OBgtf4WJkr01Gh + + + BA== + + + CSU= + + + OqQ2rV0ISTc308Z/oQgzFw== + + + U+1Y1QpJc0FOR5JdCJ01gQ== + + + APdCebq8ZyZr/T0luxlicNw= + + + FJl6tXgNpSk= + + + TA6EVg== + + + BQ== + + + 45KI4WIxyXfNrdtdj7C6 + + + BAAAAAABHkSl5ao= + + + L79XLVO2ZmtAu7FAG8Wmzw== + + + bAOrKSMsmA0MLJyAJ5BRsUM= + + + QDi5rw== + + + BAAAAAABF2Tb8Bc= + - VUtahOwvvmJFwlvmGDZP5w== + VBSf+IncsTB3RZS4KFCJPQ== + + + BAAAAAABK84yjs8= + + + QAEy3RIAAAAAAAAMweH5dw== + + + TurPPI6eivtNeGYdM0ZWXQ== + + + BAAAAAABHJRKNmk= + + + Rvm2CEw2IC2Mu/ax0A46QQ== + + + ATE3ew== + + + ESByYNtAIfizf2L3NMzCH8zZ + + + frj5jTuqBnQ4fljPvVU3KA== + + + Er0moq4zwH8ke2pYafIKdg== + + + J2La+q+JOURNWkX60OP2lQ== + + + LTRcDHabRHU= + + + B+U= + + + Ig== + + + BAAAAAABHkSHjz8= + + + RUT1Gehd1KKYPfqOlgspoQ== + + + ESCC9oPNcRdPOox+SjWm9dTX + + + FQ== + + + QDi5sA== + + + TrKEMhb2PKktH8lHg0AV5A== + + + WD1AyQAAAAAAJQ== BAAAAAABFUtaxac= + + NMpMcEnex3eXx4ohk9glcQ== + + + UoRGnb96CUDTxIqVry6LBg== + + + VfTSum25nb65YPlpuhJAvg== + + + STMAFQ== + + + UdNjvA== + + + BydiAg== + + + KuzHPJLdK5hNgJRo3R47Ag== + + + BAAAAAABMxvC9bk= + + + JpUvYJyWjdGmeoH7YcYunw== + + + OnvXX72mvUI2Id/NMzegmg== + + + Bw== + + + acI1CFIgmwSFBoU5+ahDgg== + + + GtXUVojhwOTkaQ4bTKblEQ== + + + buROL/l2GuXISv+/JVLkdA== + + + BAAAAAABA/A35EU= + + + ORFgmCj072NjcJnrxOMfQA== + + + BYyEX2b5+K+myAIR7eXaRQ== + + + VUtahOwvvmJFwlvmGDZP5w== + + + Ermwtg== + + + Cfk9qg== + + + e/fIfg2Dj2tkYIWVu2r82Cc= + + + BAAAAAABJ/v3ZwA= + + + SdegFrLaFTCsoMAW5ED+zA== + + + XhcFm2g619rt8Sro+a4rHA== + + + AuhvPsYZfVP6UDsuyjeZ4Q== + + + ANX8SnNRxCmsE/GCl5hw+8A= + + + bx/XHJqcwxDOptxJ2lh5vw== + + + Ew== + + + WX89jn8yGZVvoKTD9jDfRQ== + + + BAAAAAABCUVQ9No= + + + AQAAAAA= + + + fWK0j/Vi8vNWg3VAGjc02w== + + + BXA= + + + STMAeg== + + + EEpERSryZFMagbsNw/WoWQ== + + + OUvvVscW0/NltofkmV9qmg== + + + ESCLRVuhcUZaluIgIVlRJx+O + + + BAAAAAABJQdAjik= + + + F6QlB/yX+A== + + + Bydr0Q== + + + cXXMzbWDHMIdCotb3h64yw== + + + ESCis569omrbb20yySF39+aE + + + dItWlz2V62Philqj9m6Pbg== + + + cpqpXVWPk5AXzGw+zNIcBw== + + + BAAAAAABRE7wRk4= + + + Qh/SqA== + + + YR3YYQAAAAAABA== + + + BYOGvG32ukb1Yxj2oKoFyw== + + + NvEJoRYL2yvAZrAjbDIipQ== + + + fbsHfUkagQtznc3rtY1uDg== + + + GN2Hrh9LtnA= + + + DAk9hy8DhHSo+aQetvPB/fY= + + + CSY= + + + QZBvapTZFvmYktEPsBYLQQ== + + + PAdKZPiaac2CvPxbOrsHOw== + + + BydeGg== + + + AjpW + + + Bg== + + + OfJBIhFwAdQ= + + + Byemag== + + + Byeaqw== + + + BA== + + + BAAAAAABM6d3Z0s= + + + JV/LVzSKI/wsDgg3UuZHlA== + + + FNISyWWTGi5Yco6fGh58/A== + + + FJl6tXgNpSg= + + + ByeQ9g== + + + QAAnEQ== + + + VN2yeFexyXjPf34fHGmbhg== + + + BAAAAAABLF5/Gog= + + + cx0HrIEQg8JHWTP7DzOxSQ== + + + GpO48aJ8GngtwECqZhm/xA== + + + EM8bDLBnnoYe4LnWpLIhS4esr3I= + + + IyIVazG4RE9AERkb+ekH8w== + + + E77H6yvyFQjO0PcN3x0H+Q== + + + AQAAAAI= + + + Ew1ee9Jq7Q/Dig3ACF4V6Q== + + + a9/VeyVWrzFD7rM2PEHwQA== + + + Xrr31RF0DoIzMKXS6XtD+g== + + + UV9aaDeNRNtQuXjRYk4Skhg= + + + ESDItX4ruWiLnrlz0rk4/bmz + + + AJBQSPqrEvDE2Hz8xH39Low= + + + eLumDUO40KwnecZLJxFM2A== + + + BwImeaRkSZQLYwFREwKo3R1Jn+8= + + + Bydvrw== + + + Aw1SPC56593ZCZ9vCNHKwQ== + + + UVKsEezpGWOVQ4W9esstng== + + + Cj0= + + + UMUwXwT1Z4juyQ/CNTf4mw== + + + XJ8pGvGNM9RIcLUG9YQjLQ== + + + STMAjg== + + + UKKK5ol/rKBZchAAOnZjaA== + + + BAAAAAABLF5/HXY= + + + LizeWXFWP5pZPI/dLc+PVQ== + + + CcHC/g== + + + ByemaQ== + + + COwoDFvz7GD8R2K7Lo0rYQ== + + + Nbc68Q8EHza72P/hSWcddw== + + + ByfFnw== + + + L1fHogsVxmfMBka5q4uzaQ== + + + J8mznxvTvOR5p4Br3a3sm5j5iM0= + + + TAA2G+UIK6mqznQKBT77NA== + + + ANygrItIJ2rcKlyS3Lue07U= + + + CgFBQgAAAUFcf/EVAAAAAg== + + + ESD9YhzIEOwiOT7Nwip+E1KI + + + CeagHQ== + + + ALxyZmb/WL/wAuUiPK5oK/g= + + + OYBKgxEHpW/8XGAGAlvJyMA= + + + AjqK + + + RnQ3dYovwvB0D5q2YGY= + + + D/wZ7+m1Mv8SONSEFcs73w== + + + IA== + + + LdbnCbsA9sOgI4mkUpWXPw== + + + LAVIFm0MWZYH+Sv8Vf+IqkM= + + + GN2Hrh9LtnM= + + + Os2rnHWYhryvdOXfgan06A== + + + ESDu2nhlLPzfx+LYgjlYFP/k + + + EQ== + + + BAAAAAABHkSl5AQ= + + + BAAAAAABHkSHki0= + + + BAAAAAABCfhiO+s= + + + BydInw== + + + Bye2Cg== + AygWP2Fgd2T+iLbmAlKT6g== + + QM1zZ4GZ4gfwpQtUYye3Ne0= + + + L7tgs/W85vnhV7I7qJ6N/g== + + + BAAAAAABI54PryQ= + + + BAAAAAABKUXDqA8= + + + AQAAAAM= + + + RVWTeb5EKqE7cy7MUD2oJ3M= + + + R4af5A== + + + BAAAAAABJQcQQN0= + + + EDQMI0tR4kSntv1O37N10g== + + + Cfk9oA== + + + Ikdj3zYXXGsC/Afm9Tvx+g== + + + CeFU2w== + + + CskruA== + + + BUrYjru5px1ym4QUN33TOQ== + + + TXxtAQ== + + + ESDDtMgFFiaUfKo7HD9qImM7 + + + BydSYg== + + + Aw== + + + Cyr1PA== + + + U4P1tUoxl/XkztlVHdtdgw== + + + sPNcCSE9Nkg3jy5IN1xe2Q== + + + E5I2y6sIonl4a+TmlXc7fw== + + + LU4d0t7PAsZNgJGZcb+o/w== + + + Byd5cg== + + + CdWFNw== + + + AIChpbGNqu4XKp9J70syKEs= + + + OGPFrg== + + + M0VSOewW3WI= + + + KjoVfZ3by6+pL8fssyfM6A== + + + BAAAAAABBHYoIFs= + + + JD1wxDd8IgmiqX7MyPPg1g== + + + BAAAAAABHJRKMpA= + + + eR1nUEz8k+nDSBD+bb5uIQ== + + + Ai7cBJYqBE0I9NdyoZfRrw== + + + ESDYXNBhF+dePFjojs7u2vj1 + + + AQw= + + + RdHgEmEIjdyRFWDRRlk= + + + WJ2qHzWUqTk= + + + ezdAeCxKH7BFs7vn3byYaw== + + + ATE0vw== + + + ByembA== + + + BAAAAAABAPpuVh0= + + + a9rf7/BmG9JkKvRuy7J5QA== + + + OE4/d+p3YRzzcSl+kmZ8Mw== + + + HNo1DR4XCe4mS1iUMsY6Wg== + + + BAAAAAABEAuMoRs= + + + CWhp + + + DL8= + + + Ermw0Q== + diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 9d85113f0376..d53f14eccbf4 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -63,9 +63,6 @@ pref("extensions.hotfix.certs.2.sha1Fingerprint", "39:E7:2B:7A:5B:CF:37:78:F9:5D // Check AUS for system add-on updates. pref("extensions.systemAddon.update.url", "https://aus5.mozilla.org/update/3/SystemAddons/%VERSION%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/update.xml"); -// Disable screenshots for now, Shield will enable this. -pref("extensions.screenshots.system-disabled", true); - // Disable add-ons that are not installed by the user in all scopes by default. // See the SCOPE constants in AddonManager.jsm for values to use here. pref("extensions.autoDisableScopes", 15); diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js index 6a7ad60b998d..d6f2bd5216ca 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -1644,7 +1644,7 @@ var BookmarkingUI = { _hasBookmarksObserver: false, _itemGuids: new Set(), uninit: function BUI_uninit() { - this._updateBookmarkPageMenuItem(true); + this.updateBookmarkPageMenuItem(true); CustomizableUI.removeListener(this); this._uninitView(); @@ -1734,7 +1734,7 @@ var BookmarkingUI = { * forceReset is passed when we're destroyed and the label should go back * to the default (Bookmark This Page) for OS X. */ - _updateBookmarkPageMenuItem: function BUI__updateBookmarkPageMenuItem(forceReset) { + updateBookmarkPageMenuItem: function BUI_updateBookmarkPageMenuItem(forceReset) { let isStarred = !forceReset && this._itemGuids.size > 0; let label = isStarred ? "editlabel" : "bookmarklabel"; if (this.broadcaster) { @@ -1747,7 +1747,7 @@ var BookmarkingUI = { if (event.target != event.currentTarget) return; - this._updateBookmarkPageMenuItem(); + this.updateBookmarkPageMenuItem(); PlacesCommandHook.updateBookmarkAllTabsCommand(); this._initMobileBookmarks(document.getElementById("menu_mobileBookmarks")); this._initRecentBookmarks(document.getElementById("menu_recentBookmarks")); @@ -1854,7 +1854,7 @@ var BookmarkingUI = { }, onCurrentPageContextPopupShowing() { - this._updateBookmarkPageMenuItem(); + this.updateBookmarkPageMenuItem(); }, handleEvent: function BUI_handleEvent(aEvent) { @@ -1869,7 +1869,7 @@ var BookmarkingUI = { }, onPanelMenuViewShowing: function BUI_onViewShowing(aEvent) { - this._updateBookmarkPageMenuItem(); + this.updateBookmarkPageMenuItem(); // Update checked status of the toolbar toggle. let viewToolbar = document.getElementById("panelMenu_viewBookmarksToolbar"); let personalToolbar = document.getElementById("PersonalToolbar"); diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css index 2012ab261057..08bd175ca1fa 100644 --- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -611,12 +611,12 @@ html|input.urlbar-input[textoverflow]:not([focused]) { } #PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] { - visibility: collapse; + display: none; transition: margin-top 100ms; } #PopupAutoCompleteRichResult.showSearchSuggestionsNotification > deck[anonid="search-suggestions-notification"] { - visibility: visible; + display: -moz-deck; } #PopupAutoCompleteRichResult > richlistbox { diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 31db43ff9dc3..31c0ee80f285 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -7763,9 +7763,12 @@ var gPageActionButton = { }, _preparePanelToBeShown() { + // Update the bookmark item's label. + BookmarkingUI.updateBookmarkPageMenuItem(); + + // Update the send-to-device item's disabled state. let browser = gBrowser.selectedBrowser; let url = browser.currentURI.spec; - let sendToDeviceItem = document.getElementById("page-action-send-to-device-button"); sendToDeviceItem.disabled = !gSync.isSendableURI(url); diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul index 760c0748d798..d0c79a91b988 100644 --- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -333,6 +333,8 @@ + + isFullscreenSizeMode()); + + registerCleanupFunction(async function() { + // Exit fullscreen if we're still in it. + if (window.fullScreen) { + BrowserFullScreen(); + await BrowserTestUtils.waitForCondition(() => !isFullscreenSizeMode()); + } + }); + + Assert.ok(window.fullScreen, "Should be in fullscreen mode now."); + + let newTabOpened = BrowserTestUtils.waitForEvent(gBrowser, "TabSwitchDone"); + BrowserOpenTab(); + await newTabOpened; + + Assert.ok(gURLBar.focused, "URL bar should be focused."); +}); diff --git a/browser/base/content/test/siteIdentity/browser_no_mcb_for_loopback.js b/browser/base/content/test/siteIdentity/browser_no_mcb_for_loopback.js index 61336b96720f..d70d4172828b 100644 --- a/browser/base/content/test/siteIdentity/browser_no_mcb_for_loopback.js +++ b/browser/base/content/test/siteIdentity/browser_no_mcb_for_loopback.js @@ -8,6 +8,14 @@ // unassigned port 8 because we don't want to actually load anything, we just // want to check that the URLs are not blocked. +// The following rejections should not be left uncaught. This test has been +// whitelisted until the issue is fixed. +if (!gMultiProcessBrowser) { + Cu.import("resource://testing-common/PromiseTestUtils.jsm", this); + PromiseTestUtils.expectUncaughtRejection(/NetworkError/); + PromiseTestUtils.expectUncaughtRejection(/NetworkError/); +} + const TEST_URL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "https://example.com") + "test_no_mcb_for_loopback.html"; const LOOPBACK_PNG_URL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://127.0.0.1:8888") + "moz.png"; diff --git a/browser/base/content/test/social/browser_social_activation.js b/browser/base/content/test/social/browser_social_activation.js index 3914e74e5676..61461a03562d 100644 --- a/browser/base/content/test/social/browser_social_activation.js +++ b/browser/base/content/test/social/browser_social_activation.js @@ -2,13 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -// -// Whitelisting this test. -// As part of bug 1077403, the leaking uncaught rejection should be fixed. -// -thisTestLeaksUncaughtRejectionsAndShouldBeFixed("TypeError: Assert is null"); - - var SocialService = Cu.import("resource:///modules/SocialService.jsm", {}).SocialService; var tabsToRemove = []; diff --git a/browser/base/content/test/static/browser_all_files_referenced.js b/browser/base/content/test/static/browser_all_files_referenced.js index d4c37771acf3..2175053e97bf 100644 --- a/browser/base/content/test/static/browser_all_files_referenced.js +++ b/browser/base/content/test/static/browser_all_files_referenced.js @@ -159,8 +159,6 @@ var whitelist = new Set([ platforms: ["linux"]}, // Bug 1348362 {file: "chrome://global/skin/icons/warning-64.png", platforms: ["linux", "win"]}, - // Bug 1348524 - {file: "chrome://global/skin/notification/close.png", platforms: ["macosx"]}, // Bug 1348525 {file: "chrome://global/skin/splitter/grip-bottom.gif", platforms: ["linux"]}, {file: "chrome://global/skin/splitter/grip-left.gif", platforms: ["linux"]}, diff --git a/browser/base/content/test/static/browser_misused_characters_in_strings.js b/browser/base/content/test/static/browser_misused_characters_in_strings.js index 36f487e007a7..28a375bede9a 100644 --- a/browser/base/content/test/static/browser_misused_characters_in_strings.js +++ b/browser/base/content/test/static/browser_misused_characters_in_strings.js @@ -106,7 +106,7 @@ let gWhitelist = [{ type: "single-quote" }, { file: "preferences.properties", - key: "searchResults.needHelp", + key: "searchResults.needHelp2", type: "double-quote" } ]; diff --git a/browser/base/content/test/sync/browser_aboutAccounts.js b/browser/base/content/test/sync/browser_aboutAccounts.js index 66587dfbd052..3f199f2cc10e 100644 --- a/browser/base/content/test/sync/browser_aboutAccounts.js +++ b/browser/base/content/test/sync/browser_aboutAccounts.js @@ -2,12 +2,6 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ -// -// Whitelisting this test. -// As part of bug 1077403, the leaking uncaught rejection should be fixed. -// -thisTestLeaksUncaughtRejectionsAndShouldBeFixed("TypeError: window.location is null"); - XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts", diff --git a/browser/base/content/test/urlbar/browser_page_action_menu.js b/browser/base/content/test/urlbar/browser_page_action_menu.js index 2d34f313e0db..3ef557e17b4c 100644 --- a/browser/base/content/test/urlbar/browser_page_action_menu.js +++ b/browser/base/content/test/urlbar/browser_page_action_menu.js @@ -2,6 +2,72 @@ let gPanel = document.getElementById("page-action-panel"); +add_task(async function bookmark() { + // Open a unique page. + let url = "http://example.com/browser_page_action_menu"; + await BrowserTestUtils.withNewTab(url, async () => { + // Open the panel. + await promisePanelOpen(); + + // The bookmark button should read "Bookmark This Page" and not be starred. + let bookmarkButton = document.getElementById("page-action-bookmark-button"); + Assert.equal(bookmarkButton.label, "Bookmark This Page"); + Assert.ok(!bookmarkButton.hasAttribute("starred")); + + // Click the button. + let hiddenPromise = promisePanelHidden(); + EventUtils.synthesizeMouseAtCenter(bookmarkButton, {}); + await hiddenPromise; + + // Make sure the edit-bookmark panel opens, then hide it. + await new Promise(resolve => { + if (StarUI.panel.state == "open") { + resolve(); + return; + } + StarUI.panel.addEventListener("popupshown", resolve, { once: true }); + }); + StarUI.panel.hidePopup(); + + // Open the panel again. + await promisePanelOpen(); + + // The bookmark button should now read "Edit This Bookmark" and be starred. + Assert.equal(bookmarkButton.label, "Edit This Bookmark"); + Assert.ok(bookmarkButton.hasAttribute("starred")); + Assert.equal(bookmarkButton.getAttribute("starred"), "true"); + + // Click it again. + hiddenPromise = promisePanelHidden(); + EventUtils.synthesizeMouseAtCenter(bookmarkButton, {}); + await hiddenPromise; + + // The edit-bookmark panel should open again. + await new Promise(resolve => { + if (StarUI.panel.state == "open") { + resolve(); + return; + } + StarUI.panel.addEventListener("popupshown", resolve, { once: true }); + }); + + // Click the remove-bookmark button in the panel. + StarUI._element("editBookmarkPanelRemoveButton").click(); + + // Open the panel again. + await promisePanelOpen(); + + // The bookmark button should read "Bookmark This Page" and not be starred. + Assert.equal(bookmarkButton.label, "Bookmark This Page"); + Assert.ok(!bookmarkButton.hasAttribute("starred")); + + // Done. + hiddenPromise = promisePanelHidden(); + gPanel.hidePopup(); + await hiddenPromise; + }); +}); + add_task(async function copyURL() { // Open the panel. await promisePanelOpen(); diff --git a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-in.js b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-in.js index bdfeae98deff..73a96ae32ff1 100644 --- a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-in.js +++ b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-in.js @@ -217,7 +217,8 @@ function suggestionsPresent() { function assertVisible(visible, win = window) { let style = win.getComputedStyle(win.gURLBar.popup.searchSuggestionsNotification); - Assert.equal(style.visibility, visible ? "visible" : "collapse"); + let check = visible ? "notEqual" : "equal"; + Assert[check](style.display, "none"); } function promiseTransition(win = window) { diff --git a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js index ecb5f7b0ad06..92edde41128e 100644 --- a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js +++ b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js @@ -122,7 +122,8 @@ function suggestionsPresent() { function assertVisible(visible, win = window) { let style = win.getComputedStyle(win.gURLBar.popup.searchSuggestionsNotification); - Assert.equal(style.visibility, visible ? "visible" : "collapse"); + let check = visible ? "notEqual" : "equal"; + Assert[check](style.display, "none"); } function assertFooterVisible(visible, win = window) { let style = win.getComputedStyle(win.gURLBar.popup.footer); diff --git a/browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js b/browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js index 98a255356106..db2dbcc59209 100644 --- a/browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js +++ b/browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js @@ -2,6 +2,15 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// The rejection "The fetching process for the media resource was aborted by the +// user agent at the user's request." is left unhandled in some cases. This bug +// should be fixed, but for the moment this file is whitelisted. +// +// NOTE: Whitelisting a class of rejections should be limited. Normally you +// should use "expectUncaughtRejection" to flag individual failures. +Cu.import("resource://testing-common/PromiseTestUtils.jsm", this); +PromiseTestUtils.whitelistRejectionsGlobally(/aborted by the user agent/); + const permissionError = "error: NotAllowedError: The request is not allowed " + "by the user agent or the platform in the current context."; diff --git a/browser/base/content/webext-panels.js b/browser/base/content/webext-panels.js index b8275708db42..2670c5a08976 100644 --- a/browser/base/content/webext-panels.js +++ b/browser/base/content/webext-panels.js @@ -12,12 +12,12 @@ XPCOMUtils.defineLazyModuleGetter(this, "ExtensionParent", Cu.import("resource://gre/modules/ExtensionUtils.jsm"); var { + extensionStylesheets, promiseEvent, } = ExtensionUtils; const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - function getBrowser(sidebar) { let browser = document.getElementById("webext-panels-browser"); if (browser) { @@ -54,6 +54,15 @@ function getBrowser(sidebar) { return readyPromise.then(() => { browser.messageManager.loadFrameScript("chrome://browser/content/content.js", false); ExtensionParent.apiManager.emit("extension-browser-inserted", browser); + + if (sidebar.browserStyle) { + browser.messageManager.loadFrameScript( + "chrome://extensions/content/ext-browser-content.js", false); + + browser.messageManager.sendAsyncMessage("Extension:InitBrowser", { + stylesheets: extensionStylesheets, + }); + } return browser; }); } @@ -63,6 +72,7 @@ function loadWebPanel() { let sidebar = { uri: sidebarURI.searchParams.get("panel"), remote: sidebarURI.searchParams.get("remote"), + browserStyle: sidebarURI.searchParams.get("browser-style"), }; getBrowser(sidebar).then(browser => { browser.loadURI(sidebar.uri); diff --git a/browser/components/customizableui/CustomizeMode.jsm b/browser/components/customizableui/CustomizeMode.jsm index 21f09e46d66a..e22e2f16e2f4 100644 --- a/browser/components/customizableui/CustomizeMode.jsm +++ b/browser/components/customizableui/CustomizeMode.jsm @@ -776,7 +776,9 @@ CustomizeMode.prototype = { if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) { aNode = aNode.firstChild; } - CustomizableUI.addWidgetToArea(aNode.id, CustomizableUI.AREA_PANEL); + let panel = gPhotonStructure ? CustomizableUI.AREA_FIXED_OVERFLOW_PANEL + : CustomizableUI.AREA_PANEL; + CustomizableUI.addWidgetToArea(aNode.id, panel); if (!this._customizing) { CustomizableUI.dispatchToolboxEvent("customizationchange"); } diff --git a/browser/components/customizableui/PanelMultiView.jsm b/browser/components/customizableui/PanelMultiView.jsm index 4b0d489fac67..402c643dc77c 100644 --- a/browser/components/customizableui/PanelMultiView.jsm +++ b/browser/components/customizableui/PanelMultiView.jsm @@ -218,8 +218,12 @@ this.PanelMultiView = class { return this.__keyNavigationMap; } - constructor(xulNode) { + constructor(xulNode, testMode = false) { this.node = xulNode; + // If `testMode` is `true`, the consumer is only interested in accessing the + // methods of this instance. (E.g. in unit tests.) + if (testMode) + return; this._currentSubView = this._anchorElement = this._subViewObserver = null; this._mainViewHeight = 0; @@ -572,6 +576,9 @@ this.PanelMultiView = class { aAnchor.removeAttribute("open"); this._viewContainer.removeAttribute("transition-reverse"); + + evt = new window.CustomEvent("ViewShown", { bubbles: true, cancelable: false }); + viewNode.dispatchEvent(evt); }, { once: true }); }); }, { once: true }); @@ -823,15 +830,15 @@ this.PanelMultiView = class { let maxIdx = buttons.length - 1; let buttonIndex = isDown ? 0 : maxIdx; if (typeof navMap.selected == "number") { - if (isDown) { - buttonIndex = ++navMap.selected; - if (buttonIndex > maxIdx) - buttonIndex = 0; - } else { - buttonIndex = --navMap.selected; - if (buttonIndex < 0) - buttonIndex = maxIdx; - } + // Buttons may get selected whilst the panel is shown, so add an extra + // check here. + do { + buttonIndex = navMap.selected = (navMap.selected + (isDown ? 1 : -1)); + } while (buttons[buttonIndex] && buttons[buttonIndex].disabled) + if (isDown && buttonIndex > maxIdx) + buttonIndex = 0; + else if (!isDown && buttonIndex < 0) + buttonIndex = maxIdx; } let button = buttons[buttonIndex]; button.focus(); @@ -899,7 +906,11 @@ this.PanelMultiView = class { let buttons = Array.from(view.querySelectorAll(".subviewbutton:not([disabled])")); if (this._canGoBack(view)) buttons.unshift(view.backButton); - return buttons; + let dwu = this._dwu; + return buttons.filter(button => { + let bounds = dwu.getBoundsWithoutFlushing(button); + return bounds.width > 0 && bounds.height > 0; + }); } /** diff --git a/browser/components/customizableui/content/panelUI.inc.xul b/browser/components/customizableui/content/panelUI.inc.xul index 6e8a18f960fa..af46f5a8a970 100644 --- a/browser/components/customizableui/content/panelUI.inc.xul +++ b/browser/components/customizableui/content/panelUI.inc.xul @@ -332,42 +332,6 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + 0) { + let autoHideFullScreen = Services.prefs.getBoolPref("browser.fullscreen.autohide", false) && + Services.appinfo.OS !== "Darwin"; // Only show the doorhanger if the window is focused and not fullscreen - if (window.fullScreen || Services.focus.activeWindow !== window) { + if ((window.fullScreen && autoHideFullScreen) || Services.focus.activeWindow !== window) { this._hidePopup(); this._showBadge(doorhangers[0]); this._showBannerItem(doorhangers[0]); diff --git a/browser/components/customizableui/test/browser.ini b/browser/components/customizableui/test/browser.ini index 9b3e359b98ed..57a2d6693a18 100644 --- a/browser/components/customizableui/test/browser.ini +++ b/browser/components/customizableui/test/browser.ini @@ -149,13 +149,17 @@ skip-if = os == "mac" [browser_customizemode_contextmenu_menubuttonstate.js] [browser_exit_background_customize_mode.js] [browser_overflow_use_subviews.js] +[browser_panel_keyboard_navigation.js] [browser_panel_toggle.js] [browser_panelUINotifications.js] [browser_panelUINotifications_fullscreen.js] +tags = fullscreen +skip-if = os == "mac" [browser_panelUINotifications_multiWindow.js] [browser_switch_to_customize_mode.js] [browser_synced_tabs_menu.js] [browser_check_tooltips_in_navbar.js] [browser_editcontrols_update.js] subsuite = clipboard +[browser_photon_customization_context_menus.js] [browser_remote_tabs_button.js] diff --git a/browser/components/customizableui/test/browser_overflow_use_subviews.js b/browser/components/customizableui/test/browser_overflow_use_subviews.js index 883022b4469f..d601eb3d5112 100644 --- a/browser/components/customizableui/test/browser_overflow_use_subviews.js +++ b/browser/components/customizableui/test/browser_overflow_use_subviews.js @@ -3,18 +3,19 @@ const kOverflowPanel = document.getElementById("widget-overflow"); var gOriginalWidth; -registerCleanupFunction(function*() { +registerCleanupFunction(async function() { kOverflowPanel.removeAttribute("animate"); window.resizeTo(gOriginalWidth, window.outerHeight); + await waitForCondition(() => !document.getElementById("nav-bar").hasAttribute("overflowing")); CustomizableUI.reset(); }); /** * This checks that subview-compatible items show up as subviews rather than - * re-anchored panels. If we ever remove the character encoding widget, please + * re-anchored panels. If we ever remove the developer widget, please * replace this test with another subview - don't remove it. */ -add_task(async function check_character_encoding_subview_in_overflow() { +add_task(async function check_developer_subview_in_overflow() { kOverflowPanel.setAttribute("animate", "false"); gOriginalWidth = window.outerWidth; @@ -39,8 +40,6 @@ add_task(async function check_character_encoding_subview_in_overflow() { is(developerView.closest("panel"), kOverflowPanel, "Should be inside the panel"); kOverflowPanel.hidePopup(); await Promise.resolve(); // wait for popup to hide fully. - - CustomizableUI.reset(); }); /** diff --git a/browser/components/customizableui/test/browser_panel_keyboard_navigation.js b/browser/components/customizableui/test/browser_panel_keyboard_navigation.js new file mode 100644 index 000000000000..ffb2bf0db202 --- /dev/null +++ b/browser/components/customizableui/test/browser_panel_keyboard_navigation.js @@ -0,0 +1,140 @@ +"use strict"; + +/** + * Test keyboard navigation in the app menu panel. + */ + +const {PanelMultiView} = Cu.import("resource:///modules/PanelMultiView.jsm", {}); +const kHelpButtonId = "appMenu-help-button"; +let gHelperInstance; + +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({set: [["browser.photon.structure.enabled", true]]}); + gHelperInstance = new PanelMultiView(PanelUI.panel, true); +}); + +add_task(async function testUpDownKeys() { + let promise = promisePanelShown(window); + PanelUI.show(); + await promise; + + let buttons = gHelperInstance._getNavigableElements(PanelUI.mainView); + + for (let button of buttons) { + if (button.disabled) + continue; + EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" }); + Assert.equal(document.commandDispatcher.focusedElement, button, + "The correct button should be focused after navigating downward"); + } + + EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" }); + Assert.equal(document.commandDispatcher.focusedElement, buttons[0], + "Pressing upwards should cycle around and select the first button again"); + + for (let i = buttons.length - 1; i >= 0; --i) { + let button = buttons[i]; + if (button.disabled) + continue; + EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" }); + Assert.equal(document.commandDispatcher.focusedElement, button, + "The first button should be focused after navigating upward"); + } + + promise = promisePanelHidden(window); + PanelUI.hide(); + await promise; +}); + +add_task(async function testEnterKeyBehaviors() { + let promise = promisePanelShown(window); + PanelUI.show(); + await promise; + + let buttons = gHelperInstance._getNavigableElements(PanelUI.mainView); + + // Navigate to the 'Help' button, which points to a subview. + EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" }); + let focusedElement = document.commandDispatcher.focusedElement; + Assert.equal(focusedElement, buttons[buttons.length - 1], + "The last button should be focused after navigating upward"); + + promise = BrowserTestUtils.waitForEvent(PanelUI.helpView, "ViewShown"); + // Make sure the Help button is in focus. + while (!focusedElement || !focusedElement.id || focusedElement.id != kHelpButtonId) { + EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" }); + focusedElement = document.commandDispatcher.focusedElement; + } + EventUtils.synthesizeKey("VK_RETURN", { code: "Enter" }); + await promise; + + let helpButtons = gHelperInstance._getNavigableElements(PanelUI.helpView); + Assert.ok(helpButtons[0].classList.contains("subviewbutton-back"), + "First button in help view should be a back button"); + + // For posterity, check navigating the subview using up/ down arrow keys as well. + for (let i = helpButtons.length - 1; i >= 0; --i) { + let button = helpButtons[i]; + if (button.disabled) + continue; + EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" }); + focusedElement = document.commandDispatcher.focusedElement; + Assert.equal(focusedElement, button, "The first button should be focused after navigating upward"); + } + + // Make sure the back button is in focus again. + while (focusedElement != helpButtons[0]) { + EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" }); + focusedElement = document.commandDispatcher.focusedElement; + } + + // The first button is the back button. Hittin Enter should navigate us back. + promise = BrowserTestUtils.waitForEvent(PanelUI.mainView, "ViewShown"); + EventUtils.synthesizeKey("VK_RETURN", { code: "Enter" }); + await promise; + + // Let's test a 'normal' command button. + focusedElement = document.commandDispatcher.focusedElement; + const kFindButtonId = "appMenu-find-button"; + while (!focusedElement || !focusedElement.id || focusedElement.id != kFindButtonId) { + EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" }); + focusedElement = document.commandDispatcher.focusedElement; + } + Assert.equal(focusedElement.id, kFindButtonId, "Find button should be selected"); + + promise = promisePanelHidden(window); + EventUtils.synthesizeKey("VK_RETURN", { code: "Enter" }); + await promise; + + Assert.ok(!gFindBar.hidden, "Findbar should have opened"); + gFindBar.close(); +}); + +add_task(async function testLeftRightKeys() { + let promise = promisePanelShown(window); + PanelUI.show(); + await promise; + + // Navigate to the 'Help' button, which points to a subview. + let focusedElement = document.commandDispatcher.focusedElement; + while (!focusedElement || !focusedElement.id || focusedElement.id != kHelpButtonId) { + EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" }); + focusedElement = document.commandDispatcher.focusedElement; + } + Assert.equal(focusedElement.id, kHelpButtonId, "The last button should be focused after navigating upward"); + + // Hitting ArrowRight on a button that points to a subview should navigate us + // there. + promise = BrowserTestUtils.waitForEvent(PanelUI.helpView, "ViewShown"); + EventUtils.synthesizeKey("KEY_ArrowRight", { code: "ArrowRight" }); + await promise; + + // Hitting ArrowLeft should navigate us back. + promise = BrowserTestUtils.waitForEvent(PanelUI.mainView, "ViewShown"); + EventUtils.synthesizeKey("KEY_ArrowLeft", { code: "ArrowLeft" }); + await promise; + + promise = promisePanelHidden(window); + PanelUI.hide(); + await promise; +}); diff --git a/browser/components/customizableui/test/browser_photon_customization_context_menus.js b/browser/components/customizableui/test/browser_photon_customization_context_menus.js new file mode 100644 index 000000000000..2d50037d64ad --- /dev/null +++ b/browser/components/customizableui/test/browser_photon_customization_context_menus.js @@ -0,0 +1,431 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +requestLongerTimeout(2); + +const isOSX = (Services.appinfo.OS === "Darwin"); + +const overflowButton = document.getElementById("nav-bar-overflow-button"); +const overflowPanel = document.getElementById("widget-overflow"); + +// Right-click on the home button should +// show a context menu with options to move it. +add_task(async function() { + await SpecialPowers.pushPrefEnv({set: [["browser.photon.structure.enabled", true]]}); + let contextMenu = document.getElementById("toolbar-context-menu"); + let shownPromise = popupShown(contextMenu); + let homeButton = document.getElementById("home-button"); + EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2 }); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToPanel", true], + [".customize-context-removeFromToolbar", true], + ["---"] + ]; + if (!isOSX) { + expectedEntries.push(["#toggle_toolbar-menubar", true]); + } + expectedEntries.push( + ["#toggle_PersonalToolbar", true], + ["---"], + [".viewCustomizeToolbar", true] + ); + checkContextMenu(contextMenu, expectedEntries); + + let hiddenPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenPromise; +}); + +// Right-click on an empty bit of tabstrip should +// show a context menu without options to move it, +// but with tab-specific options instead. +add_task(async function() { + // ensure there are tabs to reload/bookmark: + let extraTab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser); + await promiseTabLoadEvent(extraTab, "http://example.com/"); + let contextMenu = document.getElementById("toolbar-context-menu"); + let shownPromise = popupShown(contextMenu); + let tabstrip = document.getElementById("tabbrowser-tabs"); + let rect = tabstrip.getBoundingClientRect(); + EventUtils.synthesizeMouse(tabstrip, rect.width - 2, 2, {type: "contextmenu", button: 2 }); + await shownPromise; + + let closedTabsAvailable = SessionStore.getClosedTabCount(window) == 0; + info("Closed tabs: " + closedTabsAvailable); + let expectedEntries = [ + ["#toolbar-context-reloadAllTabs", true], + ["#toolbar-context-bookmarkAllTabs", true], + ["#toolbar-context-undoCloseTab", !closedTabsAvailable], + ["---"] + ]; + if (!isOSX) { + expectedEntries.push(["#toggle_toolbar-menubar", true]); + } + expectedEntries.push( + ["#toggle_PersonalToolbar", true], + ["---"], + [".viewCustomizeToolbar", true] + ); + checkContextMenu(contextMenu, expectedEntries); + + let hiddenPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenPromise; + gBrowser.removeTab(extraTab); +}); + +// Right-click on an empty bit of extra toolbar should +// show a context menu with moving options disabled, +// and a toggle option for the extra toolbar +add_task(async function() { + let contextMenu = document.getElementById("toolbar-context-menu"); + let shownPromise = popupShown(contextMenu); + let toolbar = createToolbarWithPlacements("880164_empty_toolbar", []); + toolbar.setAttribute("context", "toolbar-context-menu"); + toolbar.setAttribute("toolbarname", "Fancy Toolbar for Context Menu"); + EventUtils.synthesizeMouseAtCenter(toolbar, {type: "contextmenu", button: 2 }); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToPanel", false], + [".customize-context-removeFromToolbar", false], + ["---"] + ]; + if (!isOSX) { + expectedEntries.push(["#toggle_toolbar-menubar", true]); + } + expectedEntries.push( + ["#toggle_PersonalToolbar", true], + ["#toggle_880164_empty_toolbar", true], + ["---"], + [".viewCustomizeToolbar", true] + ); + checkContextMenu(contextMenu, expectedEntries); + + let hiddenPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenPromise; + removeCustomToolbars(); +}); + + +// Right-click on the urlbar-container should +// show a context menu with disabled options to move it. +add_task(async function() { + let contextMenu = document.getElementById("toolbar-context-menu"); + let shownPromise = popupShown(contextMenu); + let urlBarContainer = document.getElementById("urlbar-container"); + // Need to make sure not to click within an edit field. + EventUtils.synthesizeMouse(urlBarContainer, 100, 1, {type: "contextmenu", button: 2 }); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToPanel", false], + [".customize-context-removeFromToolbar", false], + ["---"] + ]; + if (!isOSX) { + expectedEntries.push(["#toggle_toolbar-menubar", true]); + } + expectedEntries.push( + ["#toggle_PersonalToolbar", true], + ["---"], + [".viewCustomizeToolbar", true] + ); + checkContextMenu(contextMenu, expectedEntries); + + let hiddenPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenPromise; +}); + +// Right-click on the searchbar and moving it to the menu +// and back should move the search-container instead. +add_task(async function() { + let searchbar = document.getElementById("searchbar"); + gCustomizeMode.addToPanel(searchbar); + let placement = CustomizableUI.getPlacementOfWidget("search-container"); + is(placement.area, CustomizableUI.AREA_FIXED_OVERFLOW_PANEL, "Should be in panel"); + + let shownPanelPromise = popupShown(overflowPanel); + overflowButton.click(); + await shownPanelPromise; + let hiddenPanelPromise = popupHidden(overflowPanel); + overflowButton.click(); + await hiddenPanelPromise; + + gCustomizeMode.addToToolbar(searchbar); + placement = CustomizableUI.getPlacementOfWidget("search-container"); + is(placement.area, CustomizableUI.AREA_NAVBAR, "Should be in navbar"); + gCustomizeMode.removeFromArea(searchbar); + placement = CustomizableUI.getPlacementOfWidget("search-container"); + is(placement, null, "Should be in palette"); + CustomizableUI.reset(); + placement = CustomizableUI.getPlacementOfWidget("search-container"); + is(placement.area, CustomizableUI.AREA_NAVBAR, "Should be in navbar"); +}); + +// Right-click on an item within the panel should +// show a context menu with options to move it. +add_task(async function() { + CustomizableUI.addWidgetToArea("new-window-button", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL); + let shownPanelPromise = popupShown(overflowPanel); + overflowButton.click(); + await shownPanelPromise; + + let contextMenu = document.getElementById("customizationPanelItemContextMenu"); + let shownContextPromise = popupShown(contextMenu); + let newWindowButton = document.getElementById("new-window-button"); + ok(newWindowButton, "new-window-button was found"); + EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}); + await shownContextPromise; + + is(overflowPanel.state, "open", "The overflow panel should still be open."); + + let expectedEntries = [ + [".customize-context-moveToToolbar", true], + [".customize-context-removeFromPanel", true], + ["---"], + [".viewCustomizeToolbar", true] + ]; + checkContextMenu(contextMenu, expectedEntries); + + let hiddenContextPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenContextPromise; + + let hiddenPromise = popupHidden(overflowPanel); + overflowButton.click(); + await hiddenPromise; + + CustomizableUI.removeWidgetFromArea("new-window-button"); +}); + +// Right-click on the home button while in customization mode +// should show a context menu with options to move it. +add_task(async function() { + await startCustomizing(); + let contextMenu = document.getElementById("toolbar-context-menu"); + let shownPromise = popupShown(contextMenu); + let homeButton = document.getElementById("wrapper-home-button"); + EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2}); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToPanel", true], + [".customize-context-removeFromToolbar", true], + ["---"] + ]; + if (!isOSX) { + expectedEntries.push(["#toggle_toolbar-menubar", true]); + } + expectedEntries.push( + ["#toggle_PersonalToolbar", true], + ["---"], + [".viewCustomizeToolbar", false] + ); + checkContextMenu(contextMenu, expectedEntries); + + let hiddenContextPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenContextPromise; +}); + +// Right-click on an item in the palette should +// show a context menu with options to move it. +add_task(async function() { + let contextMenu = document.getElementById("customizationPaletteItemContextMenu"); + let shownPromise = popupShown(contextMenu); + let openFileButton = document.getElementById("wrapper-open-file-button"); + EventUtils.synthesizeMouse(openFileButton, 2, 2, {type: "contextmenu", button: 2}); + await shownPromise; + + let expectedEntries = [ + [".customize-context-addToToolbar", true], + [".customize-context-addToPanel", true] + ]; + checkContextMenu(contextMenu, expectedEntries); + + let hiddenContextPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenContextPromise; +}); + +// Right-click on an item in the panel while in customization mode +// should show a context menu with options to move it. +add_task(async function() { + CustomizableUI.addWidgetToArea("new-window-button", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL); + let contextMenu = document.getElementById("customizationPanelItemContextMenu"); + let shownPromise = popupShown(contextMenu); + let newWindowButton = document.getElementById("wrapper-new-window-button"); + EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToToolbar", true], + [".customize-context-removeFromPanel", true], + ["---"], + [".viewCustomizeToolbar", false] + ]; + checkContextMenu(contextMenu, expectedEntries); + + let hiddenContextPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenContextPromise; + CustomizableUI.removeWidgetFromArea("new-window-button"); + await endCustomizing(); +}); + +// Test the toolbarbutton panel context menu in customization mode +// without opening the panel before customization mode +add_task(async function() { + CustomizableUI.addWidgetToArea("new-window-button", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL); + this.otherWin = await openAndLoadWindow(null, true); + + await new Promise(resolve => waitForFocus(resolve, this.otherWin)); + + await startCustomizing(this.otherWin); + + let contextMenu = this.otherWin.document.getElementById("customizationPanelItemContextMenu"); + let shownPromise = popupShown(contextMenu); + let newWindowButton = this.otherWin.document.getElementById("wrapper-new-window-button"); + EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}, this.otherWin); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToToolbar", true], + [".customize-context-removeFromPanel", true], + ["---"], + [".viewCustomizeToolbar", false] + ]; + checkContextMenu(contextMenu, expectedEntries, this.otherWin); + + let hiddenContextPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenContextPromise; + await endCustomizing(this.otherWin); + CustomizableUI.removeWidgetFromArea("new-window-button"); + await promiseWindowClosed(this.otherWin); + this.otherWin = null; + + await new Promise(resolve => waitForFocus(resolve, window)); +}); + +// Bug 945191 - Combined buttons show wrong context menu options +// when they are in the toolbar. +add_task(async function() { + CustomizableUI.addWidgetToArea("zoom-controls", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL); + await startCustomizing(); + let contextMenu = document.getElementById("customizationPanelItemContextMenu"); + let shownPromise = popupShown(contextMenu); + let zoomControls = document.getElementById("wrapper-zoom-controls"); + EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2}); + await shownPromise; + // Execute the command to move the item from the panel to the toolbar. + contextMenu.childNodes[0].doCommand(); + let hiddenPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenPromise; + await endCustomizing(); + + zoomControls = document.getElementById("zoom-controls"); + is(zoomControls.parentNode.id, "nav-bar-customization-target", "Zoom-controls should be on the nav-bar"); + + contextMenu = document.getElementById("toolbar-context-menu"); + shownPromise = popupShown(contextMenu); + EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2}); + await shownPromise; + + let expectedEntries = [ + [".customize-context-moveToPanel", true], + [".customize-context-removeFromToolbar", true], + ["---"] + ]; + if (!isOSX) { + expectedEntries.push(["#toggle_toolbar-menubar", true]); + } + expectedEntries.push( + ["#toggle_PersonalToolbar", true], + ["---"], + [".viewCustomizeToolbar", true] + ); + checkContextMenu(contextMenu, expectedEntries); + + hiddenPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenPromise; + await resetCustomization(); +}); + +// Bug 947586 - After customization, panel items show wrong context menu options +add_task(async function() { + info("Check panel context menu is correct after customization"); + await startCustomizing(); + await endCustomizing(); + + CustomizableUI.addWidgetToArea("new-window-button", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL); + let shownPanelPromise = popupShown(overflowPanel); + overflowButton.click(); + await shownPanelPromise; + + let contextMenu = document.getElementById("customizationPanelItemContextMenu"); + let shownContextPromise = popupShown(contextMenu); + let newWindowButton = document.getElementById("new-window-button"); + ok(newWindowButton, "new-window-button was found"); + EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}); + await shownContextPromise; + + is(overflowPanel.state, "open", "The panel should still be open."); + + let expectedEntries = [ + [".customize-context-moveToToolbar", true], + [".customize-context-removeFromPanel", true], + ["---"], + [".viewCustomizeToolbar", true] + ]; + checkContextMenu(contextMenu, expectedEntries); + + let hiddenContextPromise = popupHidden(contextMenu); + contextMenu.hidePopup(); + await hiddenContextPromise; + + let hiddenPromise = popupHidden(overflowPanel); + overflowButton.click(); + await hiddenPromise; + CustomizableUI.removeWidgetFromArea("new-window-button"); +}); + + +// Bug 982027 - moving icon around removes custom context menu. +add_task(async function() { + let widgetId = "custom-context-menu-toolbarbutton"; + let expectedContext = "myfancycontext"; + let widget = createDummyXULButton(widgetId, "Test ctxt menu"); + widget.setAttribute("context", expectedContext); + CustomizableUI.addWidgetToArea(widgetId, CustomizableUI.AREA_NAVBAR); + is(widget.getAttribute("context"), expectedContext, "Should have context menu when added to the toolbar."); + + await startCustomizing(); + is(widget.getAttribute("context"), "", "Should not have own context menu in the toolbar now that we're customizing."); + is(widget.getAttribute("wrapped-context"), expectedContext, "Should keep own context menu wrapped when in toolbar."); + + let panel = document.getElementById("widget-overflow-fixed-list"); + simulateItemDrag(widget, panel); + is(widget.getAttribute("context"), "", "Should not have own context menu when in the panel."); + is(widget.getAttribute("wrapped-context"), expectedContext, "Should keep own context menu wrapped now that we're in the panel."); + + simulateItemDrag(widget, document.getElementById("nav-bar").customizationTarget); + is(widget.getAttribute("context"), "", "Should not have own context menu when back in toolbar because we're still customizing."); + is(widget.getAttribute("wrapped-context"), expectedContext, "Should keep own context menu wrapped now that we're back in the toolbar."); + + await endCustomizing(); + is(widget.getAttribute("context"), expectedContext, "Should have context menu again now that we're out of customize mode."); + CustomizableUI.removeWidgetFromArea(widgetId); + widget.remove(); + ok(CustomizableUI.inDefaultState, "Should be in default state after removing button."); +}); diff --git a/browser/components/extensions/ExtensionPopups.jsm b/browser/components/extensions/ExtensionPopups.jsm index 95a74579db1f..5e5634233249 100644 --- a/browser/components/extensions/ExtensionPopups.jsm +++ b/browser/components/extensions/ExtensionPopups.jsm @@ -24,6 +24,7 @@ Cu.import("resource://gre/modules/ExtensionUtils.jsm"); var { DefaultWeakMap, + extensionStylesheets, promiseEvent, } = ExtensionUtils; @@ -50,15 +51,6 @@ function promisePopupShown(popup) { }); } -XPCOMUtils.defineLazyGetter(this, "popupStylesheets", () => { - let stylesheets = ["chrome://browser/content/extension.css"]; - - if (AppConstants.platform === "macosx") { - stylesheets.push("chrome://browser/content/extension-mac.css"); - } - return stylesheets; -}); - XPCOMUtils.defineLazyGetter(this, "standaloneStylesheets", () => { let stylesheets = []; @@ -116,6 +108,8 @@ class BasePopup { this.destroyed = true; this.browserLoadedDeferred.reject(new Error("Popup destroyed")); + // Ignore unhandled rejections if the "attach" method is not called. + this.browserLoaded.catch(() => {}); BasePopup.instances.get(this.window).delete(this.extension); @@ -168,7 +162,7 @@ class BasePopup { let sheets = []; if (this.browserStyle) { - sheets.push(...popupStylesheets); + sheets.push(...extensionStylesheets); } if (!this.fixedWidth) { sheets.push(...standaloneStylesheets); diff --git a/browser/components/extensions/ext-sessions.js b/browser/components/extensions/ext-sessions.js index 95c3c502d95b..87483bed2acb 100644 --- a/browser/components/extensions/ext-sessions.js +++ b/browser/components/extensions/ext-sessions.js @@ -3,6 +3,7 @@ "use strict"; var { + ExtensionError, promiseObserved, } = ExtensionUtils; @@ -37,19 +38,18 @@ function getRecentlyClosed(maxResults, extension) { return recentlyClosed.slice(0, maxResults); } -function createSession(restored, extension, sessionId) { +async function createSession(restored, extension, sessionId) { if (!restored) { - return Promise.reject({message: `Could not restore object using sessionId ${sessionId}.`}); + throw new ExtensionError(`Could not restore object using sessionId ${sessionId}.`); } let sessionObj = {lastModified: Date.now()}; if (restored instanceof Ci.nsIDOMChromeWindow) { - return promiseObserved("sessionstore-single-window-restored", subject => subject == restored).then(() => { - sessionObj.window = extension.windowManager.convert(restored, {populate: true}); - return Promise.resolve(sessionObj); - }); + await promiseObserved("sessionstore-single-window-restored", subject => subject == restored); + sessionObj.window = extension.windowManager.convert(restored, {populate: true}); + return sessionObj; } sessionObj.tab = extension.tabManager.convert(restored); - return Promise.resolve(sessionObj); + return sessionObj; } this.sessions = class extends ExtensionAPI { @@ -57,12 +57,14 @@ this.sessions = class extends ExtensionAPI { let {extension} = context; return { sessions: { - getRecentlyClosed: function(filter) { + async getRecentlyClosed(filter) { + await SessionStore.promiseInitialized; let maxResults = filter.maxResults == undefined ? this.MAX_SESSION_RESULTS : filter.maxResults; - return Promise.resolve(getRecentlyClosed(maxResults, extension)); + return getRecentlyClosed(maxResults, extension); }, - forgetClosedTab: function(windowId, sessionId) { + async forgetClosedTab(windowId, sessionId) { + await SessionStore.promiseInitialized; let window = context.extension.windowManager.get(windowId).window; let closedTabData = SessionStore.getClosedTabData(window, false); @@ -71,14 +73,14 @@ this.sessions = class extends ExtensionAPI { }); if (closedTabIndex < 0) { - return Promise.reject({message: `Could not find closed tab using sessionId ${sessionId}.`}); + throw new ExtensionError(`Could not find closed tab using sessionId ${sessionId}.`); } SessionStore.forgetClosedTab(window, closedTabIndex); - return Promise.resolve(); }, - forgetClosedWindow: function(sessionId) { + async forgetClosedWindow(sessionId) { + await SessionStore.promiseInitialized; let closedWindowData = SessionStore.getClosedWindowData(false); let closedWindowIndex = closedWindowData.findIndex((closedWindow) => { @@ -86,14 +88,14 @@ this.sessions = class extends ExtensionAPI { }); if (closedWindowIndex < 0) { - return Promise.reject({message: `Could not find closed window using sessionId ${sessionId}.`}); + throw new ExtensionError(`Could not find closed window using sessionId ${sessionId}.`); } SessionStore.forgetClosedWindow(closedWindowIndex); - return Promise.resolve(); }, - restore: function(sessionId) { + async restore(sessionId) { + await SessionStore.promiseInitialized; let session, closedId; if (sessionId) { closedId = sessionId; diff --git a/browser/components/extensions/ext-sidebarAction.js b/browser/components/extensions/ext-sidebarAction.js index df77e6855444..7490acfa7baa 100644 --- a/browser/components/extensions/ext-sidebarAction.js +++ b/browser/components/extensions/ext-sidebarAction.js @@ -43,6 +43,10 @@ this.sidebarAction = class extends ExtensionAPI { this.id = `${widgetId}-sidebar-action`; this.menuId = `menu_${this.id}`; + // We default browser_style to true because this is a new API and + // we therefore don't need to worry about breaking existing add-ons. + this.browserStyle = options.browser_style || options.browser_style === null; + this.defaults = { enabled: true, title: options.default_title || extension.name, @@ -120,10 +124,17 @@ this.sidebarAction = class extends ExtensionAPI { } sidebarUrl(panel) { + let url = `${sidebarURL}?panel=${encodeURIComponent(panel)}`; + if (this.extension.remote) { - return `${sidebarURL}?remote=1&panel=${encodeURIComponent(panel)}`; + url += "&remote=1"; } - return `${sidebarURL}?&panel=${encodeURIComponent(panel)}`; + + if (this.browserStyle) { + url += "&browser-style=1"; + } + + return url; } createMenuItem(window, details) { @@ -138,6 +149,7 @@ this.sidebarAction = class extends ExtensionAPI { broadcaster.setAttribute("group", "sidebar"); broadcaster.setAttribute("label", details.title); broadcaster.setAttribute("sidebarurl", this.sidebarUrl(details.panel)); + // oncommand gets attached to menuitem, so we use the observes attribute to // get the command id we pass to SidebarUI. broadcaster.setAttribute("oncommand", "SidebarUI.toggle(this.getAttribute('observes'))"); diff --git a/browser/components/extensions/schemas/sidebar_action.json b/browser/components/extensions/schemas/sidebar_action.json index 4b925ea95f47..a2c281278d9f 100644 --- a/browser/components/extensions/schemas/sidebar_action.json +++ b/browser/components/extensions/schemas/sidebar_action.json @@ -22,6 +22,10 @@ "$ref": "IconPath", "optional": true }, + "browser_style": { + "type": "boolean", + "optional": true + }, "default_panel": { "type": "string", "format": "strictRelativeUrl", diff --git a/browser/components/extensions/test/browser/browser-common.ini b/browser/components/extensions/test/browser/browser-common.ini index 00f596eb4861..65f6db760aab 100644 --- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -95,6 +95,7 @@ skip-if = debug || asan # Bug 1354681 [browser_ext_sessions_getRecentlyClosed_tabs.js] [browser_ext_sessions_restore.js] [browser_ext_sidebarAction.js] +[browser_ext_sidebarAction_browser_style.js] [browser_ext_sidebarAction_context.js] [browser_ext_sidebarAction_contextMenu.js] [browser_ext_sidebarAction_tabs.js] diff --git a/browser/components/extensions/test/browser/browser_ext_sidebarAction_browser_style.js b/browser/components/extensions/test/browser/browser_ext_sidebarAction_browser_style.js new file mode 100644 index 000000000000..618b55fa4320 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_sidebarAction_browser_style.js @@ -0,0 +1,74 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +function* testSidebarBrowserStyle(sidebarAction, assertMessage) { + function sidebarScript() { + browser.test.onMessage.addListener((msgName, info, assertMessage) => { + if (msgName !== "check-style") { + browser.test.notifyFail("options-ui-browser_style"); + } + + let style = window.getComputedStyle(document.getElementById("button")); + let buttonBackgroundColor = style.backgroundColor; + let browserStyleBackgroundColor = "rgb(9, 150, 248)"; + if (!("browser_style" in info) || info.browser_style) { + browser.test.assertEq(browserStyleBackgroundColor, buttonBackgroundColor, assertMessage); + } else { + browser.test.assertTrue(browserStyleBackgroundColor !== buttonBackgroundColor, assertMessage); + } + + browser.test.notifyPass("sidebar-browser-style"); + }); + browser.test.sendMessage("sidebar-ready"); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "sidebar_action": sidebarAction, + }, + useAddonManager: "temporary", + + files: { + "panel.html": ` + + + + + `, + "panel.js": sidebarScript, + }, + }); + + let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser); + + yield extension.startup(); + yield extension.awaitMessage("sidebar-ready"); + + extension.sendMessage("check-style", sidebarAction, assertMessage); + yield extension.awaitFinish("sidebar-browser-style"); + + yield extension.unload(); + + yield BrowserTestUtils.removeTab(tab); +} + +add_task(function* test_sidebar_without_setting_browser_style() { + yield testSidebarBrowserStyle({ + "default_panel": "panel.html", + }, "Expected correct style when browser_style is excluded"); +}); + +add_task(function* test_sidebar_with_browser_style_set_to_true() { + yield testSidebarBrowserStyle({ + "default_panel": "panel.html", + "browser_style": true, + }, "Expected correct style when browser_style is set to `true`"); +}); + +add_task(function* test_sidebar_with_browser_style_set_to_false() { + yield testSidebarBrowserStyle({ + "default_panel": "panel.html", + "browser_style": false, + }, "Expected no style when browser_style is set to `false`"); +}); diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js index d7cc9a50e941..35476eccca1f 100644 --- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js +++ b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js @@ -1,5 +1,14 @@ "use strict"; +// Various "Missing host permission" rejections are left uncaught. This may be +// caused by issues in the test, in the testing framework, or in production +// code. This bug should be fixed, but for the moment this file is whitelisted. +// +// NOTE: Whitelisting a class of rejections should be limited. Normally you +// should use "expectUncaughtRejection" to flag individual failures. +Cu.import("resource://testing-common/PromiseTestUtils.jsm", this); +PromiseTestUtils.whitelistRejectionsGlobally(/Missing host permission/); + // This is a pretty terrible hack, but it's the best we can do until we // support |executeScript| callbacks and |lastError|. async function testHasNoPermission(params) { diff --git a/browser/components/extensions/test/browser/head.js b/browser/components/extensions/test/browser/head.js index deb47543d0ab..6d15b5a409a3 100644 --- a/browser/components/extensions/test/browser/head.js +++ b/browser/components/extensions/test/browser/head.js @@ -21,6 +21,16 @@ * promiseAnimationFrame */ +// There are shutdown issues for which multiple rejections are left uncaught. +// This bug should be fixed, but for the moment this directory is whitelisted. +// +// NOTE: Entire directory whitelisting should be kept to a minimum. Normally you +// should use "expectUncaughtRejection" to flag individual failures. +const {PromiseTestUtils} = Cu.import("resource://testing-common/PromiseTestUtils.jsm", {}); +PromiseTestUtils.whitelistRejectionsGlobally(/Message manager disconnected/); +PromiseTestUtils.whitelistRejectionsGlobally(/No matching message handler/); +PromiseTestUtils.whitelistRejectionsGlobally(/Receiving end does not exist/); + const {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm", {}); const {CustomizableUI} = Cu.import("resource:///modules/CustomizableUI.jsm", {}); diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index 3b20b6a39d08..af26d9673850 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -2180,27 +2180,35 @@ BrowserGlue.prototype = { chromeWindow.openPreferences(...args); }, + _openURLInNewWindow(url) { + let urlString = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); + urlString.data = url; + return new Promise(resolve => { + let win = Services.ww.openWindow(null, Services.prefs.getCharPref("browser.chromeURL"), + "_blank", "chrome,all,dialog=no", urlString); + win.addEventListener("load", () => { resolve(win); }, {once: true}); + }); + }, + /** * Called as an observer when Sync's "display URIs" notification is fired. * * We open the received URIs in background tabs. */ - _onDisplaySyncURIs: function _onDisplaySyncURIs(data) { + async _onDisplaySyncURIs(data) { try { // The payload is wrapped weirdly because of how Sync does notifications. const URIs = data.wrappedJSObject.object; - const findWindow = () => RecentWindow.getMostRecentBrowserWindow({private: false}); - // win can be null, but it's ok, we'll assign it later in openTab() - let win = findWindow(); + let win = RecentWindow.getMostRecentBrowserWindow({private: false}); - const openTab = URI => { + const openTab = async (URI) => { let tab; if (!win) { - Services.appShell.hiddenDOMWindow.open(URI.uri); - win = findWindow(); - tab = win.gBrowser.tabs[0]; + win = await this._openURLInNewWindow(URI.uri); + let tabs = win.gBrowser.tabs; + tab = tabs[tabs.length - 1]; } else { tab = win.gBrowser.addTab(URI.uri); } @@ -2208,8 +2216,8 @@ BrowserGlue.prototype = { return tab; }; - const firstTab = openTab(URIs[0]); - URIs.slice(1).forEach(URI => openTab(URI)); + const firstTab = await openTab(URIs[0]); + await Promise.all(URIs.slice(1).map(URI => openTab(URI))); let title, body; const deviceName = Weave.Service.clientsEngine.getClientName(URIs[0].clientId); @@ -2280,7 +2288,7 @@ BrowserGlue.prototype = { let url = await this.fxAccounts.promiseAccountsManageDevicesURI("device-connected-notification"); let win = RecentWindow.getMostRecentBrowserWindow({private: false}); if (!win) { - Services.appShell.hiddenDOMWindow.open(url); + this._openURLInNewWindow(url); } else { win.gBrowser.addTab(url); } diff --git a/browser/components/preferences/in-content-old/main.xul b/browser/components/preferences/in-content-old/main.xul index a86ec7c28c43..584571050281 100644 --- a/browser/components/preferences/in-content-old/main.xul +++ b/browser/components/preferences/in-content-old/main.xul @@ -337,7 +337,7 @@ accesskey="&allowHWAccel.accesskey;" preference="layers.acceleration.disabled"/> - + @@ -350,6 +350,6 @@ - &limitContentProcess.description; + &limitContentProcessOption.description; diff --git a/browser/components/preferences/in-content/advanced.xul b/browser/components/preferences/in-content/advanced.xul index e541b5e42bf2..2dccd4df318d 100644 --- a/browser/components/preferences/in-content/advanced.xul +++ b/browser/components/preferences/in-content/advanced.xul @@ -72,7 +72,8 @@ class="accessory-button" label="&updateHistory2.label;" accesskey="&updateHistory2.accesskey;" - preference="app.update.disable_button.showUpdateHistory"/> + preference="app.update.disable_button.showUpdateHistory" + searchkeywords="&history.title; &history.intro;"/> #endif diff --git a/browser/components/preferences/in-content/findInPage.js b/browser/components/preferences/in-content/findInPage.js index 6009416df1dc..f4c161247cca 100644 --- a/browser/components/preferences/in-content/findInPage.js +++ b/browser/components/preferences/in-content/findInPage.js @@ -44,7 +44,7 @@ var gSearchResultsPane = { */ stringMatchesFilters(str, filter) { if (!filter || !str) { - return true; + return false; } let searchStr = str.toLowerCase(); let filterStrings = filter.toLowerCase().split(/\s+/); @@ -239,11 +239,14 @@ var gSearchResultsPane = { noResultsEl.hidden = false; let strings = this.strings; - document.getElementById("sorry-message").textContent = - strings.getFormattedString("searchResults.sorryMessage2", [query]); + + document.getElementById("sorry-message").textContent = AppConstants.platform == "win" ? + strings.getFormattedString("searchResults.sorryMessageWin", [query]) : + strings.getFormattedString("searchResults.sorryMessageUnix", [query]); + let helpUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "preferences"; let brandName = document.getElementById("bundleBrand").getString("brandShortName"); document.getElementById("need-help").innerHTML = - strings.getFormattedString("searchResults.needHelp", [brandName]); + strings.getFormattedString("searchResults.needHelp2", [helpUrl, brandName]); } else { // Creating tooltips for all the instances found for (let node of this.listSearchTooltips) { @@ -270,7 +273,7 @@ var gSearchResultsPane = { */ searchWithinNode(nodeObject, searchPhrase) { let matchesFound = false; - if (nodeObject.childElementCount == 0) { + if (nodeObject.childElementCount == 0 || nodeObject.tagName == "menulist") { let simpleTextNodes = this.textNodeDescendants(nodeObject); for (let node of simpleTextNodes) { @@ -282,8 +285,6 @@ var gSearchResultsPane = { let nodeSizes = []; let allNodeText = ""; let runningSize = 0; - let labelResult = false; - let valueResult = false; let accessKeyTextNodes = this.textNodeDescendants(nodeObject.boxObject); for (let node of accessKeyTextNodes) { @@ -296,9 +297,7 @@ var gSearchResultsPane = { let complexTextNodesResult = this.highlightMatches(accessKeyTextNodes, nodeSizes, allNodeText.toLowerCase(), searchPhrase); // Searching some elements, such as xul:button, have a 'label' attribute that contains the user-visible text. - if (nodeObject.getAttribute("label")) { - labelResult = this.stringMatchesFilters(nodeObject.getAttribute("label"), searchPhrase); - } + let labelResult = this.stringMatchesFilters(nodeObject.getAttribute("label"), searchPhrase); // Creating tooltips for buttons if (labelResult && nodeObject.tagName === "button") { @@ -306,20 +305,26 @@ var gSearchResultsPane = { } // Searching some elements, such as xul:label, store their user-visible text in a "value" attribute. - if (nodeObject.getAttribute("value")) { - valueResult = this.stringMatchesFilters(nodeObject.getAttribute("value"), searchPhrase); - } - - if (nodeObject.tagName == "button" && (labelResult || valueResult)) { - nodeObject.setAttribute("highlightable", "true"); - } + let valueResult = this.stringMatchesFilters(nodeObject.getAttribute("value"), searchPhrase); // Creating tooltips for buttons if (valueResult && nodeObject.tagName === "button") { this.listSearchTooltips.push(nodeObject); } - matchesFound = matchesFound || complexTextNodesResult || labelResult || valueResult; + // Searching some elements, such as xul:button, buttons to open subdialogs. + let keywordsResult = this.stringMatchesFilters(nodeObject.getAttribute("searchkeywords"), searchPhrase); + + // Creating tooltips for buttons + if (keywordsResult && nodeObject.tagName === "button") { + this.listSearchTooltips.push(nodeObject); + } + + if (nodeObject.tagName == "button" && (labelResult || valueResult || keywordsResult)) { + nodeObject.setAttribute("highlightable", "true"); + } + + matchesFound = matchesFound || complexTextNodesResult || labelResult || valueResult || keywordsResult; } for (let i = 0; i < nodeObject.childNodes.length; i++) { diff --git a/browser/components/preferences/in-content/main.xul b/browser/components/preferences/in-content/main.xul index 720a884d34da..3e55fe8b7d2f 100644 --- a/browser/components/preferences/in-content/main.xul +++ b/browser/components/preferences/in-content/main.xul @@ -315,7 +315,8 @@ class="content-cell-item" label="&chooseBookmark.label;" accesskey="&chooseBookmark.accesskey;" - preference="pref.browser.homepage.disable_button.bookmark_page"/> + preference="pref.browser.homepage.disable_button.bookmark_page" + searchkeywords="&selectBookmark.title; &selectBookmark.label;"/>