forked from mirrors/gecko-dev
		
	 d36e5a4ea5
			
		
	
	
		d36e5a4ea5
		
	
	
	
	
		
			
			Dictionaries that we never initialize with JS values don't need a full-featured Init() method. Instead, we output a cut-down Init() method that doesn't even take a JSContext and Value as argument, and skips as much work as it can. It uses constant-false for "is the value present?", but also, to avoid compilation errors due to use of `cx` and `val` in now-dead conversion code, it tells the native-to-JS conversion machinery that the value is always missing, which lets it skip most of the the work it would normally try to do and just output initialization to the default value. We only need to do this for members that have default values; the others either remain no-passed or are required members with no default-initialization behavior. This saves about 330KB of codesize on Linux64 without PGO and 285KB with PGO. Differential Revision: https://phabricator.services.mozilla.com/D48007 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			184 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| /* 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/. */
 | |
| 
 | |
| interface nsIDocShell;
 | |
| interface nsISupports;
 | |
| 
 | |
| /**
 | |
|  * A callback passed to SessionStoreUtils.forEachNonDynamicChildFrame().
 | |
|  */
 | |
| callback SessionStoreUtilsFrameCallback = void (WindowProxy frame, unsigned long index);
 | |
| 
 | |
| /**
 | |
|  * SessionStore utility functions implemented in C++ for performance reasons.
 | |
|  */
 | |
| [ChromeOnly, Exposed=Window]
 | |
| namespace SessionStoreUtils {
 | |
|   /**
 | |
|    * Calls the given |callback| once for each non-dynamic child frame of the
 | |
|    * given |window|.
 | |
|    */
 | |
|   [Throws]
 | |
|   void forEachNonDynamicChildFrame(WindowProxy window,
 | |
|                                    SessionStoreUtilsFrameCallback callback);
 | |
| 
 | |
|   /**
 | |
|    * Takes the given listener, wraps it in a filter that filters out events from
 | |
|    * dynamic docShells, and adds that filter as a listener for the given event
 | |
|    * type on the given event target.  The listener that was added is returned
 | |
|    * (as nsISupports) so that it can later be removed via
 | |
|    * removeDynamicFrameFilteredListener.
 | |
|    *
 | |
|    * This is implemented as a native filter, rather than a JS-based one, for
 | |
|    * performance reasons.
 | |
|    */
 | |
|   [Throws]
 | |
|   nsISupports? addDynamicFrameFilteredListener(EventTarget target,
 | |
|                                                DOMString type,
 | |
|                                                any listener,
 | |
|                                                boolean useCapture,
 | |
|                                                optional boolean mozSystemGroup = false);
 | |
| 
 | |
|   /**
 | |
|    * Remove the passed-in filtered listener from the given event target, if it's
 | |
|    * currently a listener for the given event type there.  The 'listener'
 | |
|    * argument must be something that was returned by
 | |
|    * addDynamicFrameFilteredListener.
 | |
|    *
 | |
|    * This is needed, instead of the normal removeEventListener, because the
 | |
|    * caller doesn't actually have something that WebIDL considers an
 | |
|    * EventListener.
 | |
|    */
 | |
|   [Throws]
 | |
|   void removeDynamicFrameFilteredListener(EventTarget target,
 | |
|                                           DOMString type,
 | |
|                                           nsISupports listener,
 | |
|                                           boolean useCapture,
 | |
|                                           optional boolean mozSystemGroup = false);
 | |
| 
 | |
|   /*
 | |
|    * Save the docShell.allow* properties
 | |
|    */
 | |
|   ByteString collectDocShellCapabilities(nsIDocShell docShell);
 | |
| 
 | |
|   /*
 | |
|    * Restore the docShell.allow* properties
 | |
|    */
 | |
|   void restoreDocShellCapabilities(nsIDocShell docShell,
 | |
|                                    ByteString disallowCapabilities);
 | |
| 
 | |
|   /**
 | |
|    * Collects scroll position data for any given |frame| in the frame hierarchy.
 | |
|    *
 | |
|    * @param document (DOMDocument)
 | |
|    *
 | |
|    * @return {scroll: "x,y"} e.g. {scroll: "100,200"}
 | |
|    *         Returns null when there is no scroll data we want to store for the
 | |
|    *         given |frame|.
 | |
|    */
 | |
|   CollectedData? collectScrollPosition(WindowProxy window);
 | |
| 
 | |
|   /**
 | |
|    * Restores scroll position data for any given |frame| in the frame hierarchy.
 | |
|    *
 | |
|    * @param frame (DOMWindow)
 | |
|    * @param value (object, see collectScrollPosition())
 | |
|    */
 | |
|   void restoreScrollPosition(Window frame, optional CollectedData data = {});
 | |
| 
 | |
|   /**
 | |
|    * Collect form data for a given |frame| *not* including any subframes.
 | |
|    *
 | |
|    * The returned object may have an "id", "xpath", or "innerHTML" key or a
 | |
|    * combination of those three. Form data stored under "id" is for input
 | |
|    * fields with id attributes. Data stored under "xpath" is used for input
 | |
|    * fields that don't have a unique id and need to be queried using XPath.
 | |
|    * The "innerHTML" key is used for editable documents (designMode=on).
 | |
|    *
 | |
|    * Example:
 | |
|    *   {
 | |
|    *     id: {input1: "value1", input3: "value3"},
 | |
|    *     xpath: {
 | |
|    *       "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value2",
 | |
|    *       "/xhtml:html/xhtml:body/xhtml:input[@name='input4']" : "value4"
 | |
|    *     }
 | |
|    *   }
 | |
|    *
 | |
|    * @return object
 | |
|    *         Returns null when there is no scroll data
 | |
|    */
 | |
|   CollectedData? collectFormData(WindowProxy window);
 | |
| 
 | |
|   boolean restoreFormData(Document document, optional CollectedData data = {});
 | |
| 
 | |
|   /**
 | |
|    * Restores all sessionStorage "super cookies".
 | |
|    * @param aDocShell
 | |
|    *        A tab's docshell (containing the sessionStorage)
 | |
|    * @param aStorageData
 | |
|    *        A nested object with storage data to be restored that has hosts as
 | |
|    *        keys and per-origin session storage data as strings. For example:
 | |
|    *        {"https://example.com^userContextId=1": {"key": "value", "my_number": "123"}}
 | |
|    */
 | |
|    void restoreSessionStorage(nsIDocShell docShell, record<DOMString, record<DOMString, DOMString>> data);
 | |
| };
 | |
| 
 | |
| [GenerateConversionToJS, GenerateInit]
 | |
| dictionary CollectedFileListValue
 | |
| {
 | |
|   required DOMString type;
 | |
|   required sequence<DOMString> fileList;
 | |
| };
 | |
| 
 | |
| [GenerateConversionToJS, GenerateInit]
 | |
| dictionary CollectedNonMultipleSelectValue
 | |
| {
 | |
|   required long selectedIndex;
 | |
|   required DOMString value;
 | |
| };
 | |
| 
 | |
| // object contains either a CollectedFileListValue or a CollectedNonMultipleSelectValue or Sequence<DOMString>
 | |
| typedef (DOMString or boolean or object) CollectedFormDataValue;
 | |
| 
 | |
| dictionary CollectedData
 | |
| {
 | |
|   ByteString scroll;
 | |
|   record<DOMString, CollectedFormDataValue> id;
 | |
|   record<DOMString, CollectedFormDataValue> xpath;
 | |
|   DOMString innerHTML;
 | |
|   ByteString url;
 | |
|   // mChildren contains CollectedData instances
 | |
|   sequence<object?> children;
 | |
| };
 | |
| 
 | |
| dictionary InputElementData {
 | |
|   sequence<DOMString> id;
 | |
|   sequence<DOMString> type;
 | |
|   sequence<long> valueIdx;
 | |
|   sequence<long> selectedIndex;
 | |
|   sequence<DOMString> selectVal;
 | |
|   sequence<DOMString> strVal;
 | |
|   sequence<boolean> boolVal;
 | |
| };
 | |
| 
 | |
| [GenerateConversionToJS]
 | |
| dictionary UpdateSessionStoreData {
 | |
|   ByteString docShellCaps;
 | |
|   boolean isPrivate;
 | |
|   sequence<ByteString> positions;
 | |
|   sequence<long> positionDescendants;
 | |
|   // The following are for input data
 | |
|   InputElementData id;
 | |
|   InputElementData xpath;
 | |
|   sequence<long> inputDescendants;
 | |
|   sequence<long> numId;
 | |
|   sequence<long> numXPath;
 | |
|   sequence<DOMString> innerHTML;
 | |
|   sequence<ByteString> url;
 | |
|   // for sessionStorage
 | |
|   sequence<ByteString> storageOrigins;
 | |
|   sequence<DOMString> storageKeys;
 | |
|   sequence<DOMString> storageValues;
 | |
|   boolean isFullStorage;
 | |
| };
 |