4.5 KiB
Overview
The RDM tool uses several forms of tab and browser swapping to integrate the
tool UI cleanly into the browser UI. The high level steps of this process are
documented at /devtools/docs/responsive-design-mode.md.
This document contains a random assortment of low level notes about the steps the browser goes through when swapping browsers between tabs.
Connections between Browsers and Tabs
Link between tab and browser (gBrowser._linkBrowserToTab):
aTab.linkedBrowser = browser;
gBrowser._tabForBrowser.set(browser, aTab);
Swapping Browsers between Tabs
Legend
- (R): remote browsers only
- (!R): non-remote browsers only
Functions Called
When you call gBrowser.swapBrowsersAndCloseOther to move tab content from a
browser in one tab to a browser in another tab, here are all the code paths
involved:
gBrowser.swapBrowsersAndCloseOthergBrowser._beginRemoveTabgBrowser.tabContainer.updateVisibility- Emit
TabClose browser.webProgress.removeProgressListenerfilter.removeProgressListenerlistener.destroy
gBrowser._swapBrowserDocShellsourBrowser.webProgress.removeProgressListenerfilter.removeProgressListenergBrowser._swapRegisteredOpenURIsourBrowser.swapDocShells(aOtherBrowser)- Emit
SwapDocShells PopupNotifications._swapBrowserNotificationsbrowser.detachFormFill(!R)browser.swapFrameLoadersbrowser.attachFormFill(!R)browser._remoteWebNavigationImpl.swapBrowser(browser)(R)browser._remoteWebProgressManager.swapBrowser(browser)(R)browser._remoteFinder.swapBrowser(browser)(R)- Emit
EndSwapDocShells
- Emit
gBrowser.mTabProgressListenerfilter.addProgressListenerourBrowser.webProgress.addProgressListener
gBrowser._endRemoveTabgBrowser.tabContainer._fillTrailingGapgBrowser._blurTabgBrowser._tabFilters.deletegBrowser._tabListeners.deletegBrowser._outerWindowIDBrowserMap.deletebrowser.destroygBrowser.tabContainer.removeChildgBrowser.tabContainer.adjustTabstripgBrowser.tabContainer._setPositionalAttributesbrowser.parentNode.removeChild(browser)gBrowser._tabForBrowser.deletegBrowser.mPanelContainer.removeChild
gBrowser.setTabTitle/gBrowser.setTabTitleLoadingbrowser.currentURI.specgBrowser._tabAttrModifiedgBrowser.updateTitlebar
gBrowser.updateCurrentBrowserbrowser.docShellIsActive(!R)gBrowser.showTabgBrowser._appendStatusPanelgBrowser._callProgressListenerswithonLocationChangegBrowser._callProgressListenerswithonSecurityChangegBrowser._callProgressListenerswithonUpdateCurrentBrowsergBrowser._recordTabAccessgBrowser.updateTitlebargBrowser._callProgressListenerswithonStateChangegBrowser._setCloseKeyState- Emit
TabSelect gBrowser._tabAttrModifiedbrowser.getInPermitUnloadgBrowser.tabContainer._setPositionalAttributes
gBrowser._tabAttrModified
Browser State
When calling gBrowser.swapBrowsersAndCloseOther, the browser is not actually
moved from one tab to the other. Instead, various properties on each of the
browsers are swapped.
Browser attributes gBrowser.swapBrowsersAndCloseOther transfers between
browsers:
Tab attributes gBrowser.swapBrowsersAndCloseOther transfers between tabs:
mutedsoundplayingbusy
Browser properties gBrowser.swapBrowsersAndCloseOther transfers between
browsers:
mIconURLgetFindBar(aOurTab)._findField.value
Browser properties gBrowser._swapBrowserDocShells transfers between browsers:
outerWindowIDingBrowser._outerWindowIDBrowserMap_outerWindowIDon the browser (R)docShellIsActivepermanentKeyregisteredOpenURI
Browser properties browser.swapDocShells transfers between browsers:
_docShell_webBrowserFind_contentWindow_webNavigation_remoteWebNavigation(R)_remoteWebNavigationImpl(R)_remoteWebProgressManager(R)_remoteWebProgress(R)_remoteFinder(R)_securityUI(R)_documentURI(R)_documentContentType(R)_contentTitle(R)_characterSet(R)_contentPrincipal(R)_imageDocument(R)_fullZoom(R)_textZoom(R)_isSyntheticDocument(R)_innerWindowID(R)_manifestURI(R)
browser.swapFrameLoaders swaps the actual page content.