Support the newWindow flag in white-listed app.launchURL JavaScript actions (PR 7794 follow-up)
				
					
				
			A simple follow-up to PR 7794, which let's us add support for the `newWindow` parameter; refer to https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/js_api_reference.pdf#G5.1507380. The patch also fixes an embarrassing oversight regarding the placement of the case-insensitive flag, and also allows arbitrary white-space at the beginning of JS actions.
This commit is contained in:
		
							parent
							
								
									afc3cd2a81
								
							
						
					
					
						commit
						2a7e5b8a54
					
				@ -703,12 +703,17 @@ var Catalog = (function CatalogClosure() {
 | 
			
		||||
              'app.launchURL',
 | 
			
		||||
              'window.open'
 | 
			
		||||
            ];
 | 
			
		||||
            var regex = new RegExp('^(?:' + URL_OPEN_METHODS.join('|') + ')' +
 | 
			
		||||
                                   '\\((?:\'|\")(\\S+)(?:\'|\")(?:,|\\))');
 | 
			
		||||
            var regex = new RegExp(
 | 
			
		||||
              '^\\s*(' + URL_OPEN_METHODS.join('|').split('.').join('\\.') +
 | 
			
		||||
              ')\\((?:\'|\")([^\'\"]*)(?:\'|\")(?:,\\s*(\\w+)\\)|\\))', 'i');
 | 
			
		||||
 | 
			
		||||
            var jsUrl = regex.exec(stringToPDFString(js), 'i');
 | 
			
		||||
            if (jsUrl && jsUrl[1]) {
 | 
			
		||||
              url = jsUrl[1];
 | 
			
		||||
            var jsUrl = regex.exec(stringToPDFString(js));
 | 
			
		||||
            if (jsUrl && jsUrl[2]) {
 | 
			
		||||
              url = jsUrl[2];
 | 
			
		||||
 | 
			
		||||
              if (jsUrl[3] === 'true' && jsUrl[1] === 'app.launchURL') {
 | 
			
		||||
                resultObj.newWindow = true;
 | 
			
		||||
              }
 | 
			
		||||
              break;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
@ -611,6 +611,7 @@ describe('annotation', function() {
 | 
			
		||||
        var jsEntry = params.jsEntry;
 | 
			
		||||
        var expectedUrl = params.expectedUrl;
 | 
			
		||||
        var expectedUnsafeUrl = params.expectedUnsafeUrl;
 | 
			
		||||
        var expectedNewWindow = params.expectedNewWindow;
 | 
			
		||||
 | 
			
		||||
        var actionDict = new Dict();
 | 
			
		||||
        actionDict.set('Type', Name.get('Action'));
 | 
			
		||||
@ -636,7 +637,7 @@ describe('annotation', function() {
 | 
			
		||||
        expect(data.url).toEqual(expectedUrl);
 | 
			
		||||
        expect(data.unsafeUrl).toEqual(expectedUnsafeUrl);
 | 
			
		||||
        expect(data.dest).toBeUndefined();
 | 
			
		||||
        expect(data.newWindow).toBeFalsy();
 | 
			
		||||
        expect(data.newWindow).toEqual(expectedNewWindow);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Check that we reject a 'JS' entry containing arbitrary JavaScript.
 | 
			
		||||
@ -644,12 +645,14 @@ describe('annotation', function() {
 | 
			
		||||
        jsEntry: 'function someFun() { return "qwerty"; } someFun();',
 | 
			
		||||
        expectedUrl: undefined,
 | 
			
		||||
        expectedUnsafeUrl: undefined,
 | 
			
		||||
        expectedNewWindow: undefined,
 | 
			
		||||
      });
 | 
			
		||||
      // Check that we accept a white-listed {string} 'JS' entry.
 | 
			
		||||
      checkJsAction({
 | 
			
		||||
        jsEntry: 'window.open(\'http://www.example.com/test.pdf\')',
 | 
			
		||||
        expectedUrl: new URL('http://www.example.com/test.pdf').href,
 | 
			
		||||
        expectedUnsafeUrl: 'http://www.example.com/test.pdf',
 | 
			
		||||
        expectedNewWindow: undefined,
 | 
			
		||||
      });
 | 
			
		||||
      // Check that we accept a white-listed {Stream} 'JS' entry.
 | 
			
		||||
      checkJsAction({
 | 
			
		||||
@ -657,6 +660,7 @@ describe('annotation', function() {
 | 
			
		||||
                   'app.launchURL("http://www.example.com/test.pdf", true)'),
 | 
			
		||||
        expectedUrl: new URL('http://www.example.com/test.pdf').href,
 | 
			
		||||
        expectedUnsafeUrl: 'http://www.example.com/test.pdf',
 | 
			
		||||
        expectedNewWindow: true,
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user