|  | @@ -13,53 +13,11 @@ import { IObfuscationResult } from '../../../../../src/interfaces/source-code/IO
 | 
	
		
			
				|  |  |  import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import { DomainLockTemplate } from '../../../../../src/custom-code-helpers/domain-lock/templates/DomainLockTemplate';
 | 
	
		
			
				|  |  | -import { GlobalVariableTemplate1 } from '../../../../../src/custom-code-helpers/common/templates/GlobalVariableTemplate1';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import { InversifyContainerFacade } from '../../../../../src/container/InversifyContainerFacade';
 | 
	
		
			
				|  |  |  import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
 | 
	
		
			
				|  |  |  import { readFileAsString } from '../../../../helpers/readFileAsString';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * @param {string} currentDomain
 | 
	
		
			
				|  |  | - * @returns {string}
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -function getDocumentDomainTemplate (currentDomain: string): string {
 | 
	
		
			
				|  |  | -    return `
 | 
	
		
			
				|  |  | -        document = {
 | 
	
		
			
				|  |  | -            domain: '${currentDomain}'
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -    `
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * @param {string} currentDomain
 | 
	
		
			
				|  |  | - * @returns {string}
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -function getDocumentLocationTemplate (currentDomain: string): string {
 | 
	
		
			
				|  |  | -    return `
 | 
	
		
			
				|  |  | -        document = {
 | 
	
		
			
				|  |  | -            location: {
 | 
	
		
			
				|  |  | -                hostname: '${currentDomain}'
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -    `
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * @param {string} currentDomain
 | 
	
		
			
				|  |  | - * @returns {string}
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -function getDocumentDomainAndLocationTemplate (currentDomain: string): string {
 | 
	
		
			
				|  |  | -    return `
 | 
	
		
			
				|  |  | -        document = {
 | 
	
		
			
				|  |  | -            domain: '${currentDomain}',
 | 
	
		
			
				|  |  | -            location: {
 | 
	
		
			
				|  |  | -                hostname: '${currentDomain}'
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -    `
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * @param templateData
 | 
	
		
			
				|  |  |   * @param {string} callsControllerFunctionName
 | 
	
	
		
			
				|  | @@ -85,11 +43,12 @@ function getFunctionFromTemplate (
 | 
	
		
			
				|  |  |          })();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ${domainLockTemplate}
 | 
	
		
			
				|  |  | -    `)();
 | 
	
		
			
				|  |  | +    `);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  describe('DomainLockTemplate', () => {
 | 
	
		
			
				|  |  |      const singleCallControllerFunctionName: string = 'callsController';
 | 
	
		
			
				|  |  | +    const thatThisTemplate = 'const that = this;';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let cryptUtils: ICryptUtils;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -102,393 +61,614 @@ describe('DomainLockTemplate', () => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      describe('Variant #1: current domain matches with `domainsString`', () => {
 | 
	
		
			
				|  |  |          const domainsString: string = ['www.example.com'].join(';');
 | 
	
		
			
				|  |  | +        const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |          const currentDomain: string = 'www.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        let testFunc: () => void;
 | 
	
		
			
				|  |  | +        let testFunc: Function;
 | 
	
		
			
				|  |  | +        let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          before(() => {
 | 
	
		
			
				|  |  |              const [
 | 
	
		
			
				|  |  |                  hiddenDomainsString,
 | 
	
		
			
				|  |  | -                diff
 | 
	
		
			
				|  |  | +                domainsStringDiff
 | 
	
		
			
				|  |  |              ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +            const [
 | 
	
		
			
				|  |  | +                hiddenDomainDest,
 | 
	
		
			
				|  |  | +                domainDestDiff
 | 
	
		
			
				|  |  | +            ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            root = {
 | 
	
		
			
				|  |  | +                document: {
 | 
	
		
			
				|  |  | +                    domain: currentDomain,
 | 
	
		
			
				|  |  | +                    location: undefined,
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                    diff: diff,
 | 
	
		
			
				|  |  | +                    domainsStringDiff,
 | 
	
		
			
				|  |  |                      domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                    domainDestDiff,
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                thatThisTemplate
 | 
	
		
			
				|  |  |              );
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -            assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +            assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +            assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      describe('Variant #2: current domain matches with base domain of `domainsString`', () => {
 | 
	
		
			
				|  |  |          const domainsString: string = ['.example.com'].join(';');
 | 
	
		
			
				|  |  | +        const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |          const currentDomain: string = 'www.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        let testFunc: () => void;
 | 
	
		
			
				|  |  | +        let testFunc: Function;
 | 
	
		
			
				|  |  | +        let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          before(() => {
 | 
	
		
			
				|  |  |              const [
 | 
	
		
			
				|  |  |                  hiddenDomainsString,
 | 
	
		
			
				|  |  | -                diff
 | 
	
		
			
				|  |  | +                domainsStringDiff
 | 
	
		
			
				|  |  |              ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +            const [
 | 
	
		
			
				|  |  | +                hiddenDomainDest,
 | 
	
		
			
				|  |  | +                domainDestDiff
 | 
	
		
			
				|  |  | +            ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            root = {
 | 
	
		
			
				|  |  | +                document: {
 | 
	
		
			
				|  |  | +                    domain: currentDomain,
 | 
	
		
			
				|  |  | +                    location: undefined,
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                    diff: diff,
 | 
	
		
			
				|  |  | +                    domainsStringDiff,
 | 
	
		
			
				|  |  |                      domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                    domainDestDiff,
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                thatThisTemplate
 | 
	
		
			
				|  |  |              );
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -            assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +            assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +            assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      describe('Variant #3: current domain matches with root domain of `domainsString`', () => {
 | 
	
		
			
				|  |  |          const domainsString: string = ['.example.com'].join(';');
 | 
	
		
			
				|  |  | +        const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |          const currentDomain: string = 'example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        let testFunc: () => void;
 | 
	
		
			
				|  |  | +        let testFunc: Function;
 | 
	
		
			
				|  |  | +        let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          before(() => {
 | 
	
		
			
				|  |  |              const [
 | 
	
		
			
				|  |  |                  hiddenDomainsString,
 | 
	
		
			
				|  |  | -                diff
 | 
	
		
			
				|  |  | +                domainsStringDiff
 | 
	
		
			
				|  |  |              ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +            const [
 | 
	
		
			
				|  |  | +                hiddenDomainDest,
 | 
	
		
			
				|  |  | +                domainDestDiff
 | 
	
		
			
				|  |  | +            ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            root = {
 | 
	
		
			
				|  |  | +                document: {
 | 
	
		
			
				|  |  | +                    domain: currentDomain,
 | 
	
		
			
				|  |  | +                    location: undefined,
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                    diff: diff,
 | 
	
		
			
				|  |  | +                    domainsStringDiff,
 | 
	
		
			
				|  |  |                      domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                    domainDestDiff,
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                thatThisTemplate
 | 
	
		
			
				|  |  |              );
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -            assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +            assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +            assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      describe('Variant #4: current root domain matches with `domainsString`', () => {
 | 
	
		
			
				|  |  |          describe('Variant #1', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -                assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #2', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['example.com', '.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'subdomain.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -                assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #3', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['.example.com', 'example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'subdomain.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -                assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #4', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['sub1.example.com', 'sub2.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'sub1.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -                assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      describe('Variant #5: current domain matches with base domain of `domainsString` item', () => {
 | 
	
		
			
				|  |  |          const domainsString: string = ['www.test.com', '.example.com'].join(';');
 | 
	
		
			
				|  |  | +        const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |          const currentDomain: string = 'subdomain.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        let testFunc: () => void;
 | 
	
		
			
				|  |  | +        let testFunc: Function;
 | 
	
		
			
				|  |  | +        let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          before(() => {
 | 
	
		
			
				|  |  |              const [
 | 
	
		
			
				|  |  |                  hiddenDomainsString,
 | 
	
		
			
				|  |  | -                diff
 | 
	
		
			
				|  |  | +                domainsStringDiff
 | 
	
		
			
				|  |  |              ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +            const [
 | 
	
		
			
				|  |  | +                hiddenDomainDest,
 | 
	
		
			
				|  |  | +                domainDestDiff
 | 
	
		
			
				|  |  | +            ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            root = {
 | 
	
		
			
				|  |  | +                document: {
 | 
	
		
			
				|  |  | +                    domain: currentDomain,
 | 
	
		
			
				|  |  | +                    location: undefined,
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                    diff: diff,
 | 
	
		
			
				|  |  | +                    domainsStringDiff,
 | 
	
		
			
				|  |  |                      domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                    domainDestDiff,
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                thatThisTemplate
 | 
	
		
			
				|  |  |              );
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -            assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +            assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +            assert.isUndefined(root.document.location);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      describe('Variant #6: current domain doesn\'t match with `domainsString`', () => {
 | 
	
		
			
				|  |  |          describe('Variant #1', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['www.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'www.test.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #2', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['sub1.test.com', 'sub2.test.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'sub3.test.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate({
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate({
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #3', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['www.example.com', '.example.com', 'sub.test.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'www.test.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #4', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'example1.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        describe('Variant #4', () => {
 | 
	
		
			
				|  |  | +        describe('Variant #5', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentDomain: string = 'sub.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentDomain,
 | 
	
		
			
				|  |  | +                        location: undefined,
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainTemplate(currentDomain)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
	
		
			
				|  | @@ -496,61 +676,97 @@ describe('DomainLockTemplate', () => {
 | 
	
		
			
				|  |  |      describe('Variant #7: location.hostname', () => {
 | 
	
		
			
				|  |  |          describe('Variant #1: current location.hostname matches with `domainsString`', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['www.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentHostName: string = 'www.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        location: {
 | 
	
		
			
				|  |  | +                            hostname: currentHostName,
 | 
	
		
			
				|  |  | +                        },
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentLocationTemplate(currentHostName)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -                assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.isObject(root.document.location);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #2: current location.hostname doesn\'t match with `domainsString`', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['www.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentHostName: string = 'www.test.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        location: {
 | 
	
		
			
				|  |  | +                            hostname: currentHostName,
 | 
	
		
			
				|  |  | +                        },
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentLocationTemplate(currentHostName)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 | 
	
	
		
			
				|  | @@ -558,61 +774,99 @@ describe('DomainLockTemplate', () => {
 | 
	
		
			
				|  |  |      describe('Variant #8: domain and location.hostname presented', () => {
 | 
	
		
			
				|  |  |          describe('Variant #1: current domain matches with `domainsString`', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['www.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentHostName: string = 'www.example.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentHostName,
 | 
	
		
			
				|  |  | +                        location: {
 | 
	
		
			
				|  |  | +                            hostname: currentHostName,
 | 
	
		
			
				|  |  | +                        },
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainAndLocationTemplate(currentHostName)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              it('should correctly run code inside template', () => {
 | 
	
		
			
				|  |  | -                assert.doesNotThrow(testFunc);
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.isObject(root.document.location);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          describe('Variant #2: current domain doesn\'t match with `domainsString`', () => {
 | 
	
		
			
				|  |  |              const domainsString: string = ['www.example.com'].join(';');
 | 
	
		
			
				|  |  | +            const domainDest: string = 'about:blank';
 | 
	
		
			
				|  |  |              const currentHostName: string = 'www.test.com';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            let testFunc: () => void;
 | 
	
		
			
				|  |  | +            let testFunc: Function;
 | 
	
		
			
				|  |  | +            let root: any;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              before(() => {
 | 
	
		
			
				|  |  |                  const [
 | 
	
		
			
				|  |  |                      hiddenDomainsString,
 | 
	
		
			
				|  |  | -                    diff
 | 
	
		
			
				|  |  | +                    domainsStringDiff
 | 
	
		
			
				|  |  |                  ] = cryptUtils.hideString(domainsString, domainsString.length * 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                testFunc = () => getFunctionFromTemplate(
 | 
	
		
			
				|  |  | +                const [
 | 
	
		
			
				|  |  | +                    hiddenDomainDest,
 | 
	
		
			
				|  |  | +                    domainDestDiff
 | 
	
		
			
				|  |  | +                ] = cryptUtils.hideString(domainDest, domainDest.length * 3);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                root = {
 | 
	
		
			
				|  |  | +                    document: {
 | 
	
		
			
				|  |  | +                        domain: currentHostName,
 | 
	
		
			
				|  |  | +                        location: {
 | 
	
		
			
				|  |  | +                            hostname: currentHostName,
 | 
	
		
			
				|  |  | +                        },
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                testFunc = getFunctionFromTemplate(
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          domainLockFunctionName: 'domainLockFunction',
 | 
	
		
			
				|  |  | -                        diff: diff,
 | 
	
		
			
				|  |  | +                        domainsStringDiff,
 | 
	
		
			
				|  |  |                          domains: hiddenDomainsString,
 | 
	
		
			
				|  |  | -                        globalVariableTemplate: GlobalVariableTemplate1(),
 | 
	
		
			
				|  |  | +                        domainDestDiff,
 | 
	
		
			
				|  |  | +                        domainDest: hiddenDomainDest,
 | 
	
		
			
				|  |  | +                        globalVariableTemplate: '',
 | 
	
		
			
				|  |  |                          singleCallControllerFunctionName
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      singleCallControllerFunctionName,
 | 
	
		
			
				|  |  | -                    getDocumentDomainAndLocationTemplate(currentHostName)
 | 
	
		
			
				|  |  | +                    thatThisTemplate
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            it('should throw an error', () => {
 | 
	
		
			
				|  |  | -                assert.throws(testFunc);
 | 
	
		
			
				|  |  | +            it('should change document.location', () => {
 | 
	
		
			
				|  |  | +                assert.doesNotThrow(() => testFunc.apply(root));
 | 
	
		
			
				|  |  | +                assert.equal(root.document.location, domainDest);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      });
 |