tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_restore_manually.py (4786B)


      1 # This Source Code Form is subject to the terms of the Mozilla Public
      2 # License, v. 2.0. If a copy of the MPL was not distributed with this
      3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 
      5 import os
      6 import sys
      7 
      8 # add this directory to the path
      9 sys.path.append(os.path.dirname(__file__))
     10 
     11 from session_store_test_case import SessionStoreTestCase
     12 
     13 
     14 def inline(title):
     15    return f"data:text/html;charset=utf-8,<html><head><title>{title}</title></head><body></body></html>"
     16 
     17 
     18 class TestSessionRestoreManually(SessionStoreTestCase):
     19    """
     20    Test that window attributes for each window are restored
     21    correctly (with manual session restore) in a new session.
     22    """
     23 
     24    def setUp(self):
     25        super().setUp(
     26            startup_page=1,
     27            include_private=False,
     28            restore_on_demand=True,
     29            test_windows=set([
     30                # Window 1
     31                (
     32                    inline("lorem ipsom"),
     33                    inline("dolor"),
     34                ),
     35                # Window 2
     36                (inline("sit"),),
     37            ]),
     38        )
     39 
     40    def test_restore(self):
     41        self.marionette.execute_script(
     42            """
     43            Services.prefs.setBoolPref("browser.sessionstore.persist_closed_tabs_between_sessions", true);
     44            """
     45        )
     46 
     47        self.wait_for_windows(
     48            self.all_windows, "Not all requested windows have been opened"
     49        )
     50 
     51        self.assertEqual(
     52            len(self.marionette.chrome_window_handles),
     53            2,
     54            msg="Should have 3 windows open.",
     55        )
     56        self.marionette.execute_async_script(
     57            """
     58            function getAllBrowserWindows() {
     59                return Array.from(Services.wm.getEnumerator("navigator:browser"));
     60            }
     61            function promiseResize(value, win) {
     62                let deferred = Promise.withResolvers();
     63                let id;
     64                function listener() {
     65                    win.clearTimeout(id);
     66                    if (win.innerWidth <= value) {
     67                        id = win.setTimeout(() => {
     68                            win.removeEventListener("resize", listener);
     69                            deferred.resolve()
     70                        }, 100);
     71                    }
     72                }
     73                if (win.innerWidth > value) {
     74                    win.addEventListener("resize", listener);
     75                    win.resizeTo(value, value);
     76                } else {
     77                    deferred.resolve()
     78                }
     79                return deferred.promise;
     80            }
     81 
     82            let resolve = arguments[0];
     83            let windows = getAllBrowserWindows();
     84            let value = 500;
     85            promiseResize(value, windows[1]).then(resolve);
     86            """
     87        )
     88 
     89        self.marionette.quit()
     90        self.marionette.start_session()
     91        self.marionette.set_context("chrome")
     92 
     93        # restore the previous session
     94        self.marionette.execute_script(
     95            """
     96            const lazy = {};
     97            ChromeUtils.defineESModuleGetters(lazy, {
     98                SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
     99            });
    100            function observeClosedObjectsChange() {
    101                return new Promise(resolve => {
    102                    function observe(subject, topic, data) {
    103                        if (topic == "sessionstore-closed-objects-changed") {
    104                            Services.obs.removeObserver(this, "sessionstore-closed-objects-changed");
    105                            resolve('observed closed objects changed');
    106                        };
    107                    }
    108                    Services.obs.addObserver(observe, "sessionstore-closed-objects-changed");
    109                });
    110            };
    111 
    112            async function checkForWindowHeight() {
    113                let closedWindowsObserver = observeClosedObjectsChange();
    114                lazy.SessionStore.restoreLastSession();
    115                await closedWindowsObserver;
    116            }
    117            checkForWindowHeight();
    118            """
    119        )
    120 
    121        self.assertEqual(
    122            len(self.marionette.chrome_window_handles),
    123            2,
    124            msg="Windows from last session have been restored.",
    125        )
    126 
    127        self.assertEqual(
    128            self.marionette.execute_script(
    129                """
    130                const lazy = {};
    131                ChromeUtils.defineESModuleGetters(lazy, {
    132                    SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
    133                });
    134                let state = SessionStore.getCurrentState()
    135                return state.windows[1]["height"]
    136                """
    137            ),
    138            500,
    139            "Second window has been restored to the correct height.",
    140        )