Commit 991f1b67 authored by dpapad's avatar dpapad Committed by Commit Bot

WebUI: Add preserve_url_scheme option in polymer_modulizer()

In some cases, like the FilesApp which is served from a
chrome-extension:// scheme, converting all chrome:// URLs to
scheme-relative URLs is not desired.

Adding a |preserve_url_scheme| to opt-out of the default behavior.

Bug: 1128313
Change-Id: I48fe8fda4320d8ff3eaca35229c8c34cd55407de
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2411563Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Commit-Queue: dpapad <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807369}
parent 2054eceb
......@@ -71,5 +71,9 @@ template("polymer_modulizer") {
if (defined(invoker.migrated_imports)) {
args += [ "--migrated_imports" ] + invoker.migrated_imports
}
if (defined(invoker.preserve_url_scheme) && invoker.preserve_url_scheme) {
args += [ "--preserve_url_scheme" ]
}
}
}
......@@ -79,6 +79,11 @@ _ignore_imports = []
_migrated_imports = []
# Populated from command line arguments. Specifies whether "chrome://" URLs
# should be preserved, or whether they should be converted to scheme-relative
# URLs "//" (default behavior).
_preserve_url_scheme = False
# Use an OrderedDict, since the order these redirects are applied matters.
_chrome_redirects = OrderedDict([
('chrome://resources/polymer/v1_0/', POLYMER_V1_DIR),
......@@ -97,18 +102,23 @@ _chrome_reverse_redirects = {
# imports. |to_js_import()| is the only public method exposed by this class.
# Internally an HTML import path is
#
# 1) normalized, meaning converted from a chrome or relative URL to to an
# absolute path starting at the repo's root
# 1) normalized, meaning converted from a chrome or scheme-relative or relative
# URL to to an absolute path starting at the repo's root
# 2) converted to an equivalent JS normalized path
# 3) de-normalized, meaning converted back to a relative or chrome URL
# 3) de-normalized, meaning converted back to a chrome or scheme-relative or
# relative URL
# 4) converted to a JS import statement
class Dependency:
def __init__(self, src, dst):
self.html_file = src
self.html_path = dst
self.input_format = ('chrome' if self.html_path.startswith('chrome://')
or self.html_path.startswith('//') else 'relative')
if self.html_path.startswith('chrome://'):
self.input_format = 'chrome'
elif self.html_path.startswith('//'):
self.input_format = 'scheme-relative'
else:
self.input_format = 'relative'
self.output_format = self.input_format
self.html_path_normalized = self._to_html_normalized()
......@@ -116,7 +126,7 @@ class Dependency:
self.js_path = self._to_js()
def _to_html_normalized(self):
if self.input_format == 'chrome':
if self.input_format == 'chrome' or self.input_format == 'scheme-relative':
self.html_path_normalized = self.html_path
for r in _chrome_redirects:
if self.html_path.startswith(r):
......@@ -136,7 +146,8 @@ class Dependency:
.replace(r'.html', '.js'))
if self.html_path_normalized == 'ui/webui/resources/html/polymer.html':
self.output_format = 'chrome'
if self.output_format == 'relative':
self.output_format = 'chrome'
return POLYMER_V3_DIR + 'polymer/polymer_bundled.min.js'
if re.match(r'ui/webui/resources/html/', self.html_path_normalized):
......@@ -151,14 +162,19 @@ class Dependency:
def _to_js(self):
js_path = self.js_path_normalized
if self.output_format == 'chrome':
if self.output_format == 'chrome' or self.output_format == 'scheme-relative':
for r in _chrome_reverse_redirects:
if self.js_path_normalized.startswith(r):
js_path = self.js_path_normalized.replace(
r, _chrome_reverse_redirects[r])
break
# Restore the chrome:// scheme if |preserve_url_scheme| is enabled.
if _preserve_url_scheme and self.output_format == 'chrome':
js_path = "chrome:" + js_path
return js_path
assert self.output_format == 'relative'
input_dir = os.path.relpath(os.path.dirname(self.html_file), _ROOT)
relpath = os.path.relpath(
self.js_path_normalized, input_dir).replace("\\", "/")
......@@ -512,6 +528,7 @@ def main(argv):
parser.add_argument('--ignore_imports', required=False, nargs="*")
parser.add_argument('--auto_imports', required=False, nargs="*")
parser.add_argument('--migrated_imports', required=False, nargs="*")
parser.add_argument('--preserve_url_scheme', action="store_true")
parser.add_argument(
'--html_type', choices=['dom-module', 'style-module', 'custom-style',
'iron-iconset', 'v3-ready'],
......@@ -543,6 +560,10 @@ def main(argv):
global _migrated_imports
_migrated_imports = args.migrated_imports
# Extract |preserve_url_scheme| from arguments.
global _preserve_url_scheme
_preserve_url_scheme = args.preserve_url_scheme
in_folder = os.path.normpath(os.path.join(_CWD, args.in_folder))
out_folder = os.path.normpath(os.path.join(_CWD, args.out_folder))
......
......@@ -165,54 +165,79 @@ class PolymerModulizerTest(unittest.TestCase):
# Case where relative path to polymer.html is used.
[
'../../html/polymer.html',
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';'
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';',
'import {Polymer, html} from \'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js\';',
],
# Case where relative path to file in the same folder is used.
['foo.html', 'import \'./foo.m.js\';'],
[
'foo.html',
'import \'./foo.m.js\';',
'import \'./foo.m.js\';',
],
# Case where relative path to file in the same subtree is used.
[
'path/to/subfolder/foo.html',
'import \'./path/to/subfolder/foo.m.js\';'
'import \'./path/to/subfolder/foo.m.js\';',
'import \'./path/to/subfolder/foo.m.js\';',
],
# Case where relative path to file in ui/webui/resources/html/ is used.
['../../html/foo.html', 'import {Foo} from \'../../js/foo.m.js\';'],
[
'../../html/foo.html',
'import {Foo} from \'../../js/foo.m.js\';',
'import {Foo} from \'../../js/foo.m.js\';',
],
# chrome:// paths cases.
# Case where absolute path to a Polymer UI element is used.
[
'chrome://resources/polymer/v1_0/path/to/folder/foo.html',
'import \'//resources/polymer/v3_0/path/to/folder/foo.js\';'
'import \'//resources/polymer/v3_0/path/to/folder/foo.js\';',
'import \'chrome://resources/polymer/v3_0/path/to/folder/foo.js\';',
],
# Case where chrome:// path to polymer.html is used.
[
'chrome://resources/html/polymer.html',
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';'
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';',
'import {Polymer, html} from \'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js\';',
],
# Case where chrome://resources/html/ path to something other than
# polymer.html is used.
[
'chrome://resources/html/bar.html',
'import \'//resources/js/bar.m.js\';'
'import \'//resources/js/bar.m.js\';',
'import \'chrome://resources/js/bar.m.js\';',
],
# Scheme-relative paths cases.
# Case where absolute path to a Polymer UI element is used.
[
'//resources/polymer/v1_0/path/to/folder/foo.html',
'import \'//resources/polymer/v3_0/path/to/folder/foo.js\';'
'import \'//resources/polymer/v3_0/path/to/folder/foo.js\';',
'import \'//resources/polymer/v3_0/path/to/folder/foo.js\';',
],
# Case where path to polymer.html is used.
[
'//resources/html/polymer.html',
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';'
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';',
'import {Polymer, html} from \'//resources/polymer/v3_0/polymer/polymer_bundled.min.js\';',
],
# Case where //resources/html/ path to something other than
# polymer.html is used.
['//resources/html/bar.html', 'import \'//resources/js/bar.m.js\';'],
[
'//resources/html/bar.html',
'import \'//resources/js/bar.m.js\';',
'import \'//resources/js/bar.m.js\';',
],
]
for [html, js_expected] in cases:
assert_html_to_js(html, js_expected)
for [html, js_expected1, js_expected2] in cases:
# Test case where |preserve_url_scheme| is False
polymer._preserve_url_scheme = False
assert_html_to_js(html, js_expected1)
# Test case where |preserve_url_scheme| is True
polymer._preserve_url_scheme = True
assert_html_to_js(html, js_expected2)
if __name__ == '__main__':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment