merge mozilla-central to autoland. r=merge a=merge on a CLOSED TREE

This commit is contained in:
Sebastian Hengst 2018-01-10 01:52:28 +02:00
commit 1ebdaf80de
8784 changed files with 93338 additions and 33316 deletions

View File

@ -969,10 +969,6 @@
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="1"/>
</emItem>
<emItem blockID="i258" id="helperbar@helperbar.com">
<prefs/>
<versionRange minVersion="0" maxVersion="1.0" severity="1"/>
</emItem>
<emItem blockID="i96" id="youtubeee@youtuber3.com">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="3"/>
@ -1464,6 +1460,10 @@
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="3"/>
</emItem>
<emItem blockID="674b6e19-f087-4706-a91d-1e723ed6f79e" id="{1490068c-d8b7-4bd2-9621-a648942b312c}">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="3"/>
</emItem>
<emItem blockID="i488" id="jid1-4P0kohSJxU1qGg@jetpack">
<prefs/>
<versionRange minVersion="1.2.50" maxVersion="1.2.50" severity="1"/>
@ -2151,6 +2151,10 @@
<prefs/>
<versionRange minVersion="0" maxVersion="1.0.8" severity="1"/>
</emItem>
<emItem blockID="i258" id="helperbar@helperbar.com">
<prefs/>
<versionRange minVersion="0" maxVersion="1.0" severity="1"/>
</emItem>
</emItems>
<pluginItems>
<pluginItem blockID="p416">

View File

@ -287,8 +287,14 @@ public:
template<typename A, typename B>
RangeBoundaryBase& operator=(const RangeBoundaryBase<A,B>& aOther)
{
mParent = aOther.mParent;
mRef = aOther.mRef;
// mParent and mRef can be strong pointers, so better to try to avoid any
// extra AddRef/Release calls.
if (mParent != aOther.mParent) {
mParent = aOther.mParent;
}
if (mRef != aOther.mRef) {
mRef = aOther.mRef;
}
mOffset = aOther.mOffset;
return *this;
}

View File

@ -202,6 +202,35 @@ bool
nsTextFragment::SetTo(const char16_t* aBuffer, int32_t aLength,
bool aUpdateBidi, bool aForce2b)
{
if (aForce2b && mState.mIs2b && !m2b->IsReadonly()) {
uint32_t storageSize = m2b->StorageSize();
uint32_t neededSize = aLength * sizeof(char16_t);
if (!neededSize) {
if (storageSize < AutoStringDefaultStorageSize) {
// If we're storing small enough nsStringBuffer, let's preserve it.
static_cast<char16_t*>(m2b->Data())[0] = char16_t(0);
mState.mLength = 0;
mState.mIsBidi = false;
return true;
}
} else if ((neededSize < storageSize) &&
((storageSize / 2) <
(neededSize + AutoStringDefaultStorageSize))) {
// Don't try to reuse the existing nsStringBuffer, if it would have
// lots of unused space.
memcpy(m2b->Data(), aBuffer, neededSize);
static_cast<char16_t*>(m2b->Data())[aLength] = char16_t(0);
mState.mLength = aLength;
mState.mIsBidi = false;
if (aUpdateBidi) {
UpdateBidiFlag(aBuffer, aLength);
}
return true;
}
}
ReleaseText();
if (aLength == 0) {

View File

@ -5353,10 +5353,10 @@ EditorBase::IsModifiableNode(nsINode* aNode)
return true;
}
already_AddRefed<nsIContent>
nsIContent*
EditorBase::GetFocusedContent()
{
nsCOMPtr<nsIDOMEventTarget> piTarget = GetDOMEventTarget();
nsIDOMEventTarget* piTarget = GetDOMEventTarget();
if (!piTarget) {
return nullptr;
}
@ -5367,20 +5367,20 @@ EditorBase::GetFocusedContent()
nsIContent* content = fm->GetFocusedContent();
MOZ_ASSERT((content == piTarget) == SameCOMIdentity(content, piTarget));
return (content == piTarget) ?
piTarget.forget().downcast<nsIContent>() : nullptr;
return (content == piTarget) ? content : nullptr;
}
already_AddRefed<nsIContent>
EditorBase::GetFocusedContentForIME()
{
return GetFocusedContent();
nsCOMPtr<nsIContent> content = GetFocusedContent();
return content.forget();
}
bool
EditorBase::IsActiveInDOMWindow()
{
nsCOMPtr<nsIDOMEventTarget> piTarget = GetDOMEventTarget();
nsIDOMEventTarget* piTarget = GetDOMEventTarget();
if (!piTarget) {
return false;
}
@ -5412,7 +5412,7 @@ EditorBase::IsAcceptableInputEvent(WidgetGUIEvent* aGUIEvent)
// If this is dispatched by using cordinates but this editor doesn't have
// focus, we shouldn't handle it.
if (aGUIEvent->IsUsingCoordinates()) {
nsCOMPtr<nsIContent> focusedContent = GetFocusedContent();
nsIContent* focusedContent = GetFocusedContent();
if (!focusedContent) {
return false;
}

View File

@ -1164,7 +1164,7 @@ public:
nsINode* aEndContainer,
uint32_t aEndOffset);
virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() = 0;
virtual dom::EventTarget* GetDOMEventTarget() = 0;
/**
* Fast non-refcounting editor root element accessor
@ -1344,7 +1344,7 @@ public:
/**
* Get the focused content, if we're focused. Returns null otherwise.
*/
virtual already_AddRefed<nsIContent> GetFocusedContent();
virtual nsIContent* GetFocusedContent();
/**
* Get the focused content for the argument of some IMEStateManager's

View File

@ -144,7 +144,7 @@ EditorEventListener::InstallToEditor()
{
NS_PRECONDITION(mEditorBase, "The caller must set mEditorBase");
nsCOMPtr<EventTarget> piTarget = mEditorBase->GetDOMEventTarget();
EventTarget* piTarget = mEditorBase->GetDOMEventTarget();
NS_ENSURE_TRUE(piTarget, NS_ERROR_FAILURE);
// register the event listeners with the listener manager
@ -1093,7 +1093,7 @@ EditorEventListener::Focus(InternalFocusEvent* aFocusEvent)
return NS_OK;
}
nsCOMPtr<nsIDOMEventTarget> target = aFocusEvent->GetDOMEventTarget();
nsIDOMEventTarget* target = aFocusEvent->GetDOMEventTarget();
nsCOMPtr<nsINode> node = do_QueryInterface(target);
NS_ENSURE_TRUE(node, NS_ERROR_UNEXPECTED);
@ -1221,7 +1221,7 @@ EditorEventListener::ShouldHandleNativeKeyBindings(
// unnecessary. IsAcceptableInputEvent currently makes a similar check for
// mouse events.
nsCOMPtr<nsIDOMEventTarget> target = aKeyboardEvent->GetDOMEventTarget();
nsIDOMEventTarget* target = aKeyboardEvent->GetDOMEventTarget();
nsCOMPtr<nsIContent> targetContent = do_QueryInterface(target);
if (!targetContent) {
return false;

View File

@ -407,7 +407,7 @@ HTMLEditor::GrabberClicked()
mMouseMotionListenerP = new ResizerMouseMotionListener(*this);
if (!mMouseMotionListenerP) {return NS_ERROR_NULL_POINTER;}
nsCOMPtr<nsIDOMEventTarget> piTarget = GetDOMEventTarget();
nsIDOMEventTarget* piTarget = GetDOMEventTarget();
NS_ENSURE_TRUE(piTarget, NS_ERROR_FAILURE);
rv = piTarget->AddEventListener(NS_LITERAL_STRING("mousemove"),

View File

@ -4533,7 +4533,7 @@ HTMLEditor::GetReturnInParagraphCreatesNewParagraph(bool* aCreatesNewParagraph)
return NS_OK;
}
already_AddRefed<nsIContent>
nsIContent*
HTMLEditor::GetFocusedContent()
{
nsFocusManager* fm = nsFocusManager::GetFocusManager();
@ -4549,8 +4549,7 @@ HTMLEditor::GetFocusedContent()
if (!focusedContent) {
// in designMode, nobody gets focus in most cases.
if (inDesignMode && OurWindowHasFocus()) {
nsCOMPtr<nsIContent> rootContent = document->GetRootElement();
return rootContent.forget();
return document->GetRootElement();
}
return nullptr;
}
@ -4558,7 +4557,7 @@ HTMLEditor::GetFocusedContent()
if (inDesignMode) {
return OurWindowHasFocus() &&
nsContentUtils::ContentIsDescendantOf(focusedContent, document) ?
focusedContent.forget() : nullptr;
focusedContent.get() : nullptr;
}
// We're HTML editor for contenteditable
@ -4570,7 +4569,7 @@ HTMLEditor::GetFocusedContent()
return nullptr;
}
// If our window is focused, we're focused.
return OurWindowHasFocus() ? focusedContent.forget() : nullptr;
return OurWindowHasFocus() ? focusedContent.get() : nullptr;
}
already_AddRefed<nsIContent>
@ -4656,7 +4655,7 @@ HTMLEditor::GetActiveEditingHost()
return content->GetEditingHost();
}
already_AddRefed<EventTarget>
EventTarget*
HTMLEditor::GetDOMEventTarget()
{
// Don't use getDocument here, because we have no way of knowing
@ -4664,7 +4663,7 @@ HTMLEditor::GetDOMEventTarget()
// ourselves, if it exists.
MOZ_ASSERT(IsInitialized(), "The HTMLEditor has not been initialized yet");
nsCOMPtr<mozilla::dom::EventTarget> target = GetDocument();
return target.forget();
return target;
}
bool

View File

@ -109,10 +109,10 @@ public:
NS_IMETHOD BeginningOfDocument() override;
virtual nsresult HandleKeyPressEvent(
WidgetKeyboardEvent* aKeyboardEvent) override;
virtual already_AddRefed<nsIContent> GetFocusedContent() override;
virtual nsIContent* GetFocusedContent() override;
virtual already_AddRefed<nsIContent> GetFocusedContentForIME() override;
virtual bool IsActiveInDOMWindow() override;
virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() override;
virtual dom::EventTarget* GetDOMEventTarget() override;
virtual Element* GetEditorRoot() override;
virtual already_AddRefed<nsIContent> FindSelectionRoot(
nsINode *aNode) override;

View File

@ -537,7 +537,7 @@ HTMLEditor::StartResizing(nsIDOMElement* aHandle)
return NS_ERROR_OUT_OF_MEMORY;
}
nsCOMPtr<nsIDOMEventTarget> target = GetDOMEventTarget();
nsIDOMEventTarget* target = GetDOMEventTarget();
NS_ENSURE_TRUE(target, NS_ERROR_FAILURE);
result = target->AddEventListener(NS_LITERAL_STRING("mousemove"),

View File

@ -1712,11 +1712,10 @@ TextEditor::SelectEntireDocument(Selection* aSelection)
return NS_OK;
}
already_AddRefed<EventTarget>
EventTarget*
TextEditor::GetDOMEventTarget()
{
nsCOMPtr<EventTarget> copy = mEventTarget;
return copy.forget();
return mEventTarget;
}

View File

@ -129,7 +129,7 @@ public:
virtual nsresult HandleKeyPressEvent(
WidgetKeyboardEvent* aKeyboardEvent) override;
virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() override;
virtual dom::EventTarget* GetDOMEventTarget() override;
virtual nsresult BeginIMEComposition(WidgetCompositionEvent* aEvent) override;
virtual nsresult UpdateIMEComposition(

View File

@ -1555,14 +1555,15 @@ public:
#ifdef MOZ_WIDGET_GTK
static already_AddRefed<ScaledFont>
CreateScaledFontForFontconfigFont(cairo_scaled_font_t* aScaledFont, FcPattern* aPattern,
const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize);
const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
bool aNeedsOblique = false);
#endif
#ifdef XP_DARWIN
static already_AddRefed<ScaledFont>
CreateScaledFontForMacFont(CGFontRef aCGFont, const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
const Color& aFontSmoothingBackgroundColor, bool aUseFontSmoothing = true,
bool aApplySyntheticBold = false);
bool aApplySyntheticBold = false, bool aNeedsOblique = false);
#endif
/**
@ -1728,6 +1729,7 @@ public:
Float aSize,
bool aUseEmbeddedBitmap,
bool aForceGDIMode,
bool aNeedsOblique,
IDWriteRenderingParams *aParams,
Float aGamma,
Float aContrast);

View File

@ -653,9 +653,10 @@ Factory::CreateScaledFontWithCairo(const NativeFont& aNativeFont,
#ifdef MOZ_WIDGET_GTK
already_AddRefed<ScaledFont>
Factory::CreateScaledFontForFontconfigFont(cairo_scaled_font_t* aScaledFont, FcPattern* aPattern,
const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize)
const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
bool aNeedsOblique)
{
return MakeAndAddRef<ScaledFontFontconfig>(aScaledFont, aPattern, aUnscaledFont, aSize);
return MakeAndAddRef<ScaledFontFontconfig>(aScaledFont, aPattern, aUnscaledFont, aSize, aNeedsOblique);
}
#endif
@ -666,12 +667,13 @@ Factory::CreateScaledFontForMacFont(CGFontRef aCGFont,
Float aSize,
const Color& aFontSmoothingBackgroundColor,
bool aUseFontSmoothing,
bool aApplySyntheticBold)
bool aApplySyntheticBold,
bool aNeedsOblique)
{
return MakeAndAddRef<ScaledFontMac>(
aCGFont, aUnscaledFont, aSize, false,
aFontSmoothingBackgroundColor, aUseFontSmoothing,
aApplySyntheticBold);
aApplySyntheticBold, aNeedsOblique);
}
#endif
@ -950,12 +952,13 @@ Factory::CreateScaledFontForDWriteFont(IDWriteFontFace* aFontFace,
float aSize,
bool aUseEmbeddedBitmap,
bool aForceGDIMode,
bool aNeedsOblique,
IDWriteRenderingParams* aParams,
Float aGamma,
Float aContrast)
{
return MakeAndAddRef<ScaledFontDWrite>(aFontFace, aUnscaledFont, aSize,
aUseEmbeddedBitmap, aForceGDIMode,
aUseEmbeddedBitmap, aForceGDIMode, aNeedsOblique,
aParams, aGamma, aContrast,
aStyle);
}

View File

@ -110,6 +110,7 @@ ScaledFontDWrite::ScaledFontDWrite(IDWriteFontFace *aFontFace,
Float aSize,
bool aUseEmbeddedBitmap,
bool aForceGDIMode,
bool aNeedsOblique,
IDWriteRenderingParams* aParams,
Float aGamma,
Float aContrast,
@ -118,6 +119,7 @@ ScaledFontDWrite::ScaledFontDWrite(IDWriteFontFace *aFontFace,
, mFontFace(aFontFace)
, mUseEmbeddedBitmap(aUseEmbeddedBitmap)
, mForceGDIMode(aForceGDIMode)
, mNeedsOblique(aNeedsOblique)
, mParams(aParams)
, mGamma(aGamma)
, mContrast(aContrast)
@ -404,6 +406,9 @@ ScaledFontDWrite::GetWRFontInstanceOptions(Maybe<wr::FontInstanceOptions>* aOutO
if (ForceGDIMode()) {
options.flags |= wr::FontInstanceFlags::FORCE_GDI;
}
if (mNeedsOblique) {
options.flags |= wr::FontInstanceFlags::SYNTHETIC_ITALICS;
}
options.bg_color = wr::ToColorU(Color());
*aOutOptions = Some(options);
return true;
@ -427,6 +432,7 @@ UnscaledFontDWrite::CreateScaledFont(Float aGlyphSize,
new ScaledFontDWrite(mFontFace, this, aGlyphSize,
instanceData->mUseEmbeddedBitmap,
instanceData->mForceGDIMode,
false,
nullptr,
instanceData->mGamma,
instanceData->mContrast);

View File

@ -30,6 +30,7 @@ public:
, mFontFace(aFont)
, mUseEmbeddedBitmap(false)
, mForceGDIMode(false)
, mNeedsOblique(false)
, mGamma(2.2f)
, mContrast(1.0f)
{}
@ -39,6 +40,7 @@ public:
Float aSize,
bool aUseEmbeddedBitmap,
bool aForceGDIMode,
bool aNeedsOblique,
IDWriteRenderingParams *aParams,
Float aGamma,
Float aContrast,
@ -74,6 +76,7 @@ public:
RefPtr<IDWriteFontFace> mFontFace;
bool mUseEmbeddedBitmap;
bool mForceGDIMode;
bool mNeedsOblique;
// DrawTargetD2D1 requires the IDWriteRenderingParams,
// but we also separately need to store the gamma and contrast
// since Skia needs to be able to access these without having

View File

@ -25,9 +25,11 @@ namespace gfx {
ScaledFontFontconfig::ScaledFontFontconfig(cairo_scaled_font_t* aScaledFont,
FcPattern* aPattern,
const RefPtr<UnscaledFont>& aUnscaledFont,
Float aSize)
: ScaledFontBase(aUnscaledFont, aSize),
mPattern(aPattern)
Float aSize,
bool aNeedsOblique)
: ScaledFontBase(aUnscaledFont, aSize)
, mPattern(aPattern)
, mNeedsOblique(aNeedsOblique)
{
SetCairoScaledFont(aScaledFont);
FcPatternReference(aPattern);
@ -248,6 +250,10 @@ ScaledFontFontconfig::GetWRFontInstanceOptions(Maybe<wr::FontInstanceOptions>* a
platformOptions.lcd_filter = wr::FontLCDFilter::Legacy;
platformOptions.hinting = wr::FontHinting::Normal;
if (mNeedsOblique) {
options.flags |= wr::FontInstanceFlags::SYNTHETIC_ITALICS;
}
FcBool autohint;
if (FcPatternGetBool(mPattern, FC_AUTOHINT, 0, &autohint) == FcResultMatch && autohint) {
options.flags |= wr::FontInstanceFlags::FORCE_AUTOHINT;

View File

@ -22,7 +22,8 @@ class ScaledFontFontconfig : public ScaledFontBase
public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ScaledFontFontconfig, override)
ScaledFontFontconfig(cairo_scaled_font_t* aScaledFont, FcPattern* aPattern,
const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize);
const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
bool aNeedsOblique = false);
~ScaledFontFontconfig();
FontType GetType() const override { return FontType::FONTCONFIG; }
@ -75,6 +76,7 @@ private:
NativeFontResource* aNativeFontResource = nullptr);
FcPattern* mPattern;
bool mNeedsOblique;
};
}

View File

@ -111,12 +111,14 @@ ScaledFontMac::ScaledFontMac(CGFontRef aFont,
bool aOwnsFont,
const Color &aFontSmoothingBackgroundColor,
bool aUseFontSmoothing,
bool aApplySyntheticBold)
bool aApplySyntheticBold,
bool aNeedsOblique)
: ScaledFontBase(aUnscaledFont, aSize)
, mFont(aFont)
, mFontSmoothingBackgroundColor(aFontSmoothingBackgroundColor)
, mUseFontSmoothing(aUseFontSmoothing)
, mApplySyntheticBold(aApplySyntheticBold)
, mNeedsOblique(aNeedsOblique)
{
if (!sSymbolLookupDone) {
CTFontDrawGlyphsPtr =
@ -418,6 +420,9 @@ ScaledFontMac::GetWRFontInstanceOptions(Maybe<wr::FontInstanceOptions>* aOutOpti
if (mApplySyntheticBold) {
options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
}
if (mNeedsOblique) {
options.flags |= wr::FontInstanceFlags::SYNTHETIC_ITALICS;
}
options.bg_color = wr::ToColorU(mFontSmoothingBackgroundColor);
*aOutOptions = Some(options);
return true;

View File

@ -28,7 +28,9 @@ public:
ScaledFontMac(CGFontRef aFont, const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
bool aOwnsFont = false,
const Color &aFontSmoothingBackgroundColor = Color(),
bool aUseFontSmoothing = true, bool aApplySyntheticBold = false);
bool aUseFontSmoothing = true,
bool aApplySyntheticBold = false,
bool aNeedsOblique = false);
~ScaledFontMac();
FontType GetType() const override { return FontType::MAC; }
@ -58,6 +60,7 @@ private:
Color mFontSmoothingBackgroundColor;
bool mUseFontSmoothing;
bool mApplySyntheticBold;
bool mNeedsOblique;
typedef void (CTFontDrawGlyphsFuncT)(CTFontRef,
const CGGlyph[], const CGPoint[],

View File

@ -555,10 +555,14 @@ Renderer11::Renderer11(egl::Display *display)
ASSERT(mEGLDevice != nullptr);
mCreatedWithDeviceEXT = true;
const auto &attributes = mDisplay->getAttributeMap();
const EGLenum presentPath = static_cast<EGLenum>(attributes.get(
EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE));
mPresentPathFastEnabled = (presentPath == EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE);
// Also set EGL_PLATFORM_ANGLE_ANGLE variables, in case they're used elsewhere in ANGLE
// mAvailableFeatureLevels defaults to empty
mRequestedDriverType = D3D_DRIVER_TYPE_UNKNOWN;
mPresentPathFastEnabled = false;
}
// The D3D11 renderer must choose the D3D9 debug annotator because the D3D11 interface

View File

@ -20,7 +20,10 @@
#include "nsIGfxInfo.h"
#include "nsPrintfCString.h"
#ifdef XP_WIN
#include "mozilla/gfx/DeviceManagerDx.h"
#include "nsWindowsHelpers.h"
#include <d3d11.h>
#endif
#include "OGLShaderProgram.h"
#include "prenv.h"
@ -149,16 +152,26 @@ GetAndInitWARPDisplay(GLLibraryEGL& egl, void* displayType)
static EGLDisplay
GetAndInitDisplayForWebRender(GLLibraryEGL& egl, void* displayType)
{
const EGLint attrib_list[] = { LOCAL_EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
LOCAL_EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE,
LOCAL_EGL_PLATFORM_ANGLE_TYPE_ANGLE,
LOCAL_EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
LOCAL_EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE,
#ifdef XP_WIN
const EGLint attrib_list[] = { LOCAL_EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE,
LOCAL_EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE,
LOCAL_EGL_NONE };
EGLDisplay display = egl.fGetPlatformDisplayEXT(LOCAL_EGL_PLATFORM_ANGLE_ANGLE,
displayType,
attrib_list);
RefPtr<ID3D11Device> d3d11Device = gfx::DeviceManagerDx::Get()->GetCompositorDevice();
if (!d3d11Device) {
gfxCriticalNote << "Failed to get compositor device for EGLDisplay";
return EGL_NO_DISPLAY;
}
EGLDeviceEXT eglDevice = egl.fCreateDeviceANGLE(LOCAL_EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(d3d11Device.get()), nullptr);
if (!eglDevice) {
gfxCriticalNote << "Failed to get EGLDeviceEXT of D3D11Device";
return EGL_NO_DISPLAY;
}
// Create an EGLDisplay using the EGLDevice
EGLDisplay display = egl.fGetPlatformDisplayEXT(LOCAL_EGL_PLATFORM_DEVICE_EXT, eglDevice, attrib_list);
if (!display) {
gfxCriticalNote << "Failed to get EGLDisplay of D3D11Device";
return EGL_NO_DISPLAY;
}
if (display == EGL_NO_DISPLAY) {
const EGLint err = egl.fGetError();
@ -169,10 +182,13 @@ GetAndInitDisplayForWebRender(GLLibraryEGL& egl, void* displayType)
return EGL_NO_DISPLAY;
}
if (!egl.fInitialize(display, nullptr, nullptr))
if (!egl.fInitialize(display, nullptr, nullptr)) {
return EGL_NO_DISPLAY;
}
return display;
#else
return EGL_NO_DISPLAY;
#endif
}
static bool
@ -492,6 +508,16 @@ GLLibraryEGL::EnsureInitialized(bool forceAccel, nsACString* const out_failureId
gfxCriticalError() << "Failed to load ANGLE symbols!";
return false;
}
MOZ_ASSERT(IsExtensionSupported(ANGLE_platform_angle_d3d));
const GLLibraryLoader::SymLoadStruct createDeviceSymbols[] = {
SYMBOL(CreateDeviceANGLE),
SYMBOL(ReleaseDeviceANGLE),
END_OF_SYMBOLS
};
if (!fnLoadSymbols(createDeviceSymbols)) {
NS_ERROR("EGL supports ANGLE_device_creation without exposing its functions!");
MarkExtensionUnsupported(ANGLE_device_creation);
}
}
if (IsExtensionSupported(ANGLE_platform_angle_d3d)) {
@ -683,18 +709,6 @@ GLLibraryEGL::EnsureInitialized(bool forceAccel, nsACString* const out_failureId
}
}
if (IsExtensionSupported(ANGLE_device_creation)) {
const GLLibraryLoader::SymLoadStruct createDeviceSymbols[] = {
SYMBOL(CreateDeviceANGLE),
SYMBOL(ReleaseDeviceANGLE),
END_OF_SYMBOLS
};
if (!fnLoadSymbols(createDeviceSymbols)) {
NS_ERROR("EGL supports ANGLE_device_creation without exposing its functions!");
MarkExtensionUnsupported(ANGLE_device_creation);
}
}
mInitialized = true;
reporter.SetSuccessful();
return true;

View File

@ -77,19 +77,10 @@ gfxDWriteFont::gfxDWriteFont(const RefPtr<UnscaledFontDWrite>& aUnscaledFont,
, mCairoFontFace(nullptr)
, mMetrics(nullptr)
, mSpaceGlyph(0)
, mNeedsOblique(false)
, mNeedsBold(aNeedsBold)
, mUseSubpixelPositions(false)
, mAllowManualShowGlyphs(true)
{
if ((GetStyle()->style != NS_FONT_STYLE_NORMAL) &&
aFontEntry->IsUpright() &&
GetStyle()->allowSyntheticStyle) {
// For this we always use the font_matrix for uniformity. Not the
// DWrite simulation.
mNeedsOblique = true;
}
mFontFace = aUnscaledFont->GetFontFace();
// If the IDWriteFontFace1 interface is available, we can use that for
@ -695,6 +686,7 @@ gfxDWriteFont::GetScaledFont(mozilla::gfx::DrawTarget *aTarget)
GetAdjustedSize(),
useEmbeddedBitmap,
forceGDI,
IsSyntheticOblique(),
params,
params->GetGamma(),
params->GetEnhancedContrast());

View File

@ -101,7 +101,6 @@ protected:
uint32_t mSpaceGlyph;
bool mNeedsOblique;
bool mNeedsBold;
bool mUseSubpixelPositions;
bool mAllowManualShowGlyphs;

View File

@ -1308,7 +1308,8 @@ gfxFontconfigFont::GetScaledFont(mozilla::gfx::DrawTarget *aTarget)
Factory::CreateScaledFontForFontconfigFont(GetCairoScaledFont(),
GetPattern(),
GetUnscaledFont(),
GetAdjustedSize());
GetAdjustedSize(),
IsSyntheticOblique());
}
RefPtr<ScaledFont> scaledFont(mAzureScaledFont);

View File

@ -1916,12 +1916,14 @@ gfxFont::DrawOneGlyph(uint32_t aGlyphID, const gfx::Point& aPt,
gfx::Point devPt(ToDeviceUnits(aPt.x, runParams.devPerApp),
ToDeviceUnits(aPt.y, runParams.devPerApp));
gfxContextMatrixAutoSaveRestore matrixRestore;
if (FC == FontComplexityT::ComplexFont) {
const FontDrawParams& fontParams(aBuffer.mFontParams);
if (fontParams.needsOblique && fontParams.isVerticalFont) {
auto* textDrawer = runParams.context->GetTextDrawer();
gfxContextMatrixAutoSaveRestore matrixRestore;
if (fontParams.needsOblique && fontParams.isVerticalFont && !textDrawer) {
// We have to flush each glyph individually when doing
// synthetic-oblique for vertical-upright text, because
// the skew transform needs to be applied to a separate
@ -1958,12 +1960,9 @@ gfxFont::DrawOneGlyph(uint32_t aGlyphID, const gfx::Point& aPt,
aGlyphID)) {
return;
}
}
aBuffer.OutputGlyph(aGlyphID, devPt);
aBuffer.OutputGlyph(aGlyphID, devPt);
if (FC == FontComplexityT::ComplexFont) {
const FontDrawParams& fontParams(aBuffer.mFontParams);
// Synthetic bolding (if required) by multi-striking.
for (int32_t i = 0; i < fontParams.extraStrikes; ++i) {
if (fontParams.isVerticalFont) {
@ -1974,9 +1973,11 @@ gfxFont::DrawOneGlyph(uint32_t aGlyphID, const gfx::Point& aPt,
aBuffer.OutputGlyph(aGlyphID, devPt);
}
if (fontParams.needsOblique && fontParams.isVerticalFont) {
if (fontParams.needsOblique && fontParams.isVerticalFont && !textDrawer) {
aBuffer.Flush();
}
} else {
aBuffer.OutputGlyph(aGlyphID, devPt);
}
*aEmittedGlyphs = true;
@ -1992,7 +1993,8 @@ gfxFont::DrawMissingGlyph(const TextRunDrawParams& aRunParams,
// we don't have to draw the hexbox for them.
float advance = aDetails->mAdvance;
if (aRunParams.drawMode != DrawMode::GLYPH_PATH && advance > 0) {
if (auto* textDrawer = aRunParams.context->GetTextDrawer()) {
auto* textDrawer = aRunParams.context->GetTextDrawer();
if (textDrawer) {
textDrawer->FoundUnsupportedFeature();
return false;
}
@ -2012,7 +2014,7 @@ gfxFont::DrawMissingGlyph(const TextRunDrawParams& aRunParams,
// of the drawTarget's transform, we need to undo
// this before drawing the hexbox. (Bug 983985)
gfxContextMatrixAutoSaveRestore matrixRestore;
if (aFontParams.needsOblique && !aFontParams.isVerticalFont) {
if (aFontParams.needsOblique && !aFontParams.isVerticalFont && !textDrawer) {
matrixRestore.SetContext(aRunParams.context);
gfx::Matrix mat =
aRunParams.context->CurrentMatrix().
@ -2096,12 +2098,10 @@ gfxFont::Draw(const gfxTextRun *aTextRun, uint32_t aStart, uint32_t aEnd,
auto* textDrawer = aRunParams.context->GetTextDrawer();
fontParams.needsOblique = mFontEntry->IsUpright() &&
mStyle.style != NS_FONT_STYLE_NORMAL &&
mStyle.allowSyntheticStyle;
fontParams.needsOblique = IsSyntheticOblique();
fontParams.haveSVGGlyphs = GetFontEntry()->TryGetSVGData(this);
if ((fontParams.needsOblique || fontParams.haveSVGGlyphs) && textDrawer) {
if (fontParams.haveSVGGlyphs && textDrawer) {
textDrawer->FoundUnsupportedFeature();
return;
}
@ -2156,7 +2156,7 @@ gfxFont::Draw(const gfxTextRun *aTextRun, uint32_t aStart, uint32_t aEnd,
aRunParams.context->SetMatrixDouble(mat);
}
if (fontParams.needsOblique && !fontParams.isVerticalFont) {
if (fontParams.needsOblique && !fontParams.isVerticalFont && !textDrawer) {
// Adjust matrix for synthetic-oblique, except if we're doing vertical-
// upright text, in which case this will be handled for each glyph
// individually in DrawOneGlyph.

View File

@ -1794,6 +1794,12 @@ public:
bool IsSyntheticBold() { return mApplySyntheticBold; }
bool IsSyntheticOblique() {
return mFontEntry->IsUpright() &&
mStyle.style != NS_FONT_STYLE_NORMAL &&
mStyle.allowSyntheticStyle;
}
// Amount by which synthetic bold "fattens" the glyphs:
// For size S up to a threshold size T, we use (0.25 + 3S / 4T),
// so that the result ranges from 0.25 to 1.0; thereafter,

View File

@ -509,7 +509,8 @@ gfxMacFont::GetScaledFont(DrawTarget *aTarget)
GetAdjustedSize(),
Color::FromABGR(mFontSmoothingBackgroundColor),
!mStyle.useGrayscaleAntialiasing,
IsSyntheticBold());
IsSyntheticBold(),
IsSyntheticOblique());
if (!mAzureScaledFont) {
return nullptr;
}

View File

@ -471,10 +471,12 @@ class MethodDecl(Node):
def __init__(self, name, params=[ ], ret=Type('void'),
virtual=0, const=0, pure=0, static=0, warn_unused=0,
inline=0, force_inline=0, never_inline=0,
typeop=None,
typeop=None, override=0,
T=None):
assert not (virtual and static)
assert not pure or virtual # pure => virtual
assert not override or virtual # override => virtual
assert not (override and pure)
assert not (static and typeop)
assert not (name and typeop)
assert name is None or isinstance(name, str)
@ -494,6 +496,7 @@ class MethodDecl(Node):
self.virtual = virtual # bool
self.const = const # bool
self.pure = pure # bool
self.override = override # bool
self.static = static # bool
self.warn_unused = warn_unused # bool
self.force_inline = (force_inline or T) # bool
@ -511,6 +514,7 @@ class MethodDecl(Node):
virtual=self.virtual,
const=self.const,
pure=self.pure,
override=self.override,
static=self.static,
warn_unused=self.warn_unused,
inline=self.inline,
@ -555,7 +559,7 @@ class ConstructorDefn(MethodDefn):
self.memberinits = memberinits
class DestructorDecl(MethodDecl):
def __init__(self, name, virtual=0, force_inline=0, inline=0):
def __init__(self, name, virtual=0, override=0, force_inline=0, inline=0):
MethodDecl.__init__(self, name, params=[ ], ret=None,
virtual=virtual,
force_inline=force_inline, inline=inline)

View File

@ -192,6 +192,9 @@ class CxxCodeGen(CodePrinter, Visitor):
def visitMethodDecl(self, md):
assert not (md.static and md.virtual)
assert not (md.override and md.pure)
assert not md.pure or md.virtual # pure => virtual
assert not md.override or md.virtual # override => virtual
if md.T:
self.write('template<')
@ -208,7 +211,7 @@ class CxxCodeGen(CodePrinter, Visitor):
self.write('MOZ_NEVER_INLINE ')
if md.static:
self.write('static ')
if md.virtual:
if md.virtual and not md.override:
self.write('virtual ')
if md.ret:
if md.only_for_definition:
@ -232,6 +235,9 @@ class CxxCodeGen(CodePrinter, Visitor):
if md.ret and md.only_for_definition:
self.write(' -> ')
md.ret.accept(self)
if md.override:
self.write(' override')
if md.pure:
self.write(' = 0')

View File

@ -2787,23 +2787,23 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
MethodDecl(p.processingErrorVar().name,
params=[ Param(_Result.Type(), 'aCode'),
Param(Type('char', const=1, ptr=1), 'aReason') ],
virtual=1))
virtual=1, override=1))
# bool ShouldContinueFromReplyTimeout(); default to |true|
shouldcontinue = MethodDefn(
MethodDecl(p.shouldContinueFromTimeoutVar().name,
ret=Type.BOOL, virtual=1))
ret=Type.BOOL, virtual=1, override=1))
shouldcontinue.addstmt(StmtReturn.TRUE)
# void Entered*()/Exited*(); default to no-op
entered = MethodDefn(
MethodDecl(p.enteredCxxStackVar().name, virtual=1))
MethodDecl(p.enteredCxxStackVar().name, virtual=1, override=1))
exited = MethodDefn(
MethodDecl(p.exitedCxxStackVar().name, virtual=1))
MethodDecl(p.exitedCxxStackVar().name, virtual=1, override=1))
enteredcall = MethodDefn(
MethodDecl(p.enteredCallVar().name, virtual=1))
MethodDecl(p.enteredCallVar().name, virtual=1, override=1))
exitedcall = MethodDefn(
MethodDecl(p.exitedCallVar().name, virtual=1))
MethodDecl(p.exitedCallVar().name, virtual=1, override=1))
self.cls.addstmts([ processingerror,
shouldcontinue,
@ -2948,7 +2948,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
params.append(Decl(Type('Message', ref=1, ptr=1),
replyvar.name))
method = MethodDefn(MethodDecl(name, virtual=True,
method = MethodDefn(MethodDecl(name, virtual=1, override=1,
params=params, ret=_Result.Type()))
if not switch:
@ -3028,13 +3028,13 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
# int32_t GetProtocolTypeId() { return PFoo; }
gettypetag = MethodDefn(
MethodDecl('GetProtocolTypeId', ret=_actorTypeTagType()))
MethodDecl('GetProtocolTypeId', ret=_actorTypeTagType(), virtual=1, override=1))
gettypetag.addstmt(StmtReturn(_protocolId(ptype)))
self.cls.addstmts([ gettypetag, Whitespace.NL ])
if ptype.isToplevel():
# OnChannelClose()
onclose = MethodDefn(MethodDecl('OnChannelClose'))
onclose = MethodDefn(MethodDecl('OnChannelClose', virtual=1, override=1))
onclose.addstmts([
StmtExpr(ExprCall(destroysubtreevar,
args=[ _DestroyReason.NormalShutdown ])),
@ -3045,7 +3045,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
self.cls.addstmts([ onclose, Whitespace.NL ])
# OnChannelError()
onerror = MethodDefn(MethodDecl('OnChannelError'))
onerror = MethodDefn(MethodDecl('OnChannelError', virtual=1, override=1))
onerror.addstmts([
StmtExpr(ExprCall(destroysubtreevar,
args=[ _DestroyReason.AbnormalShutdown ])),
@ -3079,7 +3079,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
actorname = _actorName(p.name, self.side)
protocolname = MethodDefn(MethodDecl(
'ProtocolName', params=[],
const=1, virtual=1, ret=Type('char', const=1, ptr=1)))
const=1, virtual=1, override=1, ret=Type('char', const=1, ptr=1)))
protocolname.addstmts([
StmtReturn(ExprLiteral.String(actorname))
])
@ -3242,13 +3242,13 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
getchannel = MethodDefn(MethodDecl(
p.getChannelMethod().name,
ret=Type('MessageChannel', ptr=1),
virtual=1))
virtual=1, override=1))
getchannel.addstmt(StmtReturn(ExprAddrOf(p.channelVar())))
getchannelconst = MethodDefn(MethodDecl(
p.getChannelMethod().name,
ret=Type('MessageChannel', ptr=1, const=1),
virtual=1, const=1))
virtual=1, override=1, const=1))
getchannelconst.addstmt(StmtReturn(ExprAddrOf(p.channelVar())))
methods += [ getchannel,
@ -3296,7 +3296,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
p.removeManageeMethod().name,
params=[ Decl(_protocolIdType(), pvar.name),
Decl(protocolbase, listenervar.name) ],
virtual=1))
virtual=1, override=1))
if not len(p.managesStmts):
removemanagee.addstmts([ _fatalError('unreached'), StmtReturn() ])
@ -4893,6 +4893,7 @@ def _splitMethodDefn(md, clsname):
saveddecl = deepcopy(md.decl)
md.decl.name = (clsname +'::'+ md.decl.name)
md.decl.virtual = 0
md.decl.override = 0
md.decl.static = 0
md.decl.warn_unused = 0
md.decl.never_inline = 0

View File

@ -553,6 +553,19 @@ WasmThreadsSupported(JSContext* cx, unsigned argc, Value* vp)
return true;
}
static bool
WasmSignExtensionSupported(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
bool isSupported = true;
#else
bool isSupported = false;
#endif
args.rval().setBoolean(isSupported);
return true;
}
static bool
WasmCompileMode(JSContext* cx, unsigned argc, Value* vp)
{
@ -2527,7 +2540,7 @@ testingFunc_inIon(JSContext* cx, unsigned argc, Value* vp)
ScriptFrameIter iter(cx);
if (!iter.done() && iter.isIon()) {
// Reset the counter of the IonScript's script.
jit::JSJitFrameIter jitIter(cx);
jit::JSJitFrameIter jitIter(cx->activation()->asJit());
++jitIter;
jitIter.script()->resetWarmUpResetCounter();
} else {
@ -5259,6 +5272,11 @@ gc::ZealModeHelpText),
JS_FN_HELP("wasmThreadsSupported", WasmThreadsSupported, 0, 0,
"wasmThreadsSupported()",
" Returns a boolean indicating whether the WebAssembly threads proposal is\n"
" supported on the current device."),
JS_FN_HELP("wasmSignExtensionSupported", WasmSignExtensionSupported, 0, 0,
"wasmSignExtensionSupported()",
" Returns a boolean indicating whether the WebAssembly sign extension opcodes are\n"
" supported on the current device."),
JS_FN_HELP("wasmCompileMode", WasmCompileMode, 0, 0,

View File

@ -570,3 +570,16 @@ for (let addr of [1,2,3,5,6,7]) {
(atomic.wake (get_local 0) (i32.const 1))))`).exports.f(addr),
RuntimeError, unaligned);
}
// Ensure alias analysis works even if atomic and non-atomic accesses are
// mixed.
assertErrorMessage(() => wasmEvalText(`(module
(memory 0 1 shared)
(func (export "main")
i32.const 1
i32.const 2816
i32.atomic.rmw16_u.xchg align=2
i32.load16_s offset=83 align=1
drop
)
)`).exports.main(), RuntimeError, unaligned);

View File

@ -238,7 +238,7 @@ testTrap('i64', 'trunc_u', 'f32', "-infinity");
testConversion('i64', 'reinterpret', 'f64', 40.09999999999968, "0x40440ccccccccca0");
testConversion('f64', 'reinterpret', 'i64', "0x40440ccccccccca0", 40.09999999999968);
if (wasmThreadsSupported()) {
if (wasmSignExtensionSupported()) {
testSignExtension('i32', 'extend8_s', 'i32', 0x7F, 0x7F);
testSignExtension('i32', 'extend8_s', 'i32', 0x80, -0x80);
testSignExtension('i32', 'extend16_s', 'i32', 0x7FFF, 0x7FFF);

View File

@ -0,0 +1,20 @@
g = newGlobal();
g.parent = this;
g.eval("(" + function() {
Debugger(parent).onExceptionUnwind = function(frame) {}
} + ")()")
o = {};
let { exports } = wasmEvalText(`
(module (import $imp "" "inc") (func) (func $start (call $imp)) (start $start) (export "" $start))
`, {
"": {
inc: function() { o = o.p; }
}
});
// after instanciation, the start function has been executed and o is undefined.
// This second call will throw in the imported function:
assertErrorMessage(exports[""], TypeError, /undefined/);

View File

@ -144,6 +144,7 @@ GetObject(const MDefinition* ins)
case MDefinition::Opcode::WasmStore:
case MDefinition::Opcode::WasmCompareExchangeHeap:
case MDefinition::Opcode::WasmAtomicBinopHeap:
case MDefinition::Opcode::WasmAtomicExchangeHeap:
case MDefinition::Opcode::WasmLoadGlobalVar:
case MDefinition::Opcode::WasmStoreGlobalVar:
case MDefinition::Opcode::ArrayJoin:

View File

@ -1900,7 +1900,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo* bailoutInfo)
RootedScript outerScript(cx, nullptr);
MOZ_ASSERT(cx->currentlyRunningInJit());
JSJitFrameIter iter(cx);
JSJitFrameIter iter(cx->activation()->asJit());
uint8_t* outerFp = nullptr;
// Iter currently points at the exit frame. Get the previous frame
@ -1962,7 +1962,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo* bailoutInfo)
// on.
JitActivation* act = cx->activation()->asJit();
if (act->hasRematerializedFrame(outerFp)) {
JSJitFrameIter iter(cx);
JSJitFrameIter iter(cx->activation()->asJit());
size_t inlineDepth = numFrames;
bool ok = true;
while (inlineDepth > 0) {

View File

@ -1186,7 +1186,7 @@ JitRuntime::generateBaselineDebugModeOSRHandler(JSContext* cx, uint32_t* noFrame
/* static */ void
DebugModeOSRVolatileJitFrameIter::forwardLiveIterators(const CooperatingContext& cx,
uint8_t* oldAddr, uint8_t* newAddr)
uint8_t* oldAddr, uint8_t* newAddr)
{
DebugModeOSRVolatileJitFrameIter* iter;
for (iter = cx.context()->liveVolatileJitFrameIter_; iter; iter = iter->prev)

View File

@ -93,7 +93,7 @@ class DebugModeOSRVolatileJitFrameIter : public JitFrameIter
public:
explicit DebugModeOSRVolatileJitFrameIter(JSContext* cx)
: JitFrameIter(cx->activation()->asJit())
: JitFrameIter(cx->activation()->asJit(), /* mustUnwindActivation */ true)
{
stack = &cx->liveVolatileJitFrameIter_.ref();
prev = *stack;

View File

@ -142,7 +142,7 @@ BaselineFrame::initForOsr(InterpreterFrame* fp, uint32_t numStackValues)
// debugger, wants a valid return address, but it's okay to just pick one.
// In debug mode there's always at least 1 ICEntry (since there are always
// debug prologue/epilogue calls).
JSJitFrameIter frame(cx);
JSJitFrameIter frame(cx->activation()->asJit());
MOZ_ASSERT(frame.returnAddress() == nullptr);
BaselineScript* baseline = fp->script()->baselineScript();
frame.current()->setReturnAddress(baseline->returnAddressForIC(baseline->icEntry(0)));

View File

@ -327,7 +327,7 @@ CacheRegisterAllocator::restoreIonLiveRegisters(MacroAssembler& masm, LiveRegist
static void*
GetReturnAddressToIonCode(JSContext* cx)
{
JSJitFrameIter frame(cx);
JSJitFrameIter frame(cx->activation()->asJit());
MOZ_ASSERT(frame.type() == JitFrame_Exit,
"An exit frame is expected as update functions are called with a VMFunction.");

View File

@ -31,11 +31,6 @@ JSJitFrameIter::JSJitFrameIter(const JitActivation* activation)
}
}
JSJitFrameIter::JSJitFrameIter(JSContext* cx)
: JSJitFrameIter(cx->activation()->asJit())
{
}
bool
JSJitFrameIter::checkInvalidation() const
{

View File

@ -112,7 +112,6 @@ class JSJitFrameIter
public:
// See comment above the class.
explicit JSJitFrameIter(const JitActivation* activation);
explicit JSJitFrameIter(JSContext* cx);
// Used only by DebugModeOSRVolatileJitFrameIter.
void exchangeReturnAddressIfMatch(uint8_t* oldAddr, uint8_t* newAddr) {

View File

@ -29,7 +29,7 @@ SafepointIndex::resolve()
inline BaselineFrame*
GetTopBaselineFrame(JSContext* cx)
{
JSJitFrameIter frame(cx);
JSJitFrameIter frame(cx->activation()->asJit());
MOZ_ASSERT(frame.type() == JitFrame_Exit);
++frame;
if (frame.isBaselineStub())

View File

@ -591,10 +591,7 @@ struct AutoResetLastProfilerFrameOnReturnFromException
void
HandleExceptionWasm(JSContext* cx, wasm::WasmFrameIter* iter, ResumeFromException* rfe)
{
// Maintain the wasm invariant that we have wasm frames when unwinding.
JitActivation* act = cx->activation()->asJit();
act->setWasmExitFP((const wasm::Frame*) act->jsExitFP());
MOZ_ASSERT(cx->activation()->asJit()->hasWasmExitFP());
rfe->kind = ResumeFromException::RESUME_WASM;
rfe->framePointer = (uint8_t*) wasm::FailFP;
rfe->stackPointer = (uint8_t*) wasm::HandleThrow(cx, *iter);
@ -736,19 +733,8 @@ HandleException(ResumeFromException* rfe)
return;
}
JitFrameLayout* current = frame.isScripted() ? frame.jsFrame() : nullptr;
++iter;
if (current) {
// Unwind the frame by updating packedExitFP. This is necessary so
// that (1) debugger exception unwind and leave frame hooks don't
// see this frame when they use ScriptFrameIter, and (2)
// ScriptFrameIter does not crash when accessing an IonScript
// that's destroyed by the ionScript->decref call.
EnsureBareExitFrame(cx, current);
}
if (overrecursed) {
// We hit an overrecursion error during bailout. Report it now.
ReportOverRecursed(cx);
@ -763,11 +749,11 @@ HandleException(ResumeFromException* rfe)
// Turns a JitFrameLayout into an ExitFrameLayout. Note that it has to be a
// bare exit frame so it's ignored by TraceJitExitFrame.
void
EnsureBareExitFrame(JSContext* cx, JitFrameLayout* frame)
EnsureBareExitFrame(JitActivation* act, JitFrameLayout* frame)
{
ExitFrameLayout* exitFrame = reinterpret_cast<ExitFrameLayout*>(frame);
if (cx->activation()->asJit()->jsExitFP() == (uint8_t*)frame) {
if (act->jsExitFP() == (uint8_t*)frame) {
// If we already called this function for the current frame, do
// nothing.
MOZ_ASSERT(exitFrame->isBareExit());
@ -775,17 +761,17 @@ EnsureBareExitFrame(JSContext* cx, JitFrameLayout* frame)
}
#ifdef DEBUG
JSJitFrameIter iter(cx);
JSJitFrameIter iter(act);
while (!iter.isScripted())
++iter;
MOZ_ASSERT(iter.current() == frame, "|frame| must be the top JS frame");
MOZ_ASSERT(!!cx->activation()->asJit()->jsExitFP());
MOZ_ASSERT((uint8_t*)exitFrame->footer() >= cx->activation()->asJit()->jsExitFP(),
MOZ_ASSERT(!!act->jsExitFP());
MOZ_ASSERT((uint8_t*)exitFrame->footer() >= act->jsExitFP(),
"Must have space for ExitFooterFrame before jsExitFP");
#endif
cx->activation()->asJit()->setJSExitFP((uint8_t*)frame);
act->setJSExitFP((uint8_t*)frame);
exitFrame->footer()->setBareExitFrame();
MOZ_ASSERT(exitFrame->isBareExit());
}

View File

@ -284,7 +284,7 @@ struct ResumeFromException
void HandleException(ResumeFromException* rfe);
void EnsureBareExitFrame(JSContext* cx, JitFrameLayout* frame);
void EnsureBareExitFrame(JitActivation* act, JitFrameLayout* frame);
void TraceJitActivations(JSContext* cx, const CooperatingContext& target, JSTracer* trc);
@ -312,7 +312,7 @@ MakeFrameDescriptor(uint32_t frameSize, FrameType type, uint32_t headerSize)
inline JSScript*
GetTopJitJSScript(JSContext* cx)
{
JSJitFrameIter frame(cx);
JSJitFrameIter frame(cx->activation()->asJit());
MOZ_ASSERT(frame.type() == JitFrame_Exit);
++frame;
@ -532,11 +532,6 @@ class ExitFrameLayout : public CommonFrameLayout
}
public:
// Pushed for "bare" fake exit frames that have no GC things on stack to be
// traced.
static ExitFrameType BareType() { return ExitFrameType::Bare; }
static ExitFrameType VMFunctionType() { return ExitFrameType::VMFunction; }
static inline size_t Size() {
return sizeof(ExitFrameLayout);
}

View File

@ -391,7 +391,7 @@ ArrayPushDense(JSContext* cx, HandleArrayObject arr, HandleValue v, uint32_t* le
// possible the setOrExtendDenseElements call already invalidated the
// IonScript. JSJitFrameIter::ionScript works when the script is invalidated
// so we use that instead.
JSJitFrameIter frame(cx);
JSJitFrameIter frame(cx->activation()->asJit());
MOZ_ASSERT(frame.type() == JitFrame_Exit);
++frame;
IonScript* ionScript = frame.ionScript();
@ -872,7 +872,7 @@ DebugEpilogue(JSContext* cx, BaselineFrame* frame, jsbytecode* pc, bool ok)
// Pop this frame by updating packedExitFP, so that the exception
// handling code will start at the previous frame.
JitFrameLayout* prefix = frame->framePrefix();
EnsureBareExitFrame(cx, prefix);
EnsureBareExitFrame(cx->activation()->asJit(), prefix);
return false;
}

View File

@ -640,6 +640,7 @@ FINAL_LIBRARY = 'js'
if CONFIG['NIGHTLY_BUILD']:
DEFINES['ENABLE_BINARYDATA'] = True
DEFINES['ENABLE_SIMD'] = True
DEFINES['ENABLE_WASM_SIGNEXTEND_OPS'] = True
DEFINES['ENABLE_WASM_THREAD_OPS'] = True
if CONFIG['JS_BUILD_BINAST']:

View File

@ -482,6 +482,7 @@ JitFrameIter::operator=(const JitFrameIter& another)
MOZ_ASSERT(this != &another);
act_ = another.act_;
mustUnwindActivation_ = another.mustUnwindActivation_;
if (isSome())
iter_.destroy();
@ -498,9 +499,10 @@ JitFrameIter::operator=(const JitFrameIter& another)
return *this;
}
JitFrameIter::JitFrameIter(jit::JitActivation* act)
JitFrameIter::JitFrameIter(jit::JitActivation* act, bool mustUnwindActivation)
{
act_ = act;
mustUnwindActivation_ = mustUnwindActivation;
MOZ_ASSERT(act->hasExitFP(), "packedExitFP is used to determine if JSJit or wasm");
if (act->hasJSExitFP()) {
iter_.construct<jit::JSJitFrameIter>(act);
@ -557,6 +559,10 @@ JitFrameIter::settle()
// popped.
wasm::Frame* prevFP = (wasm::Frame*) jitFrame.prevFp();
if (mustUnwindActivation_)
act_->setWasmExitFP(prevFP);
iter_.destroy();
iter_.construct<wasm::WasmFrameIter>(act_, prevFP);
MOZ_ASSERT(!asWasm().done());
@ -568,12 +574,28 @@ void
JitFrameIter::operator++()
{
MOZ_ASSERT(isSome());
if (isJSJit())
if (isJSJit()) {
const jit::JSJitFrameIter& jitFrame = asJSJit();
jit::JitFrameLayout* prevFrame = nullptr;
if (mustUnwindActivation_ && jitFrame.isScripted())
prevFrame = jitFrame.jsFrame();
++asJSJit();
else if (isWasm())
if (prevFrame) {
// Unwind the frame by updating packedExitFP. This is necessary
// so that (1) debugger exception unwind and leave frame hooks
// don't see this frame when they use ScriptFrameIter, and (2)
// ScriptFrameIter does not crash when accessing an IonScript
// that's destroyed by the ionScript->decref call.
EnsureBareExitFrame(act_, prevFrame);
}
} else if (isWasm()) {
++asWasm();
else
} else {
MOZ_CRASH("unhandled case");
}
settle();
}

View File

@ -1780,12 +1780,13 @@ class JitFrameIter
protected:
jit::JitActivation* act_;
mozilla::MaybeOneOf<jit::JSJitFrameIter, wasm::WasmFrameIter> iter_;
bool mustUnwindActivation_;
void settle();
public:
JitFrameIter() : act_(nullptr), iter_() {}
explicit JitFrameIter(jit::JitActivation* activation);
JitFrameIter() : act_(nullptr), iter_(), mustUnwindActivation_(false) {}
explicit JitFrameIter(jit::JitActivation* activation, bool mustUnwindActivation = false);
explicit JitFrameIter(const JitFrameIter& another);
JitFrameIter& operator=(const JitFrameIter& another);

View File

@ -8959,7 +8959,7 @@ BaseCompiler::emitBody()
CHECK_NEXT(emitComparison(emitCompareF64, ValType::F64, Assembler::DoubleGreaterThanOrEqual));
// Sign extensions
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
case uint16_t(Op::I32Extend8S):
CHECK_NEXT(emitConversion(emitExtendI32_8, ValType::I32, ValType::I32));
case uint16_t(Op::I32Extend16S):

View File

@ -314,7 +314,7 @@ enum class Op
F32ReinterpretI32 = 0xbe,
F64ReinterpretI64 = 0xbf,
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
// Sign extension
I32Extend8S = 0xc0,
I32Extend16S = 0xc1,

View File

@ -177,7 +177,7 @@ wasm::Classify(OpBytes op)
case Op::F64ConvertUI64:
case Op::F64ReinterpretI64:
case Op::F64PromoteF32:
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
case Op::I32Extend8S:
case Op::I32Extend16S:
case Op::I64Extend8S:

View File

@ -1513,7 +1513,7 @@ AstDecodeExpr(AstDecodeContext& c)
if (!AstDecodeConversion(c, ValType::F32, ValType::F64, Op(op.b0)))
return false;
break;
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
case uint16_t(Op::I32Extend8S):
case uint16_t(Op::I32Extend16S):
if (!AstDecodeConversion(c, ValType::I32, ValType::I32, Op(op.b0)))

View File

@ -736,7 +736,7 @@ RenderConversionOperator(WasmRenderContext& c, AstConversionOperator& conv)
case Op::F64ConvertUI64: opStr = "f64.convert_u/i64"; break;
case Op::F64ReinterpretI64: opStr = "f64.reinterpret/i64"; break;
case Op::F64PromoteF32: opStr = "f64.promote/f32"; break;
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
case Op::I32Extend8S: opStr = "i32.extend8_s"; break;
case Op::I32Extend16S: opStr = "i32.extend16_s"; break;
case Op::I64Extend8S: opStr = "i64.extend8_s"; break;

View File

@ -2430,7 +2430,7 @@ EmitTruncate(FunctionCompiler& f, ValType operandType, ValType resultType,
return true;
}
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
static bool
EmitSignExtend(FunctionCompiler& f, uint32_t srcSize, uint32_t targetSize)
{
@ -3965,7 +3965,7 @@ EmitBodyExprs(FunctionCompiler& f)
CHECK(EmitReinterpret(f, ValType::F64, ValType::I64, MIRType::Double));
// Sign extensions
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
case uint16_t(Op::I32Extend8S):
CHECK(EmitSignExtend(f, 1, 4));
case uint16_t(Op::I32Extend16S):

View File

@ -1221,7 +1221,7 @@ WasmTokenStream::next()
return WasmToken(WasmToken::UnaryOpcode, Op::I32Eqz, begin, cur_);
if (consume(u"eq"))
return WasmToken(WasmToken::ComparisonOpcode, Op::I32Eq, begin, cur_);
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
if (consume(u"extend8_s"))
return WasmToken(WasmToken::ConversionOpcode, Op::I32Extend8S, begin, cur_);
if (consume(u"extend16_s"))
@ -1449,7 +1449,7 @@ WasmTokenStream::next()
if (consume(u"extend_u/i32"))
return WasmToken(WasmToken::ConversionOpcode, Op::I64ExtendUI32,
begin, cur_);
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
if (consume(u"extend8_s"))
return WasmToken(WasmToken::ConversionOpcode, Op::I64Extend8S, begin, cur_);
if (consume(u"extend16_s"))

View File

@ -607,7 +607,7 @@ DecodeFunctionBodyExprs(const ModuleEnvironment& env, const Sig& sig, const ValT
CHECK(iter.readConversion(ValType::I64, ValType::F64, &nothing));
case uint16_t(Op::F64PromoteF32):
CHECK(iter.readConversion(ValType::F32, ValType::F64, &nothing));
#ifdef ENABLE_WASM_THREAD_OPS
#ifdef ENABLE_WASM_SIGNEXTEND_OPS
case uint16_t(Op::I32Extend8S):
case uint16_t(Op::I32Extend16S):
CHECK(iter.readConversion(ValType::I32, ValType::I32, &nothing));

View File

@ -1160,4 +1160,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1523818828361000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1523991760932000);

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
/*****************************************************************************/
#include <stdint.h>
const PRTime gPreloadListExpirationTime = INT64_C(1526238015543000);
const PRTime gPreloadListExpirationTime = INT64_C(1526410948463000);
%%
0-1.party, 1
0.me.uk, 1
@ -28,7 +28,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1526238015543000);
023838.com, 1
023sec.com, 1
03-09-2016.wedding, 1
040fit.nl, 1
040fitvitality.nl, 1
046569.com, 1
04sun.com, 1
@ -340,7 +339,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1526238015543000);
42entrepreneurs.fr, 1
42t.ru, 1
439191.com, 1
440hz-radio.de, 1
441jj.com, 0
44scc.com, 1
4500.co.il, 1
@ -507,7 +505,6 @@ a1bouncycastlehire.com, 1
a1jumpandbounce.co.uk, 1
a1scuba.com, 1
a1scubastore.com, 1
a200k.xyz, 1
a2a.net, 1
a2c-co.net, 1
a2it.gr, 1
@ -803,6 +800,7 @@ adblock.ovh, 1
adblockextreme.com, 1
adblockextreme.net, 1
adblockextreme.org, 1
addcrazy.com, 1
addeekt.com, 1
adderall.space, 1
addicional.com, 1
@ -1002,6 +1000,7 @@ agdalieso.com.ba, 1
ageg.ca, 1
agenciadeempregosdourados.com.br, 1
agenciafiscal.pe, 1
agenciagriff.com, 1
agencymanager.be, 1
agenda-loto.net, 0
agenda21senden.de, 1
@ -1359,6 +1358,7 @@ allmebel.ru, 1
allmend-ru.de, 1
allns.fr, 1
allo-credit.ch, 1
alloffice.com.ua, 1
alloutatl.com, 1
alloydevil.nl, 1
allplayer.tk, 1
@ -1521,7 +1521,6 @@ americansforcommunitydevelopment.org, 1
americasbasementcontractor.com, 1
americkykongres.cz, 1
amerigroup.com, 1
amerimarkdirect.com, 1
amerimex.cc, 1
amesvacuumrepair.com, 1
amethystcards.co.uk, 1
@ -2411,6 +2410,7 @@ atraverscugy.ch, 1
atrevillot.com, 1
atrinik.org, 1
atte.fi, 1
attendantdesign.com, 1
attilagyorffy.com, 1
attilavandervelde.nl, 1
attitudes-bureaux.fr, 1
@ -2504,7 +2504,6 @@ auto-anleitung.de, 1
auto-plus.tn, 1
autoauctionsohio.com, 1
autoauctionsvirginia.com, 1
autobedrijfschalkoort.nl, 1
autoclean-plus.ch, 1
autocmall.com, 1
autocorner.com, 1
@ -2594,7 +2593,7 @@ awan.tech, 1
awaremi-tai.com, 1
awaro.net, 0
awbouncycastlehire.com, 1
awccanadianpharmacy.com, 0
awccanadianpharmacy.com, 1
awei.pub, 1
awen.me, 1
awesomebouncycastles.co.uk, 1
@ -2714,6 +2713,7 @@ bacula.jp, 1
bad.horse, 1
bad.pet, 1
badai.at, 1
badam.co, 1
badbee.cc, 1
badf00d.de, 1
badges.fedoraproject.org, 1
@ -2803,6 +2803,7 @@ bandito.re, 1
bangdream.ga, 1
bangkok-dark-night.com, 1
bangkok.dating, 1
bangkokcity.de, 1
bank.simple.com, 0
bankbranchlocator.com, 1
bankcardoffer.com, 1
@ -2985,6 +2986,7 @@ bcpc-ccgpfcheminots.com, 1
bcradio.org, 1
bcrook.com, 0
bcswampcabins.com, 1
bcvps.com, 0
bda-boulevarddesairs.com, 1
bdd.fi, 1
bdenzer.com, 1
@ -3469,6 +3471,7 @@ binaryevolved.com, 1
binarystud.io, 1
binding-problem.com, 1
binfind.com, 1
bing.com, 1
bingcheung.com, 1
bingcheung.org, 1
bingo-wear.com, 1
@ -3739,6 +3742,7 @@ blewebprojects.com, 1
blichmann.eu, 1
blidz.com, 1
blieque.co.uk, 1
blikund.swedbank.se, 1
blindaryproduction.tk, 1
blingsparkleshine.com, 1
blink-security.com, 1
@ -3980,7 +3984,6 @@ booquiz.com, 1
boosinflatablegames.co.uk, 1
booter.es, 1
booter.pw, 1
bootikexpress.fr, 1
bootjp.me, 0
boozinyan.com, 1
bopera.co.uk, 1
@ -4682,6 +4685,7 @@ c16t.uk, 1
c2design.it, 1
c2o-library.net, 1
c2o2.xyz, 1
c3ie.com, 1
c3vo.de, 1
c3w.at, 1
c4.hk, 1
@ -5498,7 +5502,6 @@ chint.ai, 1
chinternet.xyz, 1
chinwag.im, 1
chipcore.com, 1
chiphell.com, 1
chippy.ch, 0
chiralsoftware.com, 1
chireiden.net, 1
@ -5533,6 +5536,7 @@ choe.fi, 1
choisirmonerp.com, 1
chokladfantasi.net, 1
chon.io, 1
chonghe.org, 1
chook.as, 1
choosemypc.net, 1
chopperforums.com, 1
@ -5674,6 +5678,7 @@ cinq-elements.net, 1
cinsects.de, 1
cinteo.com, 1
cinto.cc, 1
cio.gov, 1
cioscloud.com, 1
cip.md, 1
cipartyhire.co.uk, 1
@ -5686,7 +5691,6 @@ ciphrex.com, 1
cipri.com, 1
cir.is, 1
cira.email, 1
circ-logic.com, 1
circara.com, 1
circlebox.rocks, 1
circu.ml, 1
@ -5708,6 +5712,7 @@ citcuit.in, 1
citimarinestore.com, 1
citizen-cam.de, 1
citizensbankal.com, 1
citizenscience.gov, 1
citizensleague.org, 1
citizenspact.eu, 1
citizing.org, 1
@ -5852,7 +5857,6 @@ closelinksecurity.com, 1
closetemail.com, 1
closingholding.com, 1
cloturea.fr, 1
cloud-crowd.com.au, 1
cloud-surfer.net, 1
cloud.bugatti, 1
cloud.fail, 1
@ -6539,7 +6543,6 @@ cqn.ch, 1
cr.search.yahoo.com, 0
crackcat.de, 1
cracker.in.th, 1
crackingking.com, 0
crackle.io, 1
crackorsquad.in, 1
crackpfer.de, 1
@ -6576,7 +6579,6 @@ crazydomains.co.nz, 1
crazydomains.co.uk, 1
crazydomains.com.au, 1
crazydomains.in, 1
crazyker.com, 1
crazymeeshu.com, 1
crazypaul.com, 1
crbug.com, 1
@ -6967,6 +6969,7 @@ cytegic-update-packages.com, 1
cyumus.com, 1
czakey.net, 1
czaw.org, 1
czbix.com, 1
czc.cz, 1
czechamlp.com, 1
czechvirus.cz, 1
@ -7347,7 +7350,6 @@ ddel.de, 1
dden.ca, 0
dden.website, 1
dden.xyz, 1
ddepot.us, 1
ddfreedish.site, 0
ddhosted.com, 1
ddmeportal.com, 1
@ -7528,6 +7530,7 @@ demfloro.ru, 1
demijn.nl, 1
demilletech.net, 1
demo.sb, 1
demo.swedbank.se, 1
demo9.ovh, 1
democracy.io, 1
democracychronicles.com, 1
@ -7718,7 +7721,6 @@ deviltracks.net, 1
deviltraxxx.de, 1
devinfo.net, 0
devisnow.fr, 1
devistravaux.org, 1
devjack.de, 1
devkid.net, 1
devkit.cc, 1
@ -7738,7 +7740,6 @@ devyn.ca, 1
devzero.io, 1
dewalch.net, 1
dewapress.com, 1
dewebwerf.nl, 1
dexalo.de, 1
dezeregio.nl, 1
dezet-ev.de, 1
@ -7815,7 +7816,6 @@ dicionarioetimologico.com.br, 1
dick.red, 1
dickieslife.com, 1
dickpics.ru, 1
dicoding.com, 1
didacte.com, 1
didche.net, 1
diddens.de, 1
@ -7859,7 +7859,6 @@ diffnow.com, 1
difoosion.com, 1
digcit.org, 1
digdata.de, 1
diggable.co, 1
dighans.com, 1
digiarc.net, 1
digibild.ch, 1
@ -8546,7 +8545,6 @@ dtp-mstdn.jp, 1
dtuaarsfest.dk, 1
dtx.sk, 1
dualascent.com, 1
dualias.xyz, 0
duan.li, 1
dubaieveningsafari.com, 1
dublin-traceroute.net, 1
@ -8642,7 +8640,6 @@ dwworld.co.uk, 1
dxa.io, 0
dxgl.info, 1
dxm.no-ip.biz, 1
dycoa.com, 1
dyeager.org, 1
dyktig.as, 1
dyktig.no, 1
@ -9017,7 +9014,6 @@ ejdv-anmeldung.de, 1
ejeff.org, 1
ejgconsultancy.co.uk, 1
ejuicelab.co.uk, 1
ejusu.com, 1
ekaigotenshoku.com, 1
ekd.de, 1
ekedc.com, 1
@ -9339,6 +9335,7 @@ enlazaresbueno.cl, 1
enlighten10x.ga, 1
enlightened.si, 1
enlightenedhr.com, 1
enlightenment.org, 1
enloestatebank.com, 1
ennea-mediation.fr, 1
enness.co.uk, 1
@ -9381,6 +9378,7 @@ envelope.co.nz, 1
enveloppenopmaat.nl, 1
envescent.com, 1
enviam.de, 1
enviaya.com.mx, 1
environment.ai, 1
environmentkirklees.org, 1
enviroprobasements.com, 1
@ -10213,6 +10211,7 @@ fcapartsdb.com, 1
fcburk.de, 1
fcforum.net, 1
fcitasc.com, 1
fckd.net, 1
fcprovadia.com, 1
fdevs.ch, 1
fdlibre.eu, 1
@ -10418,7 +10417,6 @@ filme-online.eu.com, 1
filme-onlines.com, 1
filmreviewonline.com, 1
filmserver.de, 1
filoitoupediou.gr, 1
filoo.de, 1
filterflasche-kaufen.de, 1
filterlists.com, 1
@ -10684,7 +10682,6 @@ flyt.online, 1
flytoadventures.com, 1
fm-cdn.de, 1
fm.ie, 1
fm992.com, 1
fmapplication.com, 1
fmarchal.fr, 1
fmdance.cl, 1
@ -10808,6 +10805,7 @@ forstbetrieb-hennecke.de, 1
forstprodukte.de, 1
forsyththeatre.com, 1
forteggz.nl, 1
fortesanshop.it, 1
fortnine.ca, 1
fortran.io, 1
fortress.no, 1
@ -10874,6 +10872,7 @@ foxphotography.ch, 1
foxquill.com, 1
foxterrier.com.br, 1
foxyslut.com, 1
fpc.gov, 1
fpersona.com, 1
fpki.sh, 1
fptravelling.com, 1
@ -11238,7 +11237,6 @@ futbolvivo.tv, 1
futos.de, 1
futrou.com, 1
futurefire.de, 1
futurefundapp.com, 1
futurenda.com, 1
futureoceans.org, 1
futuresonline.com, 1
@ -11404,7 +11402,6 @@ ganztagplus.de, 1
gapdirect.com, 1
gapfa.org, 1
gaptek.id, 0
gar-nich.net, 0
garage-door.pro, 1
garage-leone.com, 1
garage-meynard.com, 1
@ -11655,6 +11652,7 @@ gerwinvanderkamp.nl, 1
ges-bo.de, 1
geschenkly.de, 1
geschmacksache.online, 1
geschmackspiloten.de, 1
geschwinder.net, 1
gestormensajeria.com, 1
get-asterisk.ru, 1
@ -12018,6 +12016,7 @@ golfhausmallorca.com, 1
golfscape.com, 1
golik.net.pl, 1
golser.info, 1
gomiblog.com, 1
gommista.roma.it, 1
gondawa.com, 1
gongjianwei.com, 1
@ -12392,6 +12391,7 @@ gume4you.com, 1
gumi.ca, 1
gummibande.noip.me, 1
gunhunter.com, 1
guniram.com, 1
gunwatch.co.uk, 1
guochang.xyz, 1
guoke.com, 1
@ -13254,7 +13254,6 @@ holyhiphopdatabase.com, 1
holymolycasinos.com, 1
holytransaction.com, 1
holywhite.com, 1
holz.nu, 1
holzheizer-forum.de, 1
holzheizerforum.de, 1
holzspielzeug-shop.ch, 1
@ -13655,7 +13654,6 @@ hypotheques24.ch, 1
hypothes.is, 1
hypothyroidmom.com, 1
hyvinvointineuvoja.fi, 1
hzh.pub, 1
i--b.com, 1
i-geld.de, 1
i-hakul.net, 1
@ -13713,6 +13711,7 @@ ic3.gov, 1
icafecash.com, 1
icanhasht.ml, 1
icarlos.net, 1
icasnetwork.com, 1
icbemp.gov, 1
iccpublisher.com, 1
icebat.dyndns.org, 1
@ -13852,7 +13851,6 @@ igglabs.com, 1
iggprivate.com, 1
iggsoft.com, 1
iggsoftware.com, 1
igi.codes, 1
igiftcards.de, 1
igimusic.com, 1
igk.nz, 1
@ -14185,6 +14183,7 @@ inheritestate.com, 1
inhive.group, 1
inhouseents.co.uk, 1
iniiter.com, 1
inima.org, 1
inios.fr, 0
inishbofin.ie, 1
initq.net, 1
@ -14241,6 +14240,7 @@ inscript.pl, 1
insertcoins.net, 1
insgesamt.net, 1
inshapenutrition.com.br, 1
insho.fashion, 0
insideaudit.com, 1
insidethefirewall.tk, 1
insightera.co.th, 1
@ -14276,7 +14276,6 @@ instinctive.io, 1
instinctiveads.com, 1
institut-confucius-montpellier.org, 1
institutmaupertuis.hopto.org, 1
institutolancaster.com, 1
institutulcultural.ro, 1
instrumart.ru, 0
insult.es, 1
@ -15565,7 +15564,6 @@ jwolt-lx.com, 1
jwschuepfheim.ch, 1
jxir.de, 1
jyggen.com, 1
jym.fit, 1
jyoti-fairworks.org, 1
jzbk.org, 1
k-homes.net, 1
@ -15645,6 +15643,7 @@ kaltenbrunner.it, 1
kalterersee.ch, 1
kamalame.co, 1
kamikaichimaru.com, 1
kamikatse.net, 1
kamitech.ch, 1
kamixa.se, 1
kana.me, 1
@ -15892,7 +15891,6 @@ kenterlis.gr, 1
kenyons.info, 1
keops-spine.fr, 1
keops-spine.us, 1
kepkonyvtar.hu, 1
kepler-seminar.de, 1
kerebro.com, 1
kerem.xyz, 1
@ -16007,6 +16005,7 @@ kigmbh.com, 1
kikbb.com, 1
kiki-voice.jp, 1
kiku.pw, 1
kikuzuki.org, 1
kilerd.me, 1
kilianvalkhof.com, 1
kill-paff.com, 1
@ -16152,6 +16151,7 @@ klarika.com, 1
klarmobil-empfehlen.de, 1
klasfauseweh.de, 1
klatschreime.de, 1
klausbrinch.dk, 1
klausimas.lt, 1
klaver.it, 1
klaw.xyz, 1
@ -16700,6 +16700,7 @@ lampen24.be, 1
lampenwelt.at, 1
lampenwelt.ch, 1
lan2k.org, 1
lana.swedbank.se, 1
lanbroa.eu, 1
lanbyte.se, 1
lancejames.com, 1
@ -16712,8 +16713,8 @@ landbetweenthelakes.us, 1
landell.ml, 1
landflair-magazin.de, 1
landhaus-christmann.de, 1
landinfo.no, 1
landofelves.net, 1
landyparts.nl, 1
lanetix.com, 1
lang-php.com, 1
langatang.com, 1
@ -16833,7 +16834,6 @@ launchpad-app2.com, 1
lauraandwill.wedding, 1
laurakashiwase.com, 1
laurasplacefamilysupport.org.au, 1
laurelblack.com, 1
laurelspaandlash.com, 1
laurenlobue.com, 1
laurent-e-levy.com, 1
@ -16972,7 +16972,6 @@ leerkotte.eu, 1
leerliga.de, 1
leertipp.de, 1
leesilvey.com, 1
leet2.com, 1
leetcode.com, 1
leetcode.net, 1
leetgamers.asia, 1
@ -17458,6 +17457,7 @@ liushuyu.tk, 1
liv3ly.com, 1
livebetterwith.com, 1
livecards.co.uk, 1
livecards.es, 1
livecards.eu, 1
livecards.it, 1
livedesign.at, 1
@ -17478,7 +17478,6 @@ livekortti.fi, 1
livelexi.com, 1
livepaperhelp.com, 1
livepath.ch, 1
liveperformersmeeting.net, 1
liveregistratie.nl, 1
livesearch-fukuoka.com, 1
livesure.com, 1
@ -17643,7 +17642,6 @@ lona.io, 1
lonal.com, 1
lonasdigital.com, 1
lonbali.com, 1
london-transfers.com, 1
london.dating, 1
londongynaecologist.co, 1
londonkan.jp, 1
@ -17764,9 +17762,7 @@ lpbk-bethel.de, 0
lpm-uk.com, 1
lpt-nebreziny.eu, 1
lra-cloud.de, 1
lrssystems.com, 1
ls-alarm.de, 1
ls-reallife.de, 1
ls-rp.es, 1
lsc-dillingen.de, 1
lsc.gov, 1
@ -18129,7 +18125,7 @@ majkyto.cz, 1
makaleci.com, 1
makeaboldmove.com, 1
makedin.net, 1
makeit-so.de, 1
makeit-so.de, 0
makem-bounce.co.uk, 1
makemejob.com, 1
makenaiyo-fx.com, 1
@ -18226,7 +18222,6 @@ manicode.com, 1
maniorpedi.com, 1
maniosglass.gr, 1
manipil.ch, 1
manipulatedtme.com, 1
manja-und-martin.de, 1
manjaro.ru, 1
mankans.com, 1
@ -18247,6 +18242,7 @@ manuel-schefczyk.de, 1
manueldopheide.com, 1
manueli.de, 1
manuelrueger.de, 1
manufacturing.gov, 1
manuscript.com, 1
manutd.org.np, 1
manuth.life, 1
@ -18314,7 +18310,6 @@ marianhoenscheid.de, 1
mariannenan.nl, 1
marianwehlus.de, 1
mariaolesen.dk, 1
marie-elisabeth.dk, 0
marie.club, 1
mariehane.com, 1
mariemiramont.fr, 1
@ -18752,6 +18747,7 @@ medicinskavranje.edu.rs, 1
medicocompetente.it, 1
medicoresponde.com.br, 1
medifab.online, 1
medifi.com, 1
medireport.fr, 1
medium.com, 1
mediumraw.org, 1
@ -19033,7 +19029,7 @@ miboulot.com, 1
micado-software.com, 1
micaiahparker.com, 1
micalodeal.ch, 1
micasamgmt.com, 1
micasamgmt.com, 0
micbase.com, 1
michael-rigart.be, 1
michael-schefczyk.de, 1
@ -19155,7 +19151,6 @@ mikroskeem.eu, 1
mil-spec.ch, 1
mil0.com, 1
milahendri.com, 1
milanpala.cz, 1
milcahsmusings.com, 1
mileme.com, 1
milenaria.es, 1
@ -19550,7 +19545,6 @@ monokoo.com, 1
monolithapps.com, 1
monolithindustries.com, 1
monolithinteractive.com, 1
monoseis-monotica.gr, 1
monothesis.com, 1
monotsuku.com, 1
monpc-pro.fr, 1
@ -19591,7 +19585,6 @@ moonrhythm.info, 1
moonrhythm.io, 1
moonshyne.org, 1
moonvpn.org, 1
moonysbouncycastles.co.uk, 1
moorewelliver.com, 1
moorfunevents.co.uk, 1
moorparkelectrical.com, 1
@ -19787,7 +19780,6 @@ mssys.de, 1
mstdn.blue, 1
mstdn.club, 1
mstdn.fr, 1
mstdn.io, 1
mstdn.nl, 1
mstdn.onl, 1
mstiles92.com, 1
@ -20278,6 +20270,7 @@ nanarose.ch, 1
nanch.com, 1
nanderson.me, 1
nanfangstone.com, 1
nani.io, 1
nankiseamansclub.com, 1
nanogi.ga, 1
nanotechnologist.com, 1
@ -20477,7 +20470,6 @@ necessaryandproportionate.org, 1
necormansir.com, 1
nectarleaf.com, 1
nedcdata.org, 1
nedcf.org.uk, 1
nedim-accueil.fr, 1
nediyor.com, 1
nedlinin.com, 1
@ -21403,6 +21395,7 @@ ohd.dk, 1
oheila.com, 1
ohhdeertrade.com, 1
ohiohealthfortune100.com, 1
ohling.org, 1
ohlmeier.com, 0
ohlmeier.net, 0
ohlmeier.org, 0
@ -21410,6 +21403,7 @@ ohma.ga, 1
ohnemusik.com, 1
ohreally.de, 1
ohsohairy.co.uk, 1
ohyooo.com, 1
oilpaintingsonly.com, 1
oinky.ddns.net, 1
ojaioliveoil.com, 1
@ -21566,6 +21560,7 @@ online-eikaiwa-guide.com, 1
online-results.dk, 1
online-scene.com, 1
online.marketing, 1
online.swedbank.se, 1
online24.pt, 1
onlinebiller.com, 1
onlinebizdirect.com, 0
@ -23196,6 +23191,7 @@ potterscraftcider.com, 1
pottersheartministry.org, 1
pottshome.co.uk, 1
potworowski.de, 1
pouet.it, 1
pouets.ovh, 1
poupatempo.org, 1
pourlesenfants.info, 1
@ -23790,6 +23786,7 @@ qianalysis.com, 1
qifu.me, 1
qifu.org.cn, 1
qikan.net, 1
qimiao.io, 1
qingpat.com, 1
qingpei.me, 0
qionouu.cn, 1
@ -24225,7 +24222,6 @@ recruitsecuritytraining.com, 1
rectoraudiparts.com, 1
recuerdafilms.com, 1
recurly.com, 1
recyclingpromotions.us, 1
red-t-shirt.ru, 1
redable.hosting, 1
redb.cz, 1
@ -25479,7 +25475,6 @@ sb-tuning.ru, 1
sb.im, 1
sb.sb, 1
sb0.io, 1
sbanken.no, 1
sber.us, 1
sberbank.ch, 1
sbf888.com, 1
@ -26264,6 +26259,7 @@ shirt2go.shop, 1
shirtsofholland.com, 1
shiseki.top, 1
shishamania.de, 1
shishkin.link, 1
shishkin.us, 1
shishlik.net, 1
shitagi-shop.com, 1
@ -26557,7 +26553,6 @@ simpte.com, 1
simpul.nl, 1
sims4hub.ga, 1
simsnieuws.nl, 1
simtin-net.de, 1
simukti.net, 1
simumiehet.com, 1
simus.fr, 1
@ -26593,7 +26588,6 @@ sint-joris.nl, 1
sinterama.biz, 1
sintesysglobal.com, 1
sinuelovirtual.com.br, 1
sinusbot.online, 1
sion.moe, 1
siqi.wang, 1
siraweb.org, 1
@ -26775,6 +26769,7 @@ slneighbors.org, 1
slo-net.net, 1
slo-tech.com, 1
sloancom.com, 1
slopeedge.com, 1
slotboss.co.uk, 1
slotcar.com, 0
slotfara.com, 1
@ -27041,7 +27036,6 @@ sokietech.com, 1
sokkenhoek.nl, 1
sokolkarvina.cz, 1
sol-computers.es, 1
sol.works, 1
sol24.net, 1
solacyre.ch, 1
solanum-games.com, 1
@ -27165,7 +27159,7 @@ soundedj.com.br, 1
soundeo.com, 1
soundeo.net, 1
soundgasm.net, 1
soundhunter.xyz, 1
soundhunter.xyz, 0
soundsecurity.io, 1
sour.is, 1
souravsaha.com, 1
@ -27737,6 +27731,7 @@ stonewuu.com, 1
stony.com, 1
stonystratford.org, 1
stopakwardhandshakes.org, 1
stopbreakupnow.org, 1
stopbullying.gov, 1
stopfraud.gov, 1
stopthethyroidmadness.com, 1
@ -27948,6 +27943,7 @@ sundayfundayjapan.com, 1
suneilpatel.com, 1
sunfeathers.net, 1
sunfireshop.com.br, 1
sunflyer.cn, 0
sunfox.cz, 1
sunfulong.me, 1
sunjaydhama.com, 1
@ -29259,6 +29255,7 @@ tintencenter.com, 1
tintenfix.net, 1
tintenfux.de, 1
tintenland.de, 1
tintenprofi.de, 1
tinyhousefinance.com.au, 1
tinylan.com, 1
tinyspeck.com, 1
@ -29695,7 +29692,7 @@ tradingbhavishya.com, 1
tradingrooms.com, 0
traditionsvivantesenimages.ch, 1
tradiz.org, 1
traeningsprojekt.dk, 1
traeningsprojekt.dk, 0
trafarm.ro, 1
traffic.az, 1
trafficmanager.xxx, 1
@ -30230,7 +30227,6 @@ ulabox.com, 1
ulalau.com, 1
uli-eckhardt.de, 1
ullah.se, 1
ulmer-schneesport.de, 0
ulrik.moe, 1
ulti.gq, 1
ultieme.be, 0
@ -30448,6 +30444,7 @@ url.cab, 1
url.fi, 1
url.fm, 1
url.rw, 1
url0.eu, 1
urlachershop.com.br, 1
urlaub-leitner.at, 1
urlscan.io, 1
@ -31196,6 +31193,7 @@ vwsoft.de, 1
vww-8522.com, 1
vxapps.com, 1
vxst.org, 1
vybeministry.org, 1
vyber-odhadce.cz, 1
vyberodhadce.cz, 1
vyplnto.cz, 1
@ -31344,6 +31342,7 @@ waterschaplimburg.nl, 1
watertrails.io, 1
waterworkscondos.com, 1
watsonwork.me, 1
wattechweb.com, 1
wave-ola.es, 1
wavesboardshop.com, 1
wavesoftime.com, 1
@ -31504,7 +31503,6 @@ webseitenserver.com, 1
websenat.de, 1
websharks.org, 1
websiteadvice.com.au, 1
websitedesign.bg, 1
websiteforlease.ca, 1
websiteout.ca, 1
websiteout.net, 1
@ -32780,7 +32778,7 @@ yhori.xyz, 1
yhwj.top, 1
yibaoweilong.top, 1
yibin0831.com, 1
yicknam.my, 1
yicknam.my, 0
yii2.cc, 1
yikeyong.com, 1
yin8888.tv, 1
@ -33260,7 +33258,6 @@ zsoltsandor.me, 1
zsrbcs.com, 1
zten.org, 1
ztjuh.tk, 1
ztytian.com, 1
zuan-in.net, 1
zuckerfloh.de, 1
zudomc.me, 1

View File

@ -74,6 +74,15 @@ jobs:
run:
product: firefox
buildername: release-{branch}-firefox_schedule_publishing_in_balrog
channels:
by-project:
birch: release
maple: beta
mozilla-beta: beta
mozilla-release: release
mozilla-esr52: esr
mozilla-esr59: esr
default: unknown
index:
product: firefox
devedition:
@ -82,5 +91,6 @@ jobs:
run:
product: devedition
buildername: release-{branch}-devedition_schedule_publishing_in_balrog
channels: aurora
index:
product: devedition

View File

@ -81,7 +81,7 @@ jobs:
env:
FINAL_VERIFY_CONFIGS:
by-project:
mozilla-beta: "beta-firefox-linux.cfg beta-firefox-linux64.cfg beta-firefox-macosx64.cfg beta-firefox-win32.cfg beta-firefox-win64.cfg"
mozilla-release: "beta-firefox-linux.cfg beta-firefox-linux64.cfg beta-firefox-macosx64.cfg beta-firefox-win32.cfg beta-firefox-win64.cfg"
default: ""
treeherder:
platform: linux64/opt

View File

@ -102,6 +102,7 @@ jobs:
default: "default"
repo_path:
by-project:
birch: "projects/birch"
jamun: "projects/jamun"
maple: "projects/maple"
mozilla-beta: "releases/mozilla-beta"

View File

@ -6,6 +6,6 @@ RUN dpkg --add-architecture i386 && apt-get -q update \
# p7zip-full is for extracting Windows and OS X packages
# Mercurial is for cloning required repositories
# wget is for downloading update.xml, installers, and MARs
# libgtk-3-0 is required to run the Firefox updater
&& apt-get -q --yes install p7zip-full mercurial wget libgtk-3-0 libgtk-3.0:i386 \
# libgtk-3-0 and libgtk2.0-0 are required to run the Firefox updater
&& apt-get -q --yes install p7zip-full mercurial wget libgtk-3-0 libgtk-3.0:i386 libgtk2.0-0 libgtk2.0-0:i386 \
&& apt-get clean

View File

@ -11,7 +11,7 @@ from __future__ import absolute_import, print_function, unicode_literals
import slugid
from urlparse import urlparse
from taskgraph.util.schema import Schema
from taskgraph.util.schema import Schema, optionally_keyed_by, resolve_keyed_by
from taskgraph.util.scriptworker import get_release_config
from voluptuous import Optional, Required, Any
@ -28,6 +28,8 @@ buildbot_run_schema = Schema({
# the product to use
Required('product'): Any('firefox', 'mobile', 'fennec', 'devedition', 'thunderbird'),
Optional('channels'): optionally_keyed_by('project', basestring),
Optional('release-promotion'): bool,
})
@ -39,21 +41,6 @@ def _get_balrog_api_root(branch):
return 'https://balrog-admin.stage.mozaws.net/api'
def _get_balrog_channel(product, branch):
if product == 'devedition':
return 'aurora'
elif product == 'firefox':
if branch in ('mozilla-beta', 'maple'):
return 'beta'
elif branch == 'mozilla-release':
return 'release'
elif branch.startswith('mozilla-esr'):
return 'esr'
# Unsupported channels are filtered out after the task is generated. Then, we must
# provide a dummy value for them, otherwise the Decision task breaks.
return 'unknown'
def bb_release_worker(config, worker, run):
# props
release_props = get_release_config(config)
@ -68,9 +55,12 @@ def bb_release_worker(config, worker, run):
'revision': revision,
})
if 'channels' in run:
release_props['channels'] = run['channels']
resolve_keyed_by(release_props, 'channels', 'channels', **config.params)
if product in ('devedition', 'firefox'):
release_props['balrog_api_root'] = _get_balrog_api_root(branch)
release_props['channels'] = _get_balrog_channel(product, branch)
worker['properties'].update(release_props)
# Setting script_repo_revision to the gecko revision doesn't work for

View File

@ -1,3 +1,2 @@
[canvas_complexshapes_arcto_001.htm]
type: reftest
expected: FAIL

View File

@ -1,4 +1,3 @@
[canvas_complexshapes_beziercurveto_001.htm]
type: reftest
disabled: if (os == "win") and (version == "10.0.15603"): https://bugzilla.mozilla.org/show_bug.cgi?id=1372037
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.composite.operation.clear.html]
type: testharness
[Canvas test: 2d.composite.operation.clear]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.drawImage.animated.poster.html]
type: testharness
[drawImage() of an APNG draws the poster frame]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.drawImage.incomplete.reload.html]
type: testharness
[Canvas test: 2d.drawImage.incomplete.reload]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.drawImage.zerocanvas.html]
type: testharness
[Canvas test: 2d.drawImage.zerocanvas]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.drawImage.zerosource.html]
type: testharness
[drawImage with zero-sized source rectangle draws nothing without exception]
expected: FAIL

View File

@ -1,5 +1,4 @@
[canvas_focus_drawCustomFocusRing_001.html]
type: testharness
[drawCustomFocusRing must return false for an element that is not focused.]
expected: FAIL

View File

@ -1,5 +1,4 @@
[drawFocusIfNeeded_001.html]
type: testharness
disabled:
if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1092458
[drawFocusIfNeeded draws a focus ring.]

View File

@ -1,5 +1,4 @@
[drawFocusIfNeeded_004.html]
type: testharness
disabled:
if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1092458
[drawFocusIfNeeded does draw a focus ring if the element is in focus.]

View File

@ -1,5 +1,4 @@
[drawFocusIfNeeded_005.html]
type: testharness
disabled:
if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1092458
[drawFocusIfNeeded does draw a focus ring if the element is in focus and the user activated a particular focus ring.]

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.overlap.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.overlap]
expected:
if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.zerosize.fill.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.zerosize.fill]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.zerosize.fillRect.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.zerosize.fillRect]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.zerosize.fillText.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.zerosize.fillText]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.zerosize.stroke.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.zerosize.stroke]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.zerosize.strokeRect.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.zerosize.strokeRect]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.interpolate.zerosize.strokeText.html]
type: testharness
[Canvas test: 2d.gradient.interpolate.zerosize.strokeText]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.object.current.html]
type: testharness
[Canvas test: 2d.gradient.object.current]
expected:
if not stylo: FAIL

View File

@ -1,5 +1,4 @@
[2d.gradient.radial.outside3.html]
type: testharness
[Canvas test: 2d.gradient.radial.outside3]
expected:
if (os == "win") and (version != "6.2.9200"): FAIL

View File

@ -1,5 +1,4 @@
[2d.pattern.image.broken.html]
type: testharness
[Canvas test: 2d.pattern.image.broken]
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1016482
expected:

View File

@ -1,5 +1,4 @@
[2d.pattern.image.incomplete.emptysrc.html]
type: testharness
[Canvas test: 2d.pattern.image.incomplete.emptysrc]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.pattern.image.incomplete.nosrc.html]
type: testharness
[Canvas test: 2d.pattern.image.incomplete.nosrc]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.pattern.image.incomplete.reload.html]
type: testharness
[Canvas test: 2d.pattern.image.incomplete.reload]
expected: FAIL

View File

@ -1,5 +1,4 @@
[2d.pattern.image.incomplete.removedsrc.html]
type: testharness
[Canvas test: 2d.pattern.image.incomplete.removedsrc]
expected: FAIL

View File

@ -1,5 +1,4 @@
[canvas_colorsandstyles_createlineargradient_001.htm]
type: testharness
[linear gradient from point to self draws nothing]
expected: FAIL

View File

@ -1,5 +1,4 @@
[addHitRegions-NotSupportedError-01.html]
type: testharness
[fillRect should not affect current default path and NotSupportedError should be thrown.]
expected: FAIL

View File

@ -1,5 +1,4 @@
[hitregions-members-exist.html]
type: testharness
[context.addHitRegion Exists]
expected: FAIL

View File

@ -1,5 +1,13 @@
[createImageBitmap-invalid-args.html]
type: testharness
expected:
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH
if debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): CRASH
if debug and stylo and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): CRASH
if debug and stylo and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH
if debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH
[createImageBitmap with a HTMLImageElement source and sw set to 0 rejects with a RangeError.]
expected: FAIL
@ -66,3 +74,9 @@
[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

View File

@ -1,5 +1,4 @@
[2d.path.arc.selfintersect.1.html]
type: testharness
[arc() with lineWidth > 2*radius is drawn sensibly]
expected:
if (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL

View File

@ -1,5 +1,4 @@
[2d.path.arc.shape.3.html]
type: testharness
[arc() from 0 to -pi/2 does not draw anything in the wrong quadrant]
expected:
if (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL

View File

@ -1,5 +1,4 @@
[2d.path.rect.zero.3.html]
type: testharness
[Canvas test: 2d.path.rect.zero.3]
expected:
if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL

View File

@ -1,5 +1,4 @@
[2d.path.stroke.prune.arc.html]
type: testharness
[Zero-length line segments from arcTo and arc are removed before stroking]
expected:
if not debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL

View File

@ -1,5 +1,4 @@
[2d.path.stroke.prune.closed.html]
type: testharness
[Zero-length line segments from closed paths are removed before stroking]
expected:
if os == "win": FAIL

Some files were not shown because too many files have changed in this diff Show More