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 )