merge mozilla-inbound to mozilla-central a=merge

This commit is contained in:
Carsten "Tomcat" Book 2016-05-11 14:52:52 +02:00
Родитель 348655f801 d0b575b3af
Коммит 48f89b96dc
99 изменённых файлов: 1177 добавлений и 980 удалений

Просмотреть файл

@ -136,6 +136,7 @@ PYTHON_PATH = $(PYTHON) $(topsrcdir)/config/pythonpath.py
_DEBUG_ASFLAGS :=
_DEBUG_CFLAGS :=
_DEBUG_LDFLAGS :=
_DEBUG_RUSTFLAGS :=
ifneq (,$(MOZ_DEBUG)$(MOZ_DEBUG_SYMBOLS))
ifeq ($(AS),$(YASM))
@ -151,12 +152,14 @@ ifneq (,$(MOZ_DEBUG)$(MOZ_DEBUG_SYMBOLS))
endif
_DEBUG_CFLAGS += $(MOZ_DEBUG_FLAGS)
_DEBUG_LDFLAGS += $(MOZ_DEBUG_LDFLAGS)
_DEBUG_RUSTFLAGS += -g
endif
ASFLAGS += $(_DEBUG_ASFLAGS)
OS_CFLAGS += $(_DEBUG_CFLAGS)
OS_CXXFLAGS += $(_DEBUG_CFLAGS)
OS_LDFLAGS += $(_DEBUG_LDFLAGS)
RUSTFLAGS += $(_DEBUG_RUSTFLAGS)
# XXX: What does this? Bug 482434 filed for better explanation.
ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_)

Просмотреть файл

@ -406,7 +406,6 @@ a {
.jsterm-input-node,
.jsterm-complete-node {
border: none;
padding: 4px;
padding-inline-start: 20px;
margin: 0;
-moz-appearance: none;
@ -441,6 +440,10 @@ a {
:-moz-any(.jsterm-input-node,
.jsterm-complete-node) > .textbox-input-box > .textbox-textarea {
overflow-x: hidden;
/* Set padding for console input on textbox to make sure it is inlcuded in
scrollHeight that is used when resizing JSTerminal's input. Note: textbox
default style has important already */
padding: 4px 0 !important;
}
.inlined-variables-view .message-body {

Просмотреть файл

@ -22,4 +22,6 @@ SANDBOX_KEYWORD("allow-pointer-lock", allowpointerlock, SANDBOXED_POINTER_LOCK)
SANDBOX_KEYWORD("allow-orientation-lock", alloworientationlock,
SANDBOXED_ORIENTATION_LOCK)
SANDBOX_KEYWORD("allow-popups", allowpopups, SANDBOXED_AUXILIARY_NAVIGATION)
SANDBOX_KEYWORD("allow-modals", allowmodals, SANDBOXED_MODALS)
SANDBOX_KEYWORD("allow-popups-to-escape-sandbox", allowpopupstoescapesandbox,
SANDBOX_PROPAGATES_TO_AUXILIARY_BROWSING_CONTEXTS)

Просмотреть файл

@ -668,7 +668,7 @@ nsContentUtils::InitializeModifierStrings()
rv = bundleService->CreateBundle( "chrome://global-platform/locale/platformKeys.properties",
getter_AddRefs(bundle));
}
NS_ASSERTION(NS_SUCCEEDED(rv) && bundle, "chrome://global/locale/platformKeys.properties could not be loaded");
nsXPIDLString shiftModifier;
nsXPIDLString metaModifier;
@ -691,7 +691,7 @@ nsContentUtils::InitializeModifierStrings()
sOSText = new nsString(osModifier);
sAltText = new nsString(altModifier);
sControlText = new nsString(controlModifier);
sModifierSeparator = new nsString(modifierSeparator);
sModifierSeparator = new nsString(modifierSeparator);
}
// Because of SVG/SMIL we have several atoms mapped to the same
@ -1309,14 +1309,14 @@ nsContentUtils::SplitMimeType(const nsAString& aValue, nsString& aType,
aType.StripWhitespace();
}
nsresult
nsresult
nsContentUtils::IsUserIdle(uint32_t aRequestedIdleTimeInMS, bool* aUserIsIdle)
{
nsresult rv;
nsCOMPtr<nsIIdleService> idleService =
nsCOMPtr<nsIIdleService> idleService =
do_GetService("@mozilla.org/widget/idleservice;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
uint32_t idleTimeInMS;
rv = idleService->GetIdleTime(&idleTimeInMS);
NS_ENSURE_SUCCESS(rv, rv);
@ -1360,17 +1360,7 @@ nsContentUtils::ParseSandboxAttributeToFlags(const nsAttrValue* sandboxAttr)
if (!sandboxAttr) { return 0; }
// Start off by setting all the restriction flags.
uint32_t out = SANDBOXED_NAVIGATION
| SANDBOXED_AUXILIARY_NAVIGATION
| SANDBOXED_TOPLEVEL_NAVIGATION
| SANDBOXED_PLUGINS
| SANDBOXED_ORIGIN
| SANDBOXED_FORMS
| SANDBOXED_SCRIPTS
| SANDBOXED_AUTOMATIC_FEATURES
| SANDBOXED_POINTER_LOCK
| SANDBOXED_ORIENTATION_LOCK
| SANDBOXED_DOMAIN;
uint32_t out = SANDBOX_ALL_FLAGS;
// Macro for updating the flag according to the keywords
#define SANDBOX_KEYWORD(string, atom, flags) \
@ -1578,7 +1568,7 @@ bool nsContentUtils::IsAlphanumeric(uint32_t aChar)
return (cat == nsIUGenCategory::kLetter || cat == nsIUGenCategory::kNumber);
}
// static
bool nsContentUtils::IsAlphanumericAt(const nsTextFragment* aFrag, uint32_t aOffset)
{
@ -1924,13 +1914,13 @@ nsContentUtils::Shutdown()
delete sShiftText;
sShiftText = nullptr;
delete sControlText;
delete sControlText;
sControlText = nullptr;
delete sMetaText;
delete sMetaText;
sMetaText = nullptr;
delete sOSText;
sOSText = nullptr;
delete sAltText;
delete sAltText;
sAltText = nullptr;
delete sModifierSeparator;
sModifierSeparator = nullptr;
@ -2354,7 +2344,7 @@ nsContentUtils::ComparePoints(nsINode* aParent1, int32_t aOffset1,
uint32_t pos1 = parents1.Length() - 1;
uint32_t pos2 = parents2.Length() - 1;
bool disconnected = parents1.ElementAt(pos1) != parents2.ElementAt(pos2);
if (aDisconnected) {
*aDisconnected = disconnected;
@ -2376,7 +2366,7 @@ nsContentUtils::ComparePoints(nsINode* aParent1, int32_t aOffset1,
parent = child1;
}
// The parent chains never differed, so one of the nodes is an ancestor of
// the other
@ -2813,7 +2803,7 @@ nsContentUtils::CheckQName(const nsAString& aQualifiedName,
const char* colon = nullptr;
const char16_t* begin = aQualifiedName.BeginReading();
const char16_t* end = aQualifiedName.EndReading();
int result = MOZ_XMLCheckQName(reinterpret_cast<const char*>(begin),
reinterpret_cast<const char*>(end),
aNamespaceAware, &colon);
@ -3877,7 +3867,7 @@ Element *
nsContentUtils::MatchElementId(nsIContent *aContent, const nsAString& aId)
{
NS_PRECONDITION(!aId.IsEmpty(), "Will match random elements");
// ID attrs are generally stored as atoms, so just atomize this up front
nsCOMPtr<nsIAtom> id(NS_Atomize(aId));
if (!id) {
@ -3969,8 +3959,8 @@ nsContentUtils::RegisterShutdownObserver(nsIObserver* aObserver)
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService) {
observerService->AddObserver(aObserver,
NS_XPCOM_SHUTDOWN_OBSERVER_ID,
observerService->AddObserver(aObserver,
NS_XPCOM_SHUTDOWN_OBSERVER_ID,
false);
}
}
@ -4284,7 +4274,7 @@ nsContentUtils::CreateContextualFragment(nsINode* aContextNode,
if (isHTML) {
RefPtr<DocumentFragment> frag =
new DocumentFragment(document->NodeInfoManager());
nsCOMPtr<nsIContent> contextAsContent = do_QueryInterface(aContextNode);
if (contextAsContent && !contextAsContent->IsElement()) {
contextAsContent = contextAsContent->GetParent();
@ -4293,7 +4283,7 @@ nsContentUtils::CreateContextualFragment(nsINode* aContextNode,
contextAsContent = nullptr;
}
}
if (contextAsContent && !contextAsContent->IsHTMLElement(nsGkAtoms::html)) {
aRv = ParseFragmentHTML(aFragment, frag,
contextAsContent->NodeInfo()->NameAtom(),
@ -4705,7 +4695,7 @@ nsContentUtils::IsInSameAnonymousTree(const nsINode* aNode,
"Must have a node to work with");
NS_PRECONDITION(aContent,
"Must have a content to work with");
if (!aNode->IsNodeOfType(nsINode::eCONTENT)) {
/**
* The root isn't an nsIContent, so it's a document or attribute. The only
@ -5039,28 +5029,27 @@ nsContentUtils::WarnScriptWasIgnored(nsIDocument* aDocument)
}
/* static */
bool
void
nsContentUtils::AddScriptRunner(already_AddRefed<nsIRunnable> aRunnable)
{
nsCOMPtr<nsIRunnable> runnable = aRunnable;
if (!runnable) {
return false;
return;
}
if (sScriptBlockerCount) {
return sBlockedScriptRunners->AppendElement(runnable.forget()) != nullptr;
sBlockedScriptRunners->AppendElement(runnable.forget());
return;
}
runnable->Run();
return true;
runnable->Run();
}
/* static */
bool
void
nsContentUtils::AddScriptRunner(nsIRunnable* aRunnable) {
nsCOMPtr<nsIRunnable> runnable = aRunnable;
return AddScriptRunner(runnable.forget());
AddScriptRunner(runnable.forget());
}
/* static */
@ -5124,14 +5113,14 @@ nsContentUtils::PerformMainThreadMicroTaskCheckpoint()
nsDOMMutationObserver::HandleMutations();
}
/*
/*
* Helper function for nsContentUtils::ProcessViewportInfo.
*
* Handles a single key=value pair. If it corresponds to a valid viewport
* attribute, add it to the document header data. No validation is done on the
* value itself (this is done at display time).
*/
static void ProcessViewportToken(nsIDocument *aDocument,
static void ProcessViewportToken(nsIDocument *aDocument,
const nsAString &token) {
/* Iterators. */
@ -5377,7 +5366,7 @@ nsContentUtils::CheckForSubFrameDrop(nsIDragSession* aDragSession,
if (!target) {
return true;
}
nsIDocument* targetDoc = target->OwnerDoc();
nsPIDOMWindowOuter* targetWin = targetDoc->GetWindow();
if (!targetWin) {
@ -5842,7 +5831,7 @@ nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin)
else {
aOrigin.AssignLiteral("null");
}
return NS_OK;
}
@ -6050,7 +6039,7 @@ nsContentUtils::MatchClassNames(nsIContent* aContent, int32_t aNamespaceID,
if (!classAttr) {
return false;
}
// need to match *all* of the classes
ClassMatchingInfo* info = static_cast<ClassMatchingInfo*>(aData);
uint32_t length = info->mClasses.Length();
@ -6065,7 +6054,7 @@ nsContentUtils::MatchClassNames(nsIContent* aContent, int32_t aNamespaceID,
return false;
}
}
return true;
}
@ -6352,10 +6341,10 @@ nsContentUtils::AllowXULXBLForPrincipal(nsIPrincipal* aPrincipal)
if (IsSystemPrincipal(aPrincipal)) {
return true;
}
nsCOMPtr<nsIURI> princURI;
aPrincipal->GetURI(getter_AddRefs(princURI));
return princURI &&
((sAllowXULXBL_for_file && SchemeIs(princURI, "file")) ||
IsSitePermAllow(aPrincipal, "allowXULXBL"));

Просмотреть файл

@ -393,7 +393,7 @@ public:
*/
static bool IsFirstLetterPunctuation(uint32_t aChar);
static bool IsFirstLetterPunctuationAt(const nsTextFragment* aFrag, uint32_t aOffset);
/**
* Returns true if aChar is of class Lu, Ll, Lt, Lm, Lo, Nd, Nl or No
*/
@ -933,7 +933,7 @@ private:
const char16_t** aParams,
uint32_t aParamsLength,
nsXPIDLString& aResult);
public:
template<uint32_t N>
static nsresult FormatLocalizedString(PropertiesFile aFile,
@ -1606,10 +1606,9 @@ public:
* scripts. Passing null is allowed and results in nothing
* happening. It is also allowed to pass an object that
* has not yet been AddRefed.
* @return false on out of memory, true otherwise.
*/
static bool AddScriptRunner(already_AddRefed<nsIRunnable> aRunnable);
static bool AddScriptRunner(nsIRunnable* aRunnable);
static void AddScriptRunner(already_AddRefed<nsIRunnable> aRunnable);
static void AddScriptRunner(nsIRunnable* aRunnable);
/**
* Returns true if it's safe to execute content script and false otherwise.
@ -1950,7 +1949,7 @@ public:
{
return sIsPerformanceTimingEnabled;
}
/*
* Returns true if user timing API should print to console.
*/
@ -2256,11 +2255,11 @@ public:
/**
* Function checks if the user is idle.
*
*
* @param aRequestedIdleTimeInMS The idle observer's requested idle time.
* @param aUserIsIdle boolean indicating if the user
* @param aUserIsIdle boolean indicating if the user
* is currently idle or not. *
* @return NS_OK NS_OK returned if the requested idle service and
* @return NS_OK NS_OK returned if the requested idle service and
* the current idle time were successfully obtained.
* NS_ERROR_FAILURE returned if the the requested
* idle service or the current idle were not obtained.

Просмотреть файл

@ -9082,16 +9082,8 @@ nsDocument::BlockOnload()
// block onload only when there are no script blockers.
++mAsyncOnloadBlockCount;
if (mAsyncOnloadBlockCount == 1) {
bool success = nsContentUtils::AddScriptRunner(
nsContentUtils::AddScriptRunner(
NewRunnableMethod(this, &nsDocument::AsyncBlockOnload));
// The script runner shouldn't fail to add. But if somebody broke
// something and it does, we'll thrash at 100% cpu forever. The best
// response is just to ignore the onload blocking request. See bug 579535.
if (!success) {
NS_WARNING("Disaster! Onload blocking script runner failed to add - expect bad things!");
mAsyncOnloadBlockCount = 0;
}
}
return;
}

Просмотреть файл

@ -79,8 +79,10 @@ GK_ATOM(allowevents, "allowevents")
GK_ATOM(allownegativeassertions, "allownegativeassertions")
GK_ATOM(allowforms,"allow-forms")
GK_ATOM(allowfullscreen, "allowfullscreen")
GK_ATOM(allowmodals, "allow-modals")
GK_ATOM(alloworientationlock,"allow-orientation-lock")
GK_ATOM(allowpointerlock,"allow-pointer-lock")
GK_ATOM(allowpopupstoescapesandbox,"allow-popups-to-escape-sandbox")
GK_ATOM(allowpopups,"allow-popups")
GK_ATOM(allowsameorigin,"allow-same-origin")
GK_ATOM(allowscripts,"allow-scripts")

Просмотреть файл

@ -3421,6 +3421,16 @@ nsGlobalWindow::AreDialogsEnabled()
}
}
// Dialogs are also blocked if the document is sandboxed with SANDBOXED_MODALS
// (or if we have no document, of course). Which document? Who knows; the
// spec is daft. See <https://github.com/whatwg/html/issues/1206>. For now
// just go ahead and check mDoc, since in everything except edge cases in
// which a frame is allow-same-origin but not allow-scripts and is being poked
// at by some other window this should be the right thing anyway.
if (!mDoc || (mDoc->GetSandboxFlags() & SANDBOXED_MODALS)) {
return false;
}
return topWindow->mAreDialogsEnabled;
}
@ -14401,6 +14411,35 @@ nsGlobalWindow::CheckForDPIChange()
}
}
nsGlobalWindow::TemporarilyDisableDialogs::TemporarilyDisableDialogs(
nsGlobalWindow* aWindow MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL)
{
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
MOZ_ASSERT(aWindow);
nsGlobalWindow* topWindow = aWindow->GetScriptableTopInternal();
if (!topWindow) {
NS_ERROR("nsGlobalWindow::TemporarilyDisableDialogs used without a top "
"window?");
return;
}
// TODO: Warn if no top window?
topWindow = topWindow->GetCurrentInnerWindowInternal();
if (topWindow) {
mTopWindow = topWindow;
mSavedDialogsEnabled = mTopWindow->mAreDialogsEnabled;
mTopWindow->mAreDialogsEnabled = false;
}
}
nsGlobalWindow::TemporarilyDisableDialogs::~TemporarilyDisableDialogs()
{
if (mTopWindow) {
mTopWindow->mAreDialogsEnabled = mSavedDialogsEnabled;
}
}
template class nsPIDOMWindow<mozIDOMWindowProxy>;
template class nsPIDOMWindow<mozIDOMWindow>;
template class nsPIDOMWindow<nsISupports>;

Просмотреть файл

@ -42,6 +42,8 @@
#include "mozilla/dom/UnionTypes.h"
#include "mozilla/ErrorResult.h"
#include "nsFrameMessageManager.h"
#include "mozilla/Attributes.h"
#include "mozilla/GuardObjects.h"
#include "mozilla/LinkedList.h"
#include "mozilla/TimeStamp.h"
#include "nsWrapperCacheInlines.h"
@ -565,12 +567,37 @@ public:
bool DialogsAreBeingAbused();
// These functions are used for controlling and determining whether dialogs
// (alert, prompt, confirm) are currently allowed in this window.
// (alert, prompt, confirm) are currently allowed in this window. If you want
// to temporarily disable dialogs, please use TemporarilyDisableDialogs, not
// EnableDialogs/DisableDialogs, because correctly determining whether to
// re-enable dialogs is actually quite difficult.
void EnableDialogs();
void DisableDialogs();
// Outer windows only.
bool AreDialogsEnabled();
class MOZ_RAII TemporarilyDisableDialogs
{
public:
// Takes an inner _or_ outer window.
explicit TemporarilyDisableDialogs(nsGlobalWindow* aWindow
MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
~TemporarilyDisableDialogs();
private:
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
// Always an inner window; this is the window whose dialog state we messed
// with. We just want to keep it alive, because we plan to poke at its
// members in our destructor.
RefPtr<nsGlobalWindow> mTopWindow;
// This is not a AutoRestore<bool> because that would require careful
// member destructor ordering, which is a bit fragile. This way we can
// explicitly restore things before we drop our ref to mTopWindow.
bool mSavedDialogsEnabled;
};
friend class TemporarilyDisableDialogs;
nsIScriptContext *GetContextInternal()
{
if (mOuterWindow) {

Просмотреть файл

@ -90,7 +90,7 @@ nsMimeTypeArray::IndexedGetter(uint32_t aIndex, bool &aFound)
}
static nsMimeType*
FindMimeType(const nsTArray<RefPtr<nsMimeType> >& aMimeTypes,
FindMimeType(const nsTArray<RefPtr<nsMimeType>>& aMimeTypes,
const nsAString& aType)
{
for (uint32_t i = 0; i < aMimeTypes.Length(); ++i) {
@ -131,7 +131,7 @@ nsMimeTypeArray::Length()
}
void
nsMimeTypeArray::GetSupportedNames(nsTArray< nsString >& aRetval)
nsMimeTypeArray::GetSupportedNames(nsTArray<nsString>& aRetval)
{
EnsurePluginMimeTypes();

Просмотреть файл

@ -22,11 +22,18 @@
*/
const unsigned long SANDBOXED_NAVIGATION = 0x1;
/**
* This flag prevents content from creating new auxiliary browsing contexts,
* e.g. using the target attribute, the window.open() method, or the
* showModalDialog() method.
*/
const unsigned long SANDBOXED_AUXILIARY_NAVIGATION = 0x2;
/**
* This flag prevents content from navigating their top-level browsing
* context.
*/
const unsigned long SANDBOXED_TOPLEVEL_NAVIGATION = 0x2;
const unsigned long SANDBOXED_TOPLEVEL_NAVIGATION = 0x4;
/**
* This flag prevents content from instantiating plugins, whether using the
@ -34,7 +41,7 @@ const unsigned long SANDBOXED_TOPLEVEL_NAVIGATION = 0x2;
* navigation of a nested browsing context, unless those plugins can be
* secured.
*/
const unsigned long SANDBOXED_PLUGINS = 0x4;
const unsigned long SANDBOXED_PLUGINS = 0x8;
/**
* This flag forces content into a unique origin, thus preventing it from
@ -42,43 +49,69 @@ const unsigned long SANDBOXED_PLUGINS = 0x4;
* This flag also prevents script from reading from or writing to the
* document.cookie IDL attribute, and blocks access to localStorage.
*/
const unsigned long SANDBOXED_ORIGIN = 0x8;
const unsigned long SANDBOXED_ORIGIN = 0x10;
/**
* This flag blocks form submission.
*/
const unsigned long SANDBOXED_FORMS = 0x10;
const unsigned long SANDBOXED_FORMS = 0x20;
/**
* This flag blocks the document from acquiring pointerlock.
*/
const unsigned long SANDBOXED_POINTER_LOCK = 0x40;
/**
* This flag blocks script execution.
*/
const unsigned long SANDBOXED_SCRIPTS = 0x20;
const unsigned long SANDBOXED_SCRIPTS = 0x80;
/**
* This flag blocks features that trigger automatically, such as
* automatically playing a video or automatically focusing a form control.
*/
const unsigned long SANDBOXED_AUTOMATIC_FEATURES = 0x40;
const unsigned long SANDBOXED_AUTOMATIC_FEATURES = 0x100;
/**
* This flag blocks the document from acquiring pointerlock.
* This flag prevents URL schemes that use storage areas from being able to
* access the origin's data.
*/
const unsigned long SANDBOXED_POINTER_LOCK = 0x80;
// We don't have an explicit representation of this one, apparently?
// const unsigned long SANDBOXED_STORAGE_AREA_URLS = 0x200;
/**
* This flag prevents content from using the requestFullscreen() method.
*/
// We don't implement this yet. See represent this as a sandbox flag; instead it's an explicit check for
// the "allowfullscreen" attribute on the <iframe> that includes us.
// XXXbz This is wrong in two ways: It can change during the life of the
// document, and it doesn't get correctly propagated to popups. See
// https://bugzilla.mozilla.org/show_bug.cgi?id=1270648
// const unsigned long SANDBOXED_FULLSCREEN = 0x400;
/**
* This flag blocks the document from changing document.domain.
*/
const unsigned long SANDBOXED_DOMAIN = 0x100;
const unsigned long SANDBOXED_DOMAIN = 0x800;
/**
* This flag prevents content from creating new auxiliary browsing contexts,
* e.g. using the target attribute, the window.open() method, or the
* showModalDialog() method.
* This flag prevents content from using window.alert(), window.confirm(),
* window.print(), window.prompt() and the beforeunload event from putting up
* dialogs.
*/
const unsigned long SANDBOXED_AUXILIARY_NAVIGATION = 0x200;
const unsigned long SANDBOXED_MODALS = 0x1000;
/**
* This flag prevents content from escaping the sandbox by ensuring that any
* auxiliary browsing context it creates inherits the content's active
* sandboxing flag set.
*/
const unsigned long SANDBOX_PROPAGATES_TO_AUXILIARY_BROWSING_CONTEXTS = 0x2000;
/**
* This flag prevents locking screen orientation.
*/
const unsigned long SANDBOXED_ORIENTATION_LOCK = 0x400;
const unsigned long SANDBOXED_ORIENTATION_LOCK = 0x4000;
const unsigned long SANDBOX_ALL_FLAGS = 0x7FFF;
#endif

Просмотреть файл

@ -96,15 +96,19 @@ SimpleGlobalObject::Create(GlobalType globalType, JS::Handle<JS::Value> proto)
JS::CompartmentOptions options;
options.creationOptions().setInvisibleToDebugger(true);
nsCOMPtr<nsIPrincipal> principal;
if (NS_IsMainThread()) {
principal = nsNullPrincipal::Create();
}
JS::Rooted<JSObject*> global(cx);
JS::Rooted<JSObject*> global(cx,
JS_NewGlobalObject(cx, js::Jsvalify(&SimpleGlobalClass),
nsJSPrincipals::get(principal),
JS::DontFireOnNewGlobalHook, options));
if (NS_IsMainThread()) {
nsCOMPtr<nsIPrincipal> principal = nsNullPrincipal::Create();
options.creationOptions().setTrace(xpc::TraceXPCGlobal);
global = xpc::CreateGlobalObject(cx, js::Jsvalify(&SimpleGlobalClass),
nsJSPrincipals::get(principal),
options);
} else {
global = JS_NewGlobalObject(cx, js::Jsvalify(&SimpleGlobalClass),
nullptr,
JS::DontFireOnNewGlobalHook, options);
}
if (!global) {
JS_ClearPendingException(cx);
@ -130,7 +134,7 @@ SimpleGlobalObject::Create(GlobalType globalType, JS::Handle<JS::Value> proto)
return nullptr;
}
if (!JS_SetPrototype(cx, global, protoObj)) {
if (!JS_SplicePrototype(cx, global, protoObj)) {
JS_ClearPendingException(cx);
return nullptr;
}

Просмотреть файл

@ -20,60 +20,65 @@ namespace mozilla {
using namespace dom;
using namespace gfx;
struct ImageCacheKey {
ImageCacheKey(Element* aImage,
/**
* Used for images specific to this one canvas. Required
* due to CORS security.
*/
struct ImageCacheKey
{
ImageCacheKey(imgIContainer* aImage,
HTMLCanvasElement* aCanvas,
bool aIsAccelerated)
: mImage(aImage)
, mCanvas(aCanvas)
, mIsAccelerated(aIsAccelerated)
{}
Element* mImage;
nsCOMPtr<imgIContainer> mImage;
HTMLCanvasElement* mCanvas;
bool mIsAccelerated;
};
struct ImageCacheEntryData {
/**
* Cache data needs to be separate from the entry
* for nsExpirationTracker.
*/
struct ImageCacheEntryData
{
ImageCacheEntryData(const ImageCacheEntryData& aOther)
: mImage(aOther.mImage)
, mILC(aOther.mILC)
, mCanvas(aOther.mCanvas)
, mIsAccelerated(aOther.mIsAccelerated)
, mRequest(aOther.mRequest)
, mSourceSurface(aOther.mSourceSurface)
, mSize(aOther.mSize)
{}
explicit ImageCacheEntryData(const ImageCacheKey& aKey)
: mImage(aKey.mImage)
, mILC(nullptr)
, mCanvas(aKey.mCanvas)
, mIsAccelerated(aKey.mIsAccelerated)
{}
nsExpirationState* GetExpirationState() { return &mState; }
size_t SizeInBytes() { return mSize.width * mSize.height * 4; }
// Key
RefPtr<Element> mImage;
nsIImageLoadingContent* mILC;
RefPtr<HTMLCanvasElement> mCanvas;
nsCOMPtr<imgIContainer> mImage;
HTMLCanvasElement* mCanvas;
bool mIsAccelerated;
// Value
nsCOMPtr<imgIRequest> mRequest;
RefPtr<SourceSurface> mSourceSurface;
IntSize mSize;
nsExpirationState mState;
};
class ImageCacheEntry : public PLDHashEntryHdr {
class ImageCacheEntry : public PLDHashEntryHdr
{
public:
typedef ImageCacheKey KeyType;
typedef const ImageCacheKey* KeyTypePointer;
explicit ImageCacheEntry(const KeyType* aKey) :
mData(new ImageCacheEntryData(*aKey)) {}
ImageCacheEntry(const ImageCacheEntry &toCopy) :
ImageCacheEntry(const ImageCacheEntry& toCopy) :
mData(new ImageCacheEntryData(*toCopy.mData)) {}
~ImageCacheEntry() {}
@ -87,52 +92,61 @@ public:
static KeyTypePointer KeyToPointer(KeyType& key) { return &key; }
static PLDHashNumber HashKey(KeyTypePointer key)
{
return HashGeneric(key->mImage, key->mCanvas, key->mIsAccelerated);
return HashGeneric(key->mImage.get(), key->mCanvas, key->mIsAccelerated);
}
enum { ALLOW_MEMMOVE = true };
nsAutoPtr<ImageCacheEntryData> mData;
};
struct SimpleImageCacheKey {
SimpleImageCacheKey(const imgIRequest* aImage,
bool aIsAccelerated)
/**
* Used for all images across all canvases.
*/
struct AllCanvasImageCacheKey
{
AllCanvasImageCacheKey(imgIContainer* aImage,
bool aIsAccelerated)
: mImage(aImage)
, mIsAccelerated(aIsAccelerated)
{}
const imgIRequest* mImage;
nsCOMPtr<imgIContainer> mImage;
bool mIsAccelerated;
};
class SimpleImageCacheEntry : public PLDHashEntryHdr {
class AllCanvasImageCacheEntry : public PLDHashEntryHdr {
public:
typedef SimpleImageCacheKey KeyType;
typedef const SimpleImageCacheKey* KeyTypePointer;
typedef AllCanvasImageCacheKey KeyType;
typedef const AllCanvasImageCacheKey* KeyTypePointer;
explicit SimpleImageCacheEntry(KeyTypePointer aKey)
: mRequest(const_cast<imgIRequest*>(aKey->mImage))
explicit AllCanvasImageCacheEntry(const KeyType* aKey)
: mImage(aKey->mImage)
, mIsAccelerated(aKey->mIsAccelerated)
{}
SimpleImageCacheEntry(const SimpleImageCacheEntry &toCopy)
: mRequest(toCopy.mRequest)
AllCanvasImageCacheEntry(const AllCanvasImageCacheEntry &toCopy)
: mImage(toCopy.mImage)
, mIsAccelerated(toCopy.mIsAccelerated)
, mSourceSurface(toCopy.mSourceSurface)
{}
~SimpleImageCacheEntry() {}
~AllCanvasImageCacheEntry() {}
bool KeyEquals(KeyTypePointer key) const
{
return key->mImage == mRequest && key->mIsAccelerated == mIsAccelerated;
return mImage == key->mImage &&
mIsAccelerated == key->mIsAccelerated;
}
static KeyTypePointer KeyToPointer(KeyType& key) { return &key; }
static PLDHashNumber HashKey(KeyTypePointer key)
{
return HashGeneric(key->mImage, key->mIsAccelerated);
return HashGeneric(key->mImage.get(), key->mIsAccelerated);
}
enum { ALLOW_MEMMOVE = true };
nsCOMPtr<imgIRequest> mRequest;
nsCOMPtr<imgIContainer> mImage;
bool mIsAccelerated;
RefPtr<SourceSurface> mSourceSurface;
};
@ -142,7 +156,8 @@ static int32_t sCanvasImageCacheLimit = 0;
class ImageCacheObserver;
class ImageCache final : public nsExpirationTracker<ImageCacheEntryData,4> {
class ImageCache final : public nsExpirationTracker<ImageCacheEntryData,4>
{
public:
// We use 3 generations of 1 second each to get a 2-3 seconds timeout.
enum { GENERATION_MS = 1000 };
@ -153,20 +168,24 @@ public:
{
mTotal -= aObject->SizeInBytes();
RemoveObject(aObject);
// Deleting the entry will delete aObject since the entry owns aObject
mSimpleCache.RemoveEntry(SimpleImageCacheKey(aObject->mRequest, aObject->mIsAccelerated));
// Remove from the all canvas cache entry first since nsExpirationTracker
// will delete aObject.
mAllCanvasCache.RemoveEntry(AllCanvasImageCacheKey(aObject->mImage, aObject->mIsAccelerated));
// Deleting the entry will delete aObject since the entry owns aObject.
mCache.RemoveEntry(ImageCacheKey(aObject->mImage, aObject->mCanvas, aObject->mIsAccelerated));
}
nsTHashtable<ImageCacheEntry> mCache;
nsTHashtable<SimpleImageCacheEntry> mSimpleCache;
nsTHashtable<AllCanvasImageCacheEntry> mAllCanvasCache;
size_t mTotal;
RefPtr<ImageCacheObserver> mImageCacheObserver;
};
static ImageCache* gImageCache = nullptr;
// Listen memory-pressure event for image cache purge
// Listen memory-pressure event for image cache purge.
class ImageCacheObserver final : public nsIObserver
{
public:
@ -256,10 +275,33 @@ ImageCache::~ImageCache() {
mImageCacheObserver->Destroy();
}
static already_AddRefed<imgIContainer>
GetImageContainer(dom::Element* aImage)
{
nsCOMPtr<imgIRequest> request;
nsCOMPtr<nsIImageLoadingContent> ilc = do_QueryInterface(aImage);
if (!ilc) {
return nullptr;
}
ilc->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
getter_AddRefs(request));
if (!request) {
return nullptr;
}
nsCOMPtr<imgIContainer> imgContainer;
request->GetImage(getter_AddRefs(imgContainer));
if (!imgContainer) {
return nullptr;
}
return imgContainer.forget();
}
void
CanvasImageCache::NotifyDrawImage(Element* aImage,
HTMLCanvasElement* aCanvas,
imgIRequest* aRequest,
SourceSurface* aSource,
const IntSize& aSize,
bool aIsAccelerated)
@ -269,32 +311,31 @@ CanvasImageCache::NotifyDrawImage(Element* aImage,
nsContentUtils::RegisterShutdownObserver(new CanvasImageCacheShutdownObserver());
}
ImageCacheEntry* entry =
gImageCache->mCache.PutEntry(ImageCacheKey(aImage, aCanvas, aIsAccelerated));
nsCOMPtr<imgIContainer> imgContainer = GetImageContainer(aImage);
if (!imgContainer) {
return;
}
AllCanvasImageCacheKey allCanvasCacheKey(imgContainer, aIsAccelerated);
ImageCacheKey canvasCacheKey(imgContainer, aCanvas, aIsAccelerated);
ImageCacheEntry* entry = gImageCache->mCache.PutEntry(canvasCacheKey);
if (entry) {
if (entry->mData->mSourceSurface) {
// We are overwriting an existing entry.
gImageCache->mTotal -= entry->mData->SizeInBytes();
gImageCache->RemoveObject(entry->mData);
gImageCache->mSimpleCache.RemoveEntry(SimpleImageCacheKey(entry->mData->mRequest, entry->mData->mIsAccelerated));
gImageCache->mAllCanvasCache.RemoveEntry(allCanvasCacheKey);
}
gImageCache->AddObject(entry->mData);
nsCOMPtr<nsIImageLoadingContent> ilc = do_QueryInterface(aImage);
if (ilc) {
ilc->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
getter_AddRefs(entry->mData->mRequest));
}
entry->mData->mILC = ilc;
gImageCache->AddObject(entry->mData);
entry->mData->mSourceSurface = aSource;
entry->mData->mSize = aSize;
gImageCache->mTotal += entry->mData->SizeInBytes();
if (entry->mData->mRequest) {
SimpleImageCacheEntry* simpleentry =
gImageCache->mSimpleCache.PutEntry(SimpleImageCacheKey(entry->mData->mRequest, aIsAccelerated));
simpleentry->mSourceSurface = aSource;
AllCanvasImageCacheEntry* allEntry = gImageCache->mAllCanvasCache.PutEntry(allCanvasCacheKey);
if (allEntry) {
allEntry->mSourceSurface = aSource;
}
}
@ -307,54 +348,56 @@ CanvasImageCache::NotifyDrawImage(Element* aImage,
}
SourceSurface*
CanvasImageCache::Lookup(Element* aImage,
HTMLCanvasElement* aCanvas,
gfx::IntSize* aSize,
bool aIsAccelerated)
CanvasImageCache::LookupAllCanvas(Element* aImage,
bool aIsAccelerated)
{
if (!gImageCache)
if (!gImageCache) {
return nullptr;
}
ImageCacheEntry* entry =
gImageCache->mCache.GetEntry(ImageCacheKey(aImage, aCanvas, aIsAccelerated));
if (!entry || !entry->mData->mILC)
nsCOMPtr<imgIContainer> imgContainer = GetImageContainer(aImage);
if (!imgContainer) {
return nullptr;
}
nsCOMPtr<imgIRequest> request;
entry->mData->mILC->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST, getter_AddRefs(request));
if (request != entry->mData->mRequest)
return nullptr;
gImageCache->MarkUsed(entry->mData);
*aSize = entry->mData->mSize;
return entry->mData->mSourceSurface;
}
SourceSurface*
CanvasImageCache::SimpleLookup(Element* aImage,
bool aIsAccelerated)
{
if (!gImageCache)
return nullptr;
nsCOMPtr<imgIRequest> request;
nsCOMPtr<nsIImageLoadingContent> ilc = do_QueryInterface(aImage);
if (!ilc)
return nullptr;
ilc->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
getter_AddRefs(request));
if (!request)
return nullptr;
SimpleImageCacheEntry* entry = gImageCache->mSimpleCache.GetEntry(SimpleImageCacheKey(request, aIsAccelerated));
if (!entry)
AllCanvasImageCacheEntry* entry =
gImageCache->mAllCanvasCache.GetEntry(AllCanvasImageCacheKey(imgContainer, aIsAccelerated));
if (!entry) {
return nullptr;
}
return entry->mSourceSurface;
}
SourceSurface*
CanvasImageCache::LookupCanvas(Element* aImage,
HTMLCanvasElement* aCanvas,
IntSize* aSizeOut,
bool aIsAccelerated)
{
if (!gImageCache) {
return nullptr;
}
nsCOMPtr<imgIContainer> imgContainer = GetImageContainer(aImage);
if (!imgContainer) {
return nullptr;
}
ImageCacheEntry* entry =
gImageCache->mCache.GetEntry(ImageCacheKey(imgContainer, aCanvas, aIsAccelerated));
if (!entry) {
return nullptr;
}
MOZ_ASSERT(aSizeOut);
gImageCache->MarkUsed(entry->mData);
*aSizeOut = entry->mData->mSize;
return entry->mData->mSourceSurface;
}
NS_IMPL_ISUPPORTS(CanvasImageCacheShutdownObserver, nsIObserver)
NS_IMETHODIMP

Просмотреть файл

@ -6,6 +6,7 @@
#ifndef CANVASIMAGECACHE_H_
#define CANVASIMAGECACHE_H_
#include "mozilla/RefPtr.h"
#include "nsSize.h"
namespace mozilla {
@ -17,7 +18,7 @@ namespace gfx {
class SourceSurface;
} // namespace gfx
} // namespace mozilla
class imgIRequest;
class imgIContainer;
namespace mozilla {
@ -25,34 +26,30 @@ class CanvasImageCache {
typedef mozilla::gfx::SourceSurface SourceSurface;
public:
/**
* Notify that image element aImage was (or is about to be) drawn to aCanvas
* Notify that image element aImage was drawn to aCanvas element
* using the first frame of aRequest's image. The data for the surface is
* in aSurface, and the image size is in aSize.
*/
static void NotifyDrawImage(dom::Element* aImage,
dom::HTMLCanvasElement* aCanvas,
imgIRequest* aRequest,
SourceSurface* aSource,
const gfx::IntSize& aSize,
bool aIsAccelerated);
/**
* Check whether aImage has recently been drawn into aCanvas. If we return
* a non-null surface, then the image was recently drawn into the canvas
* (with the same image request) and the returned surface contains the image
* data, and the image size will be returned in aSize.
* Check whether aImage has recently been drawn any canvas. If we return
* a non-null surface, then the same image was recently drawn into a canvas.
*/
static SourceSurface* Lookup(dom::Element* aImage,
dom::HTMLCanvasElement* aCanvas,
gfx::IntSize* aSize,
bool aIsAccelerated);
static SourceSurface* LookupAllCanvas(dom::Element* aImage,
bool aIsAccelerated);
/**
* This is the same as Lookup, except it works on any image recently drawn
* into any canvas. Security checks need to be done again if using the
* results from this.
* Like the top above, but restricts the lookup to only aCanvas. This is
* required for CORS security.
*/
static SourceSurface* SimpleLookup(dom::Element* aImage,
static SourceSurface* LookupCanvas(dom::Element* aImage,
dom::HTMLCanvasElement* aCanvas,
gfx::IntSize* aSizeOut,
bool aIsAccelerated);
};

Просмотреть файл

@ -4361,57 +4361,6 @@ ExtractSubrect(SourceSurface* aSurface, gfx::Rect* aSourceRect, DrawTarget* aTar
return subrectDT->Snapshot();
}
// Acts like nsLayoutUtils::SurfaceFromElement, but it'll attempt
// to pull a SourceSurface from our cache. This allows us to avoid
// reoptimizing surfaces if content and canvas backends are different.
nsLayoutUtils::SurfaceFromElementResult
CanvasRenderingContext2D::CachedSurfaceFromElement(Element* aElement)
{
nsLayoutUtils::SurfaceFromElementResult res;
nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(aElement);
if (!imageLoader) {
return res;
}
nsCOMPtr<imgIRequest> imgRequest;
imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
getter_AddRefs(imgRequest));
if (!imgRequest) {
return res;
}
uint32_t status;
if (NS_FAILED(imgRequest->GetImageStatus(&status)) ||
!(status & imgIRequest::STATUS_LOAD_COMPLETE)) {
return res;
}
nsCOMPtr<nsIPrincipal> principal;
if (NS_FAILED(imgRequest->GetImagePrincipal(getter_AddRefs(principal))) ||
!principal) {
return res;
}
res.mSourceSurface =
CanvasImageCache::SimpleLookup(aElement, mIsSkiaGL);
if (!res.mSourceSurface) {
return res;
}
int32_t corsmode = imgIRequest::CORS_NONE;
if (NS_SUCCEEDED(imgRequest->GetCORSMode(&corsmode))) {
res.mCORSUsed = corsmode != imgIRequest::CORS_NONE;
}
res.mSize = res.mSourceSurface->GetSize();
res.mPrincipal = principal.forget();
res.mIsWriteOnly = false;
res.mImageRequest = imgRequest.forget();
return res;
}
//
// image
//
@ -4435,6 +4384,56 @@ ClipImageDimension(double& aSourceCoord, double& aSourceSize, int32_t aImageSize
}
}
// Acts like nsLayoutUtils::SurfaceFromElement, but it'll attempt
// to pull a SourceSurface from our cache. This allows us to avoid
// reoptimizing surfaces if content and canvas backends are different.
nsLayoutUtils::SurfaceFromElementResult
CanvasRenderingContext2D::CachedSurfaceFromElement(Element* aElement)
{
nsLayoutUtils::SurfaceFromElementResult res;
nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(aElement);
if (!imageLoader) {
return res;
}
nsCOMPtr<imgIRequest> imgRequest;
imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
getter_AddRefs(imgRequest));
if (!imgRequest) {
return res;
}
uint32_t status = 0;
if (NS_FAILED(imgRequest->GetImageStatus(&status)) ||
!(status & imgIRequest::STATUS_LOAD_COMPLETE)) {
return res;
}
nsCOMPtr<nsIPrincipal> principal;
if (NS_FAILED(imgRequest->GetImagePrincipal(getter_AddRefs(principal))) ||
!principal) {
return res;
}
res.mSourceSurface =
CanvasImageCache::LookupAllCanvas(aElement, mIsSkiaGL);
if (!res.mSourceSurface) {
return res;
}
int32_t corsmode = imgIRequest::CORS_NONE;
if (NS_SUCCEEDED(imgRequest->GetCORSMode(&corsmode))) {
res.mCORSUsed = corsmode != imgIRequest::CORS_NONE;
}
res.mSize = res.mSourceSurface->GetSize();
res.mPrincipal = principal.forget();
res.mIsWriteOnly = false;
res.mImageRequest = imgRequest.forget();
return res;
}
// drawImage(in HTMLImageElement image, in float dx, in float dy);
// -- render image from 0,0 at dx,dy top-left coords
// drawImage(in HTMLImageElement image, in float dx, in float dy, in float dw, in float dh);
@ -4504,7 +4503,7 @@ CanvasRenderingContext2D::DrawImage(const CanvasImageSource& aImage,
}
srcSurf =
CanvasImageCache::Lookup(element, mCanvasElement, &imgSize, mIsSkiaGL);
CanvasImageCache::LookupCanvas(element, mCanvasElement, &imgSize, mIsSkiaGL);
}
nsLayoutUtils::DirectDrawInfo drawInfo;
@ -4613,15 +4612,13 @@ CanvasRenderingContext2D::DrawImage(const CanvasImageSource& aImage,
// of animated images. We also don't want to rasterize vector images.
uint32_t sfeFlags = nsLayoutUtils::SFE_WANT_FIRST_FRAME |
nsLayoutUtils::SFE_NO_RASTERIZING_VECTORS;
// The cache lookup can miss even if the image is already in the cache
// if the image is coming from a different element or cached for a
// different canvas. This covers the case when we miss due to caching
// for a different canvas, but CanvasImageCache should be fixed if we
// see misses due to different elements drawing the same image.
nsLayoutUtils::SurfaceFromElementResult res =
CachedSurfaceFromElement(element);
if (!res.mSourceSurface)
CanvasRenderingContext2D::CachedSurfaceFromElement(element);
if (!res.mSourceSurface) {
res = nsLayoutUtils::SurfaceFromElement(element, sfeFlags, mTarget);
}
if (!res.mSourceSurface && !res.mDrawInfo.mImgContainer) {
// The spec says to silently do nothing in the following cases:
@ -4653,10 +4650,8 @@ CanvasRenderingContext2D::DrawImage(const CanvasImageSource& aImage,
if (res.mSourceSurface) {
if (res.mImageRequest) {
CanvasImageCache::NotifyDrawImage(element, mCanvasElement, res.mImageRequest,
res.mSourceSurface, imgSize, mIsSkiaGL);
CanvasImageCache::NotifyDrawImage(element, mCanvasElement, res.mSourceSurface, imgSize, mIsSkiaGL);
}
srcSurf = res.mSourceSurface;
} else {
drawInfo = res.mDrawInfo;

Просмотреть файл

@ -307,6 +307,38 @@ TestArray.addTest(
);
}
);
// -----------------------------------------------------------------------------
TestArray.addTest(
"JWK unwrap attempt on bogus data should error out",
function () {
// Largely cribbed from the "JWK wrap/unwrap round-trip, with AES-GCM" test
var that = this;
var wrapAlg = { name: "AES-GCM", iv: tv.aes_gcm_enc.iv };
var wrapKey;
function doBogusWrap() {
var abv = new TextEncoder("utf-8").encode("I am so not JSON");
return crypto.subtle.encrypt(wrapAlg, wrapKey, abv);
}
function doUnwrap(wrappedKey) {
return crypto.subtle.unwrapKey("jwk", wrappedKey, wrapKey, wrapAlg,
{name: "HMAC", hash: "SHA-384"},
true, ['sign', 'verify']);
}
crypto.subtle.importKey("jwk", tv.aes_gcm_enc.key_jwk,
"AES-GCM", false, ['encrypt','unwrapKey'])
.then(function(x) { wrapKey = x; })
.then(doBogusWrap, error(that))
.then(doUnwrap, error(that))
.then(
error(that),
complete(that)
);
}
);
/*]]>*/</script>
</head>

Просмотреть файл

@ -1196,9 +1196,8 @@ nsTextEditorState::BindToFrame(nsTextControlFrame* aFrame)
// otherwise, inherit the content node's direction
}
if (!nsContentUtils::AddScriptRunner(
new PrepareEditorEvent(*this, content, currentValue)))
return NS_ERROR_OUT_OF_MEMORY;
nsContentUtils::AddScriptRunner(
new PrepareEditorEvent(*this, content, currentValue));
}
return NS_OK;

Просмотреть файл

@ -12,14 +12,14 @@
try {
window.showModalDialog("file_iframe_sandbox_k_if5.html");
} catch(e) {
window.parent.ok_wrapper(false, "iframes sandboxed with allow-popups should be able to open a modal dialog");
window.parent.ok_wrapper(false, "iframes sandboxed with allow-popups and allow-modals should be able to open a modal dialog");
}
// Open a new window via showModalDialog().
try {
window.showModalDialog("file_iframe_sandbox_k_if7.html");
} catch(e) {
window.parent.ok_wrapper(false, "iframes sandboxed with allow-popups should be able to open a modal dialog");
window.parent.ok_wrapper(false, "iframes sandboxed with allow-popups and allow-modals should be able to open a modal dialog");
}
}
</script>

Просмотреть файл

@ -12,7 +12,7 @@
try {
window.showModalDialog("file_iframe_sandbox_k_if9.html");
} catch(e) {
window.parent.ok_wrapper(false, "iframes sandboxed with allow-popups should be able to open a modal dialog");
window.parent.ok_wrapper(false, "iframes sandboxed with allow-popups and allow-modals should be able to open a modal dialog");
}
}

Просмотреть файл

@ -17,7 +17,7 @@
try {
window.showModalDialog("file_iframe_sandbox_open_window_pass.html");
} catch(e) {
ok(false, "iframes sandboxed with allow-popups should be able to open a modal dialog");
ok(false, "iframes sandboxed with allow-popups and allow-modals should be able to open a modal dialog");
}
}
</script>

Просмотреть файл

@ -116,7 +116,7 @@ addLoadEvent(doTest);
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=766282">Mozilla Bug 766282</a> - implement allow-popups directive for iframe sandbox
<p id="display"></p>
<div id="content">
<iframe sandbox="allow-scripts allow-popups allow-same-origin allow-forms allow-top-navigation" id="if_1" src="file_iframe_sandbox_j_if1.html" height="10" width="10"></iframe>
<iframe sandbox="allow-scripts allow-popups allow-same-origin" id="if_2" src="file_iframe_sandbox_j_if2.html" height="10" width="10"></iframe>
<iframe sandbox="allow-popups allow-same-origin allow-scripts" id="if_3" src="file_iframe_sandbox_j_if3.html" height="10" width="10"></iframe>
<iframe sandbox="allow-scripts allow-popups allow-modals allow-same-origin allow-forms allow-top-navigation" id="if_1" src="file_iframe_sandbox_j_if1.html" height="10" width="10"></iframe>
<iframe sandbox="allow-scripts allow-popups allow-modals allow-same-origin" id="if_2" src="file_iframe_sandbox_j_if2.html" height="10" width="10"></iframe>
<iframe sandbox="allow-popups allow-modals allow-same-origin allow-scripts" id="if_3" src="file_iframe_sandbox_j_if3.html" height="10" width="10"></iframe>
</div>

Просмотреть файл

@ -156,6 +156,7 @@ struct GMPCodecs {
static GMPCodecs sGMPCodecs[] = {
{ "org.w3.clearkey", false, false },
{ "com.adobe.primetime", false, false },
{ "com.widevine.alpha", false, false },
};
void

Просмотреть файл

@ -160,10 +160,11 @@ SapiCallback::OnSpeechEvent(const SPEVENT& speechEvent)
void __stdcall
SapiService::SpeechEventCallback(WPARAM aWParam, LPARAM aLParam)
{
RefPtr<SapiService> service = (SapiService*) aWParam;
RefPtr<ISpVoice> spVoice = (ISpVoice*) aWParam;
RefPtr<SapiService> service = (SapiService*) aLParam;
SPEVENT speechEvent;
while (service->mSapiClient->GetEvents(1, &speechEvent, nullptr) == S_OK) {
while (spVoice->GetEvents(1, &speechEvent, nullptr) == S_OK) {
for (size_t i = 0; i < service->mCallbacks.Length(); i++) {
RefPtr<SapiCallback> callback = service->mCallbacks[i];
if (callback->GetStreamNum() == speechEvent.ulStreamNum) {
@ -208,11 +209,24 @@ SapiService::Init()
return false;
}
if (FAILED(CoCreateInstance(CLSID_SpVoice, nullptr, CLSCTX_ALL, IID_ISpVoice,
getter_AddRefs(mSapiClient)))) {
// Get all the voices from sapi and register in the SynthVoiceRegistry
if (!RegisterVoices()) {
return false;
}
mInitialized = true;
return true;
}
already_AddRefed<ISpVoice>
SapiService::InitSapiInstance()
{
RefPtr<ISpVoice> spVoice;
if (FAILED(CoCreateInstance(CLSID_SpVoice, nullptr, CLSCTX_ALL, IID_ISpVoice,
getter_AddRefs(spVoice)))) {
return nullptr;
}
// Set interest for all the events we are interested in
ULONGLONG eventMask =
SPFEI(SPEI_START_INPUT_STREAM) |
@ -221,21 +235,16 @@ SapiService::Init()
SPFEI(SPEI_SENTENCE_BOUNDARY) |
SPFEI(SPEI_END_INPUT_STREAM);
if (FAILED(mSapiClient->SetInterest(eventMask, eventMask))) {
return false;
}
// Get all the voices from sapi and register in the SynthVoiceRegistry
if (!RegisterVoices()) {
return false;
if (FAILED(spVoice->SetInterest(eventMask, eventMask))) {
return nullptr;
}
// Set the callback function for receiving the events
mSapiClient->SetNotifyCallbackFunction(
(SPNOTIFYCALLBACK*) SapiService::SpeechEventCallback, (WPARAM) this, 0);
spVoice->SetNotifyCallbackFunction(
(SPNOTIFYCALLBACK*) SapiService::SpeechEventCallback,
(WPARAM) spVoice.get(), (LPARAM) this);
mInitialized = true;
return true;
return spVoice.forget();
}
bool
@ -331,11 +340,16 @@ SapiService::Speak(const nsAString& aText, const nsAString& aUri,
return NS_ERROR_NOT_AVAILABLE;
}
if (FAILED(mSapiClient->SetVoice(voiceToken))) {
RefPtr<ISpVoice> spVoice = InitSapiInstance();
if (!spVoice) {
return NS_ERROR_FAILURE;
}
if (FAILED(mSapiClient->SetVolume(static_cast<USHORT>(aVolume * 100)))) {
if (FAILED(spVoice->SetVoice(voiceToken))) {
return NS_ERROR_FAILURE;
}
if (FAILED(spVoice->SetVolume(static_cast<USHORT>(aVolume * 100)))) {
return NS_ERROR_FAILURE;
}
@ -348,7 +362,7 @@ SapiService::Speak(const nsAString& aText, const nsAString& aUri,
// rate by the 10th root of 3"
// https://msdn.microsoft.com/en-us/library/ee431826(v=vs.85).aspx
long rate = aRate != 0 ? static_cast<long>(10 * log10(aRate) / log10(3)) : 0;
if (FAILED(mSapiClient->SetRate(rate))) {
if (FAILED(spVoice->SetRate(rate))) {
return NS_ERROR_FAILURE;
}
@ -370,7 +384,7 @@ SapiService::Speak(const nsAString& aText, const nsAString& aUri,
xml.AppendLiteral("</pitch>");
RefPtr<SapiCallback> callback =
new SapiCallback(aTask, mSapiClient, textOffset, aText.Length());
new SapiCallback(aTask, spVoice, textOffset, aText.Length());
// The last three parameters doesn't matter for an indirect service
nsresult rv = aTask->Setup(callback, 0, 0, 0);
@ -379,7 +393,7 @@ SapiService::Speak(const nsAString& aText, const nsAString& aUri,
}
ULONG streamNum;
if (FAILED(mSapiClient->Speak(xml.get(), SPF_ASYNC, &streamNum))) {
if (FAILED(spVoice->Speak(xml.get(), SPF_ASYNC, &streamNum))) {
aTask->Setup(nullptr, 0, 0, 0);
return NS_ERROR_FAILURE;
}

Просмотреть файл

@ -43,11 +43,11 @@ public:
private:
virtual ~SapiService();
already_AddRefed<ISpVoice> InitSapiInstance();
bool RegisterVoices();
nsRefPtrHashtable<nsStringHashKey, ISpObjectToken> mVoices;
nsTArray<RefPtr<SapiCallback>> mCallbacks;
RefPtr<ISpVoice> mSapiClient;
bool mInitialized;

Просмотреть файл

@ -159,7 +159,8 @@ nsPluginInstanceOwner::NotifyPaintWaiter(nsDisplayListBuilder* aBuilder)
nsCOMPtr<nsIRunnable> event = new AsyncPaintWaitEvent(content, false);
// Run this event as soon as it's safe to do so, since listeners need to
// receive it immediately
mWaitingForPaint = nsContentUtils::AddScriptRunner(event);
nsContentUtils::AddScriptRunner(event);
mWaitingForPaint = true;
}
}

Просмотреть файл

@ -49,10 +49,11 @@ function PushRecord(props) {
PushRecord.prototype = {
setQuota(suggestedQuota) {
if (this.quotaApplies() && !isNaN(suggestedQuota) && suggestedQuota >= 0) {
this.quota = suggestedQuota;
if (this.quotaApplies()) {
let quota = +suggestedQuota;
this.quota = quota >= 0 ? quota : prefs.get("maxQuotaPerSubscription");
} else {
this.resetQuota();
this.quota = Infinity;
}
},
@ -75,8 +76,10 @@ PushRecord.prototype = {
}
if (lastVisit > this.lastPush) {
// If the user visited the site since the last time we received a
// notification, reset the quota.
let daysElapsed = (Date.now() - lastVisit) / 24 / 60 / 60 / 1000;
// notification, reset the quota. `Math.max(0, ...)` ensures the
// last visit date isn't in the future.
let daysElapsed =
Math.max(0, (Date.now() - lastVisit) / 24 / 60 / 60 / 1000);
this.quota = Math.min(
Math.round(8 * Math.pow(daysElapsed, -0.8)),
prefs.get("maxQuotaPerSubscription")

Просмотреть файл

@ -10,6 +10,8 @@ Cu.import("resource://gre/modules/Task.jsm");
const userAgentID = 'aaabf1f8-2f68-44f1-a920-b88e9e7d7559';
const nsIPushQuotaManager = Components.interfaces.nsIPushQuotaManager;
const MS_IN_ONE_DAY = 1 * 24 * 60 * 60 * 1000;
function run_test() {
do_get_profile();
setPrefs({
@ -41,16 +43,34 @@ add_task(function* test_expiration_origin_threshold() {
originAttributes: '',
quota: 16,
});
yield db.put({
channelID: 'last-visit-future',
pushEndpoint: 'https://example.org/push/2',
scope: 'https://example.info/~marty',
pushCount: 0,
lastPush: 0,
version: null,
originAttributes: '',
quota: 8,
});
// A visit one day ago should provide a quota of 8 messages.
yield PlacesTestUtils.addVisits({
uri: 'https://example.com/login',
title: 'Sign in to see your auctions',
visitDate: (Date.now() - 1 * 24 * 60 * 60 * 1000) * 1000,
visitDate: (Date.now() - MS_IN_ONE_DAY) * 1000,
transition: Ci.nsINavHistoryService.TRANSITION_LINK
});
// Make sure we calculate the quota correctly for visit dates in the
// future (bug 1206424).
yield PlacesTestUtils.addVisits({
uri: 'https://example.info/~marty/flux-capacitor.pdf',
title: 'Flux Capacitor Design',
visitDate: (Date.now() + MS_IN_ONE_DAY) * 1000,
transition: Ci.nsINavHistoryService.TRANSITION_TYPED
});
let numMessages = 10;
let numMessages = 11;
let updates = 0;
let notifyPromise = promiseObserverNotification(PushServiceComponent.pushTopic, (subject, data) => {
@ -70,7 +90,7 @@ add_task(function* test_expiration_origin_threshold() {
let quotaUpdateCount = 0;
PushService._updateQuotaTestCallback = function() {
quotaUpdateCount++;
if (quotaUpdateCount == 10) {
if (quotaUpdateCount == numMessages) {
resolve();
}
};
@ -99,6 +119,13 @@ add_task(function* test_expiration_origin_threshold() {
}],
}));
}
this.serverSendMsg(JSON.stringify({
messageType: 'notification',
updates: [{
channelID: 'last-visit-future',
version: 1,
}],
}));
},
onUnregister(request) {
ok(false, "Channel should not be unregistered.");
@ -117,4 +144,8 @@ add_task(function* test_expiration_origin_threshold() {
let expiredRecord = yield db.getByKeyID('f56645a9-1f32-4655-92ad-ddc37f6d54fb');
notStrictEqual(expiredRecord.quota, 0, 'Expired record not updated');
let futureRecord = yield db.getByKeyID('last-visit-future');
equal(futureRecord.quota, 15,
'Should reset and reduce the quota for visits in the future');
});

Просмотреть файл

@ -59,6 +59,7 @@
#include "mozilla/dom/PMessagePort.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/PromiseDebugging.h"
#include "mozilla/dom/SimpleGlobalObject.h"
#include "mozilla/dom/ScriptSettings.h"
#include "mozilla/dom/StructuredCloneHolder.h"
#include "mozilla/dom/TabChild.h"
@ -1058,6 +1059,11 @@ public:
// Now fire an event at the global object, but don't do that if the error
// code is too much recursion and this is the same script threw the error.
// XXXbz the interaction of this with worker errors seems kinda broken.
// An overrecursion in the debugger or debugger sandbox will get turned
// into an error event on our parent worker!
// https://bugzilla.mozilla.org/show_bug.cgi?id=1271441 tracks making this
// better.
if (aFireAtScope && (aTarget || aErrorNumber != JSMSG_OVER_RECURSED)) {
JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx));
NS_ASSERTION(global, "This should never be null!");
@ -1074,10 +1080,19 @@ public:
UNWRAP_OBJECT(WorkerDebuggerGlobalScope, global, globalScope);
MOZ_ASSERT_IF(globalScope, globalScope->GetWrapperPreserveColor() == global);
MOZ_ASSERT_IF(!globalScope, IsDebuggerSandbox(global));
if (globalScope || IsDebuggerSandbox(global)) {
aWorkerPrivate->ReportErrorToDebugger(aFilename, aLineNumber,
aMessage);
return;
}
aWorkerPrivate->ReportErrorToDebugger(aFilename, aLineNumber,
aMessage);
MOZ_ASSERT(SimpleGlobalObject::SimpleGlobalType(global) ==
SimpleGlobalObject::GlobalType::BindingDetail);
// XXXbz We should really log this to console, but unwinding out of
// this stuff without ending up firing any events is ... hard. Just
// return for now.
// https://bugzilla.mozilla.org/show_bug.cgi?id=1271441 tracks
// making this better.
return;
}

Просмотреть файл

@ -872,9 +872,11 @@ nsWindowWatcher::OpenWindowInternal(mozIDOMWindowProxy* aParent,
nsCOMPtr<nsIDocShell> newDocShell(do_QueryInterface(newDocShellItem));
NS_ENSURE_TRUE(newDocShell, NS_ERROR_UNEXPECTED);
// Set up sandboxing attributes if the window is new.
// The flags can only be non-zero for new windows.
if (activeDocsSandboxFlags != 0) {
// Copy sandbox flags to the new window if activeDocsSandboxFlags says to do
// so. Note that it's only nonzero if the window is new, so clobbering
// sandbox flags on the window makes sense in that case.
if (activeDocsSandboxFlags &
SANDBOX_PROPAGATES_TO_AUXILIARY_BROWSING_CONTEXTS) {
newDocShell->SetSandboxFlags(activeDocsSandboxFlags);
if (parentWindow) {
newDocShell->SetOnePermittedSandboxedNavigator(

Просмотреть файл

@ -634,22 +634,27 @@ DrawTargetSkia::FillGlyphs(ScaledFont *aFont,
paint.mPaint.setAntiAlias(false);
}
} else {
// SkFontHost_cairo does not support subpixel text, so only enable it for other font hosts.
// SkFontHost_cairo does not support subpixel text positioning,
// so only enable it for other font hosts.
paint.mPaint.setSubpixelText(true);
if (aFont->GetType() == FontType::MAC &&
(shouldLCDRenderText || aOptions.mAntialiasMode == AntialiasMode::GRAY)) {
// SkFontHost_mac only enables CG Font Smoothing if hinting is disabled.
// CG Font Smoothing normally enables subpixel AA in CG, but Skia supports
// font smoothing with grayscale AA.
// SkFontHost_mac only supports subpixel antialiasing when hinting is turned off.
// We can get grayscale AA if we have -moz-osx-font-smoothing: grayscale
// explicitly enabled or for transparent surfaces.
// If we have AA grayscale explicit through the draw options,
// then we want to disable font smoothing.
// If we have a transparent surface, shouldLCDRenderText will be false. But unless
// grayscale font smoothing is explicitly requested, we still want Skia to use
// CG Font smoothing.
aOptions.mAntialiasMode == AntialiasMode::GRAY) {
// Normally, Skia enables LCD FontSmoothing which creates thicker fonts
// and also enables subpixel AA. CoreGraphics without font smoothing
// explicitly creates thinner fonts and grayscale AA.
// CoreGraphics doesn't support a configuration that produces thicker
// fonts with grayscale AA as LCD Font Smoothing enables or disables both.
// However, Skia supports it by enabling font smoothing (producing subpixel AA)
// and converts it to grayscale AA. Since Skia doesn't support subpixel AA on
// transparent backgrounds, we still want font smoothing for the thicker fonts,
// even if it is grayscale AA.
//
// With explicit Grayscale AA (from -moz-osx-font-smoothing:grayscale),
// we want to have grayscale AA with no smoothing at all. This means
// disabling the LCD font smoothing behaviour.
// To accomplish this we have to explicitly disable hinting,
// and disable LCDRenderText.
paint.mPaint.setHinting(SkPaint::kNo_Hinting);
} else {
paint.mPaint.setHinting(SkPaint::kNormal_Hinting);

Просмотреть файл

@ -963,6 +963,7 @@ TextureClient::TextureClient(TextureData* aData, TextureFlags aFlags, ClientIPCA
, mExpectedDtRefs(0)
#endif
, mIsLocked(false)
, mInUse(false)
, mAddedToCompositableClient(false)
, mWorkaroundAnnoyingSharedSurfaceLifetimeIssues(false)
, mWorkaroundAnnoyingSharedSurfaceOwnershipIssues(false)

Просмотреть файл

@ -359,6 +359,13 @@ public:
bool CanExposeMappedData() const { return mInfo.canExposeMappedData; }
/* TextureClientRecycleAllocator tracking to decide if we need
* to check with the compositor before recycling.
* Should be superceeded (and removed) by bug 1252835.
*/
void SetInUse(bool aInUse) { mInUse = aInUse; }
bool IsInUse() { return mInUse; }
/**
* Returns a DrawTarget to draw into the TextureClient.
* This function should never be called when not on the main thread!
@ -639,6 +646,7 @@ protected:
uint32_t mExpectedDtRefs;
#endif
bool mIsLocked;
bool mInUse;
bool mAddedToCompositableClient;
bool mWorkaroundAnnoyingSharedSurfaceLifetimeIssues;

Просмотреть файл

@ -181,6 +181,7 @@ TextureClientRecycleAllocator::CreateOrRecycle(ITextureClientAllocationHelper& a
// Make sure the texture holds a reference to us, and ask it to call RecycleTextureClient when its
// ref count drops to 1.
client->SetRecycleAllocator(this);
client->SetInUse(true);
return client.forget();
}
@ -204,9 +205,35 @@ TextureClientRecycleAllocator::ShrinkToMinimumSize()
}
}
class TextureClientWaitTask : public Runnable
{
public:
explicit TextureClientWaitTask(TextureClient* aClient)
: mTextureClient(aClient)
{}
NS_IMETHOD Run() override
{
mTextureClient->WaitForCompositorRecycle();
return NS_OK;
}
private:
RefPtr<TextureClient> mTextureClient;
};
void
TextureClientRecycleAllocator::RecycleTextureClient(TextureClient* aClient)
{
if (aClient->IsInUse()) {
aClient->SetInUse(false);
// This adds another ref to aClient, and drops it after a round trip
// to the compositor. We should then get this callback a second time
// and can recycle properly.
RefPtr<Runnable> task = new TextureClientWaitTask(aClient);
mSurfaceAllocator->GetMessageLoop()->PostTask(task.forget());
return;
}
// Clearing the recycle allocator drops a reference, so make sure we stay alive
// for the duration of this function.
RefPtr<TextureClientRecycleAllocator> kungFuDeathGrip(this);

Просмотреть файл

@ -331,6 +331,11 @@ ImageHost::Composite(LayerComposite* aLayer,
TimedImage* img = &mImages[imageIndex];
img->mTextureHost->SetCompositor(GetCompositor());
// If this TextureHost will be recycled, then make sure we hold a reference to
// it until we're sure that the compositor has finished reading from it.
if (img->mTextureHost->GetFlags() & TextureFlags::RECYCLE) {
aLayer->GetLayerManager()->HoldTextureUntilNextComposite(img->mTextureHost);
}
SetCurrentTextureHost(img->mTextureHost);
{

Просмотреть файл

@ -393,6 +393,9 @@ LayerManagerComposite::EndTransaction(const TimeStamp& aTimeStamp,
if (mRoot && !(aFlags & END_NO_IMMEDIATE_REDRAW)) {
MOZ_ASSERT(!aTimeStamp.IsNull());
UpdateAndRender();
mPreviousHeldTextureHosts.Clear();
mPreviousHeldTextureHosts.SwapElements(mCurrentHeldTextureHosts);
} else {
// Modified the layer tree.
mGeometryChanged = true;

Просмотреть файл

@ -337,6 +337,10 @@ public:
void ForcePresent() { mCompositor->ForcePresent(); }
void HoldTextureUntilNextComposite(TextureHost* aTextureHost) {
mCurrentHeldTextureHosts.AppendElement(aTextureHost);
}
private:
/** Region we're clipping our current drawing to. */
nsIntRegion mClippingRegion;
@ -397,6 +401,9 @@ private:
nsTArray<ImageCompositeNotification> mImageCompositeNotifications;
nsTArray<RefPtr<TextureHost>> mCurrentHeldTextureHosts;
nsTArray<RefPtr<TextureHost>> mPreviousHeldTextureHosts;
/**
* Context target, nullptr when drawing directly to our swap chain.
*/

Просмотреть файл

@ -1208,6 +1208,13 @@ CompositorD3D11::EndFrame()
return;
}
RefPtr<ID3D11Query> query;
CD3D11_QUERY_DESC desc(D3D11_QUERY_EVENT);
mDevice->CreateQuery(&desc, getter_AddRefs(query));
if (query) {
mContext->End(query);
}
UINT presentInterval = 0;
if (gfxWindowsPlatform::GetPlatform()->IsWARP()) {
@ -1268,6 +1275,23 @@ CompositorD3D11::EndFrame()
}
}
// Block until the previous frame's work has been completed.
if (mQuery) {
TimeStamp start = TimeStamp::Now();
BOOL result;
while (mContext->GetData(mQuery, &result, sizeof(BOOL), 0) != S_OK) {
if (mDevice->GetDeviceRemovedReason() != S_OK) {
break;
}
if ((TimeStamp::Now() - start) > TimeDuration::FromSeconds(2)) {
break;
}
Sleep(0);
}
}
// Store the query for this frame so we can flush it next time.
mQuery = query;
mCurrentRT = nullptr;
}

Просмотреть файл

@ -186,6 +186,8 @@ private:
RefPtr<CompositingRenderTargetD3D11> mDefaultRT;
RefPtr<CompositingRenderTargetD3D11> mCurrentRT;
RefPtr<ID3D11Query> mQuery;
DeviceAttachmentsD3D11* mAttachments;
LayoutDeviceIntSize mSize;

Просмотреть файл

@ -1821,6 +1821,7 @@ BundledFontLoader::CreateEnumeratorFromKey(
{
nsIFile *fontDir = *(nsIFile**)aCollectionKey;
*aFontFileEnumerator = new BundledFontFileEnumerator(aFactory, fontDir);
NS_ADDREF(*aFontFileEnumerator);
return S_OK;
}

Просмотреть файл

@ -312,10 +312,13 @@ gfxWindowsSurface::GetSize() const
{
if (mForPrinting) {
// On Windows we need to use the printable area of the page.
// Note: we only scale the printing using the LOGPIXELSY, so we use that
// when calculating the surface width as well as the height.
int32_t heightDPI = ::GetDeviceCaps(mDC, LOGPIXELSY);
float width = (::GetDeviceCaps(mDC, HORZRES) * POINTS_PER_INCH_FLOAT)
/ ::GetDeviceCaps(mDC, LOGPIXELSX);
/ heightDPI;
float height = (::GetDeviceCaps(mDC, VERTRES) * POINTS_PER_INCH_FLOAT)
/ ::GetDeviceCaps(mDC, LOGPIXELSY);
/ heightDPI;
return mozilla::gfx::IntSize(width, height);
}

Просмотреть файл

@ -28,7 +28,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=666446
the VectorImage class for SVG, whereas in this test, we are testing
RasterImage.
-->
<embed id="embeddedSVG" src="animation.svg" type="image/svg+xml" style="display: none;"/>
<embed id="embeddedSVG" src="animation.svg" type="image/svg+xml"
style="height: 40px; width: 40px; display: none;"/>
</div>
<div id="debug" style="display:none"></div>
<pre id="test">

Просмотреть файл

@ -1888,9 +1888,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo* bailoutInfo)
case Bailout_NonObjectInput:
case Bailout_NonStringInput:
case Bailout_NonSymbolInput:
case Bailout_NonSimdBool32x4Input:
case Bailout_NonSimdInt32x4Input:
case Bailout_NonSimdFloat32x4Input:
case Bailout_UnexpectedSimdInput:
case Bailout_NonSharedTypedArrayInput:
case Bailout_Debugger:
case Bailout_UninitializedThis:

Просмотреть файл

@ -5508,8 +5508,12 @@ CodeGenerator::visitSimdBox(LSimdBox* lir)
Address objectData(object, InlineTypedObject::offsetOfDataStart());
switch (type) {
case MIRType::Bool32x4:
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4:
masm.storeUnalignedSimd128Int(in, objectData);
break;
case MIRType::Float32x4:
@ -5586,8 +5590,12 @@ CodeGenerator::visitSimdUnbox(LSimdUnbox* lir)
// Load the value from the data of the InlineTypedObject.
Address objectData(object, InlineTypedObject::offsetOfDataStart());
switch (lir->mir()->type()) {
case MIRType::Bool32x4:
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4:
masm.loadUnalignedSimd128Int(objectData, simd);
break;
case MIRType::Float32x4:

Просмотреть файл

@ -104,9 +104,7 @@ enum BailoutKind
Bailout_NonSymbolInput,
// SIMD Unbox expects a given type, bails out if it doesn't match.
Bailout_NonSimdBool32x4Input,
Bailout_NonSimdInt32x4Input,
Bailout_NonSimdFloat32x4Input,
Bailout_UnexpectedSimdInput,
// Atomic operations require shared memory, bail out if the typed array
// maps unshared memory.
@ -213,12 +211,8 @@ BailoutKindString(BailoutKind kind)
return "Bailout_NonStringInput";
case Bailout_NonSymbolInput:
return "Bailout_NonSymbolInput";
case Bailout_NonSimdBool32x4Input:
return "Bailout_NonSimdBool32x4Input";
case Bailout_NonSimdInt32x4Input:
return "Bailout_NonSimdInt32x4Input";
case Bailout_NonSimdFloat32x4Input:
return "Bailout_NonSimdFloat32x4Input";
case Bailout_UnexpectedSimdInput:
return "Bailout_UnexpectedSimdInput";
case Bailout_NonSharedTypedArrayInput:
return "Bailout_NonSharedTypedArrayInput";
case Bailout_Debugger:

Просмотреть файл

@ -4282,24 +4282,8 @@ LIRGenerator::visitSimdUnbox(MSimdUnbox* ins)
MOZ_ASSERT(ins->input()->type() == MIRType::Object);
MOZ_ASSERT(IsSimdType(ins->type()));
LUse in = useRegister(ins->input());
BailoutKind kind;
switch (ins->type()) {
case MIRType::Bool32x4:
kind = Bailout_NonSimdBool32x4Input;
break;
case MIRType::Int32x4:
kind = Bailout_NonSimdInt32x4Input;
break;
case MIRType::Float32x4:
kind = Bailout_NonSimdFloat32x4Input;
break;
default:
MOZ_CRASH("Unexpected SIMD Type.");
}
LSimdUnbox* lir = new(alloc()) LSimdUnbox(in, temp());
assignSnapshot(lir, kind);
assignSnapshot(lir, Bailout_UnexpectedSimdInput);
define(lir, ins);
}

Просмотреть файл

@ -1115,6 +1115,9 @@ class MAryInstruction : public MInstruction
size_t numOperands() const final override {
return Arity;
}
#ifdef DEBUG
static const size_t staticNumOperands = Arity;
#endif
size_t indexOf(const MUse* u) const final override {
MOZ_ASSERT(u >= &operands_[0]);
MOZ_ASSERT(u <= &operands_[numOperands() - 1]);

Просмотреть файл

@ -155,6 +155,21 @@ class RInstruction
return RInstruction::Recover_##op; \
}
#define RINSTRUCTION_HEADER_NUM_OP_MAIN(op, numOp) \
RINSTRUCTION_HEADER_(op) \
virtual uint32_t numOperands() const { \
return numOp; \
}
#ifdef DEBUG
# define RINSTRUCTION_HEADER_NUM_OP_(op, numOp) \
RINSTRUCTION_HEADER_NUM_OP_MAIN(op, numOp) \
static_assert(M##op::staticNumOperands == numOp, "The recover instructions's numOperands should equal to the MIR's numOperands");
#else
# define RINSTRUCTION_HEADER_NUM_OP_(op, numOp) \
RINSTRUCTION_HEADER_NUM_OP_MAIN(op, numOp)
#endif
class RResumePoint final : public RInstruction
{
private:
@ -176,11 +191,7 @@ class RResumePoint final : public RInstruction
class RBitNot final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(BitNot)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(BitNot, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -188,11 +199,7 @@ class RBitNot final : public RInstruction
class RBitAnd final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(BitAnd)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(BitAnd, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -200,11 +207,7 @@ class RBitAnd final : public RInstruction
class RBitOr final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(BitOr)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(BitOr, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -212,11 +215,7 @@ class RBitOr final : public RInstruction
class RBitXor final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(BitXor)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(BitXor, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -224,11 +223,7 @@ class RBitXor final : public RInstruction
class RLsh final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Lsh)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Lsh, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -236,11 +231,7 @@ class RLsh final : public RInstruction
class RRsh final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Rsh)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Rsh, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -248,11 +239,7 @@ class RRsh final : public RInstruction
class RUrsh final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Ursh)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Ursh, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -263,11 +250,7 @@ class RAdd final : public RInstruction
bool isFloatOperation_;
public:
RINSTRUCTION_HEADER_(Add)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Add, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -278,11 +261,7 @@ class RSub final : public RInstruction
bool isFloatOperation_;
public:
RINSTRUCTION_HEADER_(Sub)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Sub, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -294,11 +273,7 @@ class RMul final : public RInstruction
uint8_t mode_;
public:
RINSTRUCTION_HEADER_(Mul)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Mul, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -309,11 +284,7 @@ class RDiv final : public RInstruction
bool isFloatOperation_;
public:
RINSTRUCTION_HEADER_(Div)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Div, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -321,11 +292,7 @@ class RDiv final : public RInstruction
class RMod final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Mod)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Mod, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -333,11 +300,7 @@ class RMod final : public RInstruction
class RNot final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Not)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(Not, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -345,11 +308,7 @@ class RNot final : public RInstruction
class RConcat final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Concat)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Concat, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -357,11 +316,7 @@ class RConcat final : public RInstruction
class RStringLength final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(StringLength)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(StringLength, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -369,11 +324,7 @@ class RStringLength final : public RInstruction
class RArgumentsLength final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(ArgumentsLength)
virtual uint32_t numOperands() const {
return 0;
}
RINSTRUCTION_HEADER_NUM_OP_(ArgumentsLength, 0)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -382,11 +333,7 @@ class RArgumentsLength final : public RInstruction
class RFloor final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Floor)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(Floor, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -394,11 +341,7 @@ class RFloor final : public RInstruction
class RCeil final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Ceil)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(Ceil, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -406,11 +349,7 @@ class RCeil final : public RInstruction
class RRound final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Round)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(Round, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -418,11 +357,7 @@ class RRound final : public RInstruction
class RCharCodeAt final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(CharCodeAt)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(CharCodeAt, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -430,11 +365,7 @@ class RCharCodeAt final : public RInstruction
class RFromCharCode final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(FromCharCode)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(FromCharCode, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -442,11 +373,7 @@ class RFromCharCode final : public RInstruction
class RPow final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Pow)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Pow, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -454,11 +381,7 @@ class RPow final : public RInstruction
class RPowHalf final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(PowHalf)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(PowHalf, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -469,11 +392,7 @@ class RMinMax final : public RInstruction
bool isMax_;
public:
RINSTRUCTION_HEADER_(MinMax)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(MinMax, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -481,11 +400,7 @@ class RMinMax final : public RInstruction
class RAbs final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Abs)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(Abs, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -496,11 +411,7 @@ class RSqrt final : public RInstruction
bool isFloatOperation_;
public:
RINSTRUCTION_HEADER_(Sqrt)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(Sqrt, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -508,11 +419,7 @@ class RSqrt final : public RInstruction
class RAtan2 final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Atan2)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Atan2, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -538,11 +445,7 @@ class RMathFunction final : public RInstruction
uint8_t function_;
public:
RINSTRUCTION_HEADER_(MathFunction)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(MathFunction, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -550,11 +453,7 @@ class RMathFunction final : public RInstruction
class RStringSplit final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(StringSplit)
virtual uint32_t numOperands() const {
return 3;
}
RINSTRUCTION_HEADER_NUM_OP_(StringSplit, 3)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -562,11 +461,7 @@ class RStringSplit final : public RInstruction
class RRegExpMatcher final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(RegExpMatcher)
virtual uint32_t numOperands() const {
return 5;
}
RINSTRUCTION_HEADER_NUM_OP_(RegExpMatcher, 3)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -574,11 +469,7 @@ class RRegExpMatcher final : public RInstruction
class RRegExpSearcher final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(RegExpSearcher)
virtual uint32_t numOperands() const {
return 5;
}
RINSTRUCTION_HEADER_NUM_OP_(RegExpSearcher, 3)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -586,11 +477,7 @@ class RRegExpSearcher final : public RInstruction
class RRegExpTester final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(RegExpTester)
virtual uint32_t numOperands() const {
return 5;
}
RINSTRUCTION_HEADER_NUM_OP_(RegExpTester, 3)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -601,11 +488,7 @@ class RStringReplace final : public RInstruction
bool isFlatReplacement_;
public:
RINSTRUCTION_HEADER_(StringReplace)
virtual uint32_t numOperands() const {
return 3;
}
RINSTRUCTION_HEADER_NUM_OP_(StringReplace, 3)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -613,11 +496,7 @@ class RStringReplace final : public RInstruction
class RTypeOf final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(TypeOf)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(TypeOf, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -625,11 +504,7 @@ class RTypeOf final : public RInstruction
class RToDouble final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(ToDouble)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(ToDouble, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -637,11 +512,7 @@ class RToDouble final : public RInstruction
class RToFloat32 final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(ToFloat32)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(ToFloat32, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -649,11 +520,7 @@ class RToFloat32 final : public RInstruction
class RTruncateToInt32 final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(TruncateToInt32)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(TruncateToInt32, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -664,11 +531,7 @@ class RNewObject final : public RInstruction
MNewObject::Mode mode_;
public:
RINSTRUCTION_HEADER_(NewObject)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(NewObject, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -679,11 +542,7 @@ class RNewArray final : public RInstruction
uint32_t count_;
public:
RINSTRUCTION_HEADER_(NewArray)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(NewArray, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -691,11 +550,7 @@ class RNewArray final : public RInstruction
class RNewDerivedTypedObject final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(NewDerivedTypedObject)
virtual uint32_t numOperands() const {
return 3;
}
RINSTRUCTION_HEADER_NUM_OP_(NewDerivedTypedObject, 3)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -703,11 +558,7 @@ class RNewDerivedTypedObject final : public RInstruction
class RCreateThisWithTemplate final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(CreateThisWithTemplate)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(CreateThisWithTemplate, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -715,11 +566,7 @@ class RCreateThisWithTemplate final : public RInstruction
class RLambda final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(Lambda)
virtual uint32_t numOperands() const {
return 2;
}
RINSTRUCTION_HEADER_NUM_OP_(Lambda, 2)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -730,11 +577,7 @@ class RSimdBox final : public RInstruction
uint8_t type_;
public:
RINSTRUCTION_HEADER_(SimdBox)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(SimdBox, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -781,11 +624,7 @@ class RArrayState final : public RInstruction
class RAtomicIsLockFree final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(AtomicIsLockFree)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(AtomicIsLockFree, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
@ -793,16 +632,14 @@ class RAtomicIsLockFree final : public RInstruction
class RAssertRecoveredOnBailout final : public RInstruction
{
public:
RINSTRUCTION_HEADER_(AssertRecoveredOnBailout)
virtual uint32_t numOperands() const {
return 1;
}
RINSTRUCTION_HEADER_NUM_OP_(AssertRecoveredOnBailout, 1)
bool recover(JSContext* cx, SnapshotIterator& iter) const;
};
#undef RINSTRUCTION_HEADER_
#undef RINSTRUCTION_HEADER_NUM_OP_
#undef RINSTRUCTION_HEADER_NUM_OP_MAIN
const RResumePoint*
RInstruction::toResumePoint() const

Просмотреть файл

@ -402,19 +402,22 @@ CreateGlobalObject(JSContext* cx, const JSClass* clasp, nsIPrincipal* principal,
// of |global|.
(void) new XPCWrappedNativeScope(cx, global);
if (clasp->flags & JSCLASS_DOM_GLOBAL) {
#ifdef DEBUG
// Verify that the right trace hook is called. Note that this doesn't
// work right for wrapped globals, since the tracing situation there is
// more complicated. Manual inspection shows that they do the right thing.
if (!((const js::Class*)clasp)->isWrappedNative())
{
VerifyTraceProtoAndIfaceCacheCalledTracer trc(JS_GetRuntime(cx));
TraceChildren(&trc, GCCellPtr(global.get()));
MOZ_ASSERT(trc.ok, "Trace hook on global needs to call TraceXPCGlobal for XPConnect compartments.");
}
// Verify that the right trace hook is called. Note that this doesn't
// work right for wrapped globals, since the tracing situation there is
// more complicated. Manual inspection shows that they do the right
// thing. Also note that we only check this for JSCLASS_DOM_GLOBAL
// classes because xpc::TraceXPCGlobal won't call
// TraceProtoAndIfaceCache unless that flag is set.
if (!((const js::Class*)clasp)->isWrappedNative())
{
VerifyTraceProtoAndIfaceCacheCalledTracer trc(JS_GetRuntime(cx));
TraceChildren(&trc, GCCellPtr(global.get()));
MOZ_ASSERT(trc.ok, "Trace hook on global needs to call TraceXPCGlobal for XPConnect compartments.");
}
#endif
if (clasp->flags & JSCLASS_DOM_GLOBAL) {
const char* className = clasp->name;
AllocateProtoAndIfaceCache(global,
(strcmp(className, "Window") == 0 ||

Просмотреть файл

@ -86,6 +86,8 @@
#include "nsIPrompt.h"
#include "imgIContainer.h" // image animation mode constants
#include "nsSandboxFlags.h"
#include "mozilla/DocLoadingTimelineMarker.h"
//--------------------------
@ -1130,18 +1132,14 @@ nsDocumentViewer::PermitUnloadInternal(bool *aShouldPrompt,
nsAutoPopupStatePusher popupStatePusher(openAbused, true);
// Never permit dialogs from the beforeunload handler
nsGlobalWindow *globalWindow =
static_cast<nsGlobalWindow*>(reinterpret_cast<nsPIDOMWindow<nsISupports>*>(window));
nsGlobalWindow* globalWindow = nsGlobalWindow::Cast(window);
dialogsAreEnabled = globalWindow->AreDialogsEnabled();
globalWindow->DisableDialogs();
nsGlobalWindow::TemporarilyDisableDialogs disableDialogs(globalWindow);
mInPermitUnload = true;
EventDispatcher::DispatchDOMEvent(window, nullptr, event, mPresContext,
nullptr);
mInPermitUnload = false;
if (dialogsAreEnabled) {
globalWindow->EnableDialogs();
}
}
nsCOMPtr<nsIDocShell> docShell(mContainer);
@ -1150,7 +1148,8 @@ nsDocumentViewer::PermitUnloadInternal(bool *aShouldPrompt,
// NB: we nullcheck mDocument because it might now be dead as a result of
// the event being dispatched.
if (!sIsBeforeUnloadDisabled && *aShouldPrompt && dialogsAreEnabled && mDocument &&
if (!sIsBeforeUnloadDisabled && *aShouldPrompt && dialogsAreEnabled &&
mDocument && !(mDocument->GetSandboxFlags() & SANDBOXED_MODALS) &&
(!sBeforeUnloadRequiresInteraction || mDocument->UserHasInteracted()) &&
(event->WidgetEventPtr()->DefaultPrevented() || !text.IsEmpty())) {
// Ask the user if it's ok to unload the current page

Просмотреть файл

@ -7281,8 +7281,9 @@ nsLayoutUtils::SurfaceFromElement(nsIImageLoadingContent* aElement,
nsCOMPtr<imgIRequest> imgRequest;
rv = aElement->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
getter_AddRefs(imgRequest));
if (NS_FAILED(rv) || !imgRequest)
if (NS_FAILED(rv) || !imgRequest) {
return result;
}
uint32_t status;
imgRequest->GetImageStatus(&status);
@ -7297,13 +7298,15 @@ nsLayoutUtils::SurfaceFromElement(nsIImageLoadingContent* aElement,
nsCOMPtr<nsIPrincipal> principal;
rv = imgRequest->GetImagePrincipal(getter_AddRefs(principal));
if (NS_FAILED(rv))
if (NS_FAILED(rv)) {
return result;
}
nsCOMPtr<imgIContainer> imgContainer;
rv = imgRequest->GetImage(getter_AddRefs(imgContainer));
if (NS_FAILED(rv))
if (NS_FAILED(rv)) {
return result;
}
uint32_t noRasterize = aSurfaceFlags & SFE_NO_RASTERIZING_VECTORS;
@ -7368,7 +7371,6 @@ nsLayoutUtils::SurfaceFromElement(nsIImageLoadingContent* aElement,
// no images, including SVG images, can load content from another domain.
result.mIsWriteOnly = false;
result.mImageRequest = imgRequest.forget();
return result;
}

Просмотреть файл

@ -1012,8 +1012,7 @@ nsComboboxControlFrame::RedisplayText(int32_t aIndex)
RefPtr<RedisplayTextEvent> event = new RedisplayTextEvent(this);
mRedisplayTextEvent = event;
if (!nsContentUtils::AddScriptRunner(event))
mRedisplayTextEvent.Forget();
nsContentUtils::AddScriptRunner(event);
}
return rv;
}
@ -1482,7 +1481,11 @@ nsComboboxControlFrame::Rollup(uint32_t aCount, bool aFlush,
// The popup's visibility doesn't update until the minimize animation has
// finished, so call UpdateWidgetGeometry to update it right away.
nsViewManager* viewManager = mDropdownFrame->GetView()->GetViewManager();
viewManager->UpdateWidgetGeometry();
viewManager->UpdateWidgetGeometry(); // might destroy us
}
if (!weakFrame.IsAlive()) {
return consume;
}
if (aLastRolledUp) {

Просмотреть файл

@ -587,7 +587,7 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
align = NS_STYLE_TEXT_ALIGN_END;
} else if (align == NS_STYLE_TEXT_ALIGN_RIGHT ||
align == NS_STYLE_TEXT_ALIGN_MOZ_RIGHT) {
align = NS_STYLE_TEXT_ALIGN_DEFAULT;
align = NS_STYLE_TEXT_ALIGN_START;
}
}
switch (align) {

Просмотреть файл

@ -394,12 +394,7 @@ nsTextControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
}
initializer = new EditorInitializer(this);
Properties().Set(TextControlInitializer(),initializer);
if (!nsContentUtils::AddScriptRunner(initializer)) {
initializer->Revoke(); // paranoia
Properties().Delete(TextControlInitializer());
delete initializer;
return NS_ERROR_OUT_OF_MEMORY;
}
nsContentUtils::AddScriptRunner(initializer);
}
return NS_OK;

Просмотреть файл

@ -1839,7 +1839,7 @@ IsAlignedLeft(uint8_t aAlignment,
{
return aFrame->IsSVGText() ||
NS_STYLE_TEXT_ALIGN_LEFT == aAlignment ||
(((NS_STYLE_TEXT_ALIGN_DEFAULT == aAlignment &&
(((NS_STYLE_TEXT_ALIGN_START == aAlignment &&
NS_STYLE_DIRECTION_LTR == aDirection) ||
(NS_STYLE_TEXT_ALIGN_END == aAlignment &&
NS_STYLE_DIRECTION_RTL == aDirection)) &&

Просмотреть файл

@ -3139,7 +3139,7 @@ nsLineLayout::TextAlignLine(nsLineBox* aLine,
textAlignTrue = mStyleText->mTextAlignLastTrue;
if (mStyleText->mTextAlignLast == NS_STYLE_TEXT_ALIGN_AUTO) {
if (textAlign == NS_STYLE_TEXT_ALIGN_JUSTIFY) {
textAlign = NS_STYLE_TEXT_ALIGN_DEFAULT;
textAlign = NS_STYLE_TEXT_ALIGN_START;
}
} else {
textAlign = mStyleText->mTextAlignLast;
@ -3201,7 +3201,7 @@ nsLineLayout::TextAlignLine(nsLineBox* aLine,
MOZ_FALLTHROUGH;
}
case NS_STYLE_TEXT_ALIGN_DEFAULT:
case NS_STYLE_TEXT_ALIGN_START:
// default alignment is to start edge so do nothing
break;

Просмотреть файл

@ -5,7 +5,7 @@ skip-if(!asyncPan) == bg-fixed-cover-3.html bg-fixed-cover-3-ref.html
skip-if(!asyncPan) == bg-fixed-child.html bg-fixed-child-ref.html
skip-if(!asyncPan) == bg-fixed-child-clip-1.html bg-fixed-child-clip-ref.html
skip-if(!asyncPan) == bg-fixed-child-clip-2.html bg-fixed-child-clip-ref.html
fuzzy(1,246) fuzzy-if(skiaContent,2,160) skip-if(!asyncPan) == bg-fixed-child-mask.html bg-fixed-child-mask-ref.html
fuzzy(1,246) fuzzy-if(skiaContent,2,160) fuzzy-if(browserIsRemote&&d2d,53,185) skip-if(!asyncPan) == bg-fixed-child-mask.html bg-fixed-child-mask-ref.html
skip-if(!asyncPan) == bg-fixed-in-opacity.html bg-fixed-in-opacity-ref.html
skip-if(!asyncPan) == bg-fixed-child-no-culling.html bg-fixed-child-no-culling-ref.html
fuzzy-if(B2G,2,5366) fuzzy-if(Android,2,4000) fuzzy-if(browserIsRemote&&cocoaWidget,2,179524) fuzzy-if(browserIsRemote&&winWidget,1,74590) skip-if(!asyncPan) == bg-fixed-transformed-image.html bg-fixed-transformed-image-ref.html

Просмотреть файл

@ -145,7 +145,7 @@ HTTP(..) == zwnj-02.xhtml zwnj-02-ref.xhtml # HTTP(..) for ../filters.svg
== 449555-1.html 449555-1-ref.html
== 467722.html 467722-ref.html
skip-if(B2G||Mulet) fuzzy-if(skiaContent,1,600) HTTP(..) == 475092-sub.html 475092-ref.html # Initial mulet triage: parity with B2G/B2G Desktop
fails-if(!winWidget&&!gtkWidget) skip-if(B2G||Mulet) fuzzy-if(skiaContent,64,3100) HTTP(..) == 475092-pos.html 475092-sub.html # bug 482596 # Initial mulet triage: parity with B2G/B2G Desktop
fails-if(!winWidget&&!gtkWidget) skip-if(B2G||Mulet) fuzzy-if(skiaContent,89,3100) HTTP(..) == 475092-pos.html 475092-sub.html # bug 482596 # Initial mulet triage: parity with B2G/B2G Desktop
== 476378-soft-hyphen-fallback.html 476378-soft-hyphen-fallback-ref.html
# Test for bug 484954
== rgba-text.html rgba-text-ref.html

Просмотреть файл

@ -4,102 +4,102 @@
default-preferences pref(layout.css.vertical-text.enabled,true)
# All of these are fuzzy-if on skia content on OS X due to subpixel text positioning.
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-003.xht s71-abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-005.xht s71-abs-pos-non-replaced-vlr-005-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-007.xht s71-abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-009.xht s71-abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-011.xht s71-abs-pos-non-replaced-vlr-011-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-013.xht s71-abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-015.xht s71-abs-pos-non-replaced-vlr-015-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-017.xht s71-abs-pos-non-replaced-vlr-017-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-019.xht s71-abs-pos-non-replaced-vlr-019-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-021.xht s71-abs-pos-non-replaced-vlr-021-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-023.xht s71-abs-pos-non-replaced-vlr-023-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-025.xht s71-abs-pos-non-replaced-vlr-025-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-027.xht s71-abs-pos-non-replaced-vlr-027-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-029.xht s71-abs-pos-non-replaced-vlr-029-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-031.xht s71-abs-pos-non-replaced-vlr-031-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-033.xht s71-abs-pos-non-replaced-vlr-033-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-035.xht s71-abs-pos-non-replaced-vlr-035-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-037.xht s71-abs-pos-non-replaced-vlr-037-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-039.xht s71-abs-pos-non-replaced-vlr-039-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-041.xht s71-abs-pos-non-replaced-vlr-041-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-043.xht s71-abs-pos-non-replaced-vlr-043-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-045.xht s71-abs-pos-non-replaced-vlr-045-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-047.xht s71-abs-pos-non-replaced-vlr-047-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-049.xht s71-abs-pos-non-replaced-vlr-049-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-051.xht s71-abs-pos-non-replaced-vlr-051-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-053.xht s71-abs-pos-non-replaced-vlr-053-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-055.xht s71-abs-pos-non-replaced-vlr-055-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-057.xht s71-abs-pos-non-replaced-vlr-057-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-059.xht s71-abs-pos-non-replaced-vlr-059-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-061.xht s71-abs-pos-non-replaced-vlr-061-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-063.xht s71-abs-pos-non-replaced-vlr-063-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-065.xht s71-abs-pos-non-replaced-vlr-065-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-067.xht s71-abs-pos-non-replaced-vlr-067-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-069.xht s71-abs-pos-non-replaced-vlr-069-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-071.xht s71-abs-pos-non-replaced-vlr-071-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-073.xht s71-abs-pos-non-replaced-vlr-073-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-075.xht s71-abs-pos-non-replaced-vlr-075-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-077.xht s71-abs-pos-non-replaced-vlr-077-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-079.xht s71-abs-pos-non-replaced-vlr-079-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-081.xht s71-abs-pos-non-replaced-vlr-081-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-083.xht s71-abs-pos-non-replaced-vlr-083-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-085.xht s71-abs-pos-non-replaced-vlr-085-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-087.xht s71-abs-pos-non-replaced-vlr-087-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-089.xht s71-abs-pos-non-replaced-vlr-089-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-091.xht s71-abs-pos-non-replaced-vlr-091-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-093.xht s71-abs-pos-non-replaced-vlr-093-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-095.xht s71-abs-pos-non-replaced-vlr-095-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vlr-097.xht s71-abs-pos-non-replaced-vlr-097-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-002.xht s71-abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-004.xht s71-abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-006.xht s71-abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-008.xht s71-abs-pos-non-replaced-vrl-008-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-010.xht s71-abs-pos-non-replaced-vrl-010-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-012.xht s71-abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-014.xht s71-abs-pos-non-replaced-vrl-014-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-016.xht s71-abs-pos-non-replaced-vrl-016-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-018.xht s71-abs-pos-non-replaced-vrl-018-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-020.xht s71-abs-pos-non-replaced-vrl-020-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-022.xht s71-abs-pos-non-replaced-vrl-022-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-024.xht s71-abs-pos-non-replaced-vrl-024-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-026.xht s71-abs-pos-non-replaced-vrl-026-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-028.xht s71-abs-pos-non-replaced-vrl-028-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-030.xht s71-abs-pos-non-replaced-vrl-030-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-032.xht s71-abs-pos-non-replaced-vrl-032-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-034.xht s71-abs-pos-non-replaced-vrl-034-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-036.xht s71-abs-pos-non-replaced-vrl-036-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-038.xht s71-abs-pos-non-replaced-vrl-038-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-040.xht s71-abs-pos-non-replaced-vrl-040-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-042.xht s71-abs-pos-non-replaced-vrl-042-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-044.xht s71-abs-pos-non-replaced-vrl-044-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-046.xht s71-abs-pos-non-replaced-vrl-046-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-048.xht s71-abs-pos-non-replaced-vrl-048-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-050.xht s71-abs-pos-non-replaced-vrl-050-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-052.xht s71-abs-pos-non-replaced-vrl-052-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-054.xht s71-abs-pos-non-replaced-vrl-054-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-056.xht s71-abs-pos-non-replaced-vrl-056-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-058.xht s71-abs-pos-non-replaced-vrl-058-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-060.xht s71-abs-pos-non-replaced-vrl-060-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-062.xht s71-abs-pos-non-replaced-vrl-062-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-064.xht s71-abs-pos-non-replaced-vrl-064-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-066.xht s71-abs-pos-non-replaced-vrl-066-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-068.xht s71-abs-pos-non-replaced-vrl-068-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-070.xht s71-abs-pos-non-replaced-vrl-070-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-072.xht s71-abs-pos-non-replaced-vrl-072-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-074.xht s71-abs-pos-non-replaced-vrl-074-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-076.xht s71-abs-pos-non-replaced-vrl-076-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-078.xht s71-abs-pos-non-replaced-vrl-078-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-080.xht s71-abs-pos-non-replaced-vrl-080-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-082.xht s71-abs-pos-non-replaced-vrl-082-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-084.xht s71-abs-pos-non-replaced-vrl-084-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-086.xht s71-abs-pos-non-replaced-vrl-086-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-088.xht s71-abs-pos-non-replaced-vrl-088-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-090.xht s71-abs-pos-non-replaced-vrl-090-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-092.xht s71-abs-pos-non-replaced-vrl-092-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-094.xht s71-abs-pos-non-replaced-vrl-094-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,128,160) == s71-abs-pos-non-replaced-vrl-096.xht s71-abs-pos-non-replaced-vrl-096-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-003.xht s71-abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-005.xht s71-abs-pos-non-replaced-vlr-005-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-007.xht s71-abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-009.xht s71-abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-011.xht s71-abs-pos-non-replaced-vlr-011-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-013.xht s71-abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-015.xht s71-abs-pos-non-replaced-vlr-015-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-017.xht s71-abs-pos-non-replaced-vlr-017-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-019.xht s71-abs-pos-non-replaced-vlr-019-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-021.xht s71-abs-pos-non-replaced-vlr-021-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-023.xht s71-abs-pos-non-replaced-vlr-023-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-025.xht s71-abs-pos-non-replaced-vlr-025-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-027.xht s71-abs-pos-non-replaced-vlr-027-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-029.xht s71-abs-pos-non-replaced-vlr-029-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-031.xht s71-abs-pos-non-replaced-vlr-031-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-033.xht s71-abs-pos-non-replaced-vlr-033-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-035.xht s71-abs-pos-non-replaced-vlr-035-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-037.xht s71-abs-pos-non-replaced-vlr-037-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-039.xht s71-abs-pos-non-replaced-vlr-039-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-041.xht s71-abs-pos-non-replaced-vlr-041-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-043.xht s71-abs-pos-non-replaced-vlr-043-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-045.xht s71-abs-pos-non-replaced-vlr-045-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-047.xht s71-abs-pos-non-replaced-vlr-047-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-049.xht s71-abs-pos-non-replaced-vlr-049-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-051.xht s71-abs-pos-non-replaced-vlr-051-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-053.xht s71-abs-pos-non-replaced-vlr-053-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-055.xht s71-abs-pos-non-replaced-vlr-055-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-057.xht s71-abs-pos-non-replaced-vlr-057-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-059.xht s71-abs-pos-non-replaced-vlr-059-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-061.xht s71-abs-pos-non-replaced-vlr-061-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-063.xht s71-abs-pos-non-replaced-vlr-063-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-065.xht s71-abs-pos-non-replaced-vlr-065-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-067.xht s71-abs-pos-non-replaced-vlr-067-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-069.xht s71-abs-pos-non-replaced-vlr-069-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-071.xht s71-abs-pos-non-replaced-vlr-071-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-073.xht s71-abs-pos-non-replaced-vlr-073-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-075.xht s71-abs-pos-non-replaced-vlr-075-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-077.xht s71-abs-pos-non-replaced-vlr-077-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-079.xht s71-abs-pos-non-replaced-vlr-079-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-081.xht s71-abs-pos-non-replaced-vlr-081-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-083.xht s71-abs-pos-non-replaced-vlr-083-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-085.xht s71-abs-pos-non-replaced-vlr-085-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-087.xht s71-abs-pos-non-replaced-vlr-087-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-089.xht s71-abs-pos-non-replaced-vlr-089-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-091.xht s71-abs-pos-non-replaced-vlr-091-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-093.xht s71-abs-pos-non-replaced-vlr-093-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-095.xht s71-abs-pos-non-replaced-vlr-095-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vlr-097.xht s71-abs-pos-non-replaced-vlr-097-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-002.xht s71-abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-004.xht s71-abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-006.xht s71-abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-008.xht s71-abs-pos-non-replaced-vrl-008-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-010.xht s71-abs-pos-non-replaced-vrl-010-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-012.xht s71-abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-014.xht s71-abs-pos-non-replaced-vrl-014-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-016.xht s71-abs-pos-non-replaced-vrl-016-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-018.xht s71-abs-pos-non-replaced-vrl-018-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-020.xht s71-abs-pos-non-replaced-vrl-020-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-022.xht s71-abs-pos-non-replaced-vrl-022-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-024.xht s71-abs-pos-non-replaced-vrl-024-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-026.xht s71-abs-pos-non-replaced-vrl-026-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-028.xht s71-abs-pos-non-replaced-vrl-028-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-030.xht s71-abs-pos-non-replaced-vrl-030-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-032.xht s71-abs-pos-non-replaced-vrl-032-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-034.xht s71-abs-pos-non-replaced-vrl-034-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-036.xht s71-abs-pos-non-replaced-vrl-036-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-038.xht s71-abs-pos-non-replaced-vrl-038-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-040.xht s71-abs-pos-non-replaced-vrl-040-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-042.xht s71-abs-pos-non-replaced-vrl-042-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-044.xht s71-abs-pos-non-replaced-vrl-044-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-046.xht s71-abs-pos-non-replaced-vrl-046-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-048.xht s71-abs-pos-non-replaced-vrl-048-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-050.xht s71-abs-pos-non-replaced-vrl-050-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-052.xht s71-abs-pos-non-replaced-vrl-052-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-054.xht s71-abs-pos-non-replaced-vrl-054-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-056.xht s71-abs-pos-non-replaced-vrl-056-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-058.xht s71-abs-pos-non-replaced-vrl-058-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-060.xht s71-abs-pos-non-replaced-vrl-060-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-062.xht s71-abs-pos-non-replaced-vrl-062-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-064.xht s71-abs-pos-non-replaced-vrl-064-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-066.xht s71-abs-pos-non-replaced-vrl-066-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-068.xht s71-abs-pos-non-replaced-vrl-068-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-070.xht s71-abs-pos-non-replaced-vrl-070-ref.xht
fuzzy-if(cocoaWidget,118,242) fuzzy-if(winWidget,116,240) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-072.xht s71-abs-pos-non-replaced-vrl-072-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-074.xht s71-abs-pos-non-replaced-vrl-074-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-076.xht s71-abs-pos-non-replaced-vrl-076-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-078.xht s71-abs-pos-non-replaced-vrl-078-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-080.xht s71-abs-pos-non-replaced-vrl-080-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-082.xht s71-abs-pos-non-replaced-vrl-082-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-084.xht s71-abs-pos-non-replaced-vrl-084-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-086.xht s71-abs-pos-non-replaced-vrl-086-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-088.xht s71-abs-pos-non-replaced-vrl-088-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-090.xht s71-abs-pos-non-replaced-vrl-090-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-092.xht s71-abs-pos-non-replaced-vrl-092-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-094.xht s71-abs-pos-non-replaced-vrl-094-ref.xht
fuzzy-if(cocoaWidget,15,5) fuzzy-if(d2d,102,164) fuzzy-if(skiaContent,154,248) == s71-abs-pos-non-replaced-vrl-096.xht s71-abs-pos-non-replaced-vrl-096-ref.xht
== 1183431-orthogonal-modes-1a.html 1183431-orthogonal-modes-1-ref.html
== 1183431-orthogonal-modes-1b.html 1183431-orthogonal-modes-1-ref.html

Просмотреть файл

@ -1975,7 +1975,7 @@ KTableEntry nsCSSProps::kTextAlignKTable[] = {
{ eCSSKeyword__moz_center, NS_STYLE_TEXT_ALIGN_MOZ_CENTER },
{ eCSSKeyword__moz_right, NS_STYLE_TEXT_ALIGN_MOZ_RIGHT },
{ eCSSKeyword__moz_left, NS_STYLE_TEXT_ALIGN_MOZ_LEFT },
{ eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_DEFAULT },
{ eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_START },
{ eCSSKeyword_end, NS_STYLE_TEXT_ALIGN_END },
{ eCSSKeyword_unsafe, NS_STYLE_TEXT_ALIGN_UNSAFE },
{ eCSSKeyword_match_parent, NS_STYLE_TEXT_ALIGN_MATCH_PARENT },
@ -1988,7 +1988,7 @@ KTableEntry nsCSSProps::kTextAlignLastKTable[] = {
{ eCSSKeyword_right, NS_STYLE_TEXT_ALIGN_RIGHT },
{ eCSSKeyword_center, NS_STYLE_TEXT_ALIGN_CENTER },
{ eCSSKeyword_justify, NS_STYLE_TEXT_ALIGN_JUSTIFY },
{ eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_DEFAULT },
{ eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_START },
{ eCSSKeyword_end, NS_STYLE_TEXT_ALIGN_END },
{ eCSSKeyword_unsafe, NS_STYLE_TEXT_ALIGN_UNSAFE },
{ eCSSKeyword_UNKNOWN, -1 }

Просмотреть файл

@ -4451,7 +4451,7 @@ nsRuleNode::ComputeTextData(void* aStartStruct,
textAlignValue->GetIntValue()) {
conditions.SetUncacheable();
uint8_t parentAlign = parentText->mTextAlign;
text->mTextAlign = (NS_STYLE_TEXT_ALIGN_DEFAULT == parentAlign) ?
text->mTextAlign = (NS_STYLE_TEXT_ALIGN_START == parentAlign) ?
NS_STYLE_TEXT_ALIGN_CENTER : parentAlign;
} else if (eCSSUnit_Enumerated == textAlignValue->GetUnit() &&
NS_STYLE_TEXT_ALIGN_MATCH_PARENT ==
@ -4462,7 +4462,7 @@ nsRuleNode::ComputeTextData(void* aStartStruct,
uint8_t parentAlign = parentText->mTextAlign;
uint8_t parentDirection = parent->StyleVisibility()->mDirection;
switch (parentAlign) {
case NS_STYLE_TEXT_ALIGN_DEFAULT:
case NS_STYLE_TEXT_ALIGN_START:
text->mTextAlign = parentDirection == NS_STYLE_DIRECTION_RTL ?
NS_STYLE_TEXT_ALIGN_RIGHT : NS_STYLE_TEXT_ALIGN_LEFT;
break;
@ -4496,7 +4496,7 @@ nsRuleNode::ComputeTextData(void* aStartStruct,
SetDiscrete(*textAlignValue, text->mTextAlign, conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
parentText->mTextAlign,
NS_STYLE_TEXT_ALIGN_DEFAULT, 0, 0, 0, 0);
NS_STYLE_TEXT_ALIGN_START, 0, 0, 0, 0);
}
// text-align-last: enum, pair(enum), inherit, initial

Просмотреть файл

@ -799,7 +799,7 @@ enum class FillMode : uint32_t;
#define NS_STYLE_RESIZE_VERTICAL 3
// See nsStyleText
#define NS_STYLE_TEXT_ALIGN_DEFAULT 0
#define NS_STYLE_TEXT_ALIGN_START 0
#define NS_STYLE_TEXT_ALIGN_LEFT 1
#define NS_STYLE_TEXT_ALIGN_RIGHT 2
#define NS_STYLE_TEXT_ALIGN_CENTER 3

Просмотреть файл

@ -704,7 +704,7 @@ nsStyleContext::ApplyStyleFixups(bool aSkipParentDisplayBasedStyleFixup)
text->mTextAlign == NS_STYLE_TEXT_ALIGN_MOZ_RIGHT)
{
nsStyleText* uniqueText = GET_UNIQUE_STYLE_DATA(Text);
uniqueText->mTextAlign = NS_STYLE_TEXT_ALIGN_DEFAULT;
uniqueText->mTextAlign = NS_STYLE_TEXT_ALIGN_START;
}
}

Просмотреть файл

@ -518,7 +518,7 @@ nsChangeHint nsStyleBorder::CalcDifference(const nsStyleBorder& aOther) const
nsStyleOutline::nsStyleOutline(StyleStructContext aContext)
: mOutlineWidth(NS_STYLE_BORDER_WIDTH_MEDIUM, eStyleUnit_Enumerated)
, mOutlineOffset(0)
, mCachedOutlineWidth(0)
, mActualOutlineWidth(0)
, mOutlineColor(NS_RGB(0, 0, 0))
, mOutlineStyle(NS_STYLE_BORDER_STYLE_NONE)
, mTwipsPerPixel(aContext.DevPixelsToAppUnits(1))
@ -537,7 +537,7 @@ nsStyleOutline::nsStyleOutline(const nsStyleOutline& aSrc)
: mOutlineRadius(aSrc.mOutlineRadius)
, mOutlineWidth(aSrc.mOutlineWidth)
, mOutlineOffset(aSrc.mOutlineOffset)
, mCachedOutlineWidth(aSrc.mCachedOutlineWidth)
, mActualOutlineWidth(aSrc.mActualOutlineWidth)
, mOutlineColor(aSrc.mOutlineColor)
, mOutlineStyle(aSrc.mOutlineStyle)
, mTwipsPerPixel(aSrc.mTwipsPerPixel)
@ -549,44 +549,40 @@ void
nsStyleOutline::RecalcData()
{
if (NS_STYLE_BORDER_STYLE_NONE == GetOutlineStyle()) {
mCachedOutlineWidth = 0;
mActualOutlineWidth = 0;
} else {
MOZ_ASSERT(mOutlineWidth.ConvertsToLength() ||
mOutlineWidth.GetUnit() == eStyleUnit_Enumerated);
// Clamp negative calc() to 0.
mCachedOutlineWidth =
mActualOutlineWidth =
std::max(CalcCoord(mOutlineWidth,
StaticPresData::Get()->GetBorderWidthTable(), 3), 0);
mCachedOutlineWidth =
NS_ROUND_BORDER_TO_PIXELS(mCachedOutlineWidth, mTwipsPerPixel);
mActualOutlineWidth =
NS_ROUND_BORDER_TO_PIXELS(mActualOutlineWidth, mTwipsPerPixel);
}
}
nsChangeHint nsStyleOutline::CalcDifference(const nsStyleOutline& aOther) const
{
bool outlineWasVisible =
mCachedOutlineWidth > 0 && mOutlineStyle != NS_STYLE_BORDER_STYLE_NONE;
bool outlineIsVisible =
aOther.mCachedOutlineWidth > 0 && aOther.mOutlineStyle != NS_STYLE_BORDER_STYLE_NONE;
if (outlineWasVisible != outlineIsVisible ||
(outlineIsVisible && (mOutlineOffset != aOther.mOutlineOffset ||
mOutlineWidth != aOther.mOutlineWidth ||
mTwipsPerPixel != aOther.mTwipsPerPixel))) {
if (mActualOutlineWidth != aOther.mActualOutlineWidth ||
(mActualOutlineWidth > 0 &&
mOutlineOffset != aOther.mOutlineOffset)) {
return NS_CombineHint(nsChangeHint_UpdateOverflow,
nsChangeHint_SchedulePaint);
}
if ((mOutlineStyle != aOther.mOutlineStyle) ||
(mOutlineColor != aOther.mOutlineColor) ||
(mOutlineRadius != aOther.mOutlineRadius)) {
return nsChangeHint_RepaintFrame;
if (mOutlineStyle != aOther.mOutlineStyle ||
mOutlineColor != aOther.mOutlineColor ||
mOutlineRadius != aOther.mOutlineRadius) {
if (mActualOutlineWidth > 0) {
return nsChangeHint_RepaintFrame;
}
return nsChangeHint_NeutralChange;
}
// XXX Not exactly sure if we need to check the cached outline values.
if (mOutlineWidth != aOther.mOutlineWidth ||
mOutlineOffset != aOther.mOutlineOffset ||
mTwipsPerPixel != aOther.mTwipsPerPixel ||
mCachedOutlineWidth != aOther.mCachedOutlineWidth) {
mTwipsPerPixel != aOther.mTwipsPerPixel) {
return nsChangeHint_NeutralChange;
}
@ -3528,7 +3524,7 @@ AreShadowArraysEqual(nsCSSShadowArray* lhs,
//
nsStyleText::nsStyleText(StyleStructContext aContext)
: mTextAlign(NS_STYLE_TEXT_ALIGN_DEFAULT)
: mTextAlign(NS_STYLE_TEXT_ALIGN_START)
, mTextAlignLast(NS_STYLE_TEXT_ALIGN_AUTO)
, mTextAlignTrue(false)
, mTextAlignLastTrue(false)

Просмотреть файл

@ -1316,14 +1316,17 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleOutline
nsStyleCorners mOutlineRadius; // [reset] coord, percent, calc
// Note that this is a specified value. You can get the actual values
// with GetOutlineWidth. You cannot get the computed value directly.
// This is the specified value of outline-width, but with length values
// computed to absolute. mActualOutlineWidth stores the outline-width
// value used by layout. (We must store mOutlineWidth for the same
// style struct resolution reasons that we do nsStyleBorder::mBorder;
// see that field's comment.)
nsStyleCoord mOutlineWidth; // [reset] coord, enum (see nsStyleConsts.h)
nscoord mOutlineOffset; // [reset]
nscoord GetOutlineWidth() const
{
return mCachedOutlineWidth;
return mActualOutlineWidth;
}
uint8_t GetOutlineStyle() const
@ -1364,9 +1367,10 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleOutline
}
protected:
// This value is the actual value, so it's rounded to the nearest device
// pixel.
nscoord mCachedOutlineWidth;
// The actual value of outline-width is the computed value (an absolute
// length, forced to zero when outline-style is none) rounded to device
// pixels. This is the value used by layout.
nscoord mActualOutlineWidth;
nscolor mOutlineColor; // [reset]

Просмотреть файл

@ -288,13 +288,13 @@ nsTreeColumn::Invalidate()
const nsStyleText* textStyle = frame->StyleText();
mTextAlignment = textStyle->mTextAlign;
// DEFAULT or END alignment sometimes means RIGHT
if ((mTextAlignment == NS_STYLE_TEXT_ALIGN_DEFAULT &&
// START or END alignment sometimes means RIGHT
if ((mTextAlignment == NS_STYLE_TEXT_ALIGN_START &&
vis->mDirection == NS_STYLE_DIRECTION_RTL) ||
(mTextAlignment == NS_STYLE_TEXT_ALIGN_END &&
vis->mDirection == NS_STYLE_DIRECTION_LTR)) {
mTextAlignment = NS_STYLE_TEXT_ALIGN_RIGHT;
} else if (mTextAlignment == NS_STYLE_TEXT_ALIGN_DEFAULT ||
} else if (mTextAlignment == NS_STYLE_TEXT_ALIGN_START ||
mTextAlignment == NS_STYLE_TEXT_ALIGN_END) {
mTextAlignment = NS_STYLE_TEXT_ALIGN_LEFT;
}

Просмотреть файл

@ -0,0 +1,14 @@
diff --git a/media/libnestegg/src/nestegg.c b/media/libnestegg/src/nestegg.c
index b9d3391..b13b2ae 100644
--- a/media/libnestegg/src/nestegg.c
+++ b/media/libnestegg/src/nestegg.c
@@ -2333,9 +2333,6 @@ nestegg_read_packet(nestegg * ctx, nestegg_packet ** pkt)
*pkt = NULL;
- if (!ctx->ancestor)
- return -1;
-
for (;;) {
r = ne_peek_element(ctx, &id, &size);
if (r != 1)

Просмотреть файл

@ -2333,9 +2333,6 @@ nestegg_read_packet(nestegg * ctx, nestegg_packet ** pkt)
*pkt = NULL;
if (!ctx->ancestor)
return -1;
for (;;) {
r = ne_peek_element(ctx, &id, &size);
if (r != 1)

Просмотреть файл

@ -24,4 +24,5 @@ if [ -n "$rev" ]; then
else
echo "Remember to update README_MOZILLA with the version details."
fi
patch -p3 < ./bug1271866.patch

Просмотреть файл

@ -346,6 +346,20 @@ MoofParser::ParseEncrypted(Box& aBox)
}
}
class CtsComparator
{
public:
bool Equals(Sample* const aA, Sample* const aB) const
{
return aA->mCompositionRange.start == aB->mCompositionRange.start;
}
bool
LessThan(Sample* const aA, Sample* const aB) const
{
return aA->mCompositionRange.start < aB->mCompositionRange.start;
}
};
Moof::Moof(Box& aBox, Trex& aTrex, Mvhd& aMvhd, Mdhd& aMdhd, Edts& aEdts, Sinf& aSinf, uint64_t* aDecodeTime, bool aIsAudio)
: mRange(aBox.Range())
, mMaxRoundingError(35000)
@ -356,6 +370,42 @@ Moof::Moof(Box& aBox, Trex& aTrex, Mvhd& aMvhd, Mdhd& aMdhd, Edts& aEdts, Sinf&
}
}
if (IsValid()) {
if (mIndex.Length()) {
// Ensure the samples are contiguous with no gaps.
nsTArray<Sample*> ctsOrder;
for (auto& sample : mIndex) {
ctsOrder.AppendElement(&sample);
}
ctsOrder.Sort(CtsComparator());
for (size_t i = 1; i < ctsOrder.Length(); i++) {
ctsOrder[i-1]->mCompositionRange.end = ctsOrder[i]->mCompositionRange.start;
}
// In MP4, the duration of a sample is defined as the delta between two decode
// timestamps. The operation above has updated the duration of each sample
// as a Sample's duration is mCompositionRange.end - mCompositionRange.start
// MSE's TrackBuffersManager expects dts that increased by the sample's
// duration, so we rewrite the dts accordingly.
int64_t presentationDuration =
ctsOrder.LastElement()->mCompositionRange.end
- ctsOrder[0]->mCompositionRange.start;
int64_t endDecodeTime =
aMdhd.ToMicroseconds((int64_t)*aDecodeTime - aEdts.mMediaStart)
+ aMvhd.ToMicroseconds(aEdts.mEmptyOffset);
int64_t decodeDuration = endDecodeTime - mIndex[0].mDecodeTime;
float adjust = (float)decodeDuration / presentationDuration;
int64_t dtsOffset = mIndex[0].mDecodeTime;
int64_t compositionDuration = 0;
// Adjust the dts, ensuring that the new adjusted dts will never be greater
// than decodeTime (the next moof's decode start time).
for (auto& sample : mIndex) {
sample.mDecodeTime = dtsOffset + compositionDuration * adjust;
compositionDuration += sample.mCompositionRange.Length();
}
mTimeRange = Interval<Microseconds>(ctsOrder[0]->mCompositionRange.start,
ctsOrder.LastElement()->mCompositionRange.end);
}
ProcessCenc();
}
}
@ -470,20 +520,6 @@ Moof::FixRounding(const Moof& aMoof) {
}
}
class CtsComparator
{
public:
bool Equals(Sample* const aA, Sample* const aB) const
{
return aA->mCompositionRange.start == aB->mCompositionRange.start;
}
bool
LessThan(Sample* const aA, Sample* const aB) const
{
return aA->mCompositionRange.start < aB->mCompositionRange.start;
}
};
bool
Moof::ParseTrun(Box& aBox, Tfhd& aTfhd, Mvhd& aMvhd, Mdhd& aMdhd, Edts& aEdts, uint64_t* aDecodeTime, bool aIsAudio)
{
@ -554,6 +590,8 @@ Moof::ParseTrun(Box& aBox, Tfhd& aTfhd, Mvhd& aMvhd, Mdhd& aMdhd, Edts& aEdts, u
sample.mByteRange = MediaByteRange(offset, offset + sampleSize);
offset += sampleSize;
sample.mDecodeTime =
aMdhd.ToMicroseconds((int64_t)decodeTime - aEdts.mMediaStart) + aMvhd.ToMicroseconds(aEdts.mEmptyOffset);
sample.mCompositionRange = Interval<Microseconds>(
aMdhd.ToMicroseconds((int64_t)decodeTime + ctsOffset - aEdts.mMediaStart) + aMvhd.ToMicroseconds(aEdts.mEmptyOffset),
aMdhd.ToMicroseconds((int64_t)decodeTime + ctsOffset + sampleDuration - aEdts.mMediaStart) + aMvhd.ToMicroseconds(aEdts.mEmptyOffset));
@ -570,43 +608,8 @@ Moof::ParseTrun(Box& aBox, Tfhd& aTfhd, Mvhd& aMvhd, Mdhd& aMdhd, Edts& aEdts, u
}
mMaxRoundingError += aMdhd.ToMicroseconds(sampleCount);
nsTArray<Sample*> ctsOrder;
for (int i = 0; i < mIndex.Length(); i++) {
ctsOrder.AppendElement(&mIndex[i]);
}
ctsOrder.Sort(CtsComparator());
for (size_t i = 0; i < ctsOrder.Length(); i++) {
if (i + 1 < ctsOrder.Length()) {
ctsOrder[i]->mCompositionRange.end = ctsOrder[i + 1]->mCompositionRange.start;
}
}
// In MP4, the duration of a sample is defined as the delta between two decode
// timestamps. The operation above has updated the duration of each sample
// as a Sample's duration is mCompositionRange.end - mCompositionRange.start
// MSE's TrackBuffersManager expects dts that increased by the sample's
// duration, so we rewrite the dts accordingly.
int64_t presentationDuration = ctsOrder.LastElement()->mCompositionRange.end
- ctsOrder[0]->mCompositionRange.start;
int64_t decodeDuration = aMdhd.ToMicroseconds(decodeTime - *aDecodeTime);
float adjust = (float)decodeDuration / presentationDuration;
int64_t dtsOffset =
aMdhd.ToMicroseconds((int64_t)*aDecodeTime - aEdts.mMediaStart)
+ aMvhd.ToMicroseconds(aEdts.mEmptyOffset);
int64_t compositionDuration = 0;
// Adjust the dts, ensuring that the new adjusted dts will never be greater
// than decodeTime (the next moof's decode start time).
for (auto& sample : mIndex) {
sample.mDecodeTime = dtsOffset + compositionDuration * adjust;
compositionDuration += sample.mCompositionRange.Length();
}
mTimeRange = Interval<Microseconds>(ctsOrder[0]->mCompositionRange.start,
ctsOrder.LastElement()->mCompositionRange.end);
*aDecodeTime = decodeTime;
MOZ_ASSERT(aMdhd.ToMicroseconds((int64_t)decodeTime - aEdts.mMediaStart)
+ aMvhd.ToMicroseconds(aEdts.mEmptyOffset)
>= mIndex[mIndex.Length() -1].mDecodeTime,
"Adjusted dts is too high");
return true;
}

Просмотреть файл

@ -703,11 +703,7 @@ pref("gfx.font_rendering.wordcache.charlimit", 32);
// cache shaped word results
pref("gfx.font_rendering.wordcache.maxentries", 10000);
#ifdef RELEASE_BUILD
pref("gfx.font_rendering.graphite.enabled", false);
#else
pref("gfx.font_rendering.graphite.enabled", true);
#endif
#ifdef XP_WIN
pref("gfx.font_rendering.directwrite.force-enabled", false);

Просмотреть файл

@ -205,6 +205,10 @@ static DllBlockInfo sWindowsDllBlocklist[] = {
{ "ss2osd.dll", ALL_VERSIONS },
{ "ss2devprops.dll", ALL_VERSIONS },
// NHASUSSTRIXOSD.DLL, bug 1269244
{ "nhasusstrixosd.dll", ALL_VERSIONS },
{ "nhasusstrixdevprops.dll", ALL_VERSIONS },
{ nullptr, 0 }
};

Просмотреть файл

@ -13,96 +13,7 @@
// we don't compile one of these detection methods. The detection code here is
// based on the CPU detection in libtheora.
# if defined(_MSC_VER)
//For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.
# define WIN32_LEAN_AND_MEAN
# define WIN32_EXTRA_LEAN
# include <windows.h>
# if !defined(MOZILLA_PRESUME_EDSP)
static bool
check_edsp(void)
{
# if defined(MOZILLA_MAY_SUPPORT_EDSP)
__try
{
//PLD [r13]
__emit(0xF5DDF000);
return true;
}
__except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION)
{
//Ignore exception.
}
# endif
return false;
}
# endif // !MOZILLA_PRESUME_EDSP
# if !defined(MOZILLA_PRESUME_ARMV6)
static bool
check_armv6(void)
{
# if defined(MOZILLA_MAY_SUPPORT_ARMV6)
__try
{
//SHADD8 r3,r3,r3
__emit(0xE6333F93);
return true;
}
__except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION)
{
//Ignore exception.
}
# endif
return false;
}
# endif // !MOZILLA_PRESUME_ARMV6
# if !defined(MOZILLA_PRESUME_ARMV7)
static bool
check_armv7(void)
{
# if defined(MOZILLA_MAY_SUPPORT_ARMV7)
__try
{
// ARMv7 DMB (Data Memory Barrier) for stores (DMB.ST)
// The Data Memory Barrier existed before ARMv7 as a
// cp15 operation, but ARMv7 introduced a dedicated
// instruction, DMB.
emit(0xF57FF05E);
return true;
}
__except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION)
{
//Ignore exception.
}
# endif
return false;
}
# endif // !MOZILLA_PRESUME_ARMV7
# if !defined(MOZILLA_PRESUME_NEON)
static bool
check_neon(void)
{
# if defined(MOZILLA_MAY_SUPPORT_NEON)
__try
{
//VORR q0,q0,q0
__emit(0xF2200150);
return true;
}
__except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION)
{
//Ignore exception.
}
# endif
return false;
}
# endif // !MOZILLA_PRESUME_NEON
# elif defined(__linux__) || defined(ANDROID)
# if defined(__linux__) || defined(ANDROID)
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

Просмотреть файл

@ -80,23 +80,6 @@
# define MOZILLA_ARM_HAVE_CPUID_DETECTION 1
# endif
#elif defined(_MSC_VER) && defined(_M_ARM)
# define MOZILLA_ARM_HAVE_CPUID_DETECTION 1
// _M_ARM on MSVC has current cpu architecture.
# define MOZILLA_ARM_ARCH _M_ARM
// MSVC only allows external asm for ARM, so we don't have to rely on
// compiler support.
# define MOZILLA_MAY_SUPPORT_EDSP 1
# if defined(HAVE_ARM_SIMD)
# define MOZILLA_MAY_SUPPORT_ARMV6 1
# define MOZILLA_MAY_SUPPORT_ARMV7 1
# endif
# if defined(HAVE_ARM_NEON)
# define MOZILLA_MAY_SUPPORT_NEON 1
# endif
#endif
namespace mozilla {

Просмотреть файл

@ -230,6 +230,7 @@ PollableEvent::Signal()
if (status != 1) {
NS_WARNING("PollableEvent::Signal Failed\n");
SOCKET_LOG(("PollableEvent::Signal Failed\n"));
mSignaled = false;
}
return (status == 1);
}

Просмотреть файл

@ -550,7 +550,7 @@ nsSocketTransportService::Init()
return NS_ERROR_UNEXPECTED;
nsCOMPtr<nsIThread> thread;
nsresult rv = NS_NewThread(getter_AddRefs(thread), this);
nsresult rv = NS_NewNamedThread("Socket Thread", getter_AddRefs(thread), this);
if (NS_FAILED(rv)) return rv;
{
@ -820,8 +820,6 @@ nsSocketTransportService::MarkTheLastElementOfPendingQueue()
NS_IMETHODIMP
nsSocketTransportService::Run()
{
PR_SetCurrentThreadName("Socket Thread");
#ifdef MOZ_NUWA_PROCESS
if (IsNuwaProcess()) {
NuwaMarkCurrentThread(nullptr, nullptr);

Просмотреть файл

@ -106,7 +106,7 @@ DataStorage::Init(bool& aDataWillPersist)
nsresult rv;
if (XRE_IsParentProcess()) {
rv = NS_NewThread(getter_AddRefs(mWorkerThread));
rv = NS_NewNamedThread("DataStorage", getter_AddRefs(mWorkerThread));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
@ -148,9 +148,10 @@ DataStorage::Init(bool& aDataWillPersist)
// dispatched, so we need to clean up on xpcom-shutdown.
if (XRE_IsParentProcess()) {
os->AddObserver(this, "profile-before-change", false);
} else {
os->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
}
// In the Parent process, this is a backstop for xpcshell and other cases
// where profile-before-change might not get sent.
os->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
// For test purposes, we can set the write timer to be very fast.
mTimerDelay = Preferences::GetInt("test.datastorage.write_timer_ms",
@ -864,8 +865,11 @@ DataStorage::Observe(nsISupports* aSubject, const char* aTopic,
if (strcmp(aTopic, "last-pb-context-exited") == 0) {
MutexAutoLock lock(mMutex);
mPrivateDataTable.Clear();
} else if (strcmp(aTopic, "profile-before-change") == 0) {
} else if (strcmp(aTopic, "profile-before-change") == 0 ||
(strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0 &&
XRE_IsParentProcess())) {
MOZ_ASSERT(XRE_IsParentProcess());
// per bug 1271402, this should be safe to run multiple times
{
MutexAutoLock lock(mMutex);
rv = AsyncWriteData(lock);

Просмотреть файл

@ -37,12 +37,19 @@ public:
void RunInBackground()
{
(void)NS_NewThread(getter_AddRefs(mThread));
(void)NS_NewNamedThread("DatabaseLocker", getter_AddRefs(mThread));
do_check_true(mThread);
do_check_success(mThread->Dispatch(this, NS_DISPATCH_NORMAL));
}
void Shutdown()
{
if (mThread) {
mThread->Shutdown();
}
}
NS_IMETHOD Run()
{
mozilla::ReentrantMonitorAutoEnter lock(monitor);
@ -165,17 +172,20 @@ test_step_locked_does_not_block_main_thread()
RefPtr<DatabaseLocker> locker(new DatabaseLocker("SELECT * FROM test"));
do_check_true(locker);
mozilla::ReentrantMonitorAutoEnter lock(locker->monitor);
locker->RunInBackground();
{
mozilla::ReentrantMonitorAutoEnter lock(locker->monitor);
locker->RunInBackground();
// Wait for the locker to notify us that it has locked the database properly.
locker->WaitFor(WRITE_LOCK);
// Wait for the locker to notify us that it has locked the database properly.
locker->WaitFor(WRITE_LOCK);
bool hasResult;
rv = stmt->ExecuteStep(&hasResult);
do_check_eq(rv, NS_ERROR_FILE_IS_LOCKED);
bool hasResult;
rv = stmt->ExecuteStep(&hasResult);
do_check_eq(rv, NS_ERROR_FILE_IS_LOCKED);
locker->Notify(TEST_DONE);
locker->Notify(TEST_DONE);
}
locker->Shutdown();
}
void
@ -194,18 +204,21 @@ test_drop_index_does_not_loop()
RefPtr<DatabaseTester> tester =
new DatabaseTester(db, "DROP INDEX unique_data");
do_check_true(tester);
mozilla::ReentrantMonitorAutoEnter lock(tester->monitor);
tester->RunInBackground();
{
mozilla::ReentrantMonitorAutoEnter lock(tester->monitor);
tester->RunInBackground();
// Hold a read lock on the database, and then let the tester try to execute.
bool hasResult;
rv = stmt->ExecuteStep(&hasResult);
do_check_success(rv);
do_check_true(hasResult);
tester->Notify(READ_LOCK);
// Hold a read lock on the database, and then let the tester try to execute.
bool hasResult;
rv = stmt->ExecuteStep(&hasResult);
do_check_success(rv);
do_check_true(hasResult);
tester->Notify(READ_LOCK);
// Make sure the tester finishes its test before we move on.
tester->WaitFor(TEST_DONE);
// Make sure the tester finishes its test before we move on.
tester->WaitFor(TEST_DONE);
}
tester->Shutdown();
}
void
@ -223,18 +236,21 @@ test_drop_table_does_not_loop()
RefPtr<DatabaseTester> tester(new DatabaseTester(db, "DROP TABLE test"));
do_check_true(tester);
mozilla::ReentrantMonitorAutoEnter lock(tester->monitor);
tester->RunInBackground();
{
mozilla::ReentrantMonitorAutoEnter lock(tester->monitor);
tester->RunInBackground();
// Hold a read lock on the database, and then let the tester try to execute.
bool hasResult;
rv = stmt->ExecuteStep(&hasResult);
do_check_success(rv);
do_check_true(hasResult);
tester->Notify(READ_LOCK);
// Hold a read lock on the database, and then let the tester try to execute.
bool hasResult;
rv = stmt->ExecuteStep(&hasResult);
do_check_success(rv);
do_check_true(hasResult);
tester->Notify(READ_LOCK);
// Make sure the tester finishes its test before we move on.
tester->WaitFor(TEST_DONE);
// Make sure the tester finishes its test before we move on.
tester->WaitFor(TEST_DONE);
}
tester->Shutdown();
}
void (*gTests[])(void) = {

Просмотреть файл

@ -1,4 +1,3 @@
<a href="amazon.com/www.amazon.com/Kindle-Wireless-Reader-Wifi-Graphite/dp/B002Y27P3M/507846.html">link</a><br>
<a href="cgi.ebay.com/cgi.ebay.com/ALL-NEW-KINDLE-3-eBOOK-WIRELESS-READING-DEVICE-W-WIFI-/130496077314@pt=LH_DefaultDomain_0&hash=item1e622c1e02.html">link</a><br>
<a href="163.com/www.163.com/index.html">link</a><br>
<a href="mail.ru/mail.ru/index.html">link</a><br>
@ -48,4 +47,5 @@
<a href="homeway.com.cn/www.hexun.com/index.html">link</a><br>
<a href="youtube.com/www.youtube.com/music.html">link</a><br>
<a href="people.com.cn/people.com.cn/index.html">link</a><br>
<a href="amazon.com/www.amazon.com/Kindle-Wireless-Reader-Wifi-Graphite/dp/B002Y27P3M/507846.html">link</a><br>

Просмотреть файл

@ -22,7 +22,7 @@ task:
description: Reftest e10s run {{chunk}}
extra:
chunks:
total: 5
total: 8
suite:
name: reftest
flavor: reftest

Просмотреть файл

@ -21,7 +21,7 @@ task:
description: Reftest not accelerated run {{chunk}}
extra:
chunks:
total: 2
total: 8
suite:
name: reftest
flavor: reftest-no-accel

Просмотреть файл

@ -22,7 +22,7 @@ task:
description: Reftest not accelerated e10s run {{chunk}}
extra:
chunks:
total: 2
total: 8
suite:
name: reftest
flavor: reftest-no-accel

Просмотреть файл

@ -22,7 +22,7 @@ task:
description: Web platform tests run {{chunk}}
extra:
chunks:
total: 8
total: 12
suite:
name: web-platform-tests
flavor: web-platform-tests

Просмотреть файл

@ -23,7 +23,7 @@ task:
description: Web platform e10s tests run {{chunk}}
extra:
chunks:
total: 8
total: 12
treeherder:
groupName: Desktop web-platform-tests
groupSymbol: tc-W-e10s

Просмотреть файл

@ -35349,6 +35349,18 @@
"url": "/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html"
}
],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html": [
{
"path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html",
"url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html"
}
],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html": [
{
"path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html",
"url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html"
}
],
"html/syntax/serializing-html-fragments/serializing.html": [
{
"path": "html/syntax/serializing-html-fragments/serializing.html",

Просмотреть файл

@ -0,0 +1,25 @@
<!doctype html>
<meta charset=utf-8>
<title>Check that popups from a sandboxed iframe escape the sandbox if
allow-popups-to-escape-sandbox is used</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<iframe sandbox="allow-scripts allow-popups allow-popups-to-escape-sandbox">
</iframe>
<script>
var t = async_test();
var ourOrigin;
onmessage = t.step_func(function(e) {
assert_equals(e.data, "hello", "This is our origin getter message");
ourOrigin = e.origin;
onmessage = t.step_func_done(function(e) {
assert_equals(e.origin, "null", "It came from a sandboxed iframe");
assert_equals(e.data.data, undefined, "Should have the right message");
assert_equals(e.data.origin, ourOrigin, "Should have escaped the sandbox");
});
document.querySelector("iframe").src = "iframe_sandbox_popups_helper.html";
});
postMessage("hello", "*");
</script>

Просмотреть файл

@ -0,0 +1,17 @@
<!DOCTYPE html>
<script>
var popupWin;
if (opener) {
// We're the popup. Send back our state. What we really want to send is
// our origin, but that will come automatically.
opener.postMessage(undefined, "*");
self.close();
} else {
// We're the child. Start listening for messages and open ourselves as the
// popup.
onmessage = function (e) {
parent.postMessage({ data: e.data, origin: e.origin }, "*");
};
popupWin = window.open(location.href);
}
</script>

Просмотреть файл

@ -0,0 +1,15 @@
<!doctype html>
<meta charset=utf-8>
<title>Check that popups from a sandboxed iframe do not escape the sandbox</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
var t = async_test();
onmessage = t.step_func_done(function(e) {
assert_equals(e.origin, "null", "It came from a sandboxed iframe");
assert_equals(e.data.data, undefined, "Should have the right message");
assert_equals(e.data.origin, "null", "Should not have escaped the sandbox");
});
</script>
<iframe sandbox="allow-scripts allow-popups"
src="iframe_sandbox_popups_helper.html"></iframe>

Просмотреть файл

@ -43,7 +43,10 @@ class SymbolFile:
# http://code.google.com/p/google-breakpad/wiki/SymbolFiles
if line.startswith("FUNC "):
# FUNC <address> <size> <stack_param_size> <name>
(junk, rva, size, ss, name) = line.split(None, 4)
bits = line.split(None, 4)
if len(bits) < 5:
bits.append('unnamed_function')
(junk, rva, size, ss, name) = bits
rva = int(rva,16)
funcs[rva] = name
addrs.append(rva)

Просмотреть файл

@ -400,7 +400,7 @@ nsViewManager::ProcessPendingUpdatesForView(nsView* aView,
}
}
if (rootShell->GetViewManager() != this) {
return; // 'this' might have been destroyed
return; // presentation might have been torn down
}
if (aFlushDirtyRegion) {
profiler_tracing("Paint", "DisplayList", TRACING_INTERVAL_START);
@ -446,7 +446,7 @@ nsViewManager::ProcessPendingUpdatesPaint(nsIWidget* aWidget)
if (aWidget->NeedsPaint()) {
// If an ancestor widget was hidden and then shown, we could
// have a delayed resize to handle.
for (nsViewManager *vm = this; vm;
for (RefPtr<nsViewManager> vm = this; vm;
vm = vm->mRootView->GetParent()
? vm->mRootView->GetParent()->GetViewManager()
: nullptr) {
@ -708,15 +708,16 @@ void nsViewManager::InvalidateViews(nsView *aView)
void nsViewManager::WillPaintWindow(nsIWidget* aWidget)
{
if (aWidget) {
nsView* view = nsView::GetViewFor(aWidget);
LayerManager *manager = aWidget->GetLayerManager();
RefPtr<nsIWidget> widget(aWidget);
if (widget) {
nsView* view = nsView::GetViewFor(widget);
LayerManager* manager = widget->GetLayerManager();
if (view &&
(view->ForcedRepaint() || !manager->NeedsWidgetInvalidation())) {
ProcessPendingUpdates();
// Re-get the view pointer here since the ProcessPendingUpdates might have
// destroyed it during CallWillPaintOnObservers.
view = nsView::GetViewFor(aWidget);
view = nsView::GetViewFor(widget);
if (view) {
view->SetForcedRepaint(false);
}
@ -1110,6 +1111,7 @@ nsViewManager::ProcessPendingUpdates()
if (mPresShell) {
mPresShell->GetPresContext()->RefreshDriver()->RevokeViewManagerFlush();
RefPtr<nsViewManager> strongThis(this);
CallWillPaintOnObservers();
ProcessPendingUpdatesForView(mRootView, true);
@ -1126,6 +1128,7 @@ nsViewManager::UpdateWidgetGeometry()
if (mHasPendingWidgetGeometryChanges) {
mHasPendingWidgetGeometryChanges = false;
RefPtr<nsViewManager> strongThis(this);
ProcessPendingUpdatesForView(mRootView, false);
}
}

Просмотреть файл

@ -1030,6 +1030,8 @@ PuppetWidget::Paint()
mDirtyRegion.SetEmpty();
mPaintTask.Revoke();
RefPtr<PuppetWidget> strongThis(this);
GetCurrentWidgetListener()->WillPaintWindow(this);
if (GetCurrentWidgetListener()) {

Просмотреть файл

@ -3986,6 +3986,8 @@ NSEvent* gLastDragMouseDownEvent = nil;
- (void)viewWillDraw
{
nsAutoRetainCocoaObject kungFuDeathGrip(self);
if (mGeckoChild) {
// The OS normally *will* draw our NSWindow, no matter what we do here.
// But Gecko can delete our parent widget(s) (along with mGeckoChild)

Просмотреть файл

@ -105,7 +105,7 @@ nsWindow::DoDraw(void)
return;
}
nsWindow *targetWindow = (nsWindow *)windows[0];
RefPtr<nsWindow> targetWindow = (nsWindow *)windows[0];
while (targetWindow->GetLastChild()) {
targetWindow = (nsWindow *)targetWindow->GetLastChild();
}
@ -115,15 +115,15 @@ nsWindow::DoDraw(void)
listener->WillPaintWindow(targetWindow);
}
LayerManager* lm = targetWindow->GetLayerManager();
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
// No need to do anything, the compositor will handle drawing
} else {
NS_RUNTIMEABORT("Unexpected layer manager type");
}
listener = targetWindow->GetWidgetListener();
if (listener) {
LayerManager* lm = targetWindow->GetLayerManager();
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
// No need to do anything, the compositor will handle drawing
} else {
NS_RUNTIMEABORT("Unexpected layer manager type");
}
listener->DidPaintWindow();
}
}

Просмотреть файл

@ -1095,7 +1095,19 @@ nsLookAndFeel::Init()
// Gtk manages a screen's CSS in the settings object so we
// ask Gtk to create it explicitly. Otherwise we may end up
// with wrong color theme, see Bug 972382
(void)gtk_settings_get_for_screen(gdk_screen_get_default());
GtkSettings *settings = gtk_settings_get_for_screen(gdk_screen_get_default());
// Disable dark theme because it interacts poorly with widget styling in
// web content (see bug 1216658).
// To avoid triggering reload of theme settings unnecessarily, only set the
// setting when necessary.
const gchar* dark_setting = "gtk-application-prefer-dark-theme";
gboolean dark;
g_object_get(settings, dark_setting, &dark, nullptr);
if (dark) {
g_object_set(settings, dark_setting, FALSE, nullptr);
}
GtkWidgetPath *path = gtk_widget_path_new();
gtk_widget_path_append_type(path, GTK_TYPE_WINDOW);

Просмотреть файл

@ -552,6 +552,12 @@ nsWindow::MaybeDispatchResized()
}
}
nsIWidgetListener*
nsWindow::GetListener()
{
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
}
nsresult
nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
{
@ -560,8 +566,7 @@ nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
"something", 0);
#endif
aStatus = nsEventStatus_eIgnore;
nsIWidgetListener* listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
nsIWidgetListener* listener = GetListener();
if (listener) {
aStatus = listener->HandleEvent(aEvent, mUseAttachedEvents);
}
@ -2119,8 +2124,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
if (!mGdkWindow || mIsFullyObscured || !mHasMappedToplevel)
return FALSE;
nsIWidgetListener *listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
nsIWidgetListener *listener = GetListener();
if (!listener)
return FALSE;
@ -2149,6 +2153,8 @@ nsWindow::OnExposeEvent(cairo_t *cr)
clientLayers->SendInvalidRegion(region.ToUnknownRegion());
}
RefPtr<nsWindow> strongThis(this);
// Dispatch WillPaintWindow notification to allow scripts etc. to run
// before we paint
{
@ -2161,8 +2167,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
// Re-get the listener since the will paint notification might have
// killed it.
listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
listener = GetListener();
if (!listener)
return FALSE;
}
@ -2223,6 +2228,13 @@ nsWindow::OnExposeEvent(cairo_t *cr)
// If this widget uses OMTC...
if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT) {
listener->PaintWindow(this, region);
// Re-get the listener since the will paint notification might have
// killed it.
listener = GetListener();
if (!listener)
return TRUE;
listener->DidPaintWindow();
return TRUE;
}
@ -2293,6 +2305,13 @@ nsWindow::OnExposeEvent(cairo_t *cr)
}
AutoLayerManagerSetup setupLayerManager(this, ctx, layerBuffering);
painted = listener->PaintWindow(this, region);
// Re-get the listener since the will paint notification might have
// killed it.
listener = GetListener();
if (!listener)
return TRUE;
}
}

Просмотреть файл

@ -430,6 +430,7 @@ private:
GdkWindow** aWindow, gint* aButton,
gint* aRootX, gint* aRootY);
void ClearCachedResources();
nsIWidgetListener* GetListener();
GtkWidget *mShell;
MozContainer *mContainer;

Просмотреть файл

@ -861,18 +861,28 @@ nsWindow::SetTitle(const nsAString& aTitle)
// EVENTS
nsIWidgetListener*
nsWindow::GetPaintListener()
{
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
}
void
nsWindow::OnPaint()
{
LOGDRAW(("nsWindow::%s [%p]\n", __FUNCTION__, (void *)this));
nsIWidgetListener* listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
nsIWidgetListener* listener = GetPaintListener();
if (!listener) {
return;
}
listener->WillPaintWindow(this);
nsIWidgetListener* listener = GetPaintListener();
if (!listener) {
return;
}
switch (GetLayerManager()->GetBackendType()) {
case mozilla::layers::LayersBackend::LAYERS_CLIENT: {
LayoutDeviceIntRegion region(
@ -884,6 +894,11 @@ nsWindow::OnPaint()
NS_ERROR("Invalid layer manager");
}
nsIWidgetListener* listener = GetPaintListener();
if (!listener) {
return;
}
listener->DidPaintWindow();
}

Просмотреть файл

@ -253,6 +253,7 @@ private:
bool needDispatch;
} MozCachedMoveEvent;
nsIWidgetListener* GetPaintListener();
bool CheckForRollup(double aMouseX, double aMouseY, bool aIsWheel);
void* SetupPluginPort(void);
nsresult SetWindowIconList(const nsTArray<nsCString> &aIconList);

Просмотреть файл

@ -209,22 +209,23 @@ nsPrintSettingsWin::CopyFromNative(HDC aHdc, DEVMODEW* aDevMode)
// page and don't set the unwriteable [sic] margins. Using the unwriteable
// margins doesn't appear to work on Windows, but I am not sure if this is a
// bug elsewhere in our code or a Windows quirk.
// Note: we only scale the printing using the LOGPIXELSY, so we use that
// when calculating the surface width as well as the height.
int32_t printableWidthInDots = GetDeviceCaps(aHdc, HORZRES);
int32_t printableHeightInDots = GetDeviceCaps(aHdc, VERTRES);
int32_t widthDPI = GetDeviceCaps(aHdc, LOGPIXELSX);
int32_t heightDPI = GetDeviceCaps(aHdc, LOGPIXELSY);
// Keep these values in portrait format, so we can reflect our own changes
// to mOrientation.
if (mOrientation == kPortraitOrientation) {
mPrintableWidthInInches = double(printableWidthInDots) / widthDPI;
mPrintableWidthInInches = double(printableWidthInDots) / heightDPI;
mPrintableHeightInInches = double(printableHeightInDots) / heightDPI;
} else {
mPrintableHeightInInches = double(printableWidthInDots) / widthDPI;
mPrintableHeightInInches = double(printableWidthInDots) / heightDPI;
mPrintableWidthInInches = double(printableHeightInDots) / heightDPI;
}
// Using Y to match existing code, X DPI should be the same for printing.
// Using Y to match existing code for print scaling calculations.
mResolution = heightDPI;
}
@ -397,4 +398,4 @@ Tester::Tester()
}
Tester gTester;
#endif
#endif

Просмотреть файл

@ -276,6 +276,8 @@ bool nsWindow::OnPaint(HDC aDC, uint32_t aNestingLevel)
clientLayerManager->SendInvalidRegion(region);
}
RefPtr<nsWindow> strongThis(this);
nsIWidgetListener* listener = GetPaintListener();
if (listener) {
listener->WillPaintWindow(this);