зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to autoland
This commit is contained in:
Коммит
b54dfedae2
|
@ -11,7 +11,7 @@ support-files =
|
|||
[browser_address_edit.js]
|
||||
skip-if = verify && debug && os == 'mac'
|
||||
[browser_card_edit.js]
|
||||
skip-if = (verify && debug && os == 'mac') || (os == 'linux' && debug) # bug 1465673
|
||||
skip-if = debug && (os == 'mac' || os == 'linux') # bug 1465673
|
||||
[browser_change_shipping.js]
|
||||
[browser_dropdowns.js]
|
||||
[browser_host_name.js]
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// returns the value of StaticPrefs::foo_bar().
|
||||
// This is allows the use of DOMPrefs in WebIDL files.
|
||||
|
||||
DOM_WEBIDL_PREF(canvas_imagebitmap_extensions_enabled)
|
||||
DOM_WEBIDL_PREF(dom_caches_enabled)
|
||||
DOM_WEBIDL_PREF(dom_webnotifications_serviceworker_enabled)
|
||||
DOM_WEBIDL_PREF(dom_webnotifications_requireinteraction_enabled)
|
||||
|
|
|
@ -3095,7 +3095,8 @@ nsGlobalWindowInner::GetOwnPropertyNames(JSContext* aCx, JS::AutoIdVector& aName
|
|||
nsGlobalWindowInner::IsPrivilegedChromeWindow(JSContext* aCx, JSObject* aObj)
|
||||
{
|
||||
// For now, have to deal with XPConnect objects here.
|
||||
return xpc::WindowOrNull(aObj)->IsChromeWindow() &&
|
||||
nsGlobalWindowInner* win = xpc::WindowOrNull(aObj);
|
||||
return win && win->IsChromeWindow() &&
|
||||
nsContentUtils::ObjectPrincipal(aObj) == nsContentUtils::GetSystemPrincipal();
|
||||
}
|
||||
|
||||
|
@ -7715,11 +7716,6 @@ nsGlobalWindowInner::CreateImageBitmap(JSContext* aCx,
|
|||
const ImageBitmapSource& aImage,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (aImage.IsArrayBuffer() || aImage.IsArrayBufferView()) {
|
||||
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ImageBitmap::Create(this, aImage, Nothing(), aRv);
|
||||
}
|
||||
|
||||
|
@ -7729,34 +7725,9 @@ nsGlobalWindowInner::CreateImageBitmap(JSContext* aCx,
|
|||
int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (aImage.IsArrayBuffer() || aImage.IsArrayBufferView()) {
|
||||
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ImageBitmap::Create(this, aImage, Some(gfx::IntRect(aSx, aSy, aSw, aSh)), aRv);
|
||||
}
|
||||
|
||||
already_AddRefed<mozilla::dom::Promise>
|
||||
nsGlobalWindowInner::CreateImageBitmap(JSContext* aCx,
|
||||
const ImageBitmapSource& aImage,
|
||||
int32_t aOffset, int32_t aLength,
|
||||
ImageBitmapFormat aFormat,
|
||||
const Sequence<ChannelPixelLayout>& aLayout,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (!StaticPrefs::canvas_imagebitmap_extensions_enabled()) {
|
||||
aRv.Throw(NS_ERROR_TYPE_ERR);
|
||||
return nullptr;
|
||||
}
|
||||
if (aImage.IsArrayBuffer() || aImage.IsArrayBufferView()) {
|
||||
return ImageBitmap::Create(this, aImage, aOffset, aLength, aFormat, aLayout,
|
||||
aRv);
|
||||
}
|
||||
aRv.Throw(NS_ERROR_TYPE_ERR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
mozilla::dom::TabGroup*
|
||||
nsGlobalWindowInner::TabGroupInner()
|
||||
{
|
||||
|
|
|
@ -924,15 +924,6 @@ public:
|
|||
int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
|
||||
mozilla::ErrorResult& aRv);
|
||||
|
||||
already_AddRefed<mozilla::dom::Promise>
|
||||
CreateImageBitmap(JSContext* aCx,
|
||||
const mozilla::dom::ImageBitmapSource& aImage,
|
||||
int32_t aOffset, int32_t aLength,
|
||||
mozilla::dom::ImageBitmapFormat aFormat,
|
||||
const mozilla::dom::Sequence<mozilla::dom::ChannelPixelLayout>& aLayout,
|
||||
mozilla::ErrorResult& aRv);
|
||||
|
||||
|
||||
// ChromeWindow bits. Do NOT call these unless your window is in
|
||||
// fact chrome.
|
||||
uint16_t WindowState();
|
||||
|
|
|
@ -32,7 +32,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1139964
|
|||
ppm.removeMessageListener(msgName, processListener);
|
||||
ok(m.data.hasPromise, "ProcessGlobal should have Promise object in the global scope!");
|
||||
ok(m.data.hasTextEncoder, "ProcessGlobal should have TextEncoder object in the global scope!");
|
||||
ok(!m.data.hasWindow, "ProcessGlobal should not have Window object in the global scope!");
|
||||
ok(m.data.hasWindow, "ProcessGlobal should have Window object in the global scope!");
|
||||
|
||||
messageManager.addMessageListener(msgName, tabListener)
|
||||
messageManager.loadFrameScript("data:,(" + mmScriptForPromiseTest.toString() + ")()", true);
|
||||
|
@ -42,7 +42,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1139964
|
|||
messageManager.removeMessageListener(msgName, tabListener);
|
||||
ok(m.data.hasPromise, "TabChildGlobal should have Promise object in the global scope!");
|
||||
ok(m.data.hasTextEncoder, "TabChildGlobal should have TextEncoder object in the global scope!");
|
||||
ok(!m.data.hasWindow, "TabChildGlobal should not have Window object in the global scope!");
|
||||
ok(m.data.hasWindow, "TabChildGlobal should have Window object in the global scope!");
|
||||
|
||||
opener.setTimeout("done()", 0);
|
||||
window.close();
|
||||
|
|
|
@ -464,10 +464,6 @@ DOMInterfaces = {
|
|||
'headerFile': 'xpcjsid.h',
|
||||
},
|
||||
|
||||
'ImageBitmap': {
|
||||
'implicitJSContext': [ 'mapDataInto' ],
|
||||
},
|
||||
|
||||
'ImageCapture': {
|
||||
'binaryNames': { 'videoStreamTrack': 'GetVideoStreamTrack' }
|
||||
},
|
||||
|
|
|
@ -2973,13 +2973,20 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
|||
# if we don't need to create anything, why are we generating this?
|
||||
assert needInterfaceObject or needInterfacePrototypeObject
|
||||
|
||||
def maybecrash(reason):
|
||||
if self.descriptor.name == "Document":
|
||||
return 'MOZ_CRASH("Bug 1405521/1488480: %s");\n' % reason
|
||||
return ""
|
||||
|
||||
getParentProto = fill(
|
||||
"""
|
||||
JS::${type}<JSObject*> parentProto(${getParentProto});
|
||||
if (!parentProto) {
|
||||
$*{maybeCrash}
|
||||
return;
|
||||
}
|
||||
""",
|
||||
maybeCrash=maybecrash("Can't get Node.prototype"),
|
||||
type=parentProtoType,
|
||||
getParentProto=getParentProto)
|
||||
|
||||
|
@ -2987,9 +2994,11 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
|||
"""
|
||||
JS::${type}<JSObject*> constructorProto(${getConstructorProto});
|
||||
if (!constructorProto) {
|
||||
$*{maybeCrash}
|
||||
return;
|
||||
}
|
||||
""",
|
||||
maybeCrash=maybecrash("Can't get Node"),
|
||||
type=constructorProtoType,
|
||||
getConstructorProto=getConstructorProto)
|
||||
|
||||
|
@ -3005,7 +3014,12 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
|||
for properties in idsToInit]
|
||||
idsInitedFlag = CGGeneric("static bool sIdsInited = false;\n")
|
||||
setFlag = CGGeneric("sIdsInited = true;\n")
|
||||
initIdConditionals = [CGIfWrapper(CGGeneric("return;\n"), call)
|
||||
initIdConditionals = [CGIfWrapper(CGGeneric(fill(
|
||||
"""
|
||||
$*{maybeCrash}
|
||||
return;
|
||||
""",
|
||||
maybeCrash=maybecrash("Can't init IDs"))), call)
|
||||
for call in initIdCalls]
|
||||
initIds = CGList([idsInitedFlag,
|
||||
CGIfWrapper(CGList(initIdConditionals + [setFlag]),
|
||||
|
@ -3208,10 +3222,12 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
|||
JS::Rooted<JSObject*> holderProto(aCx, ${holderProto});
|
||||
unforgeableHolder = JS_NewObjectWithoutMetadata(aCx, ${holderClass}, holderProto);
|
||||
if (!unforgeableHolder) {
|
||||
$*{maybeCrash}
|
||||
$*{failureCode}
|
||||
}
|
||||
}
|
||||
""",
|
||||
maybeCrash=maybecrash("Can't create unforgeable holder"),
|
||||
holderProto=holderProto,
|
||||
holderClass=holderClass,
|
||||
failureCode=failureCode))
|
||||
|
@ -3547,12 +3563,22 @@ def InitUnforgeablePropertiesOnHolder(descriptor, properties, failureCode,
|
|||
|
||||
unforgeables = []
|
||||
|
||||
if descriptor.name == "Document":
|
||||
maybeCrash = dedent(
|
||||
"""
|
||||
MOZ_CRASH("Bug 1405521/1488480: Can't define unforgeable attributes");
|
||||
""");
|
||||
else:
|
||||
maybeCrash = "";
|
||||
|
||||
defineUnforgeableAttrs = fill(
|
||||
"""
|
||||
if (!DefineUnforgeableAttributes(aCx, ${holderName}, %s)) {
|
||||
$*{maybeCrash}
|
||||
$*{failureCode}
|
||||
}
|
||||
""",
|
||||
maybeCrash=maybeCrash,
|
||||
failureCode=failureCode,
|
||||
holderName=holderName)
|
||||
defineUnforgeableMethods = fill(
|
||||
|
@ -17199,7 +17225,7 @@ class GlobalGenRoots():
|
|||
curr = CGList([], "\n")
|
||||
|
||||
descriptors = config.getDescriptors(hasInterfaceObject=True,
|
||||
isExposedInSystemGlobals=True,
|
||||
isExposedInWindow=True,
|
||||
register=True)
|
||||
properties = [desc.name for desc in descriptors]
|
||||
|
||||
|
@ -17244,7 +17270,7 @@ class GlobalGenRoots():
|
|||
defineIncludes = [CGHeaders.getDeclarationFilename(desc.interface)
|
||||
for desc in config.getDescriptors(hasInterfaceObject=True,
|
||||
register=True,
|
||||
isExposedInSystemGlobals=True)]
|
||||
isExposedInWindow=True)]
|
||||
defineIncludes.append("nsThreadUtils.h") # For NS_IsMainThread
|
||||
defineIncludes.append("js/Id.h") # For jsid
|
||||
defineIncludes.append("mozilla/dom/WebIDLGlobalNameHash.h")
|
||||
|
|
|
@ -250,8 +250,6 @@ class Configuration(DescriptorProvider):
|
|||
getter = lambda x: x.interface.isExposedInWorkerDebugger()
|
||||
elif key == 'isExposedInAnyWorklet':
|
||||
getter = lambda x: x.interface.isExposedInAnyWorklet()
|
||||
elif key == 'isExposedInSystemGlobals':
|
||||
getter = lambda x: x.interface.isExposedInSystemGlobals()
|
||||
elif key == 'isExposedInWindow':
|
||||
getter = lambda x: x.interface.isExposedInWindow()
|
||||
else:
|
||||
|
|
|
@ -327,6 +327,13 @@ class IDLScope(IDLObject):
|
|||
assert identifier.scope == self
|
||||
return self._lookupIdentifier(identifier)
|
||||
|
||||
def addIfaceGlobalNames(self, interfaceName, globalNames):
|
||||
"""Record the global names (from |globalNames|) that can be used in
|
||||
[Exposed] to expose things in a global named |interfaceName|"""
|
||||
self.globalNames.update(globalNames)
|
||||
for name in globalNames:
|
||||
self.globalNameMapping[name].add(interfaceName)
|
||||
|
||||
|
||||
class IDLIdentifier(IDLObject):
|
||||
def __init__(self, location, scope, name):
|
||||
|
@ -504,8 +511,10 @@ class IDLExposureMixins():
|
|||
return 'Window' in self.exposureSet
|
||||
|
||||
def isExposedOnMainThread(self):
|
||||
return (self.isExposedInWindow() or
|
||||
self.isExposedInSystemGlobals())
|
||||
return self.isExposedInWindow()
|
||||
|
||||
def isExposedOffMainThread(self):
|
||||
return len(self.exposureSet - {'Window', 'FakeTestPrimaryGlobal'}) > 0
|
||||
|
||||
def isExposedInAnyWorker(self):
|
||||
return len(self.getWorkerExposureSet()) > 0
|
||||
|
@ -516,9 +525,6 @@ class IDLExposureMixins():
|
|||
def isExposedInAnyWorklet(self):
|
||||
return len(self.getWorkletExposureSet()) > 0
|
||||
|
||||
def isExposedInSystemGlobals(self):
|
||||
return 'BackstagePass' in self.exposureSet
|
||||
|
||||
def isExposedInSomeButNotAllWorkers(self):
|
||||
"""
|
||||
Returns true if the Exposed extended attribute for this interface
|
||||
|
@ -1323,10 +1329,9 @@ class IDLInterfaceOrNamespace(IDLObjectWithScope, IDLExposureMixins):
|
|||
checkDuplicateNames(member, bindingAlias, "BindingAlias")
|
||||
|
||||
|
||||
if (self.getExtendedAttribute("Pref") and
|
||||
self._exposureGlobalNames != set([self.parentScope.primaryGlobalName])):
|
||||
raise WebIDLError("[Pref] used on an interface that is not %s-only" %
|
||||
self.parentScope.primaryGlobalName,
|
||||
if self.getExtendedAttribute("Pref") and self.isExposedOffMainThread():
|
||||
raise WebIDLError("[Pref] used on an interface that is not "
|
||||
"main-thread-only",
|
||||
[self.location])
|
||||
|
||||
# Conditional exposure makes no sense for interfaces with no
|
||||
|
@ -1710,9 +1715,8 @@ class IDLInterface(IDLInterfaceOrNamespace):
|
|||
self.globalNames = attr.args()
|
||||
else:
|
||||
self.globalNames = [self.identifier.name]
|
||||
self.parentScope.globalNames.update(self.globalNames)
|
||||
for globalName in self.globalNames:
|
||||
self.parentScope.globalNameMapping[globalName].add(self.identifier.name)
|
||||
self.parentScope.addIfaceGlobalNames(self.identifier.name,
|
||||
self.globalNames)
|
||||
self._isOnGlobalProtoChain = True
|
||||
elif identifier == "PrimaryGlobal":
|
||||
if not attr.noArguments():
|
||||
|
@ -1725,8 +1729,8 @@ class IDLInterface(IDLInterfaceOrNamespace):
|
|||
self.parentScope.primaryGlobalAttr.location])
|
||||
self.parentScope.primaryGlobalAttr = attr
|
||||
self.parentScope.primaryGlobalName = self.identifier.name
|
||||
self.parentScope.globalNames.add(self.identifier.name)
|
||||
self.parentScope.globalNameMapping[self.identifier.name].add(self.identifier.name)
|
||||
self.parentScope.addIfaceGlobalNames(self.identifier.name,
|
||||
[self.identifier.name])
|
||||
self._isOnGlobalProtoChain = True
|
||||
elif identifier == "SecureContext":
|
||||
if not attr.noArguments():
|
||||
|
@ -3572,10 +3576,9 @@ class IDLInterfaceMember(IDLObjectWithIdentifier, IDLExposureMixins):
|
|||
IDLExposureMixins.finish(self, scope)
|
||||
|
||||
def validate(self):
|
||||
if (self.getExtendedAttribute("Pref") and
|
||||
self.exposureSet != set([self._globalScope.primaryGlobalName])):
|
||||
if self.getExtendedAttribute("Pref") and self.isExposedOffMainThread():
|
||||
raise WebIDLError("[Pref] used on an interface member that is not "
|
||||
"%s-only" % self._globalScope.primaryGlobalName,
|
||||
"main-thread-only",
|
||||
[self.location])
|
||||
|
||||
if self.isAttr() or self.isMethod():
|
||||
|
@ -6896,16 +6899,13 @@ class Parser(Tokenizer):
|
|||
logger.reportGrammarErrors()
|
||||
|
||||
self._globalScope = IDLScope(BuiltinLocation("<Global Scope>"), None, None)
|
||||
|
||||
# To make our test harness work, pretend like we have a primary global already.
|
||||
# Note that we _don't_ set _globalScope.primaryGlobalAttr,
|
||||
# so we'll still be able to detect multiple PrimaryGlobal extended attributes.
|
||||
self._globalScope.primaryGlobalName = "FakeTestPrimaryGlobal"
|
||||
self._globalScope.globalNames.add("FakeTestPrimaryGlobal")
|
||||
self._globalScope.globalNameMapping["FakeTestPrimaryGlobal"].add("FakeTestPrimaryGlobal")
|
||||
# And we add the special-cased "System" global name, which
|
||||
# doesn't have any corresponding interfaces.
|
||||
self._globalScope.globalNames.add("System")
|
||||
self._globalScope.globalNameMapping["System"].add("BackstagePass")
|
||||
self._globalScope.addIfaceGlobalNames("FakeTestPrimaryGlobal", ["FakeTestPrimaryGlobal"])
|
||||
|
||||
self._installBuiltins(self._globalScope)
|
||||
self._productions = []
|
||||
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -41,7 +41,6 @@ class OffscreenCanvas;
|
|||
|
||||
class ArrayBufferViewOrArrayBuffer;
|
||||
class CanvasRenderingContext2D;
|
||||
struct ChannelPixelLayout;
|
||||
class CreateImageBitmapFromBlob;
|
||||
class CreateImageBitmapFromBlobTask;
|
||||
class CreateImageBitmapFromBlobWorkerTask;
|
||||
|
@ -52,7 +51,6 @@ class HTMLVideoElement;
|
|||
enum class ImageBitmapFormat : uint8_t;
|
||||
class ImageData;
|
||||
class ImageUtils;
|
||||
template<typename T> class MapDataIntoBufferSource;
|
||||
class Promise;
|
||||
class PostMessageEvent; // For StructuredClone between windows.
|
||||
class ImageBitmapShutdownObserver;
|
||||
|
@ -62,7 +60,6 @@ struct ImageBitmapCloneData final
|
|||
RefPtr<gfx::DataSourceSurface> mSurface;
|
||||
gfx::IntRect mPictureRect;
|
||||
gfxAlphaType mAlphaType;
|
||||
bool mIsCroppingAreaOutSideOfSourceImage;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -135,14 +132,6 @@ public:
|
|||
Create(nsIGlobalObject* aGlobal, const ImageBitmapSource& aSrc,
|
||||
const Maybe<gfx::IntRect>& aCropRect, ErrorResult& aRv);
|
||||
|
||||
static already_AddRefed<Promise>
|
||||
Create(nsIGlobalObject* aGlobal,
|
||||
const ImageBitmapSource& aBuffer,
|
||||
int32_t aOffset, int32_t aLength,
|
||||
mozilla::dom::ImageBitmapFormat aFormat,
|
||||
const Sequence<mozilla::dom::ChannelPixelLayout>& aLayout,
|
||||
ErrorResult& aRv);
|
||||
|
||||
static JSObject*
|
||||
ReadStructuredClone(JSContext* aCx,
|
||||
JSStructuredCloneReader* aReader,
|
||||
|
@ -159,23 +148,6 @@ public:
|
|||
friend CreateImageBitmapFromBlobTask;
|
||||
friend CreateImageBitmapFromBlobWorkerTask;
|
||||
|
||||
template<typename T>
|
||||
friend class MapDataIntoBufferSource;
|
||||
|
||||
// Mozilla Extensions
|
||||
ImageBitmapFormat
|
||||
FindOptimalFormat(const Optional<Sequence<ImageBitmapFormat>>& aPossibleFormats,
|
||||
ErrorResult& aRv);
|
||||
|
||||
int32_t
|
||||
MappedDataLength(ImageBitmapFormat aFormat, ErrorResult& aRv);
|
||||
|
||||
already_AddRefed<Promise>
|
||||
MapDataInto(JSContext* aCx,
|
||||
ImageBitmapFormat aFormat,
|
||||
const ArrayBufferViewOrArrayBuffer& aBuffer,
|
||||
int32_t aOffset, ErrorResult& aRv);
|
||||
|
||||
size_t GetAllocatedSize() const;
|
||||
|
||||
void OnShutdown();
|
||||
|
@ -208,9 +180,6 @@ protected:
|
|||
|
||||
void SetPictureRect(const gfx::IntRect& aRect, ErrorResult& aRv);
|
||||
|
||||
void SetIsCroppingAreaOutSideOfSourceImage(const gfx::IntSize& aSourceSize,
|
||||
const Maybe<gfx::IntRect>& aCroppingRect);
|
||||
|
||||
static already_AddRefed<ImageBitmap>
|
||||
CreateInternal(nsIGlobalObject* aGlobal, HTMLImageElement& aImageEl,
|
||||
const Maybe<gfx::IntRect>& aCropRect, ErrorResult& aRv);
|
||||
|
@ -278,15 +247,6 @@ protected:
|
|||
|
||||
RefPtr<ImageBitmapShutdownObserver> mShutdownObserver;
|
||||
|
||||
/*
|
||||
* Set mIsCroppingAreaOutSideOfSourceImage if image bitmap was cropped to the
|
||||
* source rectangle so that it contains any transparent black pixels (cropping
|
||||
* area is outside of the source image).
|
||||
* This is used in mapDataInto() to check if we should reject promise with
|
||||
* IndexSizeError.
|
||||
*/
|
||||
bool mIsCroppingAreaOutSideOfSourceImage;
|
||||
|
||||
/*
|
||||
* Whether this object allocated allocated and owns the image data.
|
||||
*/
|
||||
|
|
|
@ -11,9 +11,8 @@ namespace mozilla {
|
|||
namespace dom {
|
||||
|
||||
// So we don't have to forward declare this elsewhere.
|
||||
class HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer;
|
||||
typedef HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer
|
||||
ImageBitmapSource;
|
||||
class HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmapOrBlobOrCanvasRenderingContext2DOrImageData;
|
||||
typedef HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmapOrBlobOrCanvasRenderingContext2DOrImageData ImageBitmapSource;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2730,16 +2730,6 @@ GetChannelCountOfImageFormat(ImageBitmapFormat aFormat)
|
|||
return format->GetChannelCount();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
CalculateImageBufferSize(ImageBitmapFormat aFormat,
|
||||
uint32_t aWidth, uint32_t aHeight)
|
||||
{
|
||||
UtilsUniquePtr format = Utils::GetUtils(aFormat);
|
||||
MOZ_ASSERT(format, "Cannot get a valid ImageBitmapFormatUtils instance.");
|
||||
|
||||
return format->NeededBufferSize(aWidth, aHeight);
|
||||
}
|
||||
|
||||
UniquePtr<ImagePixelLayout>
|
||||
CopyAndConvertImageData(ImageBitmapFormat aSrcFormat,
|
||||
const uint8_t* aSrcBuffer,
|
||||
|
|
|
@ -48,14 +48,6 @@ CreatePixelLayoutFromPlanarYCbCrData(const layers::PlanarYCbCrData* aData);
|
|||
uint8_t
|
||||
GetChannelCountOfImageFormat(ImageBitmapFormat aFormat);
|
||||
|
||||
/*
|
||||
* Get the needed buffer size to store the image data in the given
|
||||
* ImageBitmapFormat with the given width and height.
|
||||
*/
|
||||
uint32_t
|
||||
CalculateImageBufferSize(ImageBitmapFormat aFormat,
|
||||
uint32_t aWidth, uint32_t aHeight);
|
||||
|
||||
/*
|
||||
* This function always copies the image data in _aSrcBuffer_ into _aDstBuffer_
|
||||
* and it also performs color conversion if the _aSrcFormat_ and the
|
||||
|
|
|
@ -125,38 +125,6 @@ public:
|
|||
return (uint32_t)(size.height * stride);
|
||||
}
|
||||
|
||||
virtual UniquePtr<ImagePixelLayout>
|
||||
MapDataInto(uint8_t* aBuffer,
|
||||
uint32_t aOffset,
|
||||
uint32_t aBufferLength,
|
||||
ImageBitmapFormat aFormat,
|
||||
ErrorResult& aRv) const
|
||||
{
|
||||
DataSourceSurface::ScopedMap map(Surface(), DataSourceSurface::READ);
|
||||
if (!map.IsMapped()) {
|
||||
aRv.Throw(NS_ERROR_ILLEGAL_VALUE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Copy or convert data.
|
||||
UniquePtr<ImagePixelLayout> srcLayout =
|
||||
CreateDefaultPixelLayout(GetFormat(), Surface()->GetSize().width,
|
||||
Surface()->GetSize().height, map.GetStride());
|
||||
|
||||
// Prepare destination buffer.
|
||||
uint8_t* dstBuffer = aBuffer + aOffset;
|
||||
UniquePtr<ImagePixelLayout> dstLayout =
|
||||
CopyAndConvertImageData(GetFormat(), map.GetData(), srcLayout.get(),
|
||||
aFormat, dstBuffer);
|
||||
|
||||
if (!dstLayout) {
|
||||
aRv.Throw(NS_ERROR_NOT_AVAILABLE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return dstLayout;
|
||||
}
|
||||
|
||||
protected:
|
||||
Impl() {}
|
||||
|
||||
|
@ -203,31 +171,6 @@ public:
|
|||
return mImage->AsNVImage()->GetBufferSize();
|
||||
}
|
||||
|
||||
UniquePtr<ImagePixelLayout> MapDataInto(uint8_t* aBuffer,
|
||||
uint32_t aOffset,
|
||||
uint32_t aBufferLength,
|
||||
ImageBitmapFormat aFormat,
|
||||
ErrorResult& aRv) const override
|
||||
{
|
||||
// Prepare source buffer and pixel layout.
|
||||
const PlanarYCbCrData* data = GetPlanarYCbCrData();
|
||||
|
||||
UniquePtr<ImagePixelLayout> srcLayout =
|
||||
CreatePixelLayoutFromPlanarYCbCrData(data);
|
||||
|
||||
// Do conversion.
|
||||
UniquePtr<ImagePixelLayout> dstLayout =
|
||||
CopyAndConvertImageData(GetFormat(), data->mYChannel, srcLayout.get(),
|
||||
aFormat, aBuffer+aOffset);
|
||||
|
||||
if (!dstLayout) {
|
||||
aRv.Throw(NS_ERROR_NOT_AVAILABLE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return dstLayout;
|
||||
}
|
||||
|
||||
private:
|
||||
const PlanarYCbCrData* GetPlanarYCbCrData() const
|
||||
{
|
||||
|
@ -277,17 +220,5 @@ ImageUtils::GetBufferLength() const
|
|||
return mImpl->GetBufferLength();
|
||||
}
|
||||
|
||||
UniquePtr<ImagePixelLayout>
|
||||
ImageUtils::MapDataInto(uint8_t* aBuffer,
|
||||
uint32_t aOffset,
|
||||
uint32_t aBufferLength,
|
||||
ImageBitmapFormat aFormat,
|
||||
ErrorResult& aRv) const
|
||||
{
|
||||
MOZ_ASSERT(mImpl);
|
||||
MOZ_ASSERT(aBuffer, "Map data into a null buffer.");
|
||||
return mImpl->MapDataInto(aBuffer, aOffset, aBufferLength, aFormat, aRv);
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
|
|
@ -32,10 +32,6 @@ typedef nsTArray<ChannelPixelLayout> ImagePixelLayout;
|
|||
* (1) GetFormat() converts the image's format into ImageBitmapFormat enum.
|
||||
* (2) GetBufferLength() returns the number of bytes that are used to store
|
||||
* the image's underlying raw data.
|
||||
* (3) MapDataInto() writes the image's underlying raw data into a given
|
||||
* ArrayBuffer in the given format. (If the given format is different from
|
||||
* the existing format, the ImageUtils uses the ImageBitmapFormatUtils to
|
||||
* performa color conversion.)
|
||||
*
|
||||
* In theory, the functionalities of this class could be merged into the
|
||||
* interface of layers::Image. However, this is designed as a isolated wrapper
|
||||
|
@ -59,10 +55,6 @@ public:
|
|||
|
||||
uint32_t GetBufferLength() const;
|
||||
|
||||
UniquePtr<ImagePixelLayout>
|
||||
MapDataInto(uint8_t* aBuffer, uint32_t aOffset, uint32_t aBufferLength,
|
||||
ImageBitmapFormat aFormat, ErrorResult& aRv) const;
|
||||
|
||||
protected:
|
||||
Impl* mImpl;
|
||||
};
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
<!DOCTYPE HTML>
|
||||
<head>
|
||||
<title>Test ImageBitmap Extensions (Bug 1141979)</title>
|
||||
<meta charset="utf-8">
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
</head>
|
||||
<body>
|
||||
<script src="imagebitmap_extensions_prepareSources.js"></script>
|
||||
<script src="imagebitmap_extensions_data.js"></script>
|
||||
<script src="imagebitmap_extensions.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
runTests();
|
||||
|
||||
function ok(expect, msg) {
|
||||
window.parent.postMessage({"type": "status", status: !!expect, msg: msg}, "*");
|
||||
}
|
||||
|
||||
function runTests() {
|
||||
|
||||
prepareSources().
|
||||
then( function() { return Promise.all([testAccessing_randomTest("Video", gVideo, 20), // video might use slightly different frames
|
||||
testAccessing_randomTest("Image", gImage, 0),
|
||||
testAccessing_randomTest("Canvas", gCanvas, 0),
|
||||
testAccessing_randomTest("Ctx", gCtx, 0),
|
||||
testAccessing_randomTest("ImageData", gImageData, 0),
|
||||
testAccessing_randomTest("ImageBitmap", gImageBitmap, 0),
|
||||
testAccessing_randomTest("PNG", gPNGBlob, 0),
|
||||
testAccessing_randomTest("JPEG", gJPEGBlob, 10) // JPEG loses information
|
||||
]); }).
|
||||
then( function() { return Promise.all([testCreateFromArrayBffer_randomTest("Video", gVideo, 20), // video might use slightly different frames
|
||||
testCreateFromArrayBffer_randomTest("Image", gImage, 0),
|
||||
testCreateFromArrayBffer_randomTest("Canvas", gCanvas, 0),
|
||||
testCreateFromArrayBffer_randomTest("Ctx", gCtx, 0),
|
||||
testCreateFromArrayBffer_randomTest("ImageData", gImageData, 0),
|
||||
testCreateFromArrayBffer_randomTest("ImageBitmap", gImageBitmap, 0),
|
||||
testCreateFromArrayBffer_randomTest("PNG", gPNGBlob, 0),
|
||||
testCreateFromArrayBffer_randomTest("JPEG", gJPEGBlob, 10) // JPEG loses information
|
||||
]); }).
|
||||
then(testDraw()).
|
||||
then(testExceptions).
|
||||
then(testColorConversions()).
|
||||
then(function() { return testInvalidAccess([gVideo, gImage, gCanvas, gCtx, gImageData, gImageBitmap, gPNGBlob, gJPEGBlob]); } ).
|
||||
then(function() {window.parent.postMessage({"type": "finish"}, "*");}, function(ev) { failed(ev); window.parent.postMessage({"type": "finish"}, "*"); });
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
|
@ -1,526 +0,0 @@
|
|||
function failed(ex) {
|
||||
ok(false, "Promise failure: " + ex);
|
||||
}
|
||||
|
||||
function isPixel(sourceType, bitmapFormat, imageData, bitmapImageData, x, y, tolerance) {
|
||||
if (imageData.width != bitmapImageData.width ||
|
||||
imageData.height != bitmapImageData.height) {
|
||||
ok(false, "Wrong dimension");
|
||||
}
|
||||
|
||||
var index = 4 * (y * imageData.width + x);
|
||||
|
||||
var pr = imageData.data[index+0],
|
||||
pg = imageData.data[index+1],
|
||||
pb = imageData.data[index+2],
|
||||
pa = imageData.data[index+3];
|
||||
|
||||
if (bitmapFormat == "RGBA32" || bitmapFormat == "RGBX32") {
|
||||
var bpr = bitmapImageData.data[index+0],
|
||||
bpg = bitmapImageData.data[index+1],
|
||||
bpb = bitmapImageData.data[index+2],
|
||||
bpa = bitmapImageData.data[index+3];
|
||||
}
|
||||
else if (bitmapFormat == "BGRA32" || bitmapFormat == "BGRX32") {
|
||||
var bpb = bitmapImageData.data[index+0],
|
||||
bpg = bitmapImageData.data[index+1],
|
||||
bpr = bitmapImageData.data[index+2],
|
||||
bpa = bitmapImageData.data[index+3];
|
||||
}
|
||||
else {
|
||||
// format might be one of the followings: "R5G6B5", "A8", "YUV", ""
|
||||
ok(false, "Not supported ImageFormat: " + bitmapFormat);
|
||||
}
|
||||
|
||||
ok(pr - tolerance <= bpr && bpr <= pr + tolerance &&
|
||||
pg - tolerance <= bpg && bpg <= pg + tolerance &&
|
||||
pb - tolerance <= bpb && bpb <= pb + tolerance &&
|
||||
pa - tolerance <= bpa && bpa <= pa + tolerance,
|
||||
"pixel[" + x + "][" + y + "]: " + sourceType + " is "+pr+","+pg+","+pb+","+pa+"; ImageBitmap is "+ bpr + "," + bpg + "," + bpb + "," + bpa);
|
||||
}
|
||||
|
||||
function promiseThrows(p, name) {
|
||||
var didThrow;
|
||||
return p.then(function() { didThrow = false; },
|
||||
function() { didThrow = true; })
|
||||
.then(function() { ok(didThrow, name); });
|
||||
}
|
||||
|
||||
function testExceptions() {
|
||||
return Promise.all([
|
||||
promiseThrows(testColorConversion("GRAY8", "RGBA32", undefined, true), "[Exception] Cannot convert from GRAY8 to RGBA32"),
|
||||
promiseThrows(testColorConversion("GRAY8", "BGRA32", undefined, true), "[Exception] Cannot convert from GRAY8 to BGRA32"),
|
||||
promiseThrows(testColorConversion("GRAY8", "RGB24", undefined, true), "[Exception] Cannot convert from GRAY8 to RGB24"),
|
||||
promiseThrows(testColorConversion("GRAY8", "BGR24", undefined, true), "[Exception] Cannot convert from GRAY8 to BGR24"),
|
||||
promiseThrows(testColorConversion("GRAY8", "YUV444P", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV444P"),
|
||||
promiseThrows(testColorConversion("GRAY8", "YUV422P", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV422P"),
|
||||
promiseThrows(testColorConversion("GRAY8", "YUV420P", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV420P"),
|
||||
promiseThrows(testColorConversion("GRAY8", "YUV420SP_NV12", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV420SP_NV12"),
|
||||
promiseThrows(testColorConversion("GRAY8", "YUV420SP_NV21", undefined, true), "[Exception] Cannot convert from GRAY8 to YUV420SP_NV21"),
|
||||
promiseThrows(testColorConversion("GRAY8", "HSV", undefined, true), "[Exception] Cannot convert from GRAY8 to HSV"),
|
||||
promiseThrows(testColorConversion("GRAY8", "Lab", undefined, true), "[Exception] Cannot convert from GRAY8 to Lab"),
|
||||
promiseThrows(testColorConversion("GRAY8", "DEPTH", undefined, true), "[Exception] Cannot convert from GRAY8 to DEPTH"),
|
||||
|
||||
promiseThrows(testColorConversion("DEPTH", "RGBA32", undefined, true), "[Exception] Cannot convert from DEPTH to RGBA32"),
|
||||
promiseThrows(testColorConversion("DEPTH", "BGRA32", undefined, true), "[Exception] Cannot convert from DEPTH to BGRA32"),
|
||||
promiseThrows(testColorConversion("DEPTH", "RGB24", undefined, true), "[Exception] Cannot convert from DEPTH to RGB24"),
|
||||
promiseThrows(testColorConversion("DEPTH", "BGR24", undefined, true), "[Exception] Cannot convert from DEPTH to BGR24"),
|
||||
promiseThrows(testColorConversion("DEPTH", "GRAY8", undefined, true), "[Exception] Cannot convert from DEPTH to GRAY8"),
|
||||
promiseThrows(testColorConversion("DEPTH", "YUV444P", undefined, true), "[Exception] Cannot convert from DEPTH to YUV444P"),
|
||||
promiseThrows(testColorConversion("DEPTH", "YUV422P", undefined, true), "[Exception] Cannot convert from DEPTH to YUV422P"),
|
||||
promiseThrows(testColorConversion("DEPTH", "YUV420P", undefined, true), "[Exception] Cannot convert from DEPTH to YUV420P"),
|
||||
promiseThrows(testColorConversion("DEPTH", "YUV420SP_NV12", undefined, true), "[Exception] Cannot convert from DEPTH to YUV420SP_NV12"),
|
||||
promiseThrows(testColorConversion("DEPTH", "YUV420SP_NV21", undefined, true), "[Exception] Cannot convert from DEPTH to YUV420SP_NV21"),
|
||||
promiseThrows(testColorConversion("DEPTH", "HSV", undefined, true), "[Exception] Cannot convert from DEPTH to HSV"),
|
||||
promiseThrows(testColorConversion("DEPTH", "Lab", undefined, true), "[Exception] Cannot convert from DEPTH to Lab"),
|
||||
|
||||
promiseThrows(testColorConversion("RGBA32", "DEPTH", undefined, true), "[Exception] Cannot convert from RGBA32 to DEPTH"),
|
||||
promiseThrows(testColorConversion("BGRA32", "DEPTH", undefined, true), "[Exception] Cannot convert from BGRA32 to DEPTH"),
|
||||
promiseThrows(testColorConversion("RGB24", "DEPTH", undefined, true), "[Exception] Cannot convert from RGB24 to DEPTH"),
|
||||
promiseThrows(testColorConversion("BGR24", "DEPTH", undefined, true), "[Exception] Cannot convert from BGR24 to DEPTH"),
|
||||
promiseThrows(testColorConversion("YUV444P", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV444P to DEPTH"),
|
||||
promiseThrows(testColorConversion("YUV422P", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV422P to DEPTH"),
|
||||
promiseThrows(testColorConversion("YUV420P", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV420P to DEPTH"),
|
||||
promiseThrows(testColorConversion("YUV420SP_NV12", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV420SP_NV12 to DEPTH"),
|
||||
promiseThrows(testColorConversion("YUV420SP_NV21", "DEPTH", undefined, true), "[Exception] Cannot convert from YUV420SP_NV21 to DEPTH"),
|
||||
promiseThrows(testColorConversion("HSV", "DEPTH", undefined, true), "[Exception] Cannot convert from HSV to DEPTH"),
|
||||
promiseThrows(testColorConversion("Lab", "DEPTH", undefined, true), "[Exception] Cannot convert from Lab to DEPTH"),
|
||||
]);
|
||||
}
|
||||
|
||||
function testInvalidAccess(sources) {
|
||||
|
||||
function callMapDataIntoWithImageBitmapCroppedOutSideOfTheSourceImage(source) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var p = createImageBitmap(source, -1, -1, 2, 2);
|
||||
p.then(
|
||||
function(bitmap) {
|
||||
var format = bitmap.findOptimalFormat();
|
||||
var length = bitmap.mappedDataLength(format);
|
||||
var buffer = new ArrayBuffer(length);
|
||||
bitmap.mapDataInto(format, buffer, 0).then(
|
||||
function(layout) { resolve(); },
|
||||
function(error) { reject(error); }
|
||||
);
|
||||
},
|
||||
function() { resolve(); });
|
||||
});
|
||||
};
|
||||
|
||||
var testCases = sources.map( function(source) {
|
||||
return promiseThrows(callMapDataIntoWithImageBitmapCroppedOutSideOfTheSourceImage(source),
|
||||
"[Exception] mapDataInto() should throw with transparent black."); });
|
||||
|
||||
return Promise.all(testCases);
|
||||
}
|
||||
|
||||
function testColorConversions() {
|
||||
return Promise.all([// From RGBA32
|
||||
testColorConversion("RGBA32", "RGBA32"),
|
||||
testColorConversion("RGBA32", "BGRA32"),
|
||||
testColorConversion("RGBA32", "RGB24"),
|
||||
testColorConversion("RGBA32", "BGR24"),
|
||||
testColorConversion("RGBA32", "GRAY8"),
|
||||
testColorConversion("RGBA32", "YUV444P"),
|
||||
testColorConversion("RGBA32", "YUV422P"),
|
||||
testColorConversion("RGBA32", "YUV420P", 2),
|
||||
testColorConversion("RGBA32", "YUV420SP_NV12"),
|
||||
testColorConversion("RGBA32", "YUV420SP_NV21"),
|
||||
testColorConversion("RGBA32", "HSV", 0.01),
|
||||
testColorConversion("RGBA32", "Lab", 0.5),
|
||||
|
||||
// From BGRA32
|
||||
testColorConversion("BGRA32", "RGBA32"),
|
||||
testColorConversion("BGRA32", "BGRA32"),
|
||||
testColorConversion("BGRA32", "RGB24"),
|
||||
testColorConversion("BGRA32", "BGR24"),
|
||||
testColorConversion("BGRA32", "GRAY8"),
|
||||
testColorConversion("BGRA32", "YUV444P", 3),
|
||||
testColorConversion("BGRA32", "YUV422P", 2),
|
||||
testColorConversion("BGRA32", "YUV420P", 2),
|
||||
testColorConversion("BGRA32", "YUV420SP_NV12", 2),
|
||||
testColorConversion("BGRA32", "YUV420SP_NV21", 2),
|
||||
testColorConversion("BGRA32", "HSV", 0.01),
|
||||
testColorConversion("BGRA32", "Lab", 0.5),
|
||||
|
||||
// From RGB24
|
||||
testColorConversion("RGB24", "RGBA32"),
|
||||
testColorConversion("RGB24", "BGRA32"),
|
||||
testColorConversion("RGB24", "RGB24"),
|
||||
testColorConversion("RGB24", "BGR24"),
|
||||
testColorConversion("RGB24", "GRAY8"),
|
||||
testColorConversion("RGB24", "YUV444P"),
|
||||
testColorConversion("RGB24", "YUV422P"),
|
||||
testColorConversion("RGB24", "YUV420P"),
|
||||
testColorConversion("RGB24", "YUV420SP_NV12"),
|
||||
testColorConversion("RGB24", "YUV420SP_NV21"),
|
||||
testColorConversion("RGB24", "HSV", 0.01),
|
||||
testColorConversion("RGB24", "Lab", 0.5),
|
||||
|
||||
// From BGR24
|
||||
testColorConversion("BGR24", "RGBA32"),
|
||||
testColorConversion("BGR24", "BGRA32"),
|
||||
testColorConversion("BGR24", "RGB24"),
|
||||
testColorConversion("BGR24", "BGR24"),
|
||||
testColorConversion("BGR24", "GRAY8"),
|
||||
testColorConversion("BGR24", "YUV444P"),
|
||||
testColorConversion("BGR24", "YUV422P"),
|
||||
testColorConversion("BGR24", "YUV420P"),
|
||||
testColorConversion("BGR24", "YUV420SP_NV12"),
|
||||
testColorConversion("BGR24", "YUV420SP_NV21"),
|
||||
testColorConversion("BGR24", "HSV", 0.01),
|
||||
testColorConversion("BGR24", "Lab", 0.5),
|
||||
|
||||
// From YUV444P
|
||||
testColorConversion("YUV444P", "RGBA32"),
|
||||
testColorConversion("YUV444P", "BGRA32"),
|
||||
testColorConversion("YUV444P", "RGB24"),
|
||||
testColorConversion("YUV444P", "BGR24"),
|
||||
testColorConversion("YUV444P", "GRAY8"),
|
||||
testColorConversion("YUV444P", "YUV444P"),
|
||||
testColorConversion("YUV444P", "YUV422P", 4),
|
||||
testColorConversion("YUV444P", "YUV420P", 3),
|
||||
testColorConversion("YUV444P", "YUV420SP_NV12", 3),
|
||||
testColorConversion("YUV444P", "YUV420SP_NV21", 3),
|
||||
testColorConversion("YUV444P", "HSV", 0.01),
|
||||
testColorConversion("YUV444P", "Lab", 0.01),
|
||||
|
||||
// From YUV422P
|
||||
testColorConversion("YUV422P", "RGBA32"),
|
||||
testColorConversion("YUV422P", "BGRA32", 2),
|
||||
testColorConversion("YUV422P", "RGB24"),
|
||||
testColorConversion("YUV422P", "BGR24"),
|
||||
testColorConversion("YUV422P", "GRAY8"),
|
||||
testColorConversion("YUV422P", "YUV444P", 3),
|
||||
testColorConversion("YUV422P", "YUV422P"),
|
||||
testColorConversion("YUV422P", "YUV420P"),
|
||||
testColorConversion("YUV422P", "YUV420SP_NV12"),
|
||||
testColorConversion("YUV422P", "YUV420SP_NV21"),
|
||||
testColorConversion("YUV422P", "HSV", 0.01),
|
||||
testColorConversion("YUV422P", "Lab", 0.01),
|
||||
|
||||
// From YUV420P
|
||||
testColorConversion("YUV420P", "RGBA32", 2),
|
||||
testColorConversion("YUV420P", "BGRA32", 2),
|
||||
testColorConversion("YUV420P", "RGB24"),
|
||||
testColorConversion("YUV420P", "BGR24"),
|
||||
testColorConversion("YUV420P", "GRAY8"),
|
||||
testColorConversion("YUV420P", "YUV444P", 3),
|
||||
testColorConversion("YUV420P", "YUV422P", 1),
|
||||
testColorConversion("YUV420P", "YUV420P"),
|
||||
testColorConversion("YUV420P", "YUV420SP_NV12"),
|
||||
testColorConversion("YUV420P", "YUV420SP_NV21"),
|
||||
testColorConversion("YUV420P", "HSV", 0.01),
|
||||
testColorConversion("YUV420P", "Lab", 0.01),
|
||||
|
||||
// From NV12
|
||||
testColorConversion("YUV420SP_NV12", "RGBA32"),
|
||||
testColorConversion("YUV420SP_NV12", "BGRA32", 2),
|
||||
testColorConversion("YUV420SP_NV12", "RGB24"),
|
||||
testColorConversion("YUV420SP_NV12", "BGR24"),
|
||||
testColorConversion("YUV420SP_NV12", "GRAY8"),
|
||||
testColorConversion("YUV420SP_NV12", "YUV444P", 3),
|
||||
testColorConversion("YUV420SP_NV12", "YUV422P", 1),
|
||||
testColorConversion("YUV420SP_NV12", "YUV420P"),
|
||||
testColorConversion("YUV420SP_NV12", "YUV420SP_NV12"),
|
||||
testColorConversion("YUV420SP_NV12", "YUV420SP_NV21"),
|
||||
testColorConversion("YUV420SP_NV12", "HSV", 0.01),
|
||||
testColorConversion("YUV420SP_NV12", "Lab", 0.01),
|
||||
|
||||
// From NV21
|
||||
testColorConversion("YUV420SP_NV21", "RGBA32"),
|
||||
testColorConversion("YUV420SP_NV21", "BGRA32", 2),
|
||||
testColorConversion("YUV420SP_NV21", "RGB24"),
|
||||
testColorConversion("YUV420SP_NV21", "BGR24"),
|
||||
testColorConversion("YUV420SP_NV21", "GRAY8"),
|
||||
testColorConversion("YUV420SP_NV21", "YUV444P", 3),
|
||||
testColorConversion("YUV420SP_NV21", "YUV422P", 1),
|
||||
testColorConversion("YUV420SP_NV21", "YUV420P"),
|
||||
testColorConversion("YUV420SP_NV21", "YUV420SP_NV12"),
|
||||
testColorConversion("YUV420SP_NV21", "YUV420SP_NV21"),
|
||||
testColorConversion("YUV420SP_NV21", "HSV", 0.01),
|
||||
testColorConversion("YUV420SP_NV21", "Lab", 0.01),
|
||||
|
||||
// From HSV
|
||||
testColorConversion("HSV", "RGBA32"),
|
||||
testColorConversion("HSV", "BGRA32"),
|
||||
testColorConversion("HSV", "RGB24"),
|
||||
testColorConversion("HSV", "BGR24"),
|
||||
testColorConversion("HSV", "GRAY8"),
|
||||
testColorConversion("HSV", "YUV444P"),
|
||||
testColorConversion("HSV", "YUV422P"),
|
||||
testColorConversion("HSV", "YUV420P"),
|
||||
testColorConversion("HSV", "YUV420SP_NV12"),
|
||||
testColorConversion("HSV", "YUV420SP_NV21"),
|
||||
testColorConversion("HSV", "HSV", 0),
|
||||
testColorConversion("HSV", "Lab", 0.5),
|
||||
|
||||
// From Lab
|
||||
testColorConversion("Lab", "RGBA32", 1),
|
||||
testColorConversion("Lab", "BGRA32", 1),
|
||||
testColorConversion("Lab", "RGB24", 1),
|
||||
testColorConversion("Lab", "BGR24", 1),
|
||||
testColorConversion("Lab", "GRAY8", 1),
|
||||
testColorConversion("Lab", "YUV444P", 1),
|
||||
testColorConversion("Lab", "YUV422P", 1),
|
||||
testColorConversion("Lab", "YUV420P", 1),
|
||||
testColorConversion("Lab", "YUV420SP_NV12", 1),
|
||||
testColorConversion("Lab", "YUV420SP_NV21", 1),
|
||||
testColorConversion("Lab", "HSV", 0.5),
|
||||
testColorConversion("Lab", "Lab", 0),
|
||||
|
||||
// From GRAY8
|
||||
testColorConversion("GRAY8", "GRAY8"),
|
||||
|
||||
// From DEPTH
|
||||
testColorConversion("DEPTH", "DEPTH", 0, Uint16Array),
|
||||
]);
|
||||
}
|
||||
|
||||
function testDraw() {
|
||||
return Promise.all([doOneDrawTest("RGB24"),
|
||||
doOneDrawTest("BGR24"),
|
||||
doOneDrawTest("YUV444P", 5),
|
||||
doOneDrawTest("YUV422P", 2),
|
||||
doOneDrawTest("YUV420P", 2),
|
||||
doOneDrawTest("YUV420SP_NV12", 2),
|
||||
doOneDrawTest("YUV420SP_NV21", 2),
|
||||
doOneDrawTest("HSV", 2),
|
||||
doOneDrawTest("Lab", 2)]);
|
||||
}
|
||||
|
||||
// Create an ImageBitmap, _bitmap_, from the _source_.
|
||||
// Read the underlying data of _bitmap_ into _bitmapBuffer_.
|
||||
// Compare the _bitmapBuffer_ with gGroundTruthImageData.
|
||||
function testAccessing_randomTest(sourceType, source, duration) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var p = createImageBitmap(source);
|
||||
p.then(
|
||||
function(bitmap) {
|
||||
bitmapFormat = "RGBA32";
|
||||
var bitmapBufferLength = bitmap.mappedDataLength(bitmapFormat);
|
||||
|
||||
var bitmapBuffer = new ArrayBuffer(bitmapBufferLength);
|
||||
var bitmapBufferView = new Uint8ClampedArray(bitmapBuffer, 0, bitmapBufferLength);
|
||||
var promise = bitmap.mapDataInto(bitmapFormat, bitmapBuffer, 0);
|
||||
promise.then(
|
||||
function(bitmapPixelLayout) {
|
||||
// Prepare.
|
||||
bitmapImageData = new ImageData(bitmapBufferView, bitmap.width, bitmap.height);
|
||||
|
||||
// Test.
|
||||
for (var t = 0; t < 50; ++t) {
|
||||
var randomX = Math.floor(Math.random() * 240);
|
||||
var randomY = Math.floor(Math.random() * 175);
|
||||
isPixel(sourceType, "RGBA32", gGroundTruthImageData, bitmapImageData, randomX, randomY, duration);
|
||||
}
|
||||
|
||||
resolve();
|
||||
},
|
||||
function(ev) { failed(ev); reject(); });
|
||||
},
|
||||
function(ev) { failed(ev); reject(); });
|
||||
});
|
||||
}
|
||||
|
||||
// Create an ImageBitmap, _bitmap_, from the _source_.
|
||||
// Read the underlying data of _bitmap_ into _bitmapBuffer_.
|
||||
// Create another ImageBitmap, _bitmap2_, from _bitmapBuffer_.
|
||||
// Read the underlying data of _bitmap2_ into _bitmapBuffer2_.
|
||||
// Compare the _bitmapBuffer2_ with gGroundTruthImageData.
|
||||
function testCreateFromArrayBffer_randomTest(sourceType, source, duration) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var p = createImageBitmap(source);
|
||||
p.then(
|
||||
function(bitmap) {
|
||||
bitmapFormat = "RGBA32";
|
||||
var bitmapBufferLength = bitmap.mappedDataLength(bitmapFormat);
|
||||
|
||||
var bitmapBuffer = new ArrayBuffer(bitmapBufferLength);
|
||||
var bitmapBufferView = new Uint8ClampedArray(bitmapBuffer, 0, bitmapBufferLength);
|
||||
var promiseMapDataInto = bitmap.mapDataInto(bitmapFormat, bitmapBuffer, 0);
|
||||
promiseMapDataInto.then(
|
||||
function(bitmapPixelLayout) {
|
||||
// Create a new ImageBitmap from an ArrayBuffer.
|
||||
var p2 = createImageBitmap(bitmapBufferView,
|
||||
0,
|
||||
bitmapBufferLength,
|
||||
bitmapFormat,
|
||||
bitmapPixelLayout);
|
||||
|
||||
p2.then(
|
||||
function(bitmap2) {
|
||||
bitmapFormat2 = "RGBA32";
|
||||
var bitmapBufferLength2 = bitmap2.mappedDataLength(bitmapFormat2);
|
||||
|
||||
var bitmapBuffer2 = new ArrayBuffer(bitmapBufferLength2);
|
||||
var bitmapBufferView2 = new Uint8ClampedArray(bitmapBuffer2, 0, bitmapBufferLength2);
|
||||
var promise2 = bitmap2.mapDataInto(bitmapFormat2, bitmapBuffer2, 0);
|
||||
promise2.then(
|
||||
function(bitmapPixelLayout2) {
|
||||
// Prepare.
|
||||
var bitmapImageData2 = new ImageData(bitmapBufferView2, bitmap2.width, bitmap2.height);
|
||||
|
||||
// Test.
|
||||
for (var t = 0; t < 50; ++t) {
|
||||
var randomX = Math.floor(Math.random() * 240);
|
||||
var randomY = Math.floor(Math.random() * 175);
|
||||
isPixel(sourceType, "RGBA32", gGroundTruthImageData, bitmapImageData2, randomX, randomY, duration);
|
||||
}
|
||||
|
||||
resolve();
|
||||
},
|
||||
function(ev) { failed(ev); reject(); });
|
||||
},
|
||||
function(ev) { console.log("p2 rejected!"); failed(ev); reject(); });
|
||||
},
|
||||
function(ev) { console.log("promiseMapDataInto rejected!"); failed(ev); reject(); });
|
||||
},
|
||||
function(ev) { failed(ev); reject(); });
|
||||
});
|
||||
}
|
||||
|
||||
function testColorConversion(sourceFromat, destinationFormat, tolerance, shouldThrow) {
|
||||
|
||||
tolerance = tolerance || 0;
|
||||
shouldThrow = shouldThrow || false;
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
var [srcData, dstData] = getTestData(sourceFromat, destinationFormat);
|
||||
|
||||
ok(!!srcData, "Get valid srcData of type:" + sourceFromat);
|
||||
ok(!!dstData, "Get valid dstData of type:" + destinationFormat);
|
||||
|
||||
// printInfo(sourceFromat, srcData);
|
||||
// printInfo(destinationFormat, dstData);
|
||||
|
||||
// Create a new ImageBitmap from an ArrayBuffer.
|
||||
var p = createImageBitmap(srcData.buffer,
|
||||
0,
|
||||
srcData.bufferLength,
|
||||
srcData.format,
|
||||
srcData.pixelLayout);
|
||||
|
||||
p.then(
|
||||
function(srcBitmap) {
|
||||
ok(!!srcBitmap, "Should get a valid srcBitmap.");
|
||||
ok(srcBitmap.findOptimalFormat() == sourceFromat, "srcBitmap.findOptimalFormat():" + srcBitmap.findOptimalFormat() +
|
||||
" should equal to sourceFromat:" + sourceFromat);
|
||||
|
||||
var dstBufferLength = srcBitmap.mappedDataLength(destinationFormat);
|
||||
var dstBuffer = new ArrayBuffer(dstBufferLength);
|
||||
var dstBufferView = new dstData.ArrayType(dstBuffer, 0, dstBufferLength / dstData.ArrayType.BYTES_PER_ELEMENT);
|
||||
|
||||
// Do color conversion here.
|
||||
var p2 = srcBitmap.mapDataInto(destinationFormat, dstBuffer, 0);
|
||||
p2.then(
|
||||
function(dstPixelLayout) {
|
||||
var dataPixalLayout = dstData.pixelLayout;
|
||||
|
||||
// Check pixel layout.
|
||||
ok(dstPixelLayout.length == dstData.channelCount, "dstPixelLayout.length:" + dstPixelLayout.length +
|
||||
" should equal to dstData.channelCount:" + dstData.channelCount);
|
||||
|
||||
for (var c = 0; c < dstData.channelCount; ++c) {
|
||||
var dstChannelLayout = dstPixelLayout[c];
|
||||
var dataChannelLayout = dataPixalLayout[c];
|
||||
ok(dstChannelLayout.width == dataChannelLayout.width, "channel[" + c + "] dstChannelLayout.width:" + dstChannelLayout.width + " should equal to dataChannelLayout.width:" + dataChannelLayout.width);
|
||||
ok(dstChannelLayout.height == dataChannelLayout.height, "channel[" + c + "] dstChannelLayout.height:" + dstChannelLayout.height + " should equal to dataChannelLayout.height:" + dataChannelLayout.height);
|
||||
ok(dstChannelLayout.skip == dataChannelLayout.skip, "channel[" + c + "] dstChannelLayout.skip:" + dstChannelLayout.skip + " should equal to dataChannelLayout.skip:" + dataChannelLayout.skip);
|
||||
|
||||
for (var i = 0; i < dstChannelLayout.height; ++i) {
|
||||
for (var j = 0; j < dstChannelLayout.width; ++j) {
|
||||
var byteOffset = dstChannelLayout.offset + i * dstChannelLayout.stride + j * (dstChannelLayout.skip + 1) * dstData.ArrayType.BYTES_PER_ELEMENT;
|
||||
var view = new dstData.ArrayType(dstBuffer, byteOffset, 1);
|
||||
var dstBufferViewValue = view[0];
|
||||
var dstDataValue = dstData.getPixelValue(i, j, c);
|
||||
ok(Math.abs(dstBufferViewValue - dstDataValue) <= tolerance,
|
||||
"[" + sourceFromat + " -> " + destinationFormat + "] pixel(" + i + "," + j + ") channnel(" + c +
|
||||
"): dstBufferViewValue:" + dstBufferViewValue +
|
||||
" should equal to dstDataValue:" + dstDataValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resolve();
|
||||
},
|
||||
function(ev) {
|
||||
// If the "mapDataInto" throws, the flow goes here.
|
||||
if (!shouldThrow) { failed(ev); }
|
||||
reject();
|
||||
}
|
||||
);
|
||||
},
|
||||
function(ev) {
|
||||
reject(ev);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function doOneDrawTest(sourceFromat, tolerance) {
|
||||
tolerance = tolerance || 0;
|
||||
var destinationFormat = "RGBA32";
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
||||
var [srcData, dstData] = getTestData(sourceFromat, destinationFormat);
|
||||
ok(!!srcData, "Get valid srcData of type:" + sourceFromat);
|
||||
ok(!!dstData, "Get valid dstData of type:" + destinationFormat);
|
||||
|
||||
var p = createImageBitmap(srcData.buffer,
|
||||
0,
|
||||
srcData.bufferLength,
|
||||
srcData.format,
|
||||
srcData.pixelLayout);
|
||||
|
||||
p.then(
|
||||
function(srcBitmap) {
|
||||
ok(!!srcBitmap, "Should get a valid srcBitmap.");
|
||||
ok(srcBitmap.findOptimalFormat() == sourceFromat, "srcBitmap.findOptimalFormat():" + srcBitmap.findOptimalFormat() +
|
||||
" should equal to sourceFromat:" + sourceFromat);
|
||||
|
||||
var canvas = document.createElement("canvas");
|
||||
canvas.width = srcBitmap.width;
|
||||
canvas.height = srcBitmap.height;
|
||||
var ctx = canvas.getContext("2d");
|
||||
|
||||
ctx.drawImage(srcBitmap, 0, 0, srcBitmap.width, srcBitmap.height);
|
||||
|
||||
// Get an ImageData from the canvas.
|
||||
var imageData = ctx.getImageData(0, 0, srcBitmap.width, srcBitmap.height);
|
||||
|
||||
for (var i = 0; i < srcBitmap.height; ++i) {
|
||||
for (var j = 0; j < srcBitmap.width; ++j) {
|
||||
var pixelOffset = i * srcBitmap.width * dstData.channelCount + j * dstData.channelCount;
|
||||
var dstImageDataValue_R = imageData.data[pixelOffset + 0];
|
||||
var dstImageDataValue_G = imageData.data[pixelOffset + 1];
|
||||
var dstImageDataValue_B = imageData.data[pixelOffset + 2];
|
||||
var dstImageDataValue_A = imageData.data[pixelOffset + 3];
|
||||
|
||||
var logPrefix = "[" + sourceFromat + " -> " + destinationFormat + "] pixel(" + i + "," + j + ")";
|
||||
|
||||
var dstDataValue_R = dstData.getPixelValue(i, j, 0);
|
||||
var dstDataValue_G = dstData.getPixelValue(i, j, 1);
|
||||
var dstDataValue_B = dstData.getPixelValue(i, j, 2);
|
||||
var dstDataValue_A = dstData.getPixelValue(i, j, 3);
|
||||
ok(Math.abs(dstImageDataValue_R - dstDataValue_R) <= tolerance,
|
||||
logPrefix + "channnel(R): dstImageDataValue:" + dstImageDataValue_R + " should equal to dstDataValue_R: " + dstDataValue_R);
|
||||
ok(Math.abs(dstImageDataValue_G - dstDataValue_G) <= tolerance,
|
||||
logPrefix + "channnel(G): dstImageDataValue:" + dstImageDataValue_G + " should equal to dstDataValue_G: " + dstDataValue_G);
|
||||
ok(Math.abs(dstImageDataValue_B - dstDataValue_B) <= tolerance,
|
||||
logPrefix + "channnel(B): dstImageDataValue:" + dstImageDataValue_B + " should equal to dstDataValue_B: " + dstDataValue_B);
|
||||
ok(Math.abs(dstImageDataValue_A - dstDataValue_A) <= tolerance,
|
||||
logPrefix + "channnel(A): dstImageDataValue:" + dstImageDataValue_A + " should equal to dstDataValue_A: " + dstDataValue_A);
|
||||
}
|
||||
}
|
||||
|
||||
resolve();
|
||||
},
|
||||
function(ev) {
|
||||
failed(ev);
|
||||
reject(ev);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,47 +0,0 @@
|
|||
importScripts("imagebitmap_extensions_data.js");
|
||||
importScripts("imagebitmap_extensions.js");
|
||||
|
||||
var gGroundTruthImageData;
|
||||
var gImageData;
|
||||
var gImageBitmap;
|
||||
var gPNGBlob;
|
||||
var gJPEGBlob;
|
||||
|
||||
onmessage = function(event) {
|
||||
if (event.data.type == "setSources") {
|
||||
gGroundTruthImageData = event.data.groundTruthImageData;
|
||||
gImageData = event.data.imageData;
|
||||
gImageBitmap = event.data.imageBitmap;
|
||||
gPNGBlob = event.data.pngBlob;
|
||||
gJPEGBlob = event.data.jpegBlob;
|
||||
|
||||
ok(!!gGroundTruthImageData, "Get gGroundTruthImageData!");
|
||||
ok(!!gImageData, "Get gImageData!");
|
||||
ok(!!gImageBitmap, "Get gImageBitmap!");
|
||||
ok(!!gPNGBlob, "Get gPNGBlob!");
|
||||
ok(!!gJPEGBlob, "Get gJPEGBlob!");
|
||||
|
||||
runTests();
|
||||
}
|
||||
};
|
||||
|
||||
function ok(expect, msg) {
|
||||
postMessage({"type": "status", status: !!expect, msg: msg});
|
||||
}
|
||||
|
||||
function runTests() {
|
||||
testExceptions().
|
||||
then(testColorConversions()).
|
||||
then( function() { return Promise.all([testAccessing_randomTest("ImageData", gImageData, 0),
|
||||
testAccessing_randomTest("ImageBitmap", gImageBitmap, 0),
|
||||
testAccessing_randomTest("PNG", gPNGBlob, 0),
|
||||
testAccessing_randomTest("JPEG", gJPEGBlob, 10) // JPEG loses information
|
||||
]); }).
|
||||
then( function() { return Promise.all([testCreateFromArrayBffer_randomTest("ImageData", gImageData, 0),
|
||||
testCreateFromArrayBffer_randomTest("ImageBitmap", gImageBitmap, 0),
|
||||
testCreateFromArrayBffer_randomTest("PNG", gPNGBlob, 0),
|
||||
testCreateFromArrayBffer_randomTest("JPEG", gJPEGBlob, 10) // JPEG loses information
|
||||
]); }).
|
||||
then(function() { return testInvalidAccess([gImageData, gImageBitmap, gPNGBlob, gJPEGBlob]); } ).
|
||||
then(function() {postMessage({"type": "finish"});}, function(ev) { failed(ev); postMessage({"type": "finish"}); });
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
var gImage;
|
||||
var gVideo;
|
||||
var gCanvas;
|
||||
var gCtx;
|
||||
var gImageData;
|
||||
var gImageBitmap;
|
||||
var gPNGBlob;
|
||||
var gJPEGBlob;
|
||||
|
||||
var gGroundTruthImageData;
|
||||
|
||||
function prepareSources() {
|
||||
gVideo = document.createElement("video");
|
||||
gVideo.src = "http://example.com/tests/dom/canvas/test/crossorigin/video.sjs?name=tests/dom/canvas/test/320x240.ogv&type=video/ogg&cors=anonymous";
|
||||
gVideo.crossOrigin = "anonymous";
|
||||
gVideo.autoplay = "true"
|
||||
|
||||
|
||||
gCanvas = document.createElement("canvas");
|
||||
gCtx = gCanvas.getContext("2d");
|
||||
|
||||
var resolver;
|
||||
var promise = new Promise(function(resolve, reject) {
|
||||
resolver = resolve;
|
||||
});
|
||||
|
||||
// Prepare video.
|
||||
gVideo.onloadeddata = function() {
|
||||
ok(gVideo, "[Prepare Sources] gVideo is ok.");
|
||||
|
||||
// Prepare canvas.
|
||||
gCanvas.width = gVideo.videoWidth;
|
||||
gCanvas.height = gVideo.videoHeight;
|
||||
gCtx.drawImage(gVideo, 0, 0);
|
||||
ok(gCanvas, "[Prepare Sources] gCanvas is ok.");
|
||||
ok(gCtx, "[Prepare Sources] gCtx is ok.");
|
||||
|
||||
// Prepare gGroundTruthImageData.
|
||||
gGroundTruthImageData = gCtx.getImageData(0, 0, gCanvas.width, gCanvas.height);
|
||||
ok(gGroundTruthImageData, "[Prepare Sources] gGroundTruthImageData is ok.");
|
||||
|
||||
// Prepare image.
|
||||
gImage = document.createElement("img");
|
||||
gImage.src = gCanvas.toDataURL();
|
||||
var resolverImage;
|
||||
var promiseImage = new Promise(function(resolve, reject) {
|
||||
resolverImage = resolve;
|
||||
});
|
||||
gImage.onload = function() {
|
||||
resolverImage(true);
|
||||
}
|
||||
|
||||
// Prepare ImageData.
|
||||
gImageData = gCtx.getImageData(0, 0, gCanvas.width, gCanvas.height);
|
||||
ok(gImageData, "[Prepare Sources] gImageData is ok.");
|
||||
|
||||
// Prepapre PNG Blob.
|
||||
var promisePNGBlob = new Promise(function(resolve, reject) {
|
||||
gCanvas.toBlob(function(blob) {
|
||||
gPNGBlob = blob;
|
||||
ok(gPNGBlob, "[Prepare Sources] gPNGBlob is ok.");
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
|
||||
// Prepare JPEG Blob.
|
||||
var promiseJPEGBlob = new Promise(function(resolve, reject) {
|
||||
gCanvas.toBlob(function(blob) {
|
||||
gJPEGBlob = blob;
|
||||
ok(gJPEGBlob, "[Prepare Sources] gJPEGBlob is ok.");
|
||||
resolve(true);
|
||||
}, "image/jpeg", 1.00);
|
||||
});
|
||||
|
||||
// Prepare ImageBitmap.
|
||||
var promiseImageBitmap = new Promise(function(resolve, reject) {
|
||||
var p = createImageBitmap(gCanvas);
|
||||
p.then(function(bitmap) {
|
||||
gImageBitmap = bitmap;
|
||||
ok(gImageBitmap, "[Prepare Sources] gImageBitmap is ok.");
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
|
||||
resolver(Promise.all([
|
||||
promiseImage,
|
||||
promisePNGBlob,
|
||||
promiseJPEGBlob,
|
||||
promiseImageBitmap
|
||||
]))
|
||||
}
|
||||
|
||||
return promise;
|
||||
}
|
|
@ -26,11 +26,6 @@ support-files =
|
|||
image_yellow75.png
|
||||
imagebitmap_bug1239300.js
|
||||
imagebitmap_bug1239752.js
|
||||
imagebitmap_extensions.html
|
||||
imagebitmap_extensions.js
|
||||
imagebitmap_extensions_data.js
|
||||
imagebitmap_extensions_on_worker.js
|
||||
imagebitmap_extensions_prepareSources.js
|
||||
imagebitmap_on_worker.js
|
||||
imagebitmap_structuredclone.js
|
||||
imagebitmap_structuredclone_iframe.html
|
||||
|
@ -238,15 +233,6 @@ tags = imagebitmap
|
|||
[test_imagebitmap_cropping.html]
|
||||
skip-if = android_version >= '17' # bug 1336581
|
||||
tags = imagebitmap
|
||||
[test_imagebitmap_extensions.html]
|
||||
skip-if = android_version >= '17' # bug 1336581
|
||||
tags = imagebitmap
|
||||
[test_imagebitmap_extensions_on_worker.html]
|
||||
skip-if = android_version == '19' # bug 1338256
|
||||
tags = imagebitmap
|
||||
[test_imagebitmap_on_worker.html]
|
||||
skip-if = android_version >= '17' # bug 1336581
|
||||
tags = imagebitmap
|
||||
[test_imagebitmap_structuredclone.html]
|
||||
tags = imagebitmap
|
||||
[test_imagebitmap_structuredclone_iframe.html]
|
||||
|
@ -311,3 +297,4 @@ skip-if = 1
|
|||
subsuite = gpu
|
||||
tags = offscreencanvas
|
||||
skip-if = 1
|
||||
[test_invalid_mime_type_blob.html]
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
<!DOCTYPE HTML>
|
||||
<heand>
|
||||
<title>Test ImageBitmap Extensions (Bug 1141979)</title>
|
||||
<meta charset="utf-8">
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="content"><div>
|
||||
<script type="text/javascript">
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
// The createImageBitmap() method is part of Window whose
|
||||
// prototype was created before the preference is set. So I create another
|
||||
// iframe with the right preference setting so that the
|
||||
// createImageBitmap() will be visible.
|
||||
SpecialPowers.pushPrefEnv({'set': [
|
||||
['canvas.imagebitmap_extensions.enabled', true],
|
||||
['gfx.ycbcr.accurate-conversion', true]
|
||||
]}, function() {
|
||||
var div = document.getElementById("content");
|
||||
ok(div, "Parent exists");
|
||||
|
||||
var ifr = document.createElement("iframe");
|
||||
ifr.setAttribute('src', "imagebitmap_extensions.html");
|
||||
div.appendChild(ifr);
|
||||
});
|
||||
|
||||
window.onmessage = function(event) {
|
||||
if (event.data.type == "status") {
|
||||
ok(event.data.status, event.data.msg);
|
||||
} else if (event.data.type == "finish") {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
|
@ -1,39 +0,0 @@
|
|||
<!DOCTYPE HTML>
|
||||
<heand>
|
||||
<title>Test ImageBitmap Extensions On Worker (Bug 1141979)</title>
|
||||
<meta charset="utf-8">
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="content"><div>
|
||||
<script src="imagebitmap_extensions_prepareSources.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
var worker;
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
SpecialPowers.pushPrefEnv({'set': [
|
||||
['canvas.imagebitmap_extensions.enabled', true]
|
||||
]}, function() {
|
||||
worker = new Worker("imagebitmap_extensions_on_worker.js");
|
||||
worker.onmessage = function(event) {
|
||||
if (event.data.type == "status") {
|
||||
ok(event.data.status, event.data.msg);
|
||||
} else if (event.data.type == "finish") {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
};
|
||||
|
||||
ok(!!worker, "Worker created successfully.");
|
||||
prepareSources().then(function() {
|
||||
worker.postMessage({"type": "setSources",
|
||||
"groundTruthImageData": gGroundTruthImageData,
|
||||
"imageData": gImageData,
|
||||
"imageBitmap": gImageBitmap,
|
||||
"pngBlob": gPNGBlob,
|
||||
"jpegBlob": gJPEGBlob});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,85 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>createImageBitmap from Blob with invalid type</title>
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
|
||||
<body>
|
||||
<script>
|
||||
|
||||
function syncBlob() {
|
||||
info("Let's create a small memory blob...");
|
||||
|
||||
// A 1x1 PNG image.
|
||||
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
|
||||
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
|
||||
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=");
|
||||
|
||||
let bytes = new Array(IMAGE.length);
|
||||
for (let i = 0; i < IMAGE.length; i++) {
|
||||
bytes[i] = IMAGE.charCodeAt(i);
|
||||
}
|
||||
|
||||
let blob = new Blob([new Uint8Array(bytes)], { type: "text/html"});
|
||||
window.createImageBitmap(blob)
|
||||
.then(imageBitmap => {
|
||||
ok(true, "Image created!");
|
||||
is(imageBitmap.width, 1, "Image is 1x1");
|
||||
is(imageBitmap.height, 1, "Image is 1x1");
|
||||
})
|
||||
.then(next);
|
||||
}
|
||||
|
||||
function asyncBlob() {
|
||||
info("Let's create a big memory blob...");
|
||||
|
||||
// A 1x1 PNG image.
|
||||
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
|
||||
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
|
||||
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=");
|
||||
|
||||
let bytes = new Array(IMAGE.length);
|
||||
for (let i = 0; i < IMAGE.length; i++) {
|
||||
bytes[i] = IMAGE.charCodeAt(i);
|
||||
}
|
||||
|
||||
let array = [];
|
||||
for (let i = 0; i < 20000; ++i) {
|
||||
array.push(new Uint8Array(bytes));
|
||||
}
|
||||
|
||||
let blob = new Blob(array, { type: "text/html"});
|
||||
ok(blob.size > 1000000, "More than 1mb");
|
||||
|
||||
let bc = new BroadcastChannel('a');
|
||||
bc.onmessage = e => {
|
||||
window.createImageBitmap(e.data)
|
||||
.then(imageBitmap => {
|
||||
ok(true, "Image created!");
|
||||
is(imageBitmap.width, 1, "Image is 1x1");
|
||||
is(imageBitmap.height, 1, "Image is 1x1");
|
||||
})
|
||||
.then(next);
|
||||
}
|
||||
|
||||
new BroadcastChannel('a').postMessage(blob);
|
||||
}
|
||||
|
||||
let tests = [
|
||||
syncBlob,
|
||||
asyncBlob,
|
||||
];
|
||||
|
||||
function next() {
|
||||
if (tests.length == 0) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
|
||||
let test = tests.shift();
|
||||
test();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
next();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
interface nsIDocShell;
|
||||
|
||||
[Exposed=(Window, System), ChromeOnly]
|
||||
[Exposed=Window, ChromeOnly]
|
||||
interface BrowsingContext {
|
||||
readonly attribute BrowsingContext? parent;
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ enum MozContentPolicyType {
|
|||
* A thin wrapper around nsIChannel and nsIHttpChannel that allows JS
|
||||
* callers to access them without XPConnect overhead.
|
||||
*/
|
||||
[ChromeOnly, Exposed=System]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface ChannelWrapper : EventTarget {
|
||||
/**
|
||||
* Returns the wrapper instance for the given channel. The same wrapper is
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* C++ callers use a fast path, and never call the JSAPI or WebIDL methods of
|
||||
* this object.
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface MozQueryInterface {
|
||||
[Throws]
|
||||
legacycaller any (IID aIID);
|
||||
|
@ -25,7 +25,7 @@ interface MozQueryInterface {
|
|||
* This is exposed in all the system globals where we can expose stuff by
|
||||
* default, so should only include methods that are **thread-safe**.
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System,Worker)]
|
||||
[ChromeOnly, Exposed=(Window,Worker)]
|
||||
namespace ChromeUtils {
|
||||
/**
|
||||
* Serialize a snapshot of the heap graph, as seen by |JS::ubi::Node| and
|
||||
|
@ -148,7 +148,7 @@ namespace ChromeUtils {
|
|||
* Additional ChromeUtils methods that are _not_ thread-safe, and hence not
|
||||
* exposed in workers.
|
||||
*/
|
||||
[Exposed=(Window,System)]
|
||||
[Exposed=Window]
|
||||
partial namespace ChromeUtils {
|
||||
/**
|
||||
* A helper that converts OriginAttributesDictionary to a opaque suffix string.
|
||||
|
|
|
@ -38,7 +38,7 @@ typedef unsigned long long NodeSize;
|
|||
* its retained size is therefore significant (assuming no external
|
||||
* references into the tree).
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System,Worker)]
|
||||
[ChromeOnly, Exposed=(Window,Worker)]
|
||||
interface DominatorTree {
|
||||
/**
|
||||
* The `NodeId` for the root of the dominator tree. This is a "meta-root" in
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
/**
|
||||
* A HeapSnapshot represents a snapshot of the heap graph
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System,Worker)]
|
||||
[ChromeOnly, Exposed=(Window,Worker)]
|
||||
interface HeapSnapshot {
|
||||
/**
|
||||
* A time stamp of when the heap snapshot was taken, if available. Units are
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* occurrence of "?" in the glob matches any single literal character.
|
||||
*/
|
||||
[Constructor(DOMString glob, optional boolean allowQuestion = true),
|
||||
ChromeOnly, Exposed=(Window,System)]
|
||||
ChromeOnly, Exposed=Window]
|
||||
interface MatchGlob {
|
||||
/**
|
||||
* Returns true if the string matches the glob.
|
||||
|
|
|
@ -30,7 +30,7 @@ interface URI;
|
|||
* the URL path must exactly match the pattern path.
|
||||
*/
|
||||
[Constructor(DOMString pattern, optional MatchPatternOptions options),
|
||||
ChromeOnly, Exposed=(Window,System)]
|
||||
ChromeOnly, Exposed=Window]
|
||||
interface MatchPattern {
|
||||
/**
|
||||
* Returns true if the given URI matches the pattern.
|
||||
|
@ -74,7 +74,7 @@ interface MatchPattern {
|
|||
* matches when any of its sub-patterns matches.
|
||||
*/
|
||||
[Constructor(sequence<(DOMString or MatchPattern)> patterns, optional MatchPatternOptions options),
|
||||
ChromeOnly, Exposed=(Window,System)]
|
||||
ChromeOnly, Exposed=Window]
|
||||
interface MatchPatternSet {
|
||||
/**
|
||||
* Returns true if the given URI matches any sub-pattern.
|
||||
|
|
|
@ -9,7 +9,7 @@ callback interface MozDocumentCallback {
|
|||
void onPreloadDocument(MozDocumentMatcher matcher, LoadInfo loadInfo);
|
||||
};
|
||||
|
||||
[ChromeOnly, Constructor(MozDocumentCallback callbacks), Exposed=System]
|
||||
[ChromeOnly, Constructor(MozDocumentCallback callbacks), Exposed=Window]
|
||||
interface MozDocumentObserver {
|
||||
[Throws]
|
||||
void observe(sequence<MozDocumentMatcher> matchers);
|
||||
|
|
|
@ -12,12 +12,12 @@ enum PlacesEventType {
|
|||
"bookmark-added",
|
||||
};
|
||||
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface PlacesEvent {
|
||||
readonly attribute PlacesEventType type;
|
||||
};
|
||||
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface PlacesVisit : PlacesEvent {
|
||||
/**
|
||||
* URL of the visit.
|
||||
|
@ -76,7 +76,7 @@ interface PlacesVisit : PlacesEvent {
|
|||
/**
|
||||
* Base class for properties that are common to all bookmark events.
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface PlacesBookmark : PlacesEvent {
|
||||
/**
|
||||
* The id of the item.
|
||||
|
@ -135,7 +135,7 @@ dictionary PlacesBookmarkAdditionInit {
|
|||
required boolean isTagging;
|
||||
};
|
||||
|
||||
[ChromeOnly, Exposed=(Window,System), Constructor(PlacesBookmarkAdditionInit initDict)]
|
||||
[ChromeOnly, Exposed=Window, Constructor(PlacesBookmarkAdditionInit initDict)]
|
||||
interface PlacesBookmarkAddition : PlacesBookmark {
|
||||
/**
|
||||
* The item's index in the folder.
|
||||
|
|
|
@ -6,13 +6,13 @@
|
|||
|
||||
callback PlacesEventCallback = void (sequence<PlacesEvent> events);
|
||||
|
||||
[ChromeOnly, Exposed=(Window,System),
|
||||
[ChromeOnly, Exposed=Window,
|
||||
Constructor(PlacesEventCallback callback)]
|
||||
interface PlacesWeakCallbackWrapper {
|
||||
};
|
||||
|
||||
// Global singleton which should handle all events for places.
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
namespace PlacesObservers {
|
||||
[Throws]
|
||||
void addListener(sequence<PlacesEventType> eventTypes,
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* Represents a pre-compiled JS script, which can be repeatedly executed in
|
||||
* different globals without being re-parsed.
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface PrecompiledScript {
|
||||
/**
|
||||
* Executes the script in the context of, and with the security principal
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
namespace PrioEncoder {
|
||||
[Throws, NewObject]
|
||||
PrioEncodedData encode(ByteString batchID, PrioParams params);
|
||||
|
|
|
@ -50,7 +50,7 @@ callback interface UncaughtRejectionObserver {
|
|||
void onConsumed(object p);
|
||||
};
|
||||
|
||||
[ChromeOnly, Exposed=(Window,System)]
|
||||
[ChromeOnly, Exposed=Window]
|
||||
interface PromiseDebugging {
|
||||
/**
|
||||
* The various functions on this interface all expect to take promises but
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* A holder for structured-clonable data which can itself be cloned with
|
||||
* little overhead, and deserialized into an arbitrary global.
|
||||
*/
|
||||
[ChromeOnly, Exposed=(Window,System,Worker),
|
||||
[ChromeOnly, Exposed=(Window,Worker),
|
||||
/**
|
||||
* Serializes the given value to an opaque structured clone blob, and
|
||||
* returns the result.
|
||||
|
|
|
@ -9,7 +9,7 @@ interface WindowProxy;
|
|||
typedef (MatchPatternSet or sequence<DOMString>) MatchPatternSetOrStringSequence;
|
||||
typedef (MatchGlob or DOMString) MatchGlobOrString;
|
||||
|
||||
[Constructor(MozDocumentMatcherInit options), ChromeOnly, Exposed=System]
|
||||
[Constructor(MozDocumentMatcherInit options), ChromeOnly, Exposed=Window]
|
||||
interface MozDocumentMatcher {
|
||||
/**
|
||||
* Returns true if the script's match and exclude patterns match the given
|
||||
|
@ -132,7 +132,7 @@ enum ContentScriptRunAt {
|
|||
"document_idle",
|
||||
};
|
||||
|
||||
[Constructor(WebExtensionPolicy extension, WebExtensionContentScriptInit options), ChromeOnly, Exposed=System]
|
||||
[Constructor(WebExtensionPolicy extension, WebExtensionContentScriptInit options), ChromeOnly, Exposed=Window]
|
||||
interface WebExtensionContentScript : MozDocumentMatcher {
|
||||
/**
|
||||
* The earliest point in the load cycle at which this script should run. For
|
||||
|
|
|
@ -11,7 +11,7 @@ callback WebExtensionLocalizeCallback = DOMString (DOMString unlocalizedText);
|
|||
* Defines the platform-level policies for a WebExtension, including its
|
||||
* permissions and the characteristics of its moz-extension: URLs.
|
||||
*/
|
||||
[Constructor(WebExtensionInit options), ChromeOnly, Exposed=System]
|
||||
[Constructor(WebExtensionInit options), ChromeOnly, Exposed=Window]
|
||||
interface WebExtensionPolicy {
|
||||
/**
|
||||
* The add-on's internal ID, as specified in its manifest.json file or its
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* https://dom.spec.whatwg.org/#abortcontroller
|
||||
*/
|
||||
|
||||
[Constructor(), Exposed=(Window,Worker,System)]
|
||||
[Constructor(), Exposed=(Window,Worker)]
|
||||
interface AbortController {
|
||||
readonly attribute AbortSignal signal;
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* https://dom.spec.whatwg.org/#abortsignal
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface AbortSignal : EventTarget {
|
||||
readonly attribute boolean aborted;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
[NoInterfaceObject, Exposed=(Window,Worker,System)]
|
||||
[NoInterfaceObject, Exposed=(Window,Worker)]
|
||||
interface AbstractWorker {
|
||||
attribute EventHandler onerror;
|
||||
};
|
||||
|
|
|
@ -82,7 +82,7 @@ interface AddonManager : EventTarget {
|
|||
readonly attribute boolean permissionPromptsEnabled;
|
||||
};
|
||||
|
||||
[ChromeOnly,Exposed=System,HeaderFile="mozilla/AddonManagerWebAPI.h"]
|
||||
[ChromeOnly,Exposed=Window,HeaderFile="mozilla/AddonManagerWebAPI.h"]
|
||||
interface AddonManagerPermissions {
|
||||
static boolean isHostPermitted(DOMString host);
|
||||
};
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* https://console.spec.whatwg.org/#console-namespace
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,WorkerDebugger,Worklet,System),
|
||||
[Exposed=(Window,Worker,WorkerDebugger,Worklet),
|
||||
ClassString="Console",
|
||||
ProtoObjectHack]
|
||||
namespace console {
|
||||
|
@ -146,7 +146,7 @@ dictionary ConsoleCounterError {
|
|||
};
|
||||
|
||||
[ChromeOnly,
|
||||
Exposed=(Window,Worker,WorkerDebugger,Worklet,System)]
|
||||
Exposed=(Window,Worker,WorkerDebugger,Worklet)]
|
||||
// This is basically a copy of the console namespace.
|
||||
interface ConsoleInstance {
|
||||
// Logging
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*/
|
||||
|
||||
[Constructor(DOMString name, optional DOMString message = ""),
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface DOMError {
|
||||
[Constant, UseCounter]
|
||||
readonly attribute DOMString name;
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
interface StackFrame;
|
||||
|
||||
[NoInterfaceObject,
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface ExceptionMembers
|
||||
{
|
||||
// The nsresult associated with this exception.
|
||||
|
@ -66,7 +66,7 @@ Exception implements ExceptionMembers;
|
|||
// XXXkhuey this is an 'exception', not an interface, but we don't have any
|
||||
// parser or codegen mechanisms for dealing with exceptions.
|
||||
[ExceptionClass,
|
||||
Exposed=(Window, Worker,System),
|
||||
Exposed=(Window, Worker),
|
||||
Constructor(optional DOMString message = "", optional DOMString name)]
|
||||
interface DOMException {
|
||||
// The name of the error code (ie, a string repr of |result|).
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
enum DOMRequestReadyState { "pending", "done" };
|
||||
|
||||
[Exposed=(Window,Worker,System), NoInterfaceObject]
|
||||
[Exposed=(Window,Worker), NoInterfaceObject]
|
||||
interface DOMRequestShared {
|
||||
readonly attribute DOMRequestReadyState readyState;
|
||||
|
||||
|
@ -16,7 +16,7 @@ interface DOMRequestShared {
|
|||
attribute EventHandler onerror;
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface DOMRequest : EventTarget {
|
||||
// The [TreatNonCallableAsNull] annotation is required since then() should do
|
||||
// nothing instead of throwing errors when non-callable arguments are passed.
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface DOMStringList {
|
||||
readonly attribute unsigned long length;
|
||||
getter DOMString? item(unsigned long index);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
[Constructor(DOMString type, optional ErrorEventInit eventInitDict),
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface ErrorEvent : Event
|
||||
{
|
||||
readonly attribute DOMString message;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*/
|
||||
|
||||
[Constructor(DOMString type, optional EventInit eventInitDict),
|
||||
Exposed=(Window,Worker,System), ProbablyShortLivingWrapper]
|
||||
Exposed=(Window,Worker), ProbablyShortLivingWrapper]
|
||||
interface Event {
|
||||
[Pure]
|
||||
readonly attribute DOMString type;
|
||||
|
|
|
@ -26,7 +26,7 @@ dictionary AddEventListenerOptions : EventListenerOptions {
|
|||
};
|
||||
|
||||
[Constructor,
|
||||
Exposed=(Window,Worker,WorkerDebugger,AudioWorklet,System)]
|
||||
Exposed=(Window,Worker,WorkerDebugger,AudioWorklet)]
|
||||
interface EventTarget {
|
||||
/* Passing null for wantsUntrusted means "default behavior", which
|
||||
differs in content and chrome. In content that default boolean
|
||||
|
@ -65,6 +65,6 @@ partial interface EventTarget {
|
|||
// chrome easier. This returns the window which can be used to create
|
||||
// events to fire at this EventTarget, or null if there isn't one.
|
||||
partial interface EventTarget {
|
||||
[ChromeOnly, Exposed=(Window,System), BinaryName="ownerGlobalForBindings"]
|
||||
[ChromeOnly, Exposed=Window, BinaryName="ownerGlobalForBindings"]
|
||||
readonly attribute WindowProxy? ownerGlobal;
|
||||
};
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*/
|
||||
|
||||
[Constructor,
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface FileReader : EventTarget {
|
||||
// async read methods
|
||||
[Throws]
|
||||
|
|
|
@ -14,7 +14,7 @@ enum IDBCursorDirection {
|
|||
"prevunique"
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBCursor {
|
||||
readonly attribute (IDBObjectStore or IDBIndex) source;
|
||||
|
||||
|
@ -42,7 +42,7 @@ interface IDBCursor {
|
|||
IDBRequest delete ();
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBCursorWithValue : IDBCursor {
|
||||
[Throws]
|
||||
readonly attribute any value;
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBDatabase : EventTarget {
|
||||
readonly attribute DOMString name;
|
||||
readonly attribute unsigned long long version;
|
||||
|
|
|
@ -23,7 +23,7 @@ dictionary IDBOpenDBOptions
|
|||
* http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#idl-def-IDBFactory
|
||||
* for more information.
|
||||
*/
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBFactory {
|
||||
[Throws, NeedsCallerType]
|
||||
IDBOpenDBRequest
|
||||
|
|
|
@ -8,7 +8,7 @@ dictionary IDBFileMetadataParameters
|
|||
boolean lastModified = true;
|
||||
};
|
||||
|
||||
[Exposed=(Window,System)]
|
||||
[Exposed=(Window)]
|
||||
interface IDBFileHandle : EventTarget
|
||||
{
|
||||
readonly attribute IDBMutableFile? mutableFile;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* 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/. */
|
||||
|
||||
[Exposed=(Window,System)]
|
||||
[Exposed=Window]
|
||||
interface IDBFileRequest : DOMRequest {
|
||||
readonly attribute IDBFileHandle? fileHandle;
|
||||
// this is deprecated due to renaming in the spec
|
||||
|
|
|
@ -18,7 +18,7 @@ dictionary IDBIndexParameters {
|
|||
DOMString? locale = null;
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBIndex {
|
||||
[SetterThrows]
|
||||
attribute DOMString name;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBKeyRange {
|
||||
[Throws]
|
||||
readonly attribute any lower;
|
||||
|
@ -33,7 +33,7 @@ interface IDBKeyRange {
|
|||
static IDBKeyRange bound (any lower, any upper, optional boolean lowerOpen = false, optional boolean upperOpen = false);
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System),
|
||||
[Exposed=(Window,Worker),
|
||||
Func="mozilla::dom::IndexedDatabaseManager::ExperimentalFeaturesEnabled"]
|
||||
interface IDBLocaleAwareKeyRange : IDBKeyRange {
|
||||
[NewObject, Throws]
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* 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/. */
|
||||
|
||||
[Exposed=(Window,System)]
|
||||
[Exposed=Window]
|
||||
interface IDBMutableFile : EventTarget {
|
||||
readonly attribute DOMString name;
|
||||
readonly attribute DOMString type;
|
||||
|
|
|
@ -12,7 +12,7 @@ dictionary IDBObjectStoreParameters {
|
|||
boolean autoIncrement = false;
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBObjectStore {
|
||||
[SetterThrows]
|
||||
attribute DOMString name;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* https://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#idl-def-IDBOpenDBRequest
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBOpenDBRequest : IDBRequest {
|
||||
attribute EventHandler onblocked;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ enum IDBRequestReadyState {
|
|||
"done"
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBRequest : EventTarget {
|
||||
[Throws]
|
||||
readonly attribute any result;
|
||||
|
|
|
@ -19,7 +19,7 @@ enum IDBTransactionMode {
|
|||
"versionchange"
|
||||
};
|
||||
|
||||
[Exposed=(Window,Worker,System)]
|
||||
[Exposed=(Window,Worker)]
|
||||
interface IDBTransaction : EventTarget {
|
||||
[Throws]
|
||||
readonly attribute IDBTransactionMode mode;
|
||||
|
|
|
@ -16,7 +16,7 @@ dictionary IDBVersionChangeEventInit : EventInit {
|
|||
};
|
||||
|
||||
[Constructor(DOMString type, optional IDBVersionChangeEventInit eventInitDict),
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface IDBVersionChangeEvent : Event {
|
||||
readonly attribute unsigned long long oldVersion;
|
||||
readonly attribute unsigned long long? newVersion;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* https://w3c.github.io/requestidlecallback/
|
||||
*/
|
||||
|
||||
[Exposed=(Window,System),
|
||||
[Exposed=Window,
|
||||
Func="nsGlobalWindowInner::IsRequestIdleCallbackEnabled"]
|
||||
interface IdleDeadline {
|
||||
DOMHighResTimeStamp timeRemaining();
|
||||
|
|
|
@ -10,25 +10,17 @@
|
|||
* http://w3c.github.io/mediacapture-worker/#imagebitmap-extensions
|
||||
*/
|
||||
|
||||
// Extensions
|
||||
// Bug 1141979 - [FoxEye] Extend ImageBitmap with interfaces to access its
|
||||
// underlying image data
|
||||
//
|
||||
// Note:
|
||||
// Our overload resolution implementation doesn't deal with a union as the
|
||||
// distinguishing argument which means we cannot overload functions via union
|
||||
// types, a.k.a. we cannot overload createImageBitmap() via ImageBitmapSource
|
||||
// and BufferSource. Here, we work around this issue by adding the BufferSource
|
||||
// into ImageBitmapSource.
|
||||
|
||||
// This is needed because we don't support SVG element as canvas image source.
|
||||
// See bug 1500768.
|
||||
typedef (HTMLImageElement or
|
||||
HTMLVideoElement or
|
||||
HTMLCanvasElement or
|
||||
HTMLVideoElement or
|
||||
ImageBitmap) CanvasImageSourceExcludedSVG;
|
||||
|
||||
typedef (CanvasImageSourceExcludedSVG or
|
||||
Blob or
|
||||
ImageData or
|
||||
CanvasRenderingContext2D or
|
||||
ImageBitmap or
|
||||
BufferSource) ImageBitmapSource;
|
||||
CanvasRenderingContext2D or // This is out of spec.
|
||||
ImageData) ImageBitmapSource;
|
||||
|
||||
[Exposed=(Window,Worker)]
|
||||
interface ImageBitmap {
|
||||
|
@ -401,12 +393,3 @@ dictionary ChannelPixelLayout {
|
|||
};
|
||||
|
||||
typedef sequence<ChannelPixelLayout> ImagePixelLayout;
|
||||
|
||||
partial interface ImageBitmap {
|
||||
[Throws, Func="mozilla::dom::DOMPrefs::canvas_imagebitmap_extensions_enabled"]
|
||||
ImageBitmapFormat findOptimalFormat (optional sequence<ImageBitmapFormat> aPossibleFormats);
|
||||
[Throws, Func="mozilla::dom::DOMPrefs::canvas_imagebitmap_extensions_enabled"]
|
||||
long mappedDataLength (ImageBitmapFormat aFormat);
|
||||
[Throws, Func="mozilla::dom::DOMPrefs::canvas_imagebitmap_extensions_enabled"]
|
||||
Promise<ImagePixelLayout> mapDataInto (ImageBitmapFormat aFormat, BufferSource aBuffer, long aOffset);
|
||||
};
|
||||
|
|
|
@ -10,10 +10,10 @@ interface IID;
|
|||
[NoInterfaceObject,
|
||||
// Need Exposed here, because this is a mixin onto things like Event
|
||||
// that are exposed in workers.
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface LegacyQueryInterface {
|
||||
// Legacy QueryInterface, only exposed to chrome code on the main thread.
|
||||
[Exposed=(Window,System), ChromeOnly]
|
||||
[Exposed=Window, ChromeOnly]
|
||||
nsISupports QueryInterface(IID iid);
|
||||
};
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* http://www.whatwg.org/specs/web-apps/current-work/#channel-messaging
|
||||
*/
|
||||
|
||||
[Constructor, Exposed=(Window,Worker,System)]
|
||||
[Constructor, Exposed=(Window,Worker)]
|
||||
interface MessageChannel {
|
||||
readonly attribute MessagePort port1;
|
||||
readonly attribute MessagePort port2;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*/
|
||||
|
||||
[Constructor(DOMString type, optional MessageEventInit eventInitDict),
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface MessageEvent : Event {
|
||||
/**
|
||||
* Custom data associated with this event.
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* http://www.whatwg.org/specs/web-apps/current-work/#channel-messaging
|
||||
*/
|
||||
|
||||
[Exposed=(Window,Worker,AudioWorklet,System)]
|
||||
[Exposed=(Window,Worker,AudioWorklet)]
|
||||
interface MessagePort : EventTarget {
|
||||
[Throws]
|
||||
void postMessage(any message, optional sequence<object> transferable = []);
|
||||
|
|
|
@ -14,7 +14,6 @@ callback AnyCallback = any (any value);
|
|||
|
||||
// Hack to allow us to have JS owning and properly tracing/CCing/etc a
|
||||
// PromiseNativeHandler.
|
||||
[NoInterfaceObject,
|
||||
Exposed=(Window,Worker,System)]
|
||||
[NoInterfaceObject, Exposed=(Window,Worker)]
|
||||
interface PromiseNativeHandler {
|
||||
};
|
||||
|
|
|
@ -57,7 +57,7 @@ enum StreamFilterStatus {
|
|||
* An interface which allows an extension to intercept, and optionally modify,
|
||||
* response data from an HTTP request.
|
||||
*/
|
||||
[Exposed=(Window,System),
|
||||
[Exposed=Window,
|
||||
Func="mozilla::extensions::StreamFilter::IsAllowedInContext"]
|
||||
interface StreamFilter : EventTarget {
|
||||
/**
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
[Constructor(DOMString type, optional StreamFilterDataEventInit eventInitDict),
|
||||
Func="mozilla::extensions::StreamFilter::IsAllowedInContext",
|
||||
Exposed=(Window,System)]
|
||||
Exposed=Window]
|
||||
interface StreamFilterDataEvent : Event {
|
||||
/**
|
||||
* Contains a chunk of data read from the input stream.
|
||||
|
|
|
@ -15,7 +15,7 @@ dictionary ServerSocketOptions {
|
|||
|
||||
[Constructor(unsigned short port, optional ServerSocketOptions options, optional unsigned short backlog = 0),
|
||||
Func="mozilla::dom::TCPSocket::ShouldTCPSocketExist",
|
||||
Exposed=(Window,System)]
|
||||
Exposed=Window]
|
||||
interface TCPServerSocket : EventTarget {
|
||||
/**
|
||||
* The port of this server socket object.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
[Constructor(DOMString type, optional TCPServerSocketEventInit eventInitDict),
|
||||
Func="mozilla::dom::TCPSocket::ShouldTCPSocketExist",
|
||||
Exposed=(Window,System)]
|
||||
Exposed=Window]
|
||||
interface TCPServerSocketEvent : Event {
|
||||
readonly attribute TCPSocket socket;
|
||||
};
|
||||
|
|
|
@ -41,7 +41,7 @@ interface LegacyMozTCPSocket {
|
|||
|
||||
[Constructor(DOMString host, unsigned short port, optional SocketOptions options),
|
||||
Func="mozilla::dom::TCPSocket::ShouldTCPSocketExist",
|
||||
Exposed=(Window,System)]
|
||||
Exposed=Window]
|
||||
interface TCPSocket : EventTarget {
|
||||
/**
|
||||
* Upgrade an insecure connection to use TLS. Throws if the ready state is not OPEN.
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
[Constructor(DOMString type, optional TCPSocketErrorEventInit eventInitDict),
|
||||
Func="mozilla::dom::TCPSocket::ShouldTCPSocketExist",
|
||||
Exposed=(Window,System)]
|
||||
Exposed=Window]
|
||||
interface TCPSocketErrorEvent : Event {
|
||||
readonly attribute DOMString name;
|
||||
readonly attribute DOMString message;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
[Constructor(DOMString type, optional TCPSocketEventInit eventInitDict),
|
||||
Func="mozilla::dom::TCPSocket::ShouldTCPSocketExist",
|
||||
Exposed=(Window,System)]
|
||||
Exposed=Window]
|
||||
interface TCPSocketEvent : Event {
|
||||
/**
|
||||
* If the event is a "data" event, data will be the bytes read from the network;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*/
|
||||
|
||||
[Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options),
|
||||
Exposed=(Window,Worker,System)]
|
||||
Exposed=(Window,Worker)]
|
||||
interface TextDecoder {
|
||||
[Constant]
|
||||
readonly attribute DOMString encoding;
|
||||
|
|
|
@ -10,8 +10,7 @@
|
|||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
[Constructor,
|
||||
Exposed=(Window,Worker,System)]
|
||||
[Constructor, Exposed=(Window,Worker)]
|
||||
interface TextEncoder {
|
||||
[Constant]
|
||||
readonly attribute DOMString encoding;
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
*/
|
||||
|
||||
[Constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = ""),
|
||||
Exposed=(Window,Worker,WorkerDebugger,System)]
|
||||
Exposed=(Window,Worker,WorkerDebugger)]
|
||||
interface URLSearchParams {
|
||||
void append(USVString name, USVString value);
|
||||
void delete(USVString name);
|
||||
|
|
|
@ -65,18 +65,3 @@ partial interface WindowOrWorkerGlobalScope {
|
|||
[Throws, Func="mozilla::dom::DOMPrefs::dom_caches_enabled", SameObject]
|
||||
readonly attribute CacheStorage caches;
|
||||
};
|
||||
|
||||
// Mozilla extensions
|
||||
partial interface WindowOrWorkerGlobalScope {
|
||||
// Extensions to ImageBitmap bits.
|
||||
// Bug 1141979 - [FoxEye] Extend ImageBitmap with interfaces to access its
|
||||
// underlying image data
|
||||
//
|
||||
// Note:
|
||||
// Overloaded functions cannot have different "extended attributes",
|
||||
// so I cannot add preference on the extended version of createImageBitmap().
|
||||
// To work around, I will then check the preference at run time and throw if
|
||||
// the preference is set to be false.
|
||||
[Throws]
|
||||
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource aImage, long aOffset, long aLength, ImageBitmapFormat aFormat, ImagePixelLayout aLayout);
|
||||
};
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
*/
|
||||
|
||||
[Constructor(USVString scriptURL, optional WorkerOptions options),
|
||||
Exposed=(Window,DedicatedWorker,SharedWorker,System)]
|
||||
Exposed=(Window,DedicatedWorker,SharedWorker)]
|
||||
interface Worker : EventTarget {
|
||||
void terminate();
|
||||
|
||||
|
@ -34,6 +34,6 @@ dictionary WorkerOptions {
|
|||
|
||||
[Constructor(USVString scriptURL),
|
||||
Func="mozilla::dom::ChromeWorker::WorkerAvailable",
|
||||
Exposed=(Window,DedicatedWorker,SharedWorker,System)]
|
||||
Exposed=(Window,DedicatedWorker,SharedWorker)]
|
||||
interface ChromeWorker : Worker {
|
||||
};
|
||||
|
|
|
@ -484,11 +484,6 @@ WorkerGlobalScope::CreateImageBitmap(JSContext* aCx,
|
|||
const ImageBitmapSource& aImage,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (aImage.IsArrayBuffer() || aImage.IsArrayBufferView()) {
|
||||
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ImageBitmap::Create(this, aImage, Nothing(), aRv);
|
||||
}
|
||||
|
||||
|
@ -498,36 +493,9 @@ WorkerGlobalScope::CreateImageBitmap(JSContext* aCx,
|
|||
int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (aImage.IsArrayBuffer() || aImage.IsArrayBufferView()) {
|
||||
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ImageBitmap::Create(this, aImage, Some(gfx::IntRect(aSx, aSy, aSw, aSh)), aRv);
|
||||
}
|
||||
|
||||
already_AddRefed<mozilla::dom::Promise>
|
||||
WorkerGlobalScope::CreateImageBitmap(JSContext* aCx,
|
||||
const ImageBitmapSource& aImage,
|
||||
int32_t aOffset, int32_t aLength,
|
||||
ImageBitmapFormat aFormat,
|
||||
const Sequence<ChannelPixelLayout>& aLayout,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (!StaticPrefs::canvas_imagebitmap_extensions_enabled()) {
|
||||
aRv.Throw(NS_ERROR_TYPE_ERR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (aImage.IsArrayBuffer() || aImage.IsArrayBufferView()) {
|
||||
return ImageBitmap::Create(this, aImage, aOffset, aLength, aFormat, aLayout,
|
||||
aRv);
|
||||
} else {
|
||||
aRv.Throw(NS_ERROR_TYPE_ERR);
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
nsresult
|
||||
WorkerGlobalScope::Dispatch(TaskCategory aCategory,
|
||||
already_AddRefed<nsIRunnable>&& aRunnable)
|
||||
|
|
|
@ -191,14 +191,6 @@ public:
|
|||
int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
|
||||
ErrorResult& aRv);
|
||||
|
||||
already_AddRefed<mozilla::dom::Promise>
|
||||
CreateImageBitmap(JSContext* aCx,
|
||||
const ImageBitmapSource& aImage,
|
||||
int32_t aOffset, int32_t aLength,
|
||||
mozilla::dom::ImageBitmapFormat aFormat,
|
||||
const mozilla::dom::Sequence<mozilla::dom::ChannelPixelLayout>& aLayout,
|
||||
mozilla::ErrorResult& aRv);
|
||||
|
||||
bool
|
||||
WindowInteractionAllowed() const
|
||||
{
|
||||
|
|
|
@ -9976,47 +9976,88 @@ CreateSimpleClipRegion(const nsDisplayMasksAndClipPaths& aDisplayItem,
|
|||
return Nothing();
|
||||
}
|
||||
|
||||
// TODO(emilio): We should be able to still generate a clip and pass the
|
||||
// opacity down to StackingContextHelper instead.
|
||||
if (frame->StyleEffects()->mOpacity != 1.0) {
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
auto& clipPath = style->mClipPath;
|
||||
if (clipPath.GetType() != StyleShapeSourceType::Shape) {
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
// TODO(emilio): We should be able to also simplify most of the circle() and
|
||||
// ellipse() shapes.
|
||||
auto& shape = clipPath.GetBasicShape();
|
||||
if (shape->GetShapeType() != StyleBasicShapeType::Inset) {
|
||||
if (shape->GetShapeType() == StyleBasicShapeType::Polygon) {
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
auto appUnitsPerDevPixel = frame->PresContext()->AppUnitsPerDevPixel();
|
||||
const nsRect refBox =
|
||||
nsLayoutUtils::ComputeGeometryBox(frame, clipPath.GetReferenceBox());
|
||||
|
||||
const nsRect insetRect =
|
||||
ShapeUtils::ComputeInsetRect(shape, refBox) + aDisplayItem.ToReferenceFrame();
|
||||
|
||||
auto appUnitsPerDevPixel = frame->PresContext()->AppUnitsPerDevPixel();
|
||||
|
||||
nscoord radii[8] = { 0 };
|
||||
AutoTArray<wr::ComplexClipRegion, 1> clipRegions;
|
||||
if (ShapeUtils::ComputeInsetRadii(shape, insetRect, refBox, radii)) {
|
||||
clipRegions.AppendElement(wr::ToComplexClipRegion(
|
||||
insetRect, radii, appUnitsPerDevPixel));
|
||||
}
|
||||
|
||||
auto rect = wr::ToRoundedLayoutRect(
|
||||
LayoutDeviceRect::FromAppUnits(insetRect, appUnitsPerDevPixel));
|
||||
wr::LayoutRect rect;
|
||||
switch (shape->GetShapeType()) {
|
||||
case StyleBasicShapeType::Inset: {
|
||||
const nsRect insetRect =
|
||||
ShapeUtils::ComputeInsetRect(shape, refBox) + aDisplayItem.ToReferenceFrame();
|
||||
|
||||
nscoord radii[8] = { 0 };
|
||||
|
||||
if (ShapeUtils::ComputeInsetRadii(shape, insetRect, refBox, radii)) {
|
||||
clipRegions.AppendElement(wr::ToComplexClipRegion(
|
||||
insetRect, radii, appUnitsPerDevPixel));
|
||||
}
|
||||
|
||||
rect = wr::ToRoundedLayoutRect(
|
||||
LayoutDeviceRect::FromAppUnits(insetRect, appUnitsPerDevPixel));
|
||||
break;
|
||||
}
|
||||
case StyleBasicShapeType::Ellipse:
|
||||
case StyleBasicShapeType::Circle: {
|
||||
nsPoint center = ShapeUtils::ComputeCircleOrEllipseCenter(shape, refBox);
|
||||
|
||||
nsSize radii;
|
||||
if (shape->GetShapeType() == StyleBasicShapeType::Ellipse) {
|
||||
radii = ShapeUtils::ComputeEllipseRadii(shape, center, refBox);
|
||||
} else {
|
||||
nscoord radius = ShapeUtils::ComputeCircleRadius(shape, center, refBox);
|
||||
radii = { radius, radius };
|
||||
}
|
||||
|
||||
nsRect ellipseRect(
|
||||
aDisplayItem.ToReferenceFrame() + center - nsPoint(radii.width, radii.height),
|
||||
radii * 2);
|
||||
|
||||
nscoord ellipseRadii[8];
|
||||
NS_FOR_CSS_HALF_CORNERS(corner) {
|
||||
ellipseRadii[corner] = HalfCornerIsX(corner) ? radii.width : radii.height;
|
||||
}
|
||||
|
||||
clipRegions.AppendElement(wr::ToComplexClipRegion(
|
||||
ellipseRect, ellipseRadii, appUnitsPerDevPixel));
|
||||
|
||||
rect = wr::ToRoundedLayoutRect(
|
||||
LayoutDeviceRect::FromAppUnits(ellipseRect, appUnitsPerDevPixel));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
// Please don't add more exceptions, try to find a way to define the clip
|
||||
// without using a mask image.
|
||||
//
|
||||
// And if you _really really_ need to add an exception, add it to where
|
||||
// the polygon check is.
|
||||
MOZ_ASSERT_UNREACHABLE("Unhandled shape id?");
|
||||
return Nothing();
|
||||
}
|
||||
wr::WrClipId clipId =
|
||||
aBuilder.DefineClip(Nothing(), rect, &clipRegions, nullptr);
|
||||
return Some(clipId);
|
||||
}
|
||||
|
||||
static Maybe<wr::WrClipId>
|
||||
enum class HandleOpacity
|
||||
{
|
||||
No,
|
||||
Yes,
|
||||
};
|
||||
|
||||
static Maybe<Pair<wr::WrClipId, HandleOpacity>>
|
||||
CreateWRClipPathAndMasks(nsDisplayMasksAndClipPaths* aDisplayItem,
|
||||
const LayoutDeviceRect& aBounds,
|
||||
wr::IpcResourceUpdateQueue& aResources,
|
||||
|
@ -10026,7 +10067,7 @@ CreateWRClipPathAndMasks(nsDisplayMasksAndClipPaths* aDisplayItem,
|
|||
nsDisplayListBuilder* aDisplayListBuilder)
|
||||
{
|
||||
if (auto clip = CreateSimpleClipRegion(*aDisplayItem, aBuilder)) {
|
||||
return clip;
|
||||
return Some(MakePair(*clip, HandleOpacity::Yes));
|
||||
}
|
||||
|
||||
Maybe<wr::WrImageMask> mask = aManager->CommandBuilder().BuildWrMaskImage(
|
||||
|
@ -10041,7 +10082,7 @@ CreateWRClipPathAndMasks(nsDisplayMasksAndClipPaths* aDisplayItem,
|
|||
nullptr,
|
||||
mask.ptr());
|
||||
|
||||
return Some(clipId);
|
||||
return Some(MakePair(clipId, HandleOpacity::No));
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -10058,7 +10099,7 @@ nsDisplayMasksAndClipPaths::CreateWebRenderCommands(
|
|||
LayoutDeviceRect bounds =
|
||||
LayoutDeviceRect::FromAppUnits(displayBounds, appUnitsPerDevPixel);
|
||||
|
||||
Maybe<wr::WrClipId> clip =
|
||||
Maybe<Pair<wr::WrClipId, HandleOpacity>> clip =
|
||||
CreateWRClipPathAndMasks(
|
||||
this, bounds, aResources, aBuilder, aSc, aManager, aDisplayListBuilder);
|
||||
|
||||
|
@ -10071,20 +10112,26 @@ nsDisplayMasksAndClipPaths::CreateWebRenderCommands(
|
|||
// The stacking context shouldn't have any offset.
|
||||
bounds.MoveTo(0, 0);
|
||||
|
||||
wr::WrClipId clipId = clip->first();
|
||||
|
||||
Maybe<float> opacity = clip->second() == HandleOpacity::Yes
|
||||
? Some(mFrame->StyleEffects()->mOpacity)
|
||||
: Nothing();
|
||||
|
||||
layer.emplace(aSc,
|
||||
aBuilder,
|
||||
/*aFilters: */ nsTArray<wr::WrFilterOp>(),
|
||||
/*aBounds: */ bounds,
|
||||
/*aBoundTransform: */ nullptr,
|
||||
/*aAnimation: */ nullptr,
|
||||
/*aOpacity: */ nullptr,
|
||||
/*aOpacity: */ opacity.ptrOr(nullptr),
|
||||
/*aTransform: */ nullptr,
|
||||
/*aPerspective: */ nullptr,
|
||||
/*aMixBlendMode: */ gfx::CompositionOp::OP_OVER,
|
||||
/*aBackfaceVisible: */ true,
|
||||
/*aIsPreserve3D: */ false,
|
||||
/*aTransformForScrollData: */ Nothing(),
|
||||
/*aClipNodeId: */ clip.ptr());
|
||||
/*aClipNodeId: */ &clipId);
|
||||
sc = layer.ptr();
|
||||
// The whole stacking context will be clipped by us, so no need to have any
|
||||
// parent for the children context's clip.
|
||||
|
|
|
@ -75,7 +75,7 @@ test-pref(font.size.inflation.emPerLine,20) test-pref(font.size.inflation.forceE
|
|||
|
||||
# The tests below use nonzero values of the lineThreshold preference.
|
||||
test-pref(font.size.inflation.emPerLine,15) test-pref(font.size.inflation.forceEnabled,true) test-pref(font.size.inflation.lineThreshold,100) == text-1.html text-1.html
|
||||
test-pref(font.size.inflation.emPerLine,15) test-pref(font.size.inflation.forceEnabled,true) test-pref(font.size.inflation.lineThreshold,100) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == list-1.html list-1-ref.html # Bug 1392106
|
||||
test-pref(font.size.inflation.emPerLine,15) test-pref(font.size.inflation.forceEnabled,true) test-pref(font.size.inflation.lineThreshold,100) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) skip-if(cocoaWidget) == list-1.html list-1-ref.html # Bug 1392106, Bug 1434812
|
||||
test-pref(font.size.inflation.emPerLine,15) test-pref(font.size.inflation.forceEnabled,true) test-pref(font.size.inflation.lineThreshold,100) == threshold-1a.html threshold-1a.html
|
||||
test-pref(font.size.inflation.emPerLine,15) test-pref(font.size.inflation.forceEnabled,true) test-pref(font.size.inflation.lineThreshold,100) == threshold-1b.html threshold-1b-ref.html
|
||||
test-pref(font.size.inflation.emPerLine,15) test-pref(font.size.inflation.forceEnabled,true) test-pref(font.size.inflation.lineThreshold,100) == threshold-1c.html threshold-1c-ref.html
|
||||
|
|
|
@ -16,36 +16,36 @@
|
|||
== clip-path-polygon-012.html clip-path-stripes-001-ref.html
|
||||
fuzzy-if(skiaContent,0-1,0-20) fuzzy-if(webrender&>kWidget,8-8,20-20) fails-if(webrender&&!gtkWidget) == clip-path-polygon-013.html clip-path-stripes-003-ref.html
|
||||
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-001.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-002.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-003.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-004.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-005.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-006.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-007.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-008.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-009.html clip-path-circle-003-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-010.html clip-path-circle-004-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-011.html clip-path-circle-005-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-012.html clip-path-circle-006-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-013.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-014.html clip-path-circle-007-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-015.html clip-path-circle-008-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-016.html clip-path-circle-009-ref.html
|
||||
fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu),0-16,0-9) fuzzy-if(webrender,64-64,714-714) == clip-path-circle-017.html clip-path-circle-007-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-018.html clip-path-circle-010-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-019.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,64-64,714-714) == clip-path-circle-020.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-001.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-002.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-003.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-004.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-005.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-006.html clip-path-circle-001-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-007.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-008.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-009.html clip-path-circle-003-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-010.html clip-path-circle-004-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-011.html clip-path-circle-005-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-012.html clip-path-circle-006-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-013.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-014.html clip-path-circle-007-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-015.html clip-path-circle-008-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-016.html clip-path-circle-009-ref.html
|
||||
fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu),0-16,0-9) fuzzy-if(webrender,35-35,703-703) == clip-path-circle-017.html clip-path-circle-007-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-018.html clip-path-circle-010-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-019.html clip-path-circle-002-ref.html
|
||||
fuzzy-if(webrender,35-35,703-703) == clip-path-circle-020.html clip-path-circle-002-ref.html
|
||||
== clip-path-circle-021.html clip-path-circle-021-ref.html
|
||||
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-001.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-002.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-003.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-004.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-005.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-006.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-007.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,64-64,1106-1106) == clip-path-ellipse-008.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-001.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-002.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-003.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-004.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-005.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-006.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-007.html clip-path-ellipse-001-ref.html
|
||||
fuzzy-if(webrender,36-36,1100-1100) == clip-path-ellipse-008.html clip-path-ellipse-001-ref.html
|
||||
|
||||
== clip-path-inset-001a.html clip-path-inset-001-ref.html
|
||||
== clip-path-inset-001b.html clip-path-inset-001-ref.html
|
||||
|
|
|
@ -89,7 +89,7 @@ fails == mask-origin-2.html mask-origin-2-ref.html # bug 1260094
|
|||
|
||||
fuzzy-if(winWidget,0-1,0-21) fuzzy-if(skiaContent,0-1,0-60) fuzzy-if(webrender,0-64,0-371) == clip-path-contentBox-1a.html clip-path-geometryBox-1-ref.html
|
||||
fuzzy-if(winWidget,0-16,0-21) fuzzy-if(skiaContent,0-1,0-60) == clip-path-contentBox-1b.html clip-path-geometryBox-1-ref.html
|
||||
fuzzy-if(winWidget,0-16,0-21) fuzzy-if(skiaContent,0-1,0-60) fuzzy-if(webrender,64-64,371-371) == clip-path-contentBox-1c.html clip-path-geometryBox-1-ref.html
|
||||
fuzzy-if(winWidget,0-16,0-21) fuzzy-if(skiaContent,0-1,0-60) fuzzy-if(webrender,35-35,360-360) == clip-path-contentBox-1c.html clip-path-geometryBox-1-ref.html
|
||||
fuzzy-if(winWidget,0-16,0-21) fuzzy-if(skiaContent,0-1,0-60) fuzzy-if(webrender,0-64,0-371) == clip-path-paddingBox-1a.html clip-path-geometryBox-1-ref.html
|
||||
fuzzy-if(winWidget,0-16,0-21) fuzzy-if(skiaContent,0-1,0-60) == clip-path-paddingBox-1b.html clip-path-geometryBox-1-ref.html
|
||||
fuzzy-if(winWidget,0-16,0-21) fuzzy-if(skiaContent,0-1,0-60) fuzzy-if(webrender,0-64,0-371) == clip-path-paddingBox-1c.html clip-path-geometryBox-1-ref.html
|
||||
|
|
|
@ -250,13 +250,6 @@ VARCACHE_PREF(
|
|||
uint32_t, 5000
|
||||
)
|
||||
|
||||
// Disable the ImageBitmap-extensions for now.
|
||||
VARCACHE_PREF(
|
||||
"canvas.imagebitmap_extensions.enabled",
|
||||
canvas_imagebitmap_extensions_enabled,
|
||||
RelaxedAtomicBool, false
|
||||
)
|
||||
|
||||
// SW Cache API
|
||||
VARCACHE_PREF(
|
||||
"dom.caches.enabled",
|
||||
|
|
|
@ -954,7 +954,7 @@ win32-mingwclang/opt:
|
|||
- linux64-node
|
||||
- linux64-clang-trunk-mingw-x86
|
||||
- linux64-mingw32-nsis
|
||||
- linux64-mingw32-fxc2
|
||||
- linux64-mingw-fxc2-x86
|
||||
|
||||
win32-mingwclang/debug:
|
||||
description: "Win32 MinGW-Clang Debug"
|
||||
|
@ -990,7 +990,7 @@ win32-mingwclang/debug:
|
|||
- linux64-node
|
||||
- linux64-clang-trunk-mingw-x86
|
||||
- linux64-mingw32-nsis
|
||||
- linux64-mingw32-fxc2
|
||||
- linux64-mingw-fxc2-x86
|
||||
|
||||
win64-mingwclang/opt:
|
||||
description: "Win64 MinGW-Clang Opt"
|
||||
|
@ -1026,7 +1026,7 @@ win64-mingwclang/opt:
|
|||
- linux64-node
|
||||
- linux64-clang-trunk-mingw-x64
|
||||
- linux64-mingw32-nsis
|
||||
- linux64-mingw32-fxc2
|
||||
- linux64-mingw-fxc2-x86
|
||||
|
||||
win64-mingwclang/debug:
|
||||
description: "Win64 MinGW-Clang Debug"
|
||||
|
@ -1062,4 +1062,4 @@ win64-mingwclang/debug:
|
|||
- linux64-node
|
||||
- linux64-clang-trunk-mingw-x64
|
||||
- linux64-mingw32-nsis
|
||||
- linux64-mingw32-fxc2
|
||||
- linux64-mingw-fxc2-x86
|
||||
|
|
|
@ -309,32 +309,34 @@ android-em-7.0-x86/opt:
|
|||
test-sets:
|
||||
- android-x86-kvm-tests
|
||||
|
||||
# Bug 1501364 - Temporarily disable Bitbar android hardware tests
|
||||
|
||||
# android-hw test platforms execute on real devices attached to Autophone hosts.
|
||||
|
||||
# android-hw-g5-7-0 Motorola Moto G5 Android 7.0
|
||||
|
||||
android-hw-g5-7-0-arm7-api-16/opt:
|
||||
build-platform: android-api-16/opt
|
||||
test-sets:
|
||||
- android-hw-arm7-raptor
|
||||
- raptor-fetch-geckoview
|
||||
# android-hw-g5-7-0-arm7-api-16/opt:
|
||||
# build-platform: android-api-16/opt
|
||||
# test-sets:
|
||||
# - android-hw-arm7-raptor
|
||||
# - raptor-fetch-geckoview
|
||||
|
||||
# android-hw-p2-8-0 Google Pixel 2 Android 8.0
|
||||
|
||||
android-hw-p2-8-0-arm7-api-16/opt:
|
||||
build-platform: android-api-16/opt
|
||||
test-sets:
|
||||
- android-hw-arm7-opt-unittests
|
||||
- android-hw-arm7-raptor
|
||||
- raptor-fetch-geckoview
|
||||
# android-hw-p2-8-0-arm7-api-16/opt:
|
||||
# build-platform: android-api-16/opt
|
||||
# test-sets:
|
||||
# - android-hw-arm7-opt-unittests
|
||||
# - android-hw-arm7-raptor
|
||||
# - raptor-fetch-geckoview
|
||||
|
||||
android-hw-p2-8-0-arm7-api-16/debug:
|
||||
build-platform: android-api-16/debug
|
||||
test-sets:
|
||||
- android-hw-arm7-debug-unittests
|
||||
# android-hw-p2-8-0-arm7-api-16/debug:
|
||||
# build-platform: android-api-16/debug
|
||||
# test-sets:
|
||||
# - android-hw-arm7-debug-unittests
|
||||
|
||||
android-hw-p2-8-0-android-aarch64/opt:
|
||||
build-platform: android-aarch64/opt
|
||||
test-sets:
|
||||
- android-hw-aarch64-opt-unittests
|
||||
- android-hw-aarch64-raptor
|
||||
# android-hw-p2-8-0-android-aarch64/opt:
|
||||
# build-platform: android-aarch64/opt
|
||||
# test-sets:
|
||||
# - android-hw-aarch64-opt-unittests
|
||||
# - android-hw-aarch64-raptor
|
||||
|
|
|
@ -810,12 +810,12 @@ linux64-mingw32-nsis:
|
|||
toolchains:
|
||||
- linux64-mingw32-gcc
|
||||
|
||||
linux64-mingw32-fxc2:
|
||||
description: "fxc2.exe build for MinGW32 Cross Compile"
|
||||
linux64-mingw-fxc2-x86:
|
||||
description: "fxc2.exe x86 build for MinGW Cross Compile"
|
||||
treeherder:
|
||||
kind: build
|
||||
platform: toolchains/opt
|
||||
symbol: TMW(mingw32-fxc2)
|
||||
symbol: TMW(mingw-fxc2-x86)
|
||||
tier: 2
|
||||
worker-type: aws-provisioner-v1/gecko-{level}-b-linux
|
||||
worker:
|
||||
|
@ -823,10 +823,11 @@ linux64-mingw32-fxc2:
|
|||
max-run-time: 1800
|
||||
run:
|
||||
using: toolchain-script
|
||||
script: build-mingw32-fxc2.sh
|
||||
script: build-mingw-fxc2-x86.sh
|
||||
resources:
|
||||
- 'build/unix/build-gcc/build-gcc.sh'
|
||||
- 'taskcluster/scripts/misc/build-gcc-mingw32.sh'
|
||||
- 'build/build-clang/build-clang.py'
|
||||
- 'build/build-clang/clang-trunk-mingw.json'
|
||||
- 'taskcluster/scripts/misc/build-clang-trunk-mingw.sh'
|
||||
toolchain-artifact: public/build/fxc2.tar.xz
|
||||
toolchains:
|
||||
- linux64-mingw32-gcc
|
||||
- linux64-clang-trunk-mingw-x86
|
||||
|
|
|
@ -32,7 +32,7 @@ SRC_DIR=$TOOLCHAIN_DIR/src
|
|||
|
||||
make_flags="-j$(nproc)"
|
||||
|
||||
mingw_version=cfd85ebed773810429bf2164c3a985895b7dbfe3
|
||||
mingw_version=c69c7a706d767c5ca3c7d1c70887fcd8e1f940b3
|
||||
libunwind_version=1f89d78bb488bc71cfdee8281fc0834e9fbe5dce
|
||||
|
||||
binutils_version=2.27
|
||||
|
|
|
@ -11,20 +11,19 @@ mkdir -p $INSTALL_DIR/bin
|
|||
|
||||
cd $TOOLTOOL_DIR
|
||||
. taskcluster/scripts/misc/tooltool-download.sh
|
||||
export PATH="$TOOLTOOL_DIR/mingw32/bin:$PATH"
|
||||
export PATH="$TOOLTOOL_DIR/clang/bin:$PATH"
|
||||
|
||||
cd $WORKSPACE
|
||||
|
||||
# --------------
|
||||
|
||||
git clone -n https://github.com/mozilla/fxc2.git fxc2-clone
|
||||
git clone -n https://github.com/tomrittervg/fxc2.git fxc2-clone
|
||||
cd fxc2-clone
|
||||
git checkout 82527b81104e5e21390d3ddcd328700c67ce73d4 # Asserts integrity of the clone (right?)
|
||||
make -j$(nproc)
|
||||
git checkout 502ef40807a472ba845f1cbdeac95ecab1aea2fd # Asserts integrity of the clone (right?)
|
||||
make -j$(nproc) x86
|
||||
|
||||
cp fxc2.exe $INSTALL_DIR/bin/
|
||||
cp d3dcompiler_47.dll $INSTALL_DIR/bin/
|
||||
cp $TOOLTOOL_DIR/mingw32/i686-w64-mingw32/bin/libwinpthread-1.dll $INSTALL_DIR/bin/
|
||||
cp dll/d3dcompiler_47_32.dll $INSTALL_DIR/bin/d3dcompiler_47.dll
|
||||
|
||||
# --------------
|
||||
|
|
@ -17,10 +17,9 @@ cd $WORKSPACE
|
|||
|
||||
# --------------
|
||||
$GPG --import $data_dir/DA23579A74D4AD9AF9D3F945CEFAC8EAAF17519D.key
|
||||
|
||||
download_and_check http://dl.winehq.org/wine/source/2.0/ wine-2.0.1.tar.xz.sign
|
||||
tar xaf $TMPDIR/wine-2.0.1.tar.xz
|
||||
cd wine-2.0.1
|
||||
download_and_check http://dl.winehq.org/wine/source/3.0/ wine-3.0.3.tar.xz.sign
|
||||
tar xaf $TMPDIR/wine-3.0.3.tar.xz
|
||||
cd wine-3.0.3
|
||||
./configure --prefix=$INSTALL_DIR/
|
||||
make -j$(nproc)
|
||||
make install
|
||||
|
|
|
@ -1,28 +1,4 @@
|
|||
[createImageBitmap-invalid-args.html]
|
||||
[createImageBitmap with an oversized canvas source rejects with a RangeError.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an invalid OffscreenCanvas source rejects with a RangeError.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a broken image source rejects with an InvalidStateError.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an available but undecodable image source rejects with an InvalidStateError.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an HTMLCanvasElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an HTMLVideoElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an HTMLImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an HTMLImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an OffscreenCanvas source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -32,15 +8,6 @@
|
|||
[createImageBitmap with an OffscreenCanvas source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an ImageData source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an ImageBitmap source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an oversized canvas source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an invalid OffscreenCanvas source.]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -50,39 +17,18 @@
|
|||
[createImageBitmap with an available but undecodable image source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a closed ImageBitmap.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a bitmap HTMLImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a bitmap SVGImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a bitmap SVGImageElement source and sh set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a bitmap SVGImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a vector SVGImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a vector SVGImageElement source and sh set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a vector SVGImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with CanvasRenderingContext2D image source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with Uint8Array image source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with ArrayBuffer image source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with an HTMLVideoElement from a data URL source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче