1# This Source Code Form is subject to the terms of the Mozilla Public 2# License, v. 2.0. If a copy of the MPL was not distributed with this 3# file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5from __future__ import absolute_import, print_function 6 7from collections import defaultdict 8 9try: 10 import urlparse 11except ImportError: 12 import urllib.parse as urlparse 13 14from mozpack.chrome.manifest import ( 15 Manifest, 16 ManifestChrome, 17 ManifestOverride, 18 ManifestResource, 19 parse_manifest, 20) 21import mozpack.path as mozpath 22 23 24class ChromeManifestHandler(object): 25 def __init__(self): 26 self.overrides = {} 27 self.chrome_mapping = defaultdict(set) 28 29 def handle_manifest_entry(self, entry): 30 format_strings = { 31 "content": "chrome://%s/content/", 32 "resource": "resource://%s/", 33 "locale": "chrome://%s/locale/", 34 "skin": "chrome://%s/skin/", 35 } 36 37 if isinstance(entry, (ManifestChrome, ManifestResource)): 38 if isinstance(entry, ManifestResource): 39 dest = entry.target 40 url = urlparse.urlparse(dest) 41 if not url.scheme: 42 dest = mozpath.normpath(mozpath.join(entry.base, dest)) 43 if url.scheme == "file": 44 dest = mozpath.normpath(url.path) 45 else: 46 dest = mozpath.normpath(entry.path) 47 48 base_uri = format_strings[entry.type] % entry.name 49 self.chrome_mapping[base_uri].add(dest) 50 if isinstance(entry, ManifestOverride): 51 self.overrides[entry.overloaded] = entry.overload 52 if isinstance(entry, Manifest): 53 for e in parse_manifest(None, entry.path): 54 self.handle_manifest_entry(e) 55