@@ -1687,4 +1687,101 @@ describe("PDF viewer", () => {
16871687 ) ;
16881688 } ) ;
16891689 } ) ;
1690+
1691+ describe ( "Double-click on title collapses/expands all outline items" , ( ) => {
1692+ let pages ;
1693+
1694+ beforeEach ( async ( ) => {
1695+ pages = await loadAndWait (
1696+ "nested_outline.pdf" ,
1697+ "#viewsManagerToggleButton"
1698+ ) ;
1699+ } ) ;
1700+
1701+ afterEach ( async ( ) => {
1702+ await closePages ( pages ) ;
1703+ } ) ;
1704+
1705+ it ( "should collapse all outline items on first double-click and expand them on second" , async ( ) => {
1706+ await Promise . all (
1707+ pages . map ( async ( [ browserName , page ] ) => {
1708+ await showViewsManager ( page ) ;
1709+
1710+ await page . click ( "#viewsManagerSelectorButton" ) ;
1711+ await page . waitForSelector ( "#outlinesViewMenu" , { visible : true } ) ;
1712+ await page . click ( "#outlinesViewMenu" ) ;
1713+ await page . waitForSelector ( "#outlinesView.withNesting" ) ;
1714+
1715+ // Initially all togglers must be expanded (none hidden).
1716+ const initialHiddenCount = await page . $$eval (
1717+ "#outlinesView .treeItemToggler" ,
1718+ togglers =>
1719+ togglers . filter ( t => t . classList . contains ( "treeItemsHidden" ) )
1720+ . length
1721+ ) ;
1722+ expect ( initialHiddenCount ) . withContext ( `In ${ browserName } ` ) . toBe ( 0 ) ;
1723+
1724+ // Double-click the title label (not on a button) to collapse all.
1725+ await page . click ( "#viewsManagerHeaderLabel" , { count : 2 } ) ;
1726+ await page . waitForFunction (
1727+ ( ) =>
1728+ document . querySelectorAll (
1729+ "#outlinesView .treeItemToggler:not(.treeItemsHidden)"
1730+ ) . length === 0
1731+ ) ;
1732+
1733+ // Double-click again to expand all.
1734+ await page . click ( "#viewsManagerHeaderLabel" , { count : 2 } ) ;
1735+ await page . waitForFunction (
1736+ ( ) =>
1737+ document . querySelectorAll (
1738+ "#outlinesView .treeItemToggler.treeItemsHidden"
1739+ ) . length === 0
1740+ ) ;
1741+ } )
1742+ ) ;
1743+ } ) ;
1744+ } ) ;
1745+
1746+ describe ( "Double-click on title resets all layer checkboxes" , ( ) => {
1747+ let pages ;
1748+
1749+ beforeEach ( async ( ) => {
1750+ pages = await loadAndWait ( "issue17679.pdf" , "#viewsManagerToggleButton" ) ;
1751+ } ) ;
1752+
1753+ afterEach ( async ( ) => {
1754+ await closePages ( pages ) ;
1755+ } ) ;
1756+
1757+ it ( "should restore all layer checkboxes to checked after unchecking them" , async ( ) => {
1758+ await Promise . all (
1759+ pages . map ( async ( [ browserName , page ] ) => {
1760+ await showViewsManager ( page ) ;
1761+
1762+ await page . click ( "#viewsManagerSelectorButton" ) ;
1763+ await page . waitForSelector ( "#layersViewMenu" , { visible : true } ) ;
1764+ await page . click ( "#layersViewMenu" ) ;
1765+ await page . waitForSelector ( "#layersView input[type='checkbox']" ) ;
1766+
1767+ // Uncheck all checkboxes.
1768+ const checkboxes = await page . $$ (
1769+ "#layersView input[type='checkbox']"
1770+ ) ;
1771+ for ( const checkbox of checkboxes ) {
1772+ await checkbox . click ( ) ;
1773+ }
1774+ await page . waitForSelector ( "#layersView:not(:has(:checked))" ) ;
1775+
1776+ // Double-click the title label to reset layers to their default
1777+ // state.
1778+ await page . click ( "#viewsManagerHeaderLabel" , { count : 2 } ) ;
1779+
1780+ await page . waitForSelector (
1781+ `#layersView:not(:has(input[type="checkbox"]:not(:checked)))`
1782+ ) ;
1783+ } )
1784+ ) ;
1785+ } ) ;
1786+ } ) ;
16901787} ) ;
0 commit comments