diff options
author | thestig <thestig@chromium.org> | 2015-08-06 19:59:16 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-07 02:59:53 +0000 |
commit | 0e5662abdd4436747d1acaf5279144c7713fbf9d (patch) | |
tree | 736f155b8f7824d8eaa9cceb6ccfab97f1fef57c /chrome/test/data | |
parent | aa958fd3a80afdfdc2f747a819a1c67605c637e6 (diff) | |
download | chromium_src-0e5662abdd4436747d1acaf5279144c7713fbf9d.zip chromium_src-0e5662abdd4436747d1acaf5279144c7713fbf9d.tar.gz chromium_src-0e5662abdd4436747d1acaf5279144c7713fbf9d.tar.bz2 |
PDF: Guess the scheme when navigating to an URI without a scheme.
Currently the code always assumes http://, instead, look at the URL and
try to figure out if it is an absolute path, relative path, or a full
link. For full links, assume http://.
Note: link navigation does not work for file:// URIs.
BUG=123985
Review URL: https://codereview.chromium.org/1266133002
Cr-Commit-Position: refs/heads/master@{#342275}
Diffstat (limited to 'chrome/test/data')
-rw-r--r-- | chrome/test/data/pdf/navigator_test.js | 209 |
1 files changed, 197 insertions, 12 deletions
diff --git a/chrome/test/data/pdf/navigator_test.js b/chrome/test/data/pdf/navigator_test.js index a7ffbbb..b9624ed 100644 --- a/chrome/test/data/pdf/navigator_test.js +++ b/chrome/test/data/pdf/navigator_test.js @@ -3,29 +3,73 @@ // found in the LICENSE file. function NavigateInCurrentTabCallback() { - this.navigateInCurrentTabCalled = false; - this.callback = function() { - this.navigateInCurrentTabCalled = true; + this.navigateCalled = false; + this.url = undefined; + this.callback = function(url) { + this.navigateCalled = true; + this.url = url; }.bind(this); this.reset = function() { - this.navigateInCurrentTabCalled = false; + this.navigateCalled = false; + this.url = undefined; }; } function NavigateInNewTabCallback() { - this.navigateInNewTabCalled = false; - this.callback = function() { - this.navigateInNewTabCalled = true; + this.navigateCalled = false; + this.url = undefined; + this.callback = function(url) { + this.navigateCalled = true; + this.url = url; }.bind(this); this.reset = function() { - this.navigateInNewTabCalled = false; + this.navigateCalled = false; + this.url = undefined; }; } +/** + * Given a |navigator|, navigate to |url| in the current tab or new tab, + * depending on the value of |openInNewTab|. Use |viewportChangedCallback| + * and |navigateCallback| to check the callbacks, and that the navigation + * to |expectedResultUrl| happened. + */ +function doNavigationUrlTest( + navigator, + url, + openInNewTab, + expectedResultUrl, + viewportChangedCallback, + navigateCallback) { + viewportChangedCallback.reset(); + navigateCallback.reset(); + navigator.navigate(url, openInNewTab); + chrome.test.assertFalse(viewportChangedCallback.wasCalled); + chrome.test.assertTrue(navigateCallback.navigateCalled); + chrome.test.assertEq(expectedResultUrl, navigateCallback.url); +} + +/** + * Helper function to run doNavigationUrlTest() for the current tab and a new + * tab. + */ +function doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + url, + expectedResultUrl, + viewportChangedCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback) { + doNavigationUrlTest(navigator, url, false, expectedResultUrl, + viewportChangedCallback, navigateInCurrentTabCallback); + doNavigationUrlTest(navigator, url, true, expectedResultUrl, + viewportChangedCallback, navigateInNewTabCallback); +} + var tests = [ /** * Test navigation within the page, opening a url in the same tab and - * opening a url in the new tab. + * opening a url in a new tab. */ function testNavigate() { var mockWindow = new MockWindow(100, 100); @@ -70,7 +114,7 @@ var tests = [ // viewport should not update and viewport position should remain same. navigator.navigate(url + "#US", true); chrome.test.assertFalse(mockCallback.wasCalled); - chrome.test.assertTrue(navigateInNewTabCallback.navigateInNewTabCalled); + chrome.test.assertTrue(navigateInNewTabCallback.navigateCalled); chrome.test.assertEq(0, viewport.position.x); chrome.test.assertEq(0, viewport.position.y); @@ -88,12 +132,153 @@ var tests = [ // in the same tab. navigator.navigate(url + "#ABC", false); chrome.test.assertFalse(mockCallback.wasCalled); - chrome.test.assertTrue( - navigateInCurrentTabCallback.navigateInCurrentTabCalled); + chrome.test.assertTrue(navigateInCurrentTabCallback.navigateCalled); chrome.test.assertEq(0, viewport.position.x); chrome.test.assertEq(300, viewport.position.y); chrome.test.succeed(); + }, + /** + * Test opening a url in the same tab and opening a url in a new tab for + * a http:// url as the current location. The destination url may not have + * a valid scheme, so the navigator must determine the url by following + * similar heuristics as Adobe Acrobat Reader. + */ + function testNavigateForLinksWithoutScheme() { + var mockWindow = new MockWindow(100, 100); + var mockSizer = new MockSizer(); + var mockCallback = new MockViewportChangedCallback(); + var viewport = new Viewport(mockWindow, mockSizer, mockCallback.callback, + function() {}, function() {}, 0, 1, 0); + + var paramsParser = new OpenPDFParamsParser(function(name) { + paramsParser.onNamedDestinationReceived(-1); + }); + var url = "http://www.example.com/subdir/xyz.pdf"; + + var navigateInCurrentTabCallback = new NavigateInCurrentTabCallback(); + var navigateInNewTabCallback = new NavigateInNewTabCallback(); + var navigator = new Navigator(url, viewport, paramsParser, + navigateInCurrentTabCallback.callback, + navigateInNewTabCallback.callback); + + // Sanity check. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + 'https://www.foo.com/bar.pdf', + 'https://www.foo.com/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + // Open relative links. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + 'foo/bar.pdf', + 'http://www.example.com/subdir/foo/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + 'foo.com/bar.pdf', + 'http://www.example.com/subdir/foo.com/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + // The expected result is not normalized here. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '../www.foo.com/bar.pdf', + 'http://www.example.com/subdir/../www.foo.com/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + // Open an absolute link. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '/foodotcom/bar.pdf', + 'http://www.example.com/foodotcom/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + // Open a http url without a scheme. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + 'www.foo.com/bar.pdf', + 'http://www.foo.com/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + // Test three dots. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '.../bar.pdf', + 'http://www.example.com/subdir/.../bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + // Test forward slashes. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '..\\bar.pdf', + 'http://www.example.com/subdir/..\\bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '.\\bar.pdf', + 'http://www.example.com/subdir/.\\bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '\\bar.pdf', + 'http://www.example.com/subdir/\\bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + chrome.test.succeed(); + }, + /** + * Test opening a url in the same tab and opening a url in a new tab with a + * file:/// url as the current location. + */ + function testNavigateFromLocalFile() { + var mockWindow = new MockWindow(100, 100); + var mockSizer = new MockSizer(); + var mockCallback = new MockViewportChangedCallback(); + var viewport = new Viewport(mockWindow, mockSizer, mockCallback.callback, + function() {}, function() {}, 0, 1, 0); + + var paramsParser = new OpenPDFParamsParser(function(name) { + paramsParser.onNamedDestinationReceived(-1); + }); + var url = "file:///some/path/to/myfile.pdf"; + + var navigateInCurrentTabCallback = new NavigateInCurrentTabCallback(); + var navigateInNewTabCallback = new NavigateInNewTabCallback(); + var navigator = new Navigator(url, viewport, paramsParser, + navigateInCurrentTabCallback.callback, + navigateInNewTabCallback.callback); + + // Open an absolute link. + doNavigationUrlTestInCurrentTabAndNewTab( + navigator, + '/foodotcom/bar.pdf', + 'file:///foodotcom/bar.pdf', + mockCallback, + navigateInCurrentTabCallback, + navigateInNewTabCallback); + + chrome.test.succeed(); } ]; |