forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			110 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
 | |
|  * 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/. */
 | |
| 
 | |
| /**
 | |
|  * The external API exported by this module.
 | |
|  */
 | |
| export var SessionStoreHelper = Object.freeze({
 | |
|   buildRestoreData(formdata, scroll) {
 | |
|     return SessionStoreHelperInternal.buildRestoreData(formdata, scroll);
 | |
|   },
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * The internal API for the SessionStoreHelper module.
 | |
|  */
 | |
| var SessionStoreHelperInternal = {
 | |
|   /**
 | |
|    * Builds a single nsISessionStoreRestoreData tree for the provided |formdata|
 | |
|    * and |scroll| trees.
 | |
|    */
 | |
|   buildRestoreData(formdata, scroll) {
 | |
|     function addFormEntries(root, fields, isXpath) {
 | |
|       for (let [key, value] of Object.entries(fields)) {
 | |
|         switch (typeof value) {
 | |
|           case "string":
 | |
|             root.addTextField(isXpath, key, value);
 | |
|             break;
 | |
|           case "boolean":
 | |
|             root.addCheckbox(isXpath, key, value);
 | |
|             break;
 | |
|           case "object": {
 | |
|             if (value === null) {
 | |
|               break;
 | |
|             }
 | |
|             if (
 | |
|               value.hasOwnProperty("type") &&
 | |
|               value.hasOwnProperty("fileList")
 | |
|             ) {
 | |
|               root.addFileList(isXpath, key, value.type, value.fileList);
 | |
|               break;
 | |
|             }
 | |
|             if (
 | |
|               value.hasOwnProperty("selectedIndex") &&
 | |
|               value.hasOwnProperty("value")
 | |
|             ) {
 | |
|               root.addSingleSelect(
 | |
|                 isXpath,
 | |
|                 key,
 | |
|                 value.selectedIndex,
 | |
|                 value.value
 | |
|               );
 | |
|               break;
 | |
|             }
 | |
|             if (
 | |
|               value.hasOwnProperty("value") &&
 | |
|               value.hasOwnProperty("state")
 | |
|             ) {
 | |
|               root.addCustomElement(isXpath, key, value.value, value.state);
 | |
|               break;
 | |
|             }
 | |
|             if (
 | |
|               key === "sessionData" &&
 | |
|               ["about:sessionrestore", "about:welcomeback"].includes(
 | |
|                 formdata.url
 | |
|               )
 | |
|             ) {
 | |
|               root.addTextField(isXpath, key, JSON.stringify(value));
 | |
|               break;
 | |
|             }
 | |
|             if (Array.isArray(value)) {
 | |
|               root.addMultipleSelect(isXpath, key, value);
 | |
|               break;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     let root = SessionStoreUtils.constructSessionStoreRestoreData();
 | |
|     if (scroll?.hasOwnProperty("scroll")) {
 | |
|       root.scroll = scroll.scroll;
 | |
|     }
 | |
|     if (formdata?.hasOwnProperty("url")) {
 | |
|       root.url = formdata.url;
 | |
|       if (formdata.hasOwnProperty("innerHTML")) {
 | |
|         // eslint-disable-next-line no-unsanitized/property
 | |
|         root.innerHTML = formdata.innerHTML;
 | |
|       }
 | |
|       if (formdata.hasOwnProperty("xpath")) {
 | |
|         addFormEntries(root, formdata.xpath, /* isXpath */ true);
 | |
|       }
 | |
|       if (formdata.hasOwnProperty("id")) {
 | |
|         addFormEntries(root, formdata.id, /* isXpath */ false);
 | |
|       }
 | |
|     }
 | |
|     let childrenLength = Math.max(
 | |
|       scroll?.children?.length || 0,
 | |
|       formdata?.children?.length || 0
 | |
|     );
 | |
|     for (let i = 0; i < childrenLength; i++) {
 | |
|       root.addChild(
 | |
|         this.buildRestoreData(formdata?.children?.[i], scroll?.children?.[i]),
 | |
|         i
 | |
|       );
 | |
|     }
 | |
|     return root;
 | |
|   },
 | |
| };
 | 
