diff --git a/dom/base/nsPerformance.h b/dom/base/nsPerformance.h index ef18aae2f..cafe37f0f 100644 --- a/dom/base/nsPerformance.h +++ b/dom/base/nsPerformance.h @@ -134,13 +134,13 @@ public: return GetDOMTiming()->GetNavigationStart(); } DOMTimeMilliSec UnloadEventStart() { - if (!nsContentUtils::IsPerformanceTimingEnabled()) { + if (!nsContentUtils::IsPerformanceTimingEnabled() || !mAllRedirectsSameOrigin) { return 0; } return GetDOMTiming()->GetUnloadEventStart(); } DOMTimeMilliSec UnloadEventEnd() { - if (!nsContentUtils::IsPerformanceTimingEnabled()) { + if (!nsContentUtils::IsPerformanceTimingEnabled() || !mAllRedirectsSameOrigin) { return 0; } return GetDOMTiming()->GetUnloadEventEnd(); diff --git a/dom/html/ImageDocument.cpp b/dom/html/ImageDocument.cpp index ff52490ce..20e44b7ff 100644 --- a/dom/html/ImageDocument.cpp +++ b/dom/html/ImageDocument.cpp @@ -636,7 +636,7 @@ ImageDocument::CreateSyntheticDocument() NS_ENSURE_SUCCESS(rv, rv); // Add the image element - Element* body = GetBodyElement(); + RefPtr body = GetBodyElement(); if (!body) { NS_WARNING("no body on image document!"); return NS_ERROR_FAILURE; diff --git a/dom/html/PluginDocument.cpp b/dom/html/PluginDocument.cpp index 6d922d3fc..3fb1774cb 100644 --- a/dom/html/PluginDocument.cpp +++ b/dom/html/PluginDocument.cpp @@ -206,7 +206,7 @@ PluginDocument::CreateSyntheticPluginDocument() NS_ENSURE_SUCCESS(rv, rv); // then attach our plugin - Element* body = GetBodyElement(); + RefPtr body = GetBodyElement(); if (!body) { NS_WARNING("no body on plugin document!"); return NS_ERROR_FAILURE; diff --git a/dom/html/VideoDocument.cpp b/dom/html/VideoDocument.cpp index 1bd898564..76b2e326f 100644 --- a/dom/html/VideoDocument.cpp +++ b/dom/html/VideoDocument.cpp @@ -90,7 +90,7 @@ VideoDocument::CreateSyntheticVideoDocument(nsIChannel* aChannel, nsresult rv = MediaDocument::CreateSyntheticDocument(); NS_ENSURE_SUCCESS(rv, rv); - Element* body = GetBodyElement(); + RefPtr body = GetBodyElement(); if (!body) { NS_WARNING("no body on video document!"); return NS_ERROR_FAILURE; diff --git a/dom/svg/SVGFEImageElement.cpp b/dom/svg/SVGFEImageElement.cpp index e085f0089..cde444d6a 100644 --- a/dom/svg/SVGFEImageElement.cpp +++ b/dom/svg/SVGFEImageElement.cpp @@ -268,13 +268,6 @@ SVGFEImageElement::OutputIsTainted(const nsTArray& aInputsAreTainted, return false; } - uint32_t status; - currentRequest->GetImageStatus(&status); - if ((status & imgIRequest::STATUS_LOAD_COMPLETE) == 0) { - // The load has not completed yet. - return false; - } - nsCOMPtr principal; rv = currentRequest->GetImagePrincipal(getter_AddRefs(principal)); if (NS_FAILED(rv) || !principal) { diff --git a/parser/html/jArray.h b/parser/html/jArray.h index 45548a077..3438dbc52 100644 --- a/parser/html/jArray.h +++ b/parser/html/jArray.h @@ -45,8 +45,16 @@ struct staticJArray { }; template -struct jArray { +class autoJArray; + +template +class jArray { + friend class autoJArray; + + private: T* arr; + + public: L length; static jArray newJArray(L const len) { MOZ_ASSERT(len >= 0, "Negative length."); @@ -69,6 +77,11 @@ struct jArray { arr = (T*)other.arr; length = other.length; } + MOZ_IMPLICIT jArray(decltype(nullptr)) : arr(nullptr), length(0) {} + jArray() : arr(nullptr), length(0) {} + + private: + jArray(T* aArr, L aLength) : arr(aArr), length(aLength) {} }; template diff --git a/parser/html/nsHtml5Tokenizer.cpp b/parser/html/nsHtml5Tokenizer.cpp index f29379c7f..aa48cd2b6 100644 --- a/parser/html/nsHtml5Tokenizer.cpp +++ b/parser/html/nsHtml5Tokenizer.cpp @@ -126,16 +126,12 @@ nsHtml5Tokenizer::isViewingXmlSource() return viewingXmlSource; } -void -nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState, nsIAtom* endTagExpectation) +void +nsHtml5Tokenizer::setState(int32_t specialTokenizerState) { this->stateSave = specialTokenizerState; - if (specialTokenizerState == NS_HTML5TOKENIZER_DATA) { - return; - } - autoJArray asArray = nsHtml5Portability::newCharArrayFromLocal(endTagExpectation); - this->endTagExpectation = nsHtml5ElementName::elementNameByBuffer(asArray, 0, asArray.length, interner); - endTagExpectationToArray(); + this->endTagExpectation = nullptr; + this->endTagExpectationAsArray = nullptr; } void @@ -2000,7 +1996,13 @@ nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* bu NS_HTML5_BREAK(stateloop); } c = checkChar(buf, pos); - if (index < endTagExpectationAsArray.length) { + if (!endTagExpectationAsArray) { + tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2); + cstart = pos; + reconsume = true; + state = P::transition(mViewSource, returnState, reconsume, pos); + NS_HTML5_CONTINUE(stateloop); + } else if (index < endTagExpectationAsArray.length) { char16_t e = endTagExpectationAsArray[index]; char16_t folded = c; if (c >= 'A' && c <= 'Z') { diff --git a/parser/html/nsHtml5Tokenizer.h b/parser/html/nsHtml5Tokenizer.h index 2dded03d7..fd886847e 100644 --- a/parser/html/nsHtml5Tokenizer.h +++ b/parser/html/nsHtml5Tokenizer.h @@ -142,7 +142,7 @@ class nsHtml5Tokenizer void setInterner(nsHtml5AtomTable* interner); void initLocation(nsHtml5String newPublicId, nsHtml5String newSystemId); bool isViewingXmlSource(); - void setStateAndEndTagExpectation(int32_t specialTokenizerState, nsIAtom* endTagExpectation); + void setState(int32_t specialTokenizerState); void setStateAndEndTagExpectation(int32_t specialTokenizerState, nsHtml5ElementName* endTagExpectation); private: void endTagExpectationToArray(); diff --git a/parser/html/nsHtml5TreeBuilder.cpp b/parser/html/nsHtml5TreeBuilder.cpp index 44ee7b10b..d303db2ff 100644 --- a/parser/html/nsHtml5TreeBuilder.cpp +++ b/parser/html/nsHtml5TreeBuilder.cpp @@ -105,7 +105,7 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elementName->camelCaseName, elt); currentPtr++; stack[currentPtr] = node; - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_DATA); mode = NS_HTML5TREE_BUILDER_FRAMESET_OK; } else if (contextNamespace == kNameSpaceID_MathML) { nsHtml5ElementName* elementName = nsHtml5ElementName::ELT_MATH; @@ -117,7 +117,7 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, elementName->name, false); currentPtr++; stack[currentPtr] = node; - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_DATA); mode = NS_HTML5TREE_BUILDER_FRAMESET_OK; } else { nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HTML, elt); @@ -129,15 +129,15 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) resetTheInsertionMode(); formPointer = getFormPointerForContext(contextNode); if (nsHtml5Atoms::title == contextName || nsHtml5Atoms::textarea == contextName) { - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_RCDATA); } else if (nsHtml5Atoms::style == contextName || nsHtml5Atoms::xmp == contextName || nsHtml5Atoms::iframe == contextName || nsHtml5Atoms::noembed == contextName || nsHtml5Atoms::noframes == contextName || (scriptingEnabled && nsHtml5Atoms::noscript == contextName)) { - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_RAWTEXT); } else if (nsHtml5Atoms::plaintext == contextName) { - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_PLAINTEXT, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_PLAINTEXT); } else if (nsHtml5Atoms::script == contextName) { - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_SCRIPT_DATA); } else { - tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName); + tokenizer->setState(NS_HTML5TOKENIZER_DATA); } } contextName = nullptr; diff --git a/xpcom/threads/nsThreadPool.cpp b/xpcom/threads/nsThreadPool.cpp index 173afbdd0..c12079d43 100644 --- a/xpcom/threads/nsThreadPool.cpp +++ b/xpcom/threads/nsThreadPool.cpp @@ -112,7 +112,9 @@ nsThreadPool::PutEvent(already_AddRefed&& aEvent) bool killThread = false; { MutexAutoLock lock(mMutex); - if (mThreads.Count() < (int32_t)mThreadLimit) { + if (mShutdown) { + killThread = true; + } else if (mThreads.Count() < (int32_t)mThreadLimit) { mThreads.AppendObject(thread); } else { killThread = true; // okay, we don't need this thread anymore