# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/.
import unittest from itertools import chain
import mozunit import six
import mozpack.path as mozpath from mozpack.chrome.manifest import (
ManifestBinaryComponent,
ManifestComponent,
ManifestContent,
ManifestLocale,
ManifestResource,
ManifestSkin,
) from mozpack.copier import FileRegistry from mozpack.errors import ErrorMessage from mozpack.files import GeneratedFile, ManifestFile from mozpack.packager.formats import FlatFormatter, JarFormatter, OmniJarFormatter from mozpack.test.test_files import bar_xpt, foo2_xpt, foo_xpt from test_errors import TestErrors
for addon in ("addon0", "addon1", "app/chrome/addons/addon2"):
RESULT_FLAT.update(
{
mozpath.join(addon, p): f for p, f in six.iteritems(
{ "chrome.manifest": [ "manifest chrome/chrome.manifest", "manifest components/components.manifest",
], "chrome/chrome.manifest": [ "content %s foo/bar/" % mozpath.basename(addon),
], "chrome/foo/bar/baz": FILES[
mozpath.join(addon, "chrome/foo/bar/baz")
], "components/components.manifest": [ "interfaces bar.xpt", "interfaces foo.xpt",
], "components/bar.xpt": bar_xpt, "components/foo.xpt": foo2_xpt,
}
)
}
)
RESULT_JAR = {
p: RESULT_FLAT[p] for p in ( "chrome.manifest", "chrome/chrome.manifest", "components/components.manifest", "components/foo.so", "components/foo.xpt", "components/bar.xpt", "foo", "app/chrome.manifest", "app/components/components.manifest", "app/components/foo.js", "addon0/chrome.manifest", "addon0/components/components.manifest", "addon0/components/foo.xpt", "addon0/components/bar.xpt",
)
}
RESULT_JAR.update(
{ "chrome/f/f.manifest": [ "content oo jar:oo.jar!/", "content bar jar:oo.jar!/bar/", "resource foo resource://bar/",
], "chrome/f/oo.jar": { "bar/baz": FILES["chrome/f/oo/bar/baz"], "baz": FILES["chrome/f/oo/baz"], "qux": FILES["chrome/f/oo/qux"],
}, "app/chrome/chrome.manifest": [ "content content jar:foo.jar!/",
], "app/chrome/foo.jar": { "foo": FILES["app/chrome/foo/foo"],
}, "addon0/chrome/chrome.manifest": [ "content addon0 jar:foo.jar!/bar/",
], "addon0/chrome/foo.jar": { "bar/baz": FILES["addon0/chrome/foo/bar/baz"],
}, "addon1.xpi": {
mozpath.relpath(p, "addon1"): f for p, f in six.iteritems(RESULT_FLAT) if p.startswith("addon1/")
}, "app/chrome/addons/addon2.xpi": {
mozpath.relpath(p, "app/chrome/addons/addon2"): f for p, f in six.iteritems(RESULT_FLAT) if p.startswith("app/chrome/addons/addon2/")
},
}
)
RESULT_OMNIJAR = {
p: RESULT_FLAT[p] for p in ( "components/foo.so", "foo",
)
}
RESULT_OMNIJAR.update({p: RESULT_JAR[p] for p in RESULT_JAR if p.startswith("addon")})
RESULT_OMNIJAR.update(
{ "omni.foo": { "components/components.manifest": [ "interfaces bar.xpt", "interfaces foo.xpt",
],
}, "chrome.manifest": [ "manifest components/components.manifest",
], "components/components.manifest": [ "binary-component foo.so",
], "app/omni.foo": {
p: RESULT_FLAT["app/" + p] for p in chain(
( "chrome.manifest", "chrome/chrome.manifest", "chrome/foo/foo", "components/components.manifest", "components/foo.js",
),
(
mozpath.relpath(p, "app") for p in six.iterkeys(RESULT_FLAT) if p.startswith("app/chrome/addons/addon2/")
),
)
},
}
)
RESULT_OMNIJAR["omni.foo"].update(
{
p: RESULT_FLAT[p] for p in ( "chrome.manifest", "chrome/chrome.manifest", "chrome/f/f.manifest", "chrome/f/oo/bar/baz", "chrome/f/oo/baz", "chrome/f/oo/qux", "components/foo.xpt", "components/bar.xpt",
)
}
)
RESULT_OMNIJAR_WITH_SUBPATH = {
k.replace("omni.foo", "bar/omni.foo"): v for k, v in RESULT_OMNIJAR.items()
}
CONTENTS_WITH_BASE = { "bases": {
mozpath.join("base/root", b) if b else"base/root": a for b, a in six.iteritems(CONTENTS["bases"])
}, "manifests": [
m.move(mozpath.join("base/root", m.base)) for m in CONTENTS["manifests"]
], "files": {
mozpath.join("base/root", p): f for p, f in six.iteritems(CONTENTS["files"])
},
}
def result_with_base(results):
result = {mozpath.join("base/root", p): v for p, v in six.iteritems(results)}
result.update(EXTRA_CONTENTS) return result
def fill_formatter(formatter, contents): for base, is_addon in sorted(contents["bases"].items()):
formatter.add_base(base, is_addon)
for manifest in contents["manifests"]:
formatter.add_manifest(manifest)
for k, v in sorted(six.iteritems(contents["files"])): if k.endswith(".xpt"):
formatter.add_interfaces(k, v) else:
formatter.add(k, v)
def get_contents(registry, read_all=False, mode="rt"):
result = {} for k, v in registry: if isinstance(v, FileRegistry):
result[k] = get_contents(v) elif isinstance(v, ManifestFile) or read_all: if"b"in mode:
result[k] = v.open().read() else:
result[k] = six.ensure_text(v.open().read()).splitlines() else:
result[k] = v return result
class TestFormatters(TestErrors, unittest.TestCase):
maxDiff = None
def do_test_contents(self, formatter, contents): for f in contents["files"]: # .xpt files are merged, so skip them. ifnot f.endswith(".xpt"):
self.assertTrue(formatter.contains(f))
def test_chrome_override(self):
registry = FileRegistry()
f = FlatFormatter(registry)
f.add_base("")
f.add_manifest(ManifestContent("chrome", "foo", "foo/unix")) # A more specific entry for a given chrome name can override a more # generic one.
f.add_manifest(ManifestContent("chrome", "foo", "foo/win", "os=WINNT"))
f.add_manifest(ManifestContent("chrome", "foo", "foo/osx", "os=Darwin"))
# Chrome with the same name overrides the previous registration. with self.assertRaises(ErrorMessage) as e:
f.add_manifest(ManifestContent("chrome", "foo", "foo/"))
# Chrome with the same name and same flags overrides the previous # registration. with self.assertRaises(ErrorMessage) as e:
f.add_manifest(ManifestContent("chrome", "foo", "foo/", "os=WINNT"))
# We may start with the more specific entry first
f.add_manifest(ManifestContent("chrome", "bar", "bar/win", "os=WINNT")) # Then adding a more generic one overrides it. with self.assertRaises(ErrorMessage) as e:
f.add_manifest(ManifestContent("chrome", "bar", "bar/unix"))
self.assertEqual(
str(e.exception), 'error: "content bar bar/unix" overrides ''"content bar bar/win os=WINNT"',
)
# Adding something more specific still works.
f.add_manifest(
ManifestContent("chrome", "bar", "bar/win", "os=WINNT osversion>=7.0")
)
# Variations of skin/locales are allowed.
f.add_manifest(
ManifestSkin("chrome", "foo", "classic/1.0", "foo/skin/classic/")
)
f.add_manifest(ManifestSkin("chrome", "foo", "modern/1.0", "foo/skin/modern/"))
# But same-skin/locale still error out. with self.assertRaises(ErrorMessage) as e:
f.add_manifest(
ManifestSkin("chrome", "foo", "classic/1.0", "foo/skin/classic/foo")
)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.