mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-09 08:48:07 +00:00
Backed out 6 changesets (bug 868996, bug 867903, bug 869014, bug 870219, bug 861587) for PGO bustage.
CLOSED TREE
This commit is contained in:
parent
727ec412d4
commit
9edc2f4aa0
@ -1619,21 +1619,6 @@ endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
ifneq (,$(filter export,$(MAKECMDGOALS)))
|
||||
MDDEPEND_FILES := $(strip $(wildcard $(addprefix $(MDDEPDIR)/,$(EXTRA_EXPORT_MDDEPEND_FILES))))
|
||||
|
||||
ifneq (,$(MDDEPEND_FILES))
|
||||
ifdef .PYMAKE
|
||||
includedeps $(MDDEPEND_FILES)
|
||||
else
|
||||
include $(MDDEPEND_FILES)
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
#############################################################################
|
||||
|
||||
-include $(topsrcdir)/$(MOZ_BUILD_APP)/app-rules.mk
|
||||
|
@ -3885,37 +3885,9 @@ nsGlobalWindow::GetOpener(nsIDOMWindow** aOpener)
|
||||
NS_IMETHODIMP
|
||||
nsGlobalWindow::SetOpener(nsIDOMWindow* aOpener)
|
||||
{
|
||||
// Check if we were called from a privileged chrome script. If not, and if
|
||||
// aOpener is not null, just define aOpener on our inner window's JS object,
|
||||
// wapped into the current compartment so that for Xrays we define on the Xray
|
||||
// expando object, but don't set it on the outer window, so that it'll get
|
||||
// reset on navigation. This is just like replaceable properties, but we're
|
||||
// not quite readonly.
|
||||
// check if we were called from a privileged chrome script.
|
||||
// If not, opener is settable only to null.
|
||||
if (aOpener && !nsContentUtils::IsCallerChrome()) {
|
||||
// JS_WrapObject will outerize, so we don't care if aOpener is an inner.
|
||||
nsCOMPtr<nsIGlobalObject> glob = do_QueryInterface(aOpener);
|
||||
NS_ENSURE_STATE(glob);
|
||||
|
||||
AutoJSContext cx;
|
||||
JSAutoRequest ar(cx);
|
||||
// Note we explicitly do NOT enter any particular compartment here; we want
|
||||
// the caller compartment in cases when we have a caller, so that we define
|
||||
// expandos on Xrays as needed.
|
||||
|
||||
JS::Rooted<JSObject*> otherObj(cx, glob->GetGlobalJSObject());
|
||||
NS_ENSURE_STATE(otherObj);
|
||||
|
||||
JS::Rooted<JSObject*> thisObj(cx, mJSObject);
|
||||
NS_ENSURE_STATE(mJSObject);
|
||||
|
||||
if (!JS_WrapObject(cx, otherObj.address()) ||
|
||||
!JS_WrapObject(cx, thisObj.address()) ||
|
||||
!JS_DefineProperty(cx, thisObj, "opener", JS::ObjectValue(*otherObj),
|
||||
JS_PropertyStub, JS_StrictPropertyStub,
|
||||
JSPROP_ENUMERATE)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,6 @@ MOCHITEST_FILES = \
|
||||
test_domcursor.html \
|
||||
test_named_frames.html \
|
||||
test_Image_constructor.html \
|
||||
test_setting_opener.html \
|
||||
$(NULL)
|
||||
|
||||
MOCHITEST_CHROME_FILES = \
|
||||
|
@ -1,106 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=868996
|
||||
-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Test for Bug 868996</title>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
<script type="application/javascript">
|
||||
|
||||
/** Test for Bug 868996 **/
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
var sb1, sb2;
|
||||
var Cu = SpecialPowers.Cu;
|
||||
|
||||
function testOpenerSet() {
|
||||
// Use setTimeout to make the relevant onerror run in this window
|
||||
var win = window.open("data:text/html,<script>opener.setTimeout(opener.basicOpenerTest, 0, this)</" + "script>");
|
||||
// A sandbox for the window
|
||||
sb1 = new Cu.Sandbox(win, {wantXrays: true })
|
||||
sb1.win = win
|
||||
// And a sandbox using the expanded principal.
|
||||
sb2 = new Cu.Sandbox([win], {wantXrays: true })
|
||||
sb2.win = win
|
||||
}
|
||||
|
||||
function evalsb(str, sb) {
|
||||
// Have to unwrap() to get objects we care about
|
||||
return SpecialPowers.unwrap(Cu.evalInSandbox(str, sb));
|
||||
}
|
||||
|
||||
function basicOpenerTest(win) {
|
||||
is(win.opener, window, "Opening a window should give it the right opener");
|
||||
is(evalsb("win.opener", sb1), window,
|
||||
"Reading opener in sandbox 1 should work");
|
||||
is(evalsb("win.opener", sb2), window,
|
||||
"Reading opener in sandbox 2 should work");
|
||||
|
||||
win.opener = $("x").contentWindow;
|
||||
evalsb("win.opener = win.opener.document.getElementById('y').contentWindow", sb1);
|
||||
evalsb("win.opener = win.opener.document.getElementById('z').contentWindow", sb2);
|
||||
|
||||
is(win.opener, $("x").contentWindow, "Should be able to set an opener to a different window");
|
||||
is(evalsb("win.opener", sb1), $("y").contentWindow,
|
||||
"Should be able to set the opener to a different window in a sandbox one");
|
||||
is(evalsb("win.opener", sb2), $("z").contentWindow,
|
||||
"Should be able to set the opener to a different window in a sandbox two");
|
||||
|
||||
win.location = "data:text/html,<script>opener.setTimeout(opener.continueOpenerTest, 0, this);</" + "script>";
|
||||
}
|
||||
|
||||
function continueOpenerTest(win) {
|
||||
is(win.opener, window, "Navigating a window should have reset the opener we stashed on it temporarily");
|
||||
is(evalsb("win.opener", sb1), window,
|
||||
"Navigating a window should have reset the opener in sb1");
|
||||
is(evalsb("win.opener", sb2), window,
|
||||
"Navigating a window should have reset the opener in sb2");
|
||||
|
||||
win.opener = null;
|
||||
is(win.opener, null, "Should be able to set the opener to null");
|
||||
is(evalsb("win.opener", sb1), null,
|
||||
"Setting the opener to null should be visible in sb1");
|
||||
is(evalsb("win.opener", sb2), null,
|
||||
"Setting the opener to null should be visible in sb2");
|
||||
|
||||
win.location = "data:text/html,Loaded";
|
||||
// Now poll for that load, since we have no way for the window to
|
||||
// communicate with us now
|
||||
setTimeout(checkForLoad, 0, win);
|
||||
}
|
||||
|
||||
function checkForLoad(win) {
|
||||
if (!win.document.documentElement ||
|
||||
win.document.documentElement.textContent != "Loaded") {
|
||||
setTimeout(checkForLoad, 0, win);
|
||||
return;
|
||||
}
|
||||
|
||||
is(win.opener, null, "Null opener should persist across navigations");
|
||||
is(evalsb("win.opener", sb1), null,
|
||||
"Null opener should persist across navigations in sb1");
|
||||
is(evalsb("win.opener", sb2), null,
|
||||
"Null opener should persist across navigations in sb2");
|
||||
|
||||
win.close();
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
addLoadEvent(testOpenerSet);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=868996">Mozilla Bug 868996</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
<iframe id="x"></iframe>
|
||||
<iframe id="y"></iframe>
|
||||
<iframe id="z"></iframe>
|
||||
</div>
|
||||
<pre id="test">
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@ -5,25 +5,41 @@
|
||||
import os
|
||||
import cPickle
|
||||
from Configuration import Configuration
|
||||
from Codegen import CGBindingRoot, replaceFileIfChanged
|
||||
from Codegen import CGBindingRoot
|
||||
|
||||
def generate_binding_files(config, outputprefix, srcprefix, webidlfile):
|
||||
def generate_binding_header(config, outputprefix, srcprefix, webidlfile):
|
||||
"""
|
||||
|config| Is the configuration object.
|
||||
|outputprefix| is a prefix to use for the header guards and filename.
|
||||
"""
|
||||
|
||||
depsname = ".deps/" + outputprefix + ".pp"
|
||||
filename = outputprefix + ".h"
|
||||
depsname = ".deps/" + filename + ".pp"
|
||||
root = CGBindingRoot(config, outputprefix, webidlfile)
|
||||
replaceFileIfChanged(outputprefix + ".h", root.declare())
|
||||
replaceFileIfChanged(outputprefix + ".cpp", root.define())
|
||||
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(root.declare())
|
||||
with open(depsname, 'wb') as f:
|
||||
# Sort so that our output is stable
|
||||
f.write("\n".join(outputprefix + ": " + os.path.join(srcprefix, x) for
|
||||
f.write("\n".join(filename + ": " + os.path.join(srcprefix, x) for
|
||||
x in sorted(root.deps())))
|
||||
|
||||
def generate_binding_cpp(config, outputprefix, srcprefix, webidlfile):
|
||||
"""
|
||||
|config| Is the configuration object.
|
||||
|outputprefix| is a prefix to use for the header guards and filename.
|
||||
"""
|
||||
|
||||
filename = outputprefix + ".cpp"
|
||||
depsname = ".deps/" + filename + ".pp"
|
||||
root = CGBindingRoot(config, outputprefix, webidlfile)
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(root.define())
|
||||
with open(depsname, 'wb') as f:
|
||||
f.write("\n".join(filename + ": " + os.path.join(srcprefix, x) for
|
||||
x in sorted(root.deps())))
|
||||
|
||||
def main():
|
||||
|
||||
# Parse arguments.
|
||||
from optparse import OptionParser
|
||||
usagestring = "usage: %prog [header|cpp] configFile outputPrefix srcPrefix webIDLFile"
|
||||
@ -32,34 +48,29 @@ def main():
|
||||
help="When an error happens, display the Python traceback.")
|
||||
(options, args) = o.parse_args()
|
||||
|
||||
configFile = os.path.normpath(args[0])
|
||||
srcPrefix = os.path.normpath(args[1])
|
||||
if len(args) != 5 or (args[0] != "header" and args[0] != "cpp"):
|
||||
o.error(usagestring)
|
||||
buildTarget = args[0]
|
||||
configFile = os.path.normpath(args[1])
|
||||
outputPrefix = args[2]
|
||||
srcPrefix = os.path.normpath(args[3])
|
||||
webIDLFile = os.path.normpath(args[4])
|
||||
|
||||
# Load the configuration
|
||||
# Load the parsing results
|
||||
f = open('ParserResults.pkl', 'rb')
|
||||
config = cPickle.load(f)
|
||||
parserData = cPickle.load(f)
|
||||
f.close()
|
||||
|
||||
def readFile(f):
|
||||
file = open(f, 'rb')
|
||||
try:
|
||||
contents = file.read()
|
||||
finally:
|
||||
file.close()
|
||||
return contents
|
||||
allWebIDLFiles = readFile(args[2]).split()
|
||||
changedDeps = readFile(args[3]).split()
|
||||
# Create the configuration data.
|
||||
config = Configuration(configFile, parserData)
|
||||
|
||||
if all(f.endswith("Binding") or f == "ParserResults.pkl" for f in changedDeps):
|
||||
toRegenerate = filter(lambda f: f.endswith("Binding"), changedDeps)
|
||||
toRegenerate = map(lambda f: f[:-len("Binding")] + ".webidl", toRegenerate)
|
||||
# Generate the prototype classes.
|
||||
if buildTarget == "header":
|
||||
generate_binding_header(config, outputPrefix, srcPrefix, webIDLFile);
|
||||
elif buildTarget == "cpp":
|
||||
generate_binding_cpp(config, outputPrefix, srcPrefix, webIDLFile);
|
||||
else:
|
||||
toRegenerate = allWebIDLFiles
|
||||
|
||||
for webIDLFile in toRegenerate:
|
||||
assert webIDLFile.endswith(".webidl")
|
||||
outputPrefix = webIDLFile[:-len(".webidl")] + "Binding"
|
||||
generate_binding_files(config, outputPrefix, srcPrefix, webIDLFile);
|
||||
assert False # not reached
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
@ -357,10 +357,7 @@ class CGList(CGThing):
|
||||
"""
|
||||
def __init__(self, children, joiner=""):
|
||||
CGThing.__init__(self)
|
||||
# Make a copy of the kids into a list, because if someone passes in a
|
||||
# generator we won't be able to both declare and define ourselves, or
|
||||
# define ourselves more than once!
|
||||
self.children = list(children)
|
||||
self.children = children
|
||||
self.joiner = joiner
|
||||
def append(self, child):
|
||||
self.children.append(child)
|
||||
|
@ -60,19 +60,6 @@ class Configuration:
|
||||
d.nativeType != descriptor.nativeType or d == descriptor
|
||||
for d in self.descriptors)
|
||||
|
||||
# Keep the descriptor list sorted for determinism.
|
||||
self.descriptors.sort(lambda x,y: cmp(x.name, y.name))
|
||||
|
||||
self.descriptorsByName = {}
|
||||
for d in self.descriptors:
|
||||
self.descriptorsByName.setdefault(d.interface.identifier.name,
|
||||
[]).append(d)
|
||||
|
||||
self.descriptorsByFile = {}
|
||||
for d in self.descriptors:
|
||||
self.descriptorsByFile.setdefault(d.interface.filename(),
|
||||
[]).append(d)
|
||||
|
||||
self.enums = [e for e in parseData if e.isEnum()]
|
||||
|
||||
# Figure out what our main-thread and worker dictionaries and callbacks
|
||||
@ -103,22 +90,17 @@ class Configuration:
|
||||
workerDictionaries);
|
||||
flagWorkerOrMainThread(self.callbacks, mainCallbacks, workerCallbacks)
|
||||
|
||||
# Keep the descriptor list sorted for determinism.
|
||||
self.descriptors.sort(lambda x,y: cmp(x.name, y.name))
|
||||
|
||||
def getInterface(self, ifname):
|
||||
return self.interfaces[ifname]
|
||||
def getDescriptors(self, **filters):
|
||||
"""Gets the descriptors that match the given filters."""
|
||||
curr = self.descriptors
|
||||
# Collect up our filters, because we may have a webIDLFile filter that
|
||||
# we always want to apply first.
|
||||
tofilter = []
|
||||
for key, val in filters.iteritems():
|
||||
if key == 'webIDLFile':
|
||||
# Special-case this part to make it fast, since most of our
|
||||
# getDescriptors calls are conditioned on a webIDLFile. We may
|
||||
# not have this key, in which case we have no descriptors
|
||||
# either.
|
||||
curr = self.descriptorsByFile.get(val, [])
|
||||
continue
|
||||
getter = lambda x: x.interface.filename()
|
||||
elif key == 'hasInterfaceObject':
|
||||
getter = lambda x: (not x.interface.isExternal() and
|
||||
x.interface.hasInterfaceObject())
|
||||
@ -136,12 +118,8 @@ class Configuration:
|
||||
elif key == 'isNavigatorProperty':
|
||||
getter = lambda x: x.interface.getNavigatorProperty() != None
|
||||
else:
|
||||
# Have to watch out: just closing over "key" is not enough,
|
||||
# since we're about to mutate its value
|
||||
getter = (lambda attrName: lambda x: getattr(x, attrName))(key)
|
||||
tofilter.append((getter, val))
|
||||
for f in tofilter:
|
||||
curr = filter(lambda x: f[0](x) == f[1], curr)
|
||||
getter = lambda x: getattr(x, key)
|
||||
curr = filter(lambda x: getter(x) == val, curr)
|
||||
return curr
|
||||
def getEnums(self, webIDLFile):
|
||||
return filter(lambda e: e.filename() == webIDLFile, self.enums)
|
||||
@ -170,11 +148,17 @@ class Configuration:
|
||||
Gets the appropriate descriptor for the given interface name
|
||||
and the given workers boolean.
|
||||
"""
|
||||
for d in self.descriptorsByName[interfaceName]:
|
||||
if d.workers == workers:
|
||||
return d
|
||||
iface = self.getInterface(interfaceName)
|
||||
descriptors = self.getDescriptors(interface=iface)
|
||||
|
||||
raise NoSuchDescriptorError("For " + interfaceName + " found no matches");
|
||||
# The only filter we currently have is workers vs non-workers.
|
||||
matches = filter(lambda x: x.workers is workers, descriptors)
|
||||
|
||||
# After filtering, we should have exactly one result.
|
||||
if len(matches) is not 1:
|
||||
raise NoSuchDescriptorError("For " + interfaceName + " found " +
|
||||
str(len(matches)) + " matches");
|
||||
return matches[0]
|
||||
def getDescriptorProvider(self, workers):
|
||||
"""
|
||||
Gets a descriptor provider that can provide descriptors as needed,
|
||||
|
@ -34,11 +34,14 @@ def main():
|
||||
configFile = os.path.normpath(args[0])
|
||||
interfaceName = args[1]
|
||||
|
||||
# Load the configuration
|
||||
# Load the parsing results
|
||||
f = open('ParserResults.pkl', 'rb')
|
||||
config = cPickle.load(f)
|
||||
parserData = cPickle.load(f)
|
||||
f.close()
|
||||
|
||||
# Create the configuration data.
|
||||
config = Configuration(configFile, parserData)
|
||||
|
||||
# Generate the example class.
|
||||
generate_interface_example(config, interfaceName)
|
||||
|
||||
|
@ -55,14 +55,14 @@ def main():
|
||||
parser.parse(''.join(lines), fullPath)
|
||||
parserResults = parser.finish()
|
||||
|
||||
# Write the parser results out to a pickle.
|
||||
resultsFile = open('ParserResults.pkl', 'wb')
|
||||
cPickle.dump(parserResults, resultsFile, -1)
|
||||
resultsFile.close()
|
||||
|
||||
# Load the configuration.
|
||||
config = Configuration(configFile, parserResults)
|
||||
|
||||
# Write the configuration out to a pickle.
|
||||
resultsFile = open('ParserResults.pkl', 'wb')
|
||||
cPickle.dump(config, resultsFile, -1)
|
||||
resultsFile.close()
|
||||
|
||||
# Generate the prototype list.
|
||||
generate_file(config, 'PrototypeList', 'declare')
|
||||
|
||||
|
@ -33,15 +33,6 @@ all_webidl_files += $(test_webidl_files)
|
||||
binding_header_files := $(subst .webidl,Binding.h,$(all_webidl_files))
|
||||
binding_cpp_files := $(subst .webidl,Binding.cpp,$(all_webidl_files))
|
||||
|
||||
# We want to be able to only regenerate the .cpp and .h files that really need
|
||||
# to change when a .webidl file changes. We do this by making the
|
||||
# binding_dependency_trackers targets have dependencies on the right .webidl
|
||||
# files via generated .pp files, having a .BindingGen target that depends on the
|
||||
# binding_dependency_trackers and which has all the generated binding .h/.cpp
|
||||
# depending on it, and then in the make commands for that target being able to
|
||||
# check which exact binding_dependency_trackers changed.
|
||||
binding_dependency_trackers := $(subst .webidl,Binding,$(all_webidl_files))
|
||||
|
||||
globalgen_targets := \
|
||||
PrototypeList.h \
|
||||
RegisterBindings.h \
|
||||
@ -51,18 +42,6 @@ globalgen_targets := \
|
||||
UnionConversions.h \
|
||||
$(NULL)
|
||||
|
||||
# Nasty hack: when the test/Makefile.in invokes us to do codegen, it
|
||||
# uses a target of
|
||||
# "export TestExampleInterface-example TestExampleProxyInterface-example".
|
||||
# We don't actually need to load our .o.pp files in that case, so just
|
||||
# pretend like we have no CPPSRCS if that's the target. It makes the
|
||||
# test cycle much faster, which is why we're doing it.
|
||||
#
|
||||
# XXXbz We could try to cheat even more and only include our CPPSRCS
|
||||
# when $(MAKECMDGOALS) contains libs, so that we can skip loading all
|
||||
# those .o.pp when trying to make a single .cpp file too, but that
|
||||
# would break |make FooBinding.o(bj)|. Ah, well.
|
||||
ifneq (export TestExampleInterface-example TestExampleProxyInterface-example,$(MAKECMDGOALS))
|
||||
CPPSRCS = \
|
||||
$(linked_binding_cpp_files) \
|
||||
$(filter %.cpp, $(globalgen_targets)) \
|
||||
@ -71,7 +50,6 @@ CPPSRCS = \
|
||||
CallbackObject.cpp \
|
||||
DOMJSProxyHandler.cpp \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
LOCAL_INCLUDES += -I$(topsrcdir)/js/xpconnect/src \
|
||||
-I$(topsrcdir)/js/xpconnect/wrappers \
|
||||
@ -101,11 +79,11 @@ LOCAL_INCLUDES += \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
EXTRA_EXPORT_MDDEPEND_FILES := $(addsuffix .pp,$(binding_dependency_trackers))
|
||||
EXTRA_MDDEPEND_FILES := $(addsuffix .pp,$(binding_cpp_files) $(binding_header_files))
|
||||
|
||||
EXPORTS_GENERATED_FILES := $(exported_binding_headers)
|
||||
EXPORTS_GENERATED_DEST := $(DIST)/include/$(binding_include_path)
|
||||
EXPORTS_GENERATED_TARGET := export
|
||||
EXPORTS_GENERATED_TARGET := webidl-export
|
||||
INSTALL_TARGETS += EXPORTS_GENERATED
|
||||
|
||||
ifdef GNU_CC
|
||||
@ -114,6 +92,14 @@ endif
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
# edmorley is sick of clobbering everytime someone adds an interface
|
||||
$(CPPOBJS): PrototypeList.h
|
||||
|
||||
# We need to create a separate target so we can ensure that the pickle is
|
||||
# done before generating headers.
|
||||
export:: ParserResults.pkl
|
||||
$(MAKE) webidl-export
|
||||
|
||||
# If you change bindinggen_dependencies here, change it in
|
||||
# dom/bindings/test/Makefile.in too.
|
||||
bindinggen_dependencies := \
|
||||
@ -121,7 +107,6 @@ bindinggen_dependencies := \
|
||||
Bindings.conf \
|
||||
Configuration.py \
|
||||
Codegen.py \
|
||||
ParserResults.pkl \
|
||||
parser/WebIDL.py \
|
||||
$(GLOBAL_DEPS) \
|
||||
$(NULL)
|
||||
@ -142,20 +127,35 @@ $(webidl_files): %: $(webidl_base)/%
|
||||
$(test_webidl_files): %: $(srcdir)/test/%
|
||||
$(INSTALL) $(IFLAGS1) $(srcdir)/test/$* .
|
||||
|
||||
$(binding_header_files): .BindingGen
|
||||
$(binding_header_files): %Binding.h: $(bindinggen_dependencies) \
|
||||
%.webidl \
|
||||
$(call mkdir_deps,$(MDDEPDIR)) \
|
||||
$(NULL)
|
||||
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
$(PLY_INCLUDE) -I$(srcdir)/parser \
|
||||
$(srcdir)/BindingGen.py header \
|
||||
$(srcdir)/Bindings.conf \
|
||||
$*Binding \
|
||||
$(CURDIR)/ \
|
||||
$*.webidl
|
||||
|
||||
$(binding_cpp_files): .BindingGen
|
||||
|
||||
# $(binding_dependency_trackers) pick up additional dependencies via .pp files
|
||||
$(binding_dependency_trackers):
|
||||
# Just bring it up to date, if it's out of date, so that we'll know that
|
||||
# we have to redo binding generation and flag this prerequisite there as
|
||||
# being newer than the bindinggen target.
|
||||
@$(TOUCH) $@
|
||||
$(binding_cpp_files): %Binding.cpp: $(bindinggen_dependencies) \
|
||||
$(CURDIR)/%.webidl \
|
||||
$(call mkdir_deps,$(MDDEPDIR)) \
|
||||
$(NULL)
|
||||
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
$(PLY_INCLUDE) -I$(srcdir)/parser \
|
||||
$(srcdir)/BindingGen.py cpp \
|
||||
$(srcdir)/Bindings.conf \
|
||||
$*Binding \
|
||||
$(CURDIR) \
|
||||
$*.webidl
|
||||
|
||||
$(globalgen_targets): ParserResults.pkl
|
||||
|
||||
%-example: .BindingGen
|
||||
%-example: $(bindinggen_dependencies) \
|
||||
ParserResults.pkl \
|
||||
$(NULL)
|
||||
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
$(PLY_INCLUDE) -I$(srcdir)/parser \
|
||||
$(srcdir)/ExampleGen.py \
|
||||
@ -180,52 +180,24 @@ $(CACHE_DIR)/.done:
|
||||
@$(TOUCH) $@
|
||||
|
||||
ParserResults.pkl: $(globalgen_dependencies)
|
||||
# Running GlobalGen.py updates ParserResults.pkl as a side-effect
|
||||
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
$(PLY_INCLUDE) -I$(srcdir)/parser \
|
||||
$(srcdir)/GlobalGen.py $(srcdir)/Bindings.conf . \
|
||||
--cachedir=$(CACHE_DIR) \
|
||||
$(all_webidl_files)
|
||||
|
||||
.BindingGen: $(bindinggen_dependencies) $(binding_dependency_trackers)
|
||||
# Make sure .deps actually exists, since we'll try to write to it from
|
||||
# BindingGen.py but we're typically running in the export phase, which
|
||||
# is before anyone has bothered creating .deps.
|
||||
$(MKDIR) -p .deps
|
||||
# Pass our long lists through files to try to avoid blowing
|
||||
# out the command line
|
||||
echo $(all_webidl_files) > .all-webidl-file-list
|
||||
echo $? > .changed-dependency-list
|
||||
# BindingGen.py will examine the changed dependency list to figure out
|
||||
# what it really needs to regenerate.
|
||||
$PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
$(PLY_INCLUDE) -I$(srcdir)/parser \
|
||||
$(srcdir)/BindingGen.py \
|
||||
$(srcdir)/Bindings.conf \
|
||||
$(CURDIR) \
|
||||
.all-webidl-file-list \
|
||||
.changed-dependency-list
|
||||
# Now touch the .BindingGen file so that we don't have to keep redoing
|
||||
# all that until something else actually changes.
|
||||
@$(TOUCH) $@
|
||||
|
||||
GARBAGE += \
|
||||
webidlyacc.py \
|
||||
parser.out \
|
||||
$(wildcard *-example.h) \
|
||||
$(wildcard *-example.cpp) \
|
||||
.BindingGen \
|
||||
.all-webidl-file-list \
|
||||
.changed-dependency-list \
|
||||
$(binding_dependency_trackers) \
|
||||
$(NULL)
|
||||
|
||||
# Make sure all binding header files are created during the export stage, so we
|
||||
# don't have issues with .cpp files being compiled before we've generated the
|
||||
# headers they depend on. This is really only needed for the test files, since
|
||||
# the non-test headers are all exported above anyway. Note that this means that
|
||||
# we do all of our codegen during export.
|
||||
export:: $(binding_header_files)
|
||||
# the non-test headers are all exported above anyway.
|
||||
webidl-export:: $(binding_header_files)
|
||||
|
||||
distclean::
|
||||
-$(RM) \
|
||||
@ -233,5 +205,6 @@ distclean::
|
||||
$(binding_cpp_files) \
|
||||
$(all_webidl_files) \
|
||||
$(globalgen_targets) \
|
||||
ParserResults.pkl \
|
||||
$(NULL)
|
||||
ParserResults.pkl
|
||||
|
||||
.PHONY: webidl-export
|
||||
|
@ -3396,15 +3396,8 @@ class Parser(Tokenizer):
|
||||
try:
|
||||
if self.globalScope()._lookupIdentifier(identifier):
|
||||
p[0] = self.globalScope()._lookupIdentifier(identifier)
|
||||
if not isinstance(p[0], IDLExternalInterface):
|
||||
raise WebIDLError("Name collision between external "
|
||||
"interface declaration for identifier "
|
||||
"%s and %s" % (identifier.name, p[0]),
|
||||
[location, p[0].location])
|
||||
return
|
||||
except Exception, ex:
|
||||
if isinstance(ex, WebIDLError):
|
||||
raise ex
|
||||
except:
|
||||
pass
|
||||
|
||||
p[0] = IDLExternalInterface(location, self.globalScope(), identifier)
|
||||
|
@ -317,49 +317,6 @@ def WebIDLTest(parser, harness):
|
||||
"Should not allow a name collision between interface "
|
||||
"and other object")
|
||||
|
||||
parser = parser.reset()
|
||||
threw = False
|
||||
try:
|
||||
parser.parse("""
|
||||
dictionary A {
|
||||
boolean x;
|
||||
};
|
||||
interface A;
|
||||
""")
|
||||
results = parser.finish()
|
||||
except:
|
||||
threw = True
|
||||
harness.ok(threw,
|
||||
"Should not allow a name collision between external interface "
|
||||
"and other object")
|
||||
|
||||
parser = parser.reset()
|
||||
threw = False
|
||||
try:
|
||||
parser.parse("""
|
||||
interface A {
|
||||
readonly attribute boolean x;
|
||||
};
|
||||
interface A;
|
||||
""")
|
||||
results = parser.finish()
|
||||
except:
|
||||
threw = True
|
||||
harness.ok(threw,
|
||||
"Should not allow a name collision between external interface "
|
||||
"and interface")
|
||||
|
||||
parser = parser.reset()
|
||||
parser.parse("""
|
||||
interface A;
|
||||
interface A;
|
||||
""")
|
||||
results = parser.finish()
|
||||
harness.ok(len(results) == 1 and
|
||||
isinstance(results[0], WebIDL.IDLExternalInterface),
|
||||
"Should allow name collisions between external interface "
|
||||
"declarations")
|
||||
|
||||
parser = parser.reset()
|
||||
threw = False
|
||||
try:
|
||||
|
@ -47,7 +47,6 @@ bindinggen_dependencies := \
|
||||
../Bindings.conf \
|
||||
../Configuration.py \
|
||||
../Codegen.py \
|
||||
../ParserResults.pkl \
|
||||
../parser/WebIDL.py \
|
||||
../Makefile \
|
||||
$(GLOBAL_DEPS) \
|
||||
@ -90,18 +89,19 @@ endif
|
||||
# rules.mk and running make with no target in this dir does the right thing.
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
$(CPPSRCS): .BindingGen
|
||||
$(CPPSRCS): ../%Binding.cpp: $(bindinggen_dependencies) \
|
||||
../%.webidl \
|
||||
TestExampleInterface-example \
|
||||
TestExampleProxyInterface-example \
|
||||
$(NULL)
|
||||
$(MAKE) -C .. $*Binding.h
|
||||
$(MAKE) -C .. $*Binding.cpp
|
||||
|
||||
.BindingGen: $(bindinggen_dependencies) \
|
||||
$(test_webidl_files) \
|
||||
$(NULL)
|
||||
# The export phase in dom/bindings is what actually looks at
|
||||
# dependencies and regenerates things as needed, so just go ahead and
|
||||
# make that phase here. Also make our example interface files. If the
|
||||
# target used here ever changes, change the conditional around
|
||||
# $(CPPSRCS) in dom/bindings/Makefile.in.
|
||||
$(MAKE) -C .. export TestExampleInterface-example TestExampleProxyInterface-example
|
||||
@$(TOUCH) $@
|
||||
TestExampleInterface-example:
|
||||
$(MAKE) -C .. TestExampleInterface-example
|
||||
|
||||
TestExampleProxyInterface-example:
|
||||
$(MAKE) -C .. TestExampleProxyInterface-example
|
||||
|
||||
check::
|
||||
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
@ -110,20 +110,3 @@ check::
|
||||
check-interactive:
|
||||
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
$(PLY_INCLUDE) $(srcdir)/../parser/runtests.py -q
|
||||
|
||||
# Since we define MOCHITEST_FILES, config/makefiles/mochitest.mk goes ahead and
|
||||
# sets up a rule with libs:: in itm which makes our .DEFAULT_TARGET be "libs".
|
||||
# Then ruls.mk does |.DEFAULT_TARGET ?= default| which leaves it as "libs". So
|
||||
# if we make without an explicit target in this directory, we try to make
|
||||
# "libs", but with a $(MAKECMDGOALS) of empty string. And then rules.mk
|
||||
# helpfully does not include our *.o.pp files, since it includes them only if
|
||||
# filtering some stuff out from $(MAKECMDGOALS) leaves it nonempty. The upshot
|
||||
# is that if some headers change and we run make in this dir without an explicit
|
||||
# target things don't get rebuilt.
|
||||
#
|
||||
# On the other hand, if we set .DEFAULT_TARGET to "default" explicitly here,
|
||||
# then rules.mk will reinvoke make with "export" and "libs" but this time hey
|
||||
# will be passed as explicit targets, show up in $(MAKECMDGOALS), and things
|
||||
# will work. Do this at the end of our Makefile so the rest of the build system
|
||||
# does not get a chance to muck with it after we set it.
|
||||
.DEFAULT_GOAL := default
|
||||
|
@ -4,6 +4,8 @@
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
interface ClientRect;
|
||||
|
||||
interface ClientRectList {
|
||||
readonly attribute unsigned long length;
|
||||
getter ClientRect? item(unsigned long index);
|
||||
|
@ -15,6 +15,7 @@
|
||||
* http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/core/nsIDOMDocument.idl
|
||||
*/
|
||||
|
||||
interface Comment;
|
||||
interface StyleSheetList;
|
||||
interface TouchList;
|
||||
interface WindowProxy;
|
||||
|
@ -1,8 +1,8 @@
|
||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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/. */
|
||||
|
||||
interface DOMRequest;
|
||||
interface LockedFile;
|
||||
|
||||
enum FileMode { "readonly", "readwrite" };
|
||||
|
@ -10,6 +10,8 @@
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
interface Element;
|
||||
|
||||
interface HTMLCollection {
|
||||
readonly attribute unsigned long length;
|
||||
getter Element? item(unsigned long index);
|
||||
|
@ -12,6 +12,8 @@
|
||||
* and create derivative works of this document.
|
||||
*/
|
||||
|
||||
interface DOMStringMap;
|
||||
|
||||
interface HTMLElement : Element {
|
||||
// metadata attributes
|
||||
attribute DOMString title;
|
||||
|
@ -10,6 +10,8 @@
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
interface HTMLOptionElement;
|
||||
|
||||
interface HTMLOptionsCollection : HTMLCollection {
|
||||
attribute unsigned long length;
|
||||
[Throws]
|
||||
|
@ -3,6 +3,8 @@
|
||||
* 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/. */
|
||||
|
||||
interface Attr;
|
||||
|
||||
/**
|
||||
* This is a temporary, non-standard interface, to ease the transition to a
|
||||
* world where Attr no longer inherits from Node.
|
||||
|
@ -3,6 +3,8 @@
|
||||
* 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/. */
|
||||
|
||||
interface ClientRect;
|
||||
|
||||
/**
|
||||
* These objects are exposed by the MozDOMAfterPaint event. Each one represents
|
||||
* a request to repaint a rectangle that was generated by the browser.
|
||||
|
@ -12,6 +12,8 @@
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
interface ClientRect;
|
||||
|
||||
interface Range {
|
||||
[Throws]
|
||||
readonly attribute Node startContainer;
|
||||
|
@ -11,6 +11,7 @@
|
||||
*/
|
||||
|
||||
interface SVGAnimatedEnumeration;
|
||||
interface SVGAnimatedLength;
|
||||
|
||||
interface SVGMaskElement : SVGElement {
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
interface SVGAnimatedString;
|
||||
interface SVGViewSpec;
|
||||
interface SVGPoint;
|
||||
|
||||
interface SVGSVGElement : SVGGraphicsElement {
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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/.
|
||||
@ -10,6 +9,8 @@
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
interface DocumentFragment;
|
||||
|
||||
callback LifecycleCreatedCallback = void();
|
||||
|
||||
dictionary LifecycleCallbacks {
|
||||
|
@ -15,6 +15,13 @@
|
||||
// This IDL depends on the typed array specification defined at:
|
||||
// https://www.khronos.org/registry/typedarray/specs/latest/typedarrays.idl
|
||||
|
||||
// XXXbz all sorts of forward declarations for things that are not new
|
||||
// bindings yet.
|
||||
interface Event;
|
||||
interface HTMLCanvasElement;
|
||||
interface HTMLVideoElement;
|
||||
interface ImageData;
|
||||
|
||||
typedef unsigned long GLenum;
|
||||
typedef boolean GLboolean;
|
||||
typedef unsigned long GLbitfield;
|
||||
|
@ -4,6 +4,8 @@
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
interface StyleSheet;
|
||||
|
||||
interface XMLStylesheetProcessingInstruction : ProcessingInstruction {
|
||||
readonly attribute StyleSheet? sheet;
|
||||
};
|
||||
|
@ -1619,21 +1619,6 @@ endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
ifneq (,$(filter export,$(MAKECMDGOALS)))
|
||||
MDDEPEND_FILES := $(strip $(wildcard $(addprefix $(MDDEPDIR)/,$(EXTRA_EXPORT_MDDEPEND_FILES))))
|
||||
|
||||
ifneq (,$(MDDEPEND_FILES))
|
||||
ifdef .PYMAKE
|
||||
includedeps $(MDDEPEND_FILES)
|
||||
else
|
||||
include $(MDDEPEND_FILES)
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
#############################################################################
|
||||
|
||||
-include $(topsrcdir)/$(MOZ_BUILD_APP)/app-rules.mk
|
||||
|
Loading…
x
Reference in New Issue
Block a user