author | Wes Kocher <wkocher@mozilla.com> |
Tue, 07 Feb 2017 16:56:19 -0800 | |
changeset 341308 | e3d24805064d2a40e5278dc591790a670a21ee67 |
parent 341307 | af979611f4d15604b3469bd3b377570dd9f08446 (current diff) |
parent 341248 | f4f374622111022d41dd8d5eb9220624135c534a (diff) |
child 341309 | 03f791909447fc2f21eb6527b60f643f4ffad51d |
push id | 86684 |
push user | cbook@mozilla.com |
push date | Wed, 08 Feb 2017 10:31:03 +0000 |
treeherder | mozilla-inbound@c5b88e4e70f4 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 54.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
js/src/vm/TypedArrayCommon.h | file | annotate | diff | comparison | revisions | |
widget/windows/mozwrlbase.h | file | annotate | diff | comparison | revisions |
--- a/devtools/client/shared/test/browser.ini +++ b/devtools/client/shared/test/browser.ini @@ -26,16 +26,17 @@ support-files = [browser_css_angle.js] [browser_css_color.js] [browser_cubic-bezier-01.js] [browser_cubic-bezier-02.js] [browser_cubic-bezier-03.js] [browser_cubic-bezier-04.js] [browser_cubic-bezier-05.js] [browser_cubic-bezier-06.js] +[browser_cubic-bezier-07.js] [browser_filter-editor-01.js] [browser_filter-editor-02.js] [browser_filter-editor-03.js] [browser_filter-editor-04.js] [browser_filter-editor-05.js] [browser_filter-editor-06.js] [browser_filter-editor-07.js] [browser_filter-editor-08.js]
new file mode 100644 --- /dev/null +++ b/devtools/client/shared/test/browser_cubic-bezier-07.js @@ -0,0 +1,53 @@ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Tests that changing the cubic-bezier curve in the widget does change the dot animation +// preview too. + +const {CubicBezierWidget} = require("devtools/client/shared/widgets/CubicBezierWidget"); +const {PREDEFINED} = require("devtools/client/shared/widgets/CubicBezierPresets"); + +const TEST_URI = `data:text/html,<div id="cubic-bezier-container" />`; + +add_task(function* () { + let [host,, doc] = yield createHost("bottom", TEST_URI); + + let container = doc.querySelector("#cubic-bezier-container"); + let w = new CubicBezierWidget(container, PREDEFINED.linear); + + yield previewDotReactsToChanges(w, [0.6, -0.28, 0.74, 0.05]); + yield previewDotReactsToChanges(w, [0.9, 0.03, 0.69, 0.22]); + yield previewDotReactsToChanges(w, [0.68, -0.55, 0.27, 1.55]); + yield previewDotReactsToChanges(w, PREDEFINED.ease, "ease"); + yield previewDotReactsToChanges(w, PREDEFINED["ease-in-out"], "ease-in-out"); + + w.destroy(); + host.destroy(); +}); + +function* previewDotReactsToChanges(widget, coords, expectedEasing) { + let onUpdated = widget.once("updated"); + widget.coordinates = coords; + yield onUpdated; + + let animatedDot = widget.timingPreview.dot; + let animations = animatedDot.getAnimations(); + + if (!expectedEasing) { + expectedEasing = + `cubic-bezier(${coords[0]}, ${coords[1]}, ${coords[2]}, ${coords[3]})`; + } + + is(animations.length, 1, "The dot is animated"); + + let goingToRight = animations[0].effect.getKeyframes()[2]; + is(goingToRight.easing, expectedEasing, + `The easing when going to the right was set correctly to ${coords}`); + + let goingToLeft = animations[0].effect.getKeyframes()[6]; + is(goingToLeft.easing, expectedEasing, + `The easing when going to the left was set correctly to ${coords}`); +}
--- a/devtools/client/shared/widgets/CubicBezierWidget.js +++ b/devtools/client/shared/widgets/CubicBezierWidget.js @@ -413,17 +413,17 @@ CubicBezierWidget.prototype = { * @param {Array} coordinates The array of control point coordinates */ _redraw: function (coordinates) { // Provide a new CubicBezier to the canvas and plot the curve this.bezierCanvas.bezier = new CubicBezier(coordinates); this.bezierCanvas.plot(); this.emit("updated", this.bezierCanvas.bezier); - this.timingPreview.preview(this.bezierCanvas.bezier + ""); + this.timingPreview.preview(this.bezierCanvas.bezier.toString()); }, /** * Set new coordinates for the control points and redraw the curve * @param {Array} coordinates */ set coordinates(coordinates) { this._redraw(coordinates); @@ -716,17 +716,16 @@ CubicBezierPresetWidget.prototype = { /** * The TimingFunctionPreviewWidget animates a dot on a scale with a given * timing-function * @param {DOMNode} parent The container where this widget should go */ function TimingFunctionPreviewWidget(parent) { this.previousValue = null; - this.autoRestartAnimation = null; this.parent = parent; this._initMarkup(); } TimingFunctionPreviewWidget.prototype = { PREVIEW_DURATION: 1000, @@ -743,62 +742,69 @@ TimingFunctionPreviewWidget.prototype = let scale = doc.createElementNS(XHTML_NS, "div"); scale.className = "scale"; container.appendChild(scale); this.parent.appendChild(container); }, destroy: function () { - clearTimeout(this.autoRestartAnimation); + this.dot.getAnimations().forEach(anim => anim.cancel()); this.parent.querySelector(".timing-function-preview").remove(); this.parent = this.dot = null; }, /** * Preview a new timing function. The current preview will only be stopped if * the supplied function value is different from the previous one. If the * supplied function is invalid, the preview will stop. * @param {String} value */ preview: function (value) { // Don't restart the preview animation if the value is the same if (value === this.previousValue) { return; } - clearTimeout(this.autoRestartAnimation); - if (parseTimingFunction(value)) { - this.dot.style.animationTimingFunction = value; - this.restartAnimation(); + this.restartAnimation(value); } this.previousValue = value; }, /** - * Re-start the preview animation from the beginning + * Re-start the preview animation from the beginning. + * @param {String} timingFunction The value for the timing-function. */ - restartAnimation: function () { - // Just toggling the class won't do it unless there's a sync reflow + restartAnimation: function (timingFunction) { + // Cancel the previous animation if there was any. + this.dot.getAnimations().forEach(anim => anim.cancel()); + + // And start the new one. + // The animation consists of a few keyframes that move the dot to the right of the + // container, and then move it back to the left. + // It also contains some pause where the dot is semi transparent, before it moves to + // the right, and once again, before it comes back to the left. + // The timing function passed to this function is applied to the keyframes that + // actually move the dot. This way it can be previewed in both direction, instead of + // being spread over the whole animation. this.dot.animate([ - { left: "-7px", offset: 0 }, - { left: "143px", offset: 0.25 }, - { left: "143px", offset: 0.5 }, - { left: "-7px", offset: 0.75 }, - { left: "-7px", offset: 1 } + { left: "-7px", opacity: .5, offset: 0 }, + { left: "-7px", opacity: .5, offset: .19 }, + { left: "-7px", opacity: 1, offset: .2, easing: timingFunction }, + { left: "143px", opacity: 1, offset: .5 }, + { left: "143px", opacity: .5, offset: .51 }, + { left: "143px", opacity: .5, offset: .7 }, + { left: "143px", opacity: 1, offset: .71, easing: timingFunction }, + { left: "-7px", opacity: 1, offset: 1 } ], { - duration: (this.PREVIEW_DURATION * 2), - fill: "forwards" + duration: this.PREVIEW_DURATION * 2, + iterations: Infinity }); - - // Restart it again after a while - this.autoRestartAnimation = setTimeout(this.restartAnimation.bind(this), - this.PREVIEW_DURATION * 2); } }; // Helpers function getPadding(padding) { let p = typeof padding === "number" ? [padding] : padding;
--- a/dom/base/nsDeprecatedOperationList.h +++ b/dom/base/nsDeprecatedOperationList.h @@ -45,8 +45,9 @@ DEPRECATED_OPERATION(NavigatorGetUserMed DEPRECATED_OPERATION(WebrtcDeprecatedPrefix) DEPRECATED_OPERATION(RTCPeerConnectionGetStreams) DEPRECATED_OPERATION(AppCache) DEPRECATED_OPERATION(PrefixedImageSmoothingEnabled) DEPRECATED_OPERATION(PrefixedFullscreenAPI) DEPRECATED_OPERATION(LenientSetter) DEPRECATED_OPERATION(FileLastModifiedDate) DEPRECATED_OPERATION(ImageBitmapRenderingContext_TransferImageBitmap) +DEPRECATED_OPERATION(URLCreateObjectURL_MediaStream)
--- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -3613,26 +3613,33 @@ DeprecationWarning(JSContext* aCx, JSObj nsIDocument::DeprecatedOperations aOperation) { GlobalObject global(aCx, aObject); if (global.Failed()) { NS_ERROR("Could not create global for DeprecationWarning"); return; } + DeprecationWarning(global, aOperation); +} + +void +DeprecationWarning(const GlobalObject& aGlobal, + nsIDocument::DeprecatedOperations aOperation) +{ if (NS_IsMainThread()) { - nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(global.GetAsSupports()); + nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports()); if (window && window->GetExtantDoc()) { window->GetExtantDoc()->WarnOnceAbout(aOperation); } return; } - WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx); + WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aGlobal.Context()); if (!workerPrivate) { return; } RefPtr<DeprecationWarningRunnable> runnable = new DeprecationWarningRunnable(workerPrivate, aOperation); runnable->Dispatch(); }
--- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -3190,16 +3190,20 @@ void SetDocumentAndPageUseCounter(JSContext* aCx, JSObject* aObject, UseCounter aUseCounter); // Warnings void DeprecationWarning(JSContext* aCx, JSObject* aObject, nsIDocument::DeprecatedOperations aOperation); +void +DeprecationWarning(const GlobalObject& aGlobal, + nsIDocument::DeprecatedOperations aOperation); + // A callback to perform funToString on an interface object JSString* InterfaceObjectToString(JSContext* aCx, JS::Handle<JSObject*> aObject, unsigned /* indent */); namespace binding_detail { // Get a JS global object that can be used for some temporary allocations. The // idea is that this should be used for situations when you need to operate in
--- a/dom/browser-element/mochitest/chrome.ini +++ b/dom/browser-element/mochitest/chrome.ini @@ -54,17 +54,17 @@ support-files = [test_browserElement_inproc_ActiveStateChange.html] tags = audiochannel [test_browserElement_inproc_AudioChannelMutedByDefault.html] tags = audiochannel skip-if = toolkit == 'android' [test_browserElement_inproc_AudioChannelSeeking.html] tags = audiochannel [test_browserElement_inproc_AudioPlayback.html] -skip-if = toolkit == 'android' # bug 1332850 +skip-if = true # bug 1332850, bug 1332862 [test_browserElement_inproc_AudioChannel.html] tags = audiochannel [test_browserElement_inproc_AudioChannel_nested.html] tags = audiochannel skip-if = toolkit == 'android' # bug 1332850 [test_browserElement_inproc_BackForward.html] [test_browserElement_inproc_BadScreenshot.html] [test_browserElement_inproc_DocumentFirstPaint.html]
new file mode 100644 --- /dev/null +++ b/dom/canvas/BasicRenderingContext2D.h @@ -0,0 +1,201 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BasicRenderingContext2D_h +#define BasicRenderingContext2D_h + +#include "mozilla/dom/CanvasRenderingContext2DBinding.h" + +namespace mozilla { +namespace dom { + +class HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap; +typedef HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap + CanvasImageSource; + +/* + * BasicRenderingContext2D + */ +class BasicRenderingContext2D +{ +public: + // + // CanvasState + // + virtual void Save() = 0; + virtual void Restore() = 0; + + // + // CanvasTransform + // + virtual void Scale(double aX, double aY, mozilla::ErrorResult& aError) = 0; + virtual void Rotate(double aAngle, mozilla::ErrorResult& aError) = 0; + virtual void Translate(double aX, + double aY, + mozilla::ErrorResult& aError) = 0; + virtual void Transform(double aM11, + double aM12, + double aM21, + double aM22, + double aDx, + double aDy, + mozilla::ErrorResult& aError) = 0; + virtual void SetTransform(double aM11, + double aM12, + double aM21, + double aM22, + double aDx, + double aDy, + mozilla::ErrorResult& aError) = 0; + virtual void ResetTransform(mozilla::ErrorResult& aError) = 0; + + // + // CanvasCompositing + // + virtual double GlobalAlpha() = 0; + virtual void SetGlobalAlpha(double aGlobalAlpha) = 0; + virtual void GetGlobalCompositeOperation(nsAString& aOp, + mozilla::ErrorResult& aError) = 0; + virtual void SetGlobalCompositeOperation(const nsAString& aOp, + mozilla::ErrorResult& aError) = 0; + + // + // CanvasImageSmoothing + // + virtual bool ImageSmoothingEnabled() = 0; + virtual void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) = 0; + + // + // CanvasFillStrokeStyles + // + virtual void GetStrokeStyle( + OwningStringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual void SetStrokeStyle( + const StringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual void GetFillStyle( + OwningStringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual void SetFillStyle( + const StringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual already_AddRefed<CanvasGradient> CreateLinearGradient(double aX0, + double aY0, + double aX1, + double aY1) = 0; + virtual already_AddRefed<CanvasGradient> CreateRadialGradient( + double aX0, + double aY0, + double aR0, + double aX1, + double aY1, + double aR1, + ErrorResult& aError) = 0; + virtual already_AddRefed<CanvasPattern> CreatePattern( + const CanvasImageSource& aElement, + const nsAString& aRepeat, + ErrorResult& aError) = 0; + // + // CanvasShadowStyles + // + virtual double ShadowOffsetX() = 0; + virtual void SetShadowOffsetX(double aShadowOffsetX) = 0; + virtual double ShadowOffsetY() = 0; + virtual void SetShadowOffsetY(double aShadowOffsetY) = 0; + virtual double ShadowBlur() = 0; + virtual void SetShadowBlur(double aShadowBlur) = 0; + virtual void GetShadowColor(nsAString& aShadowColor) = 0; + virtual void SetShadowColor(const nsAString& aShadowColor) = 0; + + // + // CanvasRect + // + virtual void ClearRect(double aX, double aY, double aW, double aH) = 0; + virtual void FillRect(double aX, double aY, double aW, double aH) = 0; + virtual void StrokeRect(double aX, double aY, double aW, double aH) = 0; + + // + // CanvasDrawImage + // + virtual void DrawImage(const CanvasImageSource& aImage, + double aDx, + double aDy, + mozilla::ErrorResult& aError) = 0; + virtual void DrawImage(const CanvasImageSource& aImage, + double aDx, + double aDy, + double aDw, + double aDh, + mozilla::ErrorResult& aError) = 0; + virtual void DrawImage(const CanvasImageSource& aImage, + double aSx, + double aSy, + double aSw, + double aSh, + double aDx, + double aDy, + double aDw, + double aDh, + mozilla::ErrorResult& aError) = 0; + + // + // CanvasPathDrawingStyles + // + virtual double LineWidth() = 0; + virtual void SetLineWidth(double aWidth) = 0; + virtual void GetLineCap(nsAString& aLinecapStyle) = 0; + virtual void SetLineCap(const nsAString& aLinecapStyle) = 0; + virtual void GetLineJoin(nsAString& aLinejoinStyle, + mozilla::ErrorResult& aError) = 0; + virtual void SetLineJoin(const nsAString& aLinejoinStyle) = 0; + virtual double MiterLimit() = 0; + virtual void SetMiterLimit(double aMiter) = 0; + virtual void SetLineDash(const Sequence<double>& aSegments, + mozilla::ErrorResult& aRv) = 0; + virtual void GetLineDash(nsTArray<double>& aSegments) const = 0; + virtual void SetLineDashOffset(double aOffset) = 0; + virtual double LineDashOffset() const = 0; + + // + // CanvasPath + // + virtual void ClosePath() = 0; + virtual void MoveTo(double aX, double aY) = 0; + virtual void LineTo(double aX, double aY) = 0; + virtual void QuadraticCurveTo(double aCpx, + double aCpy, + double aX, + double aY) = 0; + virtual void BezierCurveTo(double aCp1x, + double aCp1y, + double aCp2x, + double aCp2y, + double aX, + double aY) = 0; + virtual void ArcTo(double aX1, + double aY1, + double aX2, + double aY2, + double aRadius, + mozilla::ErrorResult& aError) = 0; + virtual void Rect(double aX, double aY, double aW, double aH) = 0; + virtual void Arc(double aX, + double aY, + double aRadius, + double aStartAngle, + double aEndAngle, + bool aAnticlockwise, + mozilla::ErrorResult& aError) = 0; + virtual void Ellipse(double aX, + double aY, + double aRadiusX, + double aRadiusY, + double aRotation, + double aStartAngle, + double aEndAngle, + bool aAnticlockwise, + ErrorResult& aError) = 0; +}; + +} // namespace dom +} // namespace mozilla + +#endif /* BasicRenderingContext2D_h */
--- a/dom/canvas/CanvasRenderingContext2D.h +++ b/dom/canvas/CanvasRenderingContext2D.h @@ -10,16 +10,17 @@ #include "nsIDOMCanvasRenderingContext2D.h" #include "nsICanvasRenderingContextInternal.h" #include "mozilla/RefPtr.h" #include "nsColor.h" #include "mozilla/dom/HTMLCanvasElement.h" #include "mozilla/dom/HTMLVideoElement.h" #include "gfxTextRun.h" #include "mozilla/ErrorResult.h" +#include "mozilla/dom/BasicRenderingContext2D.h" #include "mozilla/dom/CanvasGradient.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/dom/CanvasPattern.h" #include "mozilla/gfx/Rect.h" #include "mozilla/gfx/2D.h" #include "mozilla/UniquePtr.h" #include "gfx2DGlue.h" #include "imgIEncoder.h" @@ -56,17 +57,18 @@ class CanvasRenderingContext2DUserData; class CanvasDrawObserver; class CanvasShutdownObserver; /** ** CanvasRenderingContext2D **/ class CanvasRenderingContext2D final : public nsICanvasRenderingContextInternal, - public nsWrapperCache + public nsWrapperCache, + public BasicRenderingContext2D { virtual ~CanvasRenderingContext2D(); public: explicit CanvasRenderingContext2D(layers::LayersBackend aCompositorBackend); virtual JSObject* WrapObject(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) override; @@ -75,122 +77,128 @@ public: if (!mCanvasElement || mCanvasElement->IsInNativeAnonymousSubtree()) { return nullptr; } // corresponds to changes to the old bindings made in bug 745025 return mCanvasElement->GetOriginalCanvas(); } - void Save(); - void Restore(); - void Scale(double aX, double aY, mozilla::ErrorResult& aError); - void Rotate(double aAngle, mozilla::ErrorResult& aError); - void Translate(double aX, double aY, mozilla::ErrorResult& aError); - void Transform(double aM11, double aM12, double aM21, double aM22, double aDx, - double aDy, mozilla::ErrorResult& aError); - void SetTransform(double aM11, double aM12, double aM21, double aM22, double aDx, - double aDy, mozilla::ErrorResult& aError); - void ResetTransform(mozilla::ErrorResult& aError); + void Save() override; + void Restore() override; + void Scale(double aX, double aY, mozilla::ErrorResult& aError) override; + void Rotate(double aAngle, mozilla::ErrorResult& aError) override; + void Translate(double aX, double aY, mozilla::ErrorResult& aError) override; + void Transform(double aM11, double aM12, double aM21, double aM22, + double aDx, double aDy, mozilla::ErrorResult& aError) override; + void SetTransform(double aM11, double aM12, double aM21, double aM22, + double aDx, double aDy, mozilla::ErrorResult& aError) override; + void ResetTransform(mozilla::ErrorResult& aError) override; - double GlobalAlpha() + double GlobalAlpha() override { return CurrentState().globalAlpha; } // Useful for silencing cast warnings static mozilla::gfx::Float ToFloat(double aValue) { return mozilla::gfx::Float(aValue); } - void SetGlobalAlpha(double aGlobalAlpha) + void SetGlobalAlpha(double aGlobalAlpha) override { if (aGlobalAlpha >= 0.0 && aGlobalAlpha <= 1.0) { CurrentState().globalAlpha = ToFloat(aGlobalAlpha); } } - void GetGlobalCompositeOperation(nsAString& aOp, mozilla::ErrorResult& aError); + void GetGlobalCompositeOperation(nsAString& aOp, + mozilla::ErrorResult& aError) override; void SetGlobalCompositeOperation(const nsAString& aOp, - mozilla::ErrorResult& aError); + mozilla::ErrorResult& aError) override; - void GetStrokeStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) + void + GetStrokeStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) override { GetStyleAsUnion(aValue, Style::STROKE); } - void SetStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) + void + SetStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) override { SetStyleFromUnion(aValue, Style::STROKE); } - void GetFillStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) + void + GetFillStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) override { GetStyleAsUnion(aValue, Style::FILL); } - void SetFillStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) + void + SetFillStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) override { SetStyleFromUnion(aValue, Style::FILL); } already_AddRefed<CanvasGradient> - CreateLinearGradient(double aX0, double aY0, double aX1, double aY1); + CreateLinearGradient(double aX0, double aY0, double aX1, double aY1) override; already_AddRefed<CanvasGradient> - CreateRadialGradient(double aX0, double aY0, double aR0, double aX1, double aY1, - double aR1, ErrorResult& aError); + CreateRadialGradient(double aX0, double aY0, double aR0, + double aX1, double aY1, double aR1, + ErrorResult& aError) override; already_AddRefed<CanvasPattern> CreatePattern(const CanvasImageSource& aElement, - const nsAString& aRepeat, ErrorResult& aError); + const nsAString& aRepeat, ErrorResult& aError) override; - double ShadowOffsetX() + double ShadowOffsetX() override { return CurrentState().shadowOffset.x; } - void SetShadowOffsetX(double aShadowOffsetX) + void SetShadowOffsetX(double aShadowOffsetX) override { CurrentState().shadowOffset.x = ToFloat(aShadowOffsetX); } - double ShadowOffsetY() + double ShadowOffsetY() override { return CurrentState().shadowOffset.y; } - void SetShadowOffsetY(double aShadowOffsetY) + void SetShadowOffsetY(double aShadowOffsetY) override { CurrentState().shadowOffset.y = ToFloat(aShadowOffsetY); } - double ShadowBlur() + double ShadowBlur() override { return CurrentState().shadowBlur; } - void SetShadowBlur(double aShadowBlur) + void SetShadowBlur(double aShadowBlur) override { if (aShadowBlur >= 0.0) { CurrentState().shadowBlur = ToFloat(aShadowBlur); } } - void GetShadowColor(nsAString& aShadowColor) + void GetShadowColor(nsAString& aShadowColor) override { StyleColorToString(CurrentState().shadowColor, aShadowColor); } void GetFilter(nsAString& aFilter) { aFilter = CurrentState().filterString; } - void SetShadowColor(const nsAString& aShadowColor); + void SetShadowColor(const nsAString& aShadowColor) override; void SetFilter(const nsAString& aFilter, mozilla::ErrorResult& aError); - void ClearRect(double aX, double aY, double aW, double aH); - void FillRect(double aX, double aY, double aW, double aH); - void StrokeRect(double aX, double aY, double aW, double aH); + void ClearRect(double aX, double aY, double aW, double aH) override; + void FillRect(double aX, double aY, double aW, double aH) override; + void StrokeRect(double aX, double aY, double aW, double aH) override; void BeginPath(); void Fill(const CanvasWindingRule& aWinding); void Fill(const CanvasPath& aPath, const CanvasWindingRule& aWinding); void Stroke(); void Stroke(const CanvasPath& aPath); void DrawFocusIfNeeded(mozilla::dom::Element& aElement, ErrorResult& aRv); bool DrawCustomFocusRing(mozilla::dom::Element& aElement); void Clip(const CanvasWindingRule& aWinding); @@ -207,32 +215,32 @@ public: mozilla::ErrorResult& aError); TextMetrics* MeasureText(const nsAString& aRawText, mozilla::ErrorResult& aError); void AddHitRegion(const HitRegionOptions& aOptions, mozilla::ErrorResult& aError); void RemoveHitRegion(const nsAString& aId); void ClearHitRegions(); - void DrawImage(const CanvasImageSource& aImage, - double aDx, double aDy, mozilla::ErrorResult& aError) + void DrawImage(const CanvasImageSource& aImage, double aDx, double aDy, + mozilla::ErrorResult& aError) override { DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, 0.0, 0.0, 0, aError); } - void DrawImage(const CanvasImageSource& aImage, - double aDx, double aDy, double aDw, double aDh, - mozilla::ErrorResult& aError) + void DrawImage(const CanvasImageSource& aImage, double aDx, double aDy, + double aDw, double aDh, mozilla::ErrorResult& aError) override { DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, aDw, aDh, 2, aError); } void DrawImage(const CanvasImageSource& aImage, - double aSx, double aSy, double aSw, double aSh, double aDx, - double aDy, double aDw, double aDh, mozilla::ErrorResult& aError) + double aSx, double aSy, double aSw, double aSh, + double aDx, double aDy, double aDw, double aDh, + mozilla::ErrorResult& aError) override { DrawImage(aImage, aSx, aSy, aSw, aSh, aDx, aDy, aDw, aDh, 6, aError); } already_AddRefed<ImageData> CreateImageData(JSContext* aCx, double aSw, double aSh, mozilla::ErrorResult& aError); already_AddRefed<ImageData> @@ -243,38 +251,39 @@ public: mozilla::ErrorResult& aError); void PutImageData(ImageData& aImageData, double aDx, double aDy, mozilla::ErrorResult& aError); void PutImageData(ImageData& aImageData, double aDx, double aDy, double aDirtyX, double aDirtyY, double aDirtyWidth, double aDirtyHeight, mozilla::ErrorResult& aError); - double LineWidth() + double LineWidth() override { return CurrentState().lineWidth; } - void SetLineWidth(double aWidth) + void SetLineWidth(double aWidth) override { if (aWidth > 0.0) { CurrentState().lineWidth = ToFloat(aWidth); } } - void GetLineCap(nsAString& aLinecapStyle); - void SetLineCap(const nsAString& aLinecapStyle); - void GetLineJoin(nsAString& aLinejoinStyle, mozilla::ErrorResult& aError); - void SetLineJoin(const nsAString& aLinejoinStyle); + void GetLineCap(nsAString& aLinecapStyle) override; + void SetLineCap(const nsAString& aLinecapStyle) override; + void GetLineJoin(nsAString& aLinejoinStyle, + mozilla::ErrorResult& aError) override; + void SetLineJoin(const nsAString& aLinejoinStyle) override; - double MiterLimit() + double MiterLimit() override { return CurrentState().miterLimit; } - void SetMiterLimit(double aMiter) + void SetMiterLimit(double aMiter) override { if (aMiter > 0.0) { CurrentState().miterLimit = ToFloat(aMiter); } } void GetFont(nsAString& aFont) { @@ -282,79 +291,81 @@ public: } void SetFont(const nsAString& aFont, mozilla::ErrorResult& aError); void GetTextAlign(nsAString& aTextAlign); void SetTextAlign(const nsAString& aTextAlign); void GetTextBaseline(nsAString& aTextBaseline); void SetTextBaseline(const nsAString& aTextBaseline); - void ClosePath() + void ClosePath() override { EnsureWritablePath(); if (mPathBuilder) { mPathBuilder->Close(); } else { mDSPathBuilder->Close(); } } - void MoveTo(double aX, double aY) + void MoveTo(double aX, double aY) override { EnsureWritablePath(); if (mPathBuilder) { mPathBuilder->MoveTo(mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); } else { mDSPathBuilder->MoveTo(mTarget->GetTransform().TransformPoint( mozilla::gfx::Point(ToFloat(aX), ToFloat(aY)))); } } - void LineTo(double aX, double aY) + void LineTo(double aX, double aY) override { EnsureWritablePath(); LineTo(mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); } - void QuadraticCurveTo(double aCpx, double aCpy, double aX, double aY) + void QuadraticCurveTo(double aCpx, double aCpy, double aX, double aY) override { EnsureWritablePath(); if (mPathBuilder) { mPathBuilder->QuadraticBezierTo(mozilla::gfx::Point(ToFloat(aCpx), ToFloat(aCpy)), mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); } else { mozilla::gfx::Matrix transform = mTarget->GetTransform(); mDSPathBuilder->QuadraticBezierTo(transform.TransformPoint( mozilla::gfx::Point(ToFloat(aCpx), ToFloat(aCpy))), transform.TransformPoint( mozilla::gfx::Point(ToFloat(aX), ToFloat(aY)))); } } - void BezierCurveTo(double aCp1x, double aCp1y, double aCp2x, double aCp2y, double aX, double aY) + void BezierCurveTo(double aCp1x, double aCp1y, double aCp2x, double aCp2y, + double aX, double aY) override { EnsureWritablePath(); BezierTo(mozilla::gfx::Point(ToFloat(aCp1x), ToFloat(aCp1y)), mozilla::gfx::Point(ToFloat(aCp2x), ToFloat(aCp2y)), mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); } - void ArcTo(double aX1, double aY1, double aX2, double aY2, double aRadius, - mozilla::ErrorResult& aError); - void Rect(double aX, double aY, double aW, double aH); + void ArcTo(double aX1, double aY1, double aX2, double aY2, + double aRadius, mozilla::ErrorResult& aError) override; + void Rect(double aX, double aY, double aW, double aH) override; void Arc(double aX, double aY, double aRadius, double aStartAngle, - double aEndAngle, bool aAnticlockwise, mozilla::ErrorResult& aError); + double aEndAngle, bool aAnticlockwise, + mozilla::ErrorResult& aError) override; void Ellipse(double aX, double aY, double aRadiusX, double aRadiusY, double aRotation, double aStartAngle, double aEndAngle, - bool aAnticlockwise, ErrorResult& aError); + bool aAnticlockwise, ErrorResult& aError) override; void GetMozCurrentTransform(JSContext* aCx, JS::MutableHandle<JSObject*> aResult, mozilla::ErrorResult& aError); void SetMozCurrentTransform(JSContext* aCx, JS::Handle<JSObject*> aCurrentTransform, mozilla::ErrorResult& aError); void GetMozCurrentTransformInverse(JSContext* aCx, @@ -362,39 +373,39 @@ public: mozilla::ErrorResult& aError); void SetMozCurrentTransformInverse(JSContext* aCx, JS::Handle<JSObject*> aCurrentTransform, mozilla::ErrorResult& aError); void GetFillRule(nsAString& aFillRule); void SetFillRule(const nsAString& aFillRule); void SetLineDash(const Sequence<double>& aSegments, - mozilla::ErrorResult& aRv); - void GetLineDash(nsTArray<double>& aSegments) const; + mozilla::ErrorResult& aRv) override; + void GetLineDash(nsTArray<double>& aSegments) const override; - void SetLineDashOffset(double aOffset); - double LineDashOffset() const; + void SetLineDashOffset(double aOffset) override; + double LineDashOffset() const override; void GetMozTextStyle(nsAString& aMozTextStyle) { GetFont(aMozTextStyle); } void SetMozTextStyle(const nsAString& aMozTextStyle, mozilla::ErrorResult& aError) { SetFont(aMozTextStyle, aError); } - bool ImageSmoothingEnabled() + bool ImageSmoothingEnabled() override { return CurrentState().imageSmoothingEnabled; } - void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) + void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) override { if (aImageSmoothingEnabled != CurrentState().imageSmoothingEnabled) { CurrentState().imageSmoothingEnabled = aImageSmoothingEnabled; } } void DrawWindow(nsGlobalWindow& aWindow, double aX, double aY, double aW, double aH,
--- a/dom/canvas/moz.build +++ b/dom/canvas/moz.build @@ -50,16 +50,17 @@ EXPORTS += [ ] EXPORTS.mozilla.ipc += [ 'DocumentRendererChild.h', 'DocumentRendererParent.h', ] EXPORTS.mozilla.dom += [ + 'BasicRenderingContext2D.h', 'CanvasGradient.h', 'CanvasPath.h', 'CanvasPattern.h', 'CanvasRenderingContext2D.h', 'CanvasRenderingContextHelper.h', 'CanvasUtils.h', 'ImageBitmap.h', 'ImageBitmapRenderingContext.h',
--- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -6666,41 +6666,38 @@ private: * ObjectStoreAddOrPutRequestOp::StoredFileInfo for a queued or active add/put * op is holding a reference to us. */ class DatabaseFile final : public PBackgroundIDBDatabaseFileParent { friend class Database; + // mBlobImpl's ownership lifecycle: + // - Initialized on the background thread at creation time. Then + // responsibility is handed off to the connection thread. + // - Checked and used by the connection thread to generate a stream to write + // the blob to disk by an add/put operation. + // - Cleared on the connection thread once the file has successfully been + // written to disk. RefPtr<BlobImpl> mBlobImpl; RefPtr<FileInfo> mFileInfo; public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(mozilla::dom::indexedDB::DatabaseFile); FileInfo* GetFileInfo() const { AssertIsOnBackgroundThread(); return mFileInfo; } /** - * Is there a blob available to provide an input stream? This may be called - * on any thread under current lifecycle constraints. - */ - bool - HasBlobImpl() const - { - return (bool)mBlobImpl; - } - - /** * If mBlobImpl is non-null (implying the contents of this file have not yet * been written to disk), then return an input stream that is guaranteed to * block on reads and never return NS_BASE_STREAM_WOULD_BLOCK. If mBlobImpl * is null (because the contents have been written to disk), returns null. * * Because this method does I/O, it should only be called on a database I/O * thread, not on PBackground. Note that we actually open the stream on this * thread, where previously it was opened on PBackground. This is safe and @@ -6729,20 +6726,27 @@ public: * writing), they will be sent up from the child via PSendStream in chunks * to a non-blocking pipe that will return NS_BASE_STREAM_WOULD_BLOCK. * - Other Blob types could potentially be non-blocking. (We're not making * any assumptions.) */ already_AddRefed<nsIInputStream> GetBlockingInputStream(ErrorResult &rv) const; - void - ClearInputStream() - { - AssertIsOnBackgroundThread(); + /** + * To be called upon successful copying of the stream GetBlockingInputStream() + * returned so that we won't try and redundantly write the file to disk in the + * future. This is a separate step from GetBlockingInputStream() because + * the write could fail due to quota errors that happen now but that might + * not happen in a future attempt. + */ + void + WriteSucceededClearBlobImpl() + { + MOZ_ASSERT(!IsOnBackgroundThread()); mBlobImpl = nullptr; } private: // Called when sending to the child. explicit DatabaseFile(FileInfo* aFileInfo) : mFileInfo(aFileInfo) @@ -6768,18 +6772,18 @@ private: { AssertIsOnBackgroundThread(); } }; already_AddRefed<nsIInputStream> DatabaseFile::GetBlockingInputStream(ErrorResult &rv) const { - // We should only be called from a database I/O thread, not the background - // thread. The background thread should call HasBlobImpl(). + // We should only be called from our DB connection thread, not the background + // thread. MOZ_ASSERT(!IsOnBackgroundThread()); if (!mBlobImpl) { return nullptr; } nsCOMPtr<nsIInputStream> inputStream; mBlobImpl->GetInternalStream(getter_AddRefs(inputStream), rv); @@ -8315,18 +8319,16 @@ class ObjectStoreAddOrPutRequestOp final Maybe<UniqueIndexTable> mUniqueIndexTable; // This must be non-const so that we can update the mNextAutoIncrementId field // if we are modifying an autoIncrement objectStore. RefPtr<FullObjectStoreMetadata> mMetadata; FallibleTArray<StoredFileInfo> mStoredFileInfos; - RefPtr<FileManager> mFileManager; - Key mResponse; const nsCString mGroup; const nsCString mOrigin; const PersistenceType mPersistenceType; const bool mOverwrite; bool mObjectStoreMayHaveIndexes; bool mDataOverThreshold; @@ -8356,21 +8358,19 @@ private: struct ObjectStoreAddOrPutRequestOp::StoredFileInfo final { RefPtr<DatabaseFile> mFileActor; RefPtr<FileInfo> mFileInfo; // A non-Blob-backed inputstream to write to disk. If null, mFileActor may // still have a stream for us to write. nsCOMPtr<nsIInputStream> mInputStream; StructuredCloneFile::FileType mType; - bool mCopiedSuccessfully; StoredFileInfo() : mType(StructuredCloneFile::eBlob) - , mCopiedSuccessfully(false) { AssertIsOnBackgroundThread(); MOZ_COUNT_CTOR(ObjectStoreAddOrPutRequestOp::StoredFileInfo); } ~StoredFileInfo() { @@ -26150,20 +26150,16 @@ ObjectStoreAddOrPutRequestOp::Init(Trans if (!fileAddInfos.IsEmpty()) { const uint32_t count = fileAddInfos.Length(); if (NS_WARN_IF(!mStoredFileInfos.SetCapacity(count, fallible))) { return false; } - RefPtr<FileManager> fileManager = - aTransaction->GetDatabase()->GetFileManager(); - MOZ_ASSERT(fileManager); - for (uint32_t index = 0; index < count; index++) { const FileAddInfo& fileAddInfo = fileAddInfos[index]; MOZ_ASSERT(fileAddInfo.type() == StructuredCloneFile::eBlob || fileAddInfo.type() == StructuredCloneFile::eMutableFile || fileAddInfo.type() == StructuredCloneFile::eWasmBytecode || fileAddInfo.type() == StructuredCloneFile::eWasmCompiled); @@ -26180,20 +26176,16 @@ ObjectStoreAddOrPutRequestOp::Init(Trans storedFileInfo->mFileActor = static_cast<DatabaseFile*>( file.get_PBackgroundIDBDatabaseFileParent()); MOZ_ASSERT(storedFileInfo->mFileActor); storedFileInfo->mFileInfo = storedFileInfo->mFileActor->GetFileInfo(); MOZ_ASSERT(storedFileInfo->mFileInfo); - if (storedFileInfo->mFileActor->HasBlobImpl() && !mFileManager) { - mFileManager = fileManager; - } - storedFileInfo->mType = StructuredCloneFile::eBlob; break; } case StructuredCloneFile::eMutableFile: { MOZ_ASSERT(file.type() == DatabaseOrMutableFile::TPBackgroundMutableFileParent); @@ -26217,57 +26209,51 @@ ObjectStoreAddOrPutRequestOp::Init(Trans storedFileInfo->mFileActor = static_cast<DatabaseFile*>( file.get_PBackgroundIDBDatabaseFileParent()); MOZ_ASSERT(storedFileInfo->mFileActor); storedFileInfo->mFileInfo = storedFileInfo->mFileActor->GetFileInfo(); MOZ_ASSERT(storedFileInfo->mFileInfo); - if (storedFileInfo->mFileActor->HasBlobImpl() && !mFileManager) { - mFileManager = fileManager; - } - storedFileInfo->mType = fileAddInfo.type(); break; } default: MOZ_CRASH("Should never get here!"); } } } if (mDataOverThreshold) { StoredFileInfo* storedFileInfo = mStoredFileInfos.AppendElement(fallible); MOZ_ASSERT(storedFileInfo); - if (!mFileManager) { - mFileManager = aTransaction->GetDatabase()->GetFileManager(); - MOZ_ASSERT(mFileManager); - } - - storedFileInfo->mFileInfo = mFileManager->GetNewFileInfo(); + RefPtr<FileManager> fileManager = + aTransaction->GetDatabase()->GetFileManager(); + MOZ_ASSERT(fileManager); + + storedFileInfo->mFileInfo = fileManager->GetNewFileInfo(); storedFileInfo->mInputStream = new SCInputStream(mParams.cloneInfo().data().data); storedFileInfo->mType = StructuredCloneFile::eStructuredClone; } return true; } nsresult ObjectStoreAddOrPutRequestOp::DoDatabaseWork(DatabaseConnection* aConnection) { MOZ_ASSERT(aConnection); aConnection->AssertIsOnConnectionThread(); MOZ_ASSERT(aConnection->GetStorageConnection()); - MOZ_ASSERT_IF(mFileManager, !mStoredFileInfos.IsEmpty()); PROFILER_LABEL("IndexedDB", "ObjectStoreAddOrPutRequestOp::DoDatabaseWork", js::ProfileEntry::Category::STORAGE); if (NS_WARN_IF(IndexedDatabaseManager::InLowDiskSpaceMode())) { return NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR; } @@ -26434,44 +26420,34 @@ ObjectStoreAddOrPutRequestOp::DoDatabase rv = stmt->BindAdoptedBlobByName(NS_LITERAL_CSTRING("data"), dataBuffer, dataBufferLength); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } - Maybe<FileHelper> fileHelper; - - if (mFileManager) { - fileHelper.emplace(mFileManager); - - rv = fileHelper->Init(); - if (NS_WARN_IF(NS_FAILED(rv))) { - IDB_REPORT_INTERNAL_ERR(); - return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; - } - } - if (!mStoredFileInfos.IsEmpty()) { + // Moved outside the loop to allow it to be cached when demanded by the + // first write. (We may have mStoredFileInfos without any required writes.) + Maybe<FileHelper> fileHelper; nsAutoString fileIds; for (uint32_t count = mStoredFileInfos.Length(), index = 0; index < count; index++) { StoredFileInfo& storedFileInfo = mStoredFileInfos[index]; MOZ_ASSERT(storedFileInfo.mFileInfo); // If there is a StoredFileInfo, then one of the following is true: // - This was an overflow structured clone and storedFileInfo.mInputStream // MUST be non-null. // - This is a reference to a Blob that may or may not have already been // written to disk. storedFileInfo.mFileActor MUST be non-null, but - // its HasBlobImpl() may return false and so GetBlockingInputStream may - // return null (so don't assert on them). + // its GetBlockingInputStream may return null (so don't assert on them). // - It's a mutable file. No writing will be performed. MOZ_ASSERT(storedFileInfo.mInputStream || storedFileInfo.mFileActor || storedFileInfo.mType == StructuredCloneFile::eMutableFile); nsCOMPtr<nsIInputStream> inputStream; // Check for an explicit stream, like a structured clone stream. storedFileInfo.mInputStream.swap(inputStream); // Check for a blob-backed stream otherwise. @@ -26480,16 +26456,29 @@ ObjectStoreAddOrPutRequestOp::DoDatabase inputStream = storedFileInfo.mFileActor->GetBlockingInputStream(streamRv); if (NS_WARN_IF(streamRv.Failed())) { return streamRv.StealNSResult(); } } if (inputStream) { + if (fileHelper.isNothing()) { + RefPtr<FileManager> fileManager = + Transaction()->GetDatabase()->GetFileManager(); + MOZ_ASSERT(fileManager); + + fileHelper.emplace(fileManager); + rv = fileHelper->Init(); + if (NS_WARN_IF(NS_FAILED(rv))) { + IDB_REPORT_INTERNAL_ERR(); + return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; + } + } + RefPtr<FileInfo>& fileInfo = storedFileInfo.mFileInfo; nsCOMPtr<nsIFile> file = fileHelper->GetFile(fileInfo); if (NS_WARN_IF(!file)) { IDB_REPORT_INTERNAL_ERR(); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } @@ -26516,17 +26505,19 @@ ObjectStoreAddOrPutRequestOp::DoDatabase // Try to remove the file if the copy failed. nsresult rv2 = fileHelper->RemoveFile(file, journalFile); if (NS_WARN_IF(NS_FAILED(rv2))) { return rv; } return rv; } - storedFileInfo.mCopiedSuccessfully = true; + if (storedFileInfo.mFileActor) { + storedFileInfo.mFileActor->WriteSucceededClearBlobImpl(); + } } if (index) { fileIds.Append(' '); } storedFileInfo.Serialize(fileIds); } @@ -26600,33 +26591,17 @@ ObjectStoreAddOrPutRequestOp::GetRespons } } void ObjectStoreAddOrPutRequestOp::Cleanup() { AssertIsOnOwningThread(); - if (!mStoredFileInfos.IsEmpty()) { - for (uint32_t count = mStoredFileInfos.Length(), index = 0; - index < count; - index++) { - StoredFileInfo& storedFileInfo = mStoredFileInfos[index]; - - MOZ_ASSERT_IF(storedFileInfo.mType == StructuredCloneFile::eMutableFile, - !storedFileInfo.mCopiedSuccessfully); - - RefPtr<DatabaseFile>& fileActor = storedFileInfo.mFileActor; - if (fileActor && storedFileInfo.mCopiedSuccessfully) { - fileActor->ClearInputStream(); - } - } - - mStoredFileInfos.Clear(); - } + mStoredFileInfos.Clear(); NormalTransactionOp::Cleanup(); } NS_IMPL_ISUPPORTS(ObjectStoreAddOrPutRequestOp::SCInputStream, nsIInputStream) NS_IMETHODIMP ObjectStoreAddOrPutRequestOp::
--- a/dom/locales/en-US/chrome/dom/dom.properties +++ b/dom/locales/en-US/chrome/dom/dom.properties @@ -316,8 +316,10 @@ LargeAllocationSuccess=This page was loa LargeAllocationNonGetRequest=A Large-Allocation header was ignored due to the load being triggered by a non-GET request. # LOCALIZATION NOTE: Do not translate "Large-Allocation", as it is a literal header name. Do not translate `window.opener`. LargeAllocationNotOnlyToplevelInTabGroup=A Large-Allocation header was ignored due to the presence of windows which have a reference to this browsing context through the frame hierarchy or window.opener. # LOCALIZATION NOTE: Do not translate "Large-Allocation", as it is a literal header name LargeAllocationNonE10S=A Large-Allocation header was ignored due to the document not being loaded out of process. GeolocationInsecureRequestIsForbidden=A Geolocation request can only be fulfilled in a secure context. # LOCALIZATION NOTE: Do not translate "Large-Allocation", as it is a literal header name. LargeAllocationNonWin32=This page would be loaded in a new process due to a Large-Allocation header, however Large-Allocation process creation is disabled on non-Win32 platforms. +# LOCALIZATION NOTE: Do not translate URL.createObjectURL(MediaStream). +URLCreateObjectURL_MediaStream=URL.createObjectURL(MediaStream) is deprecated and will be removed soon.
--- a/dom/media/platforms/wmf/WMF.h +++ b/dom/media/platforms/wmf/WMF.h @@ -2,45 +2,33 @@ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef WMF_H_ #define WMF_H_ -#if WINVER < _WIN32_WINNT_WIN7 -#error \ -You must include WMF.h before including mozilla headers, \ -otherwise mozconfig.h will be included \ -and that sets WINVER to WinXP, \ -which makes Windows Media Foundation unavailable. -#endif - -#pragma push_macro("WINVER") -#undef WINVER -#define WINVER _WIN32_WINNT_WIN7 - #include <windows.h> #include <mfapi.h> #include <mfidl.h> #include <mfreadwrite.h> #include <mfobjects.h> #include <ks.h> #include <stdio.h> #include <mferror.h> #include <propvarutil.h> #include <wmcodecdsp.h> #include <d3d9.h> #include <dxva2api.h> #include <wmcodecdsp.h> #include <codecapi.h> // The Windows headers helpfully declare min and max macros, which don't -// compile in the prescence of std::min and std::max and unified builds. +// compile in the presence of std::min and std::max and unified builds. // So undef them here. #ifdef min #undef min #endif #ifdef max #undef max #endif @@ -92,13 +80,9 @@ HRESULT MFCreateDXGISurfaceBuffer(REFIID IUnknown *punkSurface, UINT uSubresourceIndex, BOOL fButtomUpWhenLinear, IMFMediaBuffer **ppBuffer); } // end namespace wmf } // end namespace mozilla - - -#pragma pop_macro("WINVER") - #endif
--- a/dom/url/URL.cpp +++ b/dom/url/URL.cpp @@ -1722,16 +1722,19 @@ URL::CreateObjectURL(const GlobalObject& } } void URL::CreateObjectURL(const GlobalObject& aGlobal, DOMMediaStream& aStream, nsAString& aResult, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); + + DeprecationWarning(aGlobal, nsIDocument::eURLCreateObjectURL_MediaStream); + URLMainThread::CreateObjectURL(aGlobal, aStream, aResult, aRv); } void URL::CreateObjectURL(const GlobalObject& aGlobal, MediaSource& aSource, nsAString& aResult, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread());
--- a/dom/workers/ScriptLoader.cpp +++ b/dom/workers/ScriptLoader.cpp @@ -867,27 +867,19 @@ private: nsresult LoadScript(uint32_t aIndex) { AssertIsOnMainThread(); MOZ_ASSERT(aIndex < mLoadInfos.Length()); WorkerPrivate* parentWorker = mWorkerPrivate->GetParent(); - // Figure out which principal to use. nsIPrincipal* principal = mWorkerPrivate->GetPrincipal(); nsCOMPtr<nsILoadGroup> loadGroup = mWorkerPrivate->GetLoadGroup(); - if (!principal) { - NS_ASSERTION(parentWorker, "Must have a principal!"); - NS_ASSERTION(mIsMainScript, "Must have a principal for importScripts!"); - - principal = parentWorker->GetPrincipal(); - loadGroup = parentWorker->GetLoadGroup(); - } - NS_ASSERTION(principal, "This should never be null here!"); + MOZ_DIAGNOSTIC_ASSERT(principal); MOZ_ASSERT(NS_LoadGroupMatchesPrincipal(loadGroup, principal)); // Figure out our base URI. nsCOMPtr<nsIURI> baseURI = GetBaseURI(mIsMainScript, mWorkerPrivate); // May be null. nsCOMPtr<nsIDocument> parentDoc = mWorkerPrivate->GetDocument(); @@ -1132,71 +1124,17 @@ private: // worker's primary script. if (IsMainWorkerScript()) { // Take care of the base URI first. mWorkerPrivate->SetBaseURI(finalURI); // Store the channel info if needed. mWorkerPrivate->InitChannelInfo(channel); - // Now to figure out which principal to give this worker. - WorkerPrivate* parent = mWorkerPrivate->GetParent(); - - NS_ASSERTION(mWorkerPrivate->GetPrincipal() || parent, - "Must have one of these!"); - - nsCOMPtr<nsIPrincipal> loadPrincipal = mWorkerPrivate->GetPrincipal() ? - mWorkerPrivate->GetPrincipal() : - parent->GetPrincipal(); - - nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); - NS_ASSERTION(ssm, "Should never be null!"); - - nsCOMPtr<nsIPrincipal> channelPrincipal; - rv = ssm->GetChannelResultPrincipal(channel, getter_AddRefs(channelPrincipal)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr<nsILoadGroup> channelLoadGroup; - rv = channel->GetLoadGroup(getter_AddRefs(channelLoadGroup)); - NS_ENSURE_SUCCESS(rv, rv); - MOZ_ASSERT(channelLoadGroup); - - // If the load principal is the system principal then the channel - // principal must also be the system principal (we do not allow chrome - // code to create workers with non-chrome scripts, and if we ever decide - // to change this we need to make sure we don't always set - // mPrincipalIsSystem to true in WorkerPrivate::GetLoadInfo()). Otherwise - // this channel principal must be same origin with the load principal (we - // check again here in case redirects changed the location of the script). - if (nsContentUtils::IsSystemPrincipal(loadPrincipal)) { - if (!nsContentUtils::IsSystemPrincipal(channelPrincipal)) { - // See if this is a resource URI. Since JSMs usually come from - // resource:// URIs we're currently considering all URIs with the - // URI_IS_UI_RESOURCE flag as valid for creating privileged workers. - bool isResource; - rv = NS_URIChainHasFlags(finalURI, - nsIProtocolHandler::URI_IS_UI_RESOURCE, - &isResource); - NS_ENSURE_SUCCESS(rv, rv); - - if (isResource) { - // Assign the system principal to the resource:// worker only if it - // was loaded from code using the system principal. - channelPrincipal = loadPrincipal; - } else { - return NS_ERROR_DOM_BAD_URI; - } - } - } - - // The principal can change, but it should still match the original - // load group's appId and browser element flag. - MOZ_ASSERT(NS_LoadGroupMatchesPrincipal(channelLoadGroup, channelPrincipal)); - - mWorkerPrivate->SetPrincipal(channelPrincipal, channelLoadGroup); + MOZ_DIAGNOSTIC_ASSERT(mWorkerPrivate->FinalChannelPrincipalIsValid(channel)); // We did inherit CSP in bug 1223647. If we do not already have a CSP, we // should get it from the HTTP headers on the worker script. if (!mWorkerPrivate->GetCSP() && CSPService::sCSPEnabled) { NS_ConvertASCIItoUTF16 cspHeaderValue(tCspHeaderValue); NS_ConvertASCIItoUTF16 cspROHeaderValue(tCspROHeaderValue); nsIPrincipal* principal = mWorkerPrivate->GetPrincipal(); @@ -1234,16 +1172,17 @@ private: NS_ENSURE_SUCCESS(rv, rv); if (hasReferrerPolicy) { //FIXME bug 1307366: move RP out of CSP code mWorkerPrivate->SetReferrerPolicy(static_cast<net::ReferrerPolicy>(rp)); } } } + WorkerPrivate* parent = mWorkerPrivate->GetParent(); if (parent) { // XHR Params Allowed mWorkerPrivate->SetXHRParamsAllowed(parent->XHRParamsAllowed()); } } NS_ConvertUTF8toUTF16 tRPHeaderValue(tRPHeaderCValue); // If there's a Referrer-Policy header, apply it. @@ -1303,17 +1242,17 @@ private: nsILoadGroup* loadGroup = mWorkerPrivate->GetLoadGroup(); MOZ_ASSERT(loadGroup); mozilla::DebugOnly<bool> equal = false; MOZ_ASSERT(responsePrincipal && NS_SUCCEEDED(responsePrincipal->Equals(principal, &equal))); MOZ_ASSERT(equal); mWorkerPrivate->InitChannelInfo(aChannelInfo); - mWorkerPrivate->SetPrincipal(responsePrincipal, loadGroup); + mWorkerPrivate->SetPrincipalOnMainThread(responsePrincipal, loadGroup); } if (NS_SUCCEEDED(rv)) { DataReceived(); } LoadingFinished(aIndex, rv); } @@ -1790,64 +1729,71 @@ CacheScriptLoader::OnStreamComplete(nsIS mRunnable->DataReceivedFromCache(mIndex, aString, aStringLen, mChannelInfo, Move(mPrincipalInfo)); return NS_OK; } class ChannelGetterRunnable final : public WorkerMainThreadRunnable { const nsAString& mScriptURL; - nsIChannel** mChannel; + WorkerLoadInfo& mLoadInfo; nsresult mResult; public: ChannelGetterRunnable(WorkerPrivate* aParentWorker, const nsAString& aScriptURL, - nsIChannel** aChannel) + WorkerLoadInfo& aLoadInfo) : WorkerMainThreadRunnable(aParentWorker, NS_LITERAL_CSTRING("ScriptLoader :: ChannelGetter")) , mScriptURL(aScriptURL) - , mChannel(aChannel) + , mLoadInfo(aLoadInfo) , mResult(NS_ERROR_FAILURE) { MOZ_ASSERT(aParentWorker); aParentWorker->AssertIsOnWorkerThread(); } virtual bool MainThreadRun() override { AssertIsOnMainThread(); - nsIPrincipal* principal = mWorkerPrivate->GetPrincipal(); - MOZ_ASSERT(principal); + // Initialize the WorkerLoadInfo principal to our triggering principal + // before doing anything else. Normally we do this in the WorkerPrivate + // Constructor, but we can't do so off the main thread when creating + // a nested worker. So do it here instead. + mLoadInfo.mPrincipal = mWorkerPrivate->GetPrincipal(); + MOZ_ASSERT(mLoadInfo.mPrincipal); // Figure out our base URI. nsCOMPtr<nsIURI> baseURI = mWorkerPrivate->GetBaseURI(); MOZ_ASSERT(baseURI); // May be null. nsCOMPtr<nsIDocument> parentDoc = mWorkerPrivate->GetDocument(); - nsCOMPtr<nsILoadGroup> loadGroup = mWorkerPrivate->GetLoadGroup(); + mLoadInfo.mLoadGroup = mWorkerPrivate->GetLoadGroup(); nsCOMPtr<nsIChannel> channel; mResult = - scriptloader::ChannelFromScriptURLMainThread(principal, baseURI, - parentDoc, loadGroup, + scriptloader::ChannelFromScriptURLMainThread(mLoadInfo.mPrincipal, + baseURI, parentDoc, + mLoadInfo.mLoadGroup, mScriptURL, // Nested workers are always dedicated. nsIContentPolicy::TYPE_INTERNAL_WORKER, // Nested workers use default uri encoding. true, getter_AddRefs(channel)); - if (NS_SUCCEEDED(mResult)) { - channel.forget(mChannel); - } + NS_ENSURE_SUCCESS(mResult, true); + mResult = mLoadInfo.SetPrincipalFromChannel(channel); + NS_ENSURE_SUCCESS(mResult, true); + + mLoadInfo.mChannel = channel.forget(); return true; } nsresult GetResult() const { return mResult; } @@ -2173,22 +2119,22 @@ ChannelFromScriptURLMainThread(nsIPrinci aContentPolicyType, nsIRequest::LOAD_NORMAL, aDefaultURIEncoding, aChannel); } nsresult ChannelFromScriptURLWorkerThread(JSContext* aCx, WorkerPrivate* aParent, const nsAString& aScriptURL, - nsIChannel** aChannel) + WorkerLoadInfo& aLoadInfo) { aParent->AssertIsOnWorkerThread(); RefPtr<ChannelGetterRunnable> getter = - new ChannelGetterRunnable(aParent, aScriptURL, aChannel); + new ChannelGetterRunnable(aParent, aScriptURL, aLoadInfo); ErrorResult rv; getter->Dispatch(Terminating, rv); if (rv.Failed()) { NS_ERROR("Failed to dispatch!"); return rv.StealNSResult(); }
--- a/dom/workers/ScriptLoader.h +++ b/dom/workers/ScriptLoader.h @@ -41,17 +41,17 @@ ChannelFromScriptURLMainThread(nsIPrinci nsContentPolicyType aContentPolicyType, bool aDefaultURIEncoding, nsIChannel** aChannel); nsresult ChannelFromScriptURLWorkerThread(JSContext* aCx, WorkerPrivate* aParent, const nsAString& aScriptURL, - nsIChannel** aChannel); + WorkerLoadInfo& aLoadInfo); void ReportLoadError(ErrorResult& aRv, nsresult aLoadResult, const nsAString& aScriptURL); void LoadMainScript(WorkerPrivate* aWorkerPrivate, const nsAString& aScriptURL, WorkerScriptType aWorkerScriptType, ErrorResult& aRv);
--- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -390,25 +390,17 @@ private: PostDispatch(WorkerPrivate* aWorkerPrivate, bool aDispatchResult) override { // Silence bad assertions. } virtual bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override { - nsCOMPtr<nsILoadGroup> loadGroupToCancel; - mFinishedWorker->ForgetOverridenLoadGroup(loadGroupToCancel); - - nsTArray<nsCOMPtr<nsISupports>> doomed; - mFinishedWorker->ForgetMainThreadObjects(doomed); - - RefPtr<MainThreadReleaseRunnable> runnable = - new MainThreadReleaseRunnable(doomed, loadGroupToCancel); - if (NS_FAILED(mWorkerPrivate->DispatchToMainThread(runnable.forget()))) { + if (!mFinishedWorker->ProxyReleaseMainThreadObjects()) { NS_WARNING("Failed to dispatch, going to leak!"); } RuntimeService* runtime = RuntimeService::GetService(); NS_ASSERTION(runtime, "This should never be null!"); mFinishedWorker->DisableDebugger(); @@ -442,25 +434,17 @@ private: RuntimeService* runtime = RuntimeService::GetService(); MOZ_ASSERT(runtime); mFinishedWorker->DisableDebugger(); runtime->UnregisterWorker(mFinishedWorker); - nsCOMPtr<nsILoadGroup> loadGroupToCancel; - mFinishedWorker->ForgetOverridenLoadGroup(loadGroupToCancel); - - nsTArray<nsCOMPtr<nsISupports> > doomed; - mFinishedWorker->ForgetMainThreadObjects(doomed); - - RefPtr<MainThreadReleaseRunnable> runnable = - new MainThreadReleaseRunnable(doomed, loadGroupToCancel); - if (NS_FAILED(NS_DispatchToCurrentThread(runnable))) { + if (!mFinishedWorker->ProxyReleaseMainThreadObjects()) { NS_WARNING("Failed to dispatch, going to leak!"); } mFinishedWorker->ClearSelfRef(); return NS_OK; } }; @@ -1846,16 +1830,203 @@ WorkerLoadInfo::StealFrom(WorkerLoadInfo mReportCSPViolations = aOther.mReportCSPViolations; mXHRParamsAllowed = aOther.mXHRParamsAllowed; mPrincipalIsSystem = aOther.mPrincipalIsSystem; mStorageAllowed = aOther.mStorageAllowed; mServiceWorkersTestingInWindow = aOther.mServiceWorkersTestingInWindow; mOriginAttributes = aOther.mOriginAttributes; } +void +WorkerLoadInfo::SetPrincipalOnMainThread(nsIPrincipal* aPrincipal, + nsILoadGroup* aLoadGroup) +{ + AssertIsOnMainThread(); + MOZ_ASSERT(NS_LoadGroupMatchesPrincipal(aLoadGroup, aPrincipal)); + MOZ_ASSERT(!mPrincipalInfo); + + mPrincipal = aPrincipal; + mPrincipalIsSystem = nsContentUtils::IsSystemPrincipal(aPrincipal); + + aPrincipal->GetCsp(getter_AddRefs(mCSP)); + + if (mCSP) { + mCSP->GetAllowsEval(&mReportCSPViolations, &mEvalAllowed); + // Set ReferrerPolicy + bool hasReferrerPolicy = false; + uint32_t rp = mozilla::net::RP_Unset; + + nsresult rv = mCSP->GetReferrerPolicy(&rp, &hasReferrerPolicy); + NS_ENSURE_SUCCESS_VOID(rv); + + if (hasReferrerPolicy) { + mReferrerPolicy = static_cast<net::ReferrerPolicy>(rp); + } + } else { + mEvalAllowed = true; + mReportCSPViolations = false; + } + + mLoadGroup = aLoadGroup; + + mPrincipalInfo = new PrincipalInfo(); + mOriginAttributes = nsContentUtils::GetOriginAttributes(aLoadGroup); + + MOZ_ALWAYS_SUCCEEDS( + PrincipalToPrincipalInfo(aPrincipal, mPrincipalInfo)); +} + +nsresult +WorkerLoadInfo::GetPrincipalAndLoadGroupFromChannel(nsIChannel* aChannel, + nsIPrincipal** aPrincipalOut, + nsILoadGroup** aLoadGroupOut) +{ + AssertIsOnMainThread(); + MOZ_DIAGNOSTIC_ASSERT(aChannel); + MOZ_DIAGNOSTIC_ASSERT(aPrincipalOut); + MOZ_DIAGNOSTIC_ASSERT(aLoadGroupOut); + + // Initial triggering principal should be set + MOZ_DIAGNOSTIC_ASSERT(mPrincipal); + + nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); + MOZ_DIAGNOSTIC_ASSERT(ssm); + + nsCOMPtr<nsIPrincipal> channelPrincipal; + nsresult rv = ssm->GetChannelResultPrincipal(aChannel, getter_AddRefs(channelPrincipal)); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr<nsILoadGroup> channelLoadGroup; + rv = aChannel->GetLoadGroup(getter_AddRefs(channelLoadGroup)); + NS_ENSURE_SUCCESS(rv, rv); + MOZ_ASSERT(channelLoadGroup); + + // If the load principal is the system principal then the channel + // principal must also be the system principal (we do not allow chrome + // code to create workers with non-chrome scripts, and if we ever decide + // to change this we need to make sure we don't always set + // mPrincipalIsSystem to true in WorkerPrivate::GetLoadInfo()). Otherwise + // this channel principal must be same origin with the load principal (we + // check again here in case redirects changed the location of the script). + if (nsContentUtils::IsSystemPrincipal(mPrincipal)) { + if (!nsContentUtils::IsSystemPrincipal(channelPrincipal)) { + nsCOMPtr<nsIURI> finalURI; + rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(finalURI)); + NS_ENSURE_SUCCESS(rv, rv); + + // See if this is a resource URI. Since JSMs usually come from + // resource:// URIs we're currently considering all URIs with the + // URI_IS_UI_RESOURCE flag as valid for creating privileged workers. + bool isResource; + rv = NS_URIChainHasFlags(finalURI, + nsIProtocolHandler::URI_IS_UI_RESOURCE, + &isResource); + NS_ENSURE_SUCCESS(rv, rv); + + if (isResource) { + // Assign the system principal to the resource:// worker only if it + // was loaded from code using the system principal. + channelPrincipal = mPrincipal; + } else { + return NS_ERROR_DOM_BAD_URI; + } + } + } + + // The principal can change, but it should still match the original + // load group's appId and browser element flag. + MOZ_ASSERT(NS_LoadGroupMatchesPrincipal(channelLoadGroup, channelPrincipal)); + + channelPrincipal.forget(aPrincipalOut); + channelLoadGroup.forget(aLoadGroupOut); + + return NS_OK; +} + +nsresult +WorkerLoadInfo::SetPrincipalFromChannel(nsIChannel* aChannel) +{ + AssertIsOnMainThread(); + + nsCOMPtr<nsIPrincipal> principal; + nsCOMPtr<nsILoadGroup> loadGroup; + nsresult rv = GetPrincipalAndLoadGroupFromChannel(aChannel, + getter_AddRefs(principal), + getter_AddRefs(loadGroup)); + NS_ENSURE_SUCCESS(rv, rv); + + SetPrincipalOnMainThread(principal, loadGroup); + return NS_OK; +} + +#if defined(DEBUG) || !defined(RELEASE_OR_BETA) +bool +WorkerLoadInfo::FinalChannelPrincipalIsValid(nsIChannel* aChannel) +{ + AssertIsOnMainThread(); + + nsCOMPtr<nsIPrincipal> principal; + nsCOMPtr<nsILoadGroup> loadGroup; + nsresult rv = GetPrincipalAndLoadGroupFromChannel(aChannel, + getter_AddRefs(principal), + getter_AddRefs(loadGroup)); + NS_ENSURE_SUCCESS(rv, false); + + + // Verify that the channel is still a null principal. We don't care + // if these are the exact same null principal object, though. From + // the worker's perspective its the same effect. + if (principal->GetIsNullPrincipal() && mPrincipal->GetIsNullPrincipal()) { + return true; + } + + // Otherwise we require exact equality. Redirects can happen, but they + // are not allowed to change our principal. + if (principal->Equals(mPrincipal)) { + return true; + } + + return false; +} +#endif // defined(DEBUG) || !defined(RELEASE_OR_BETA) + +bool +WorkerLoadInfo::ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate) +{ + nsCOMPtr<nsILoadGroup> nullLoadGroup; + return ProxyReleaseMainThreadObjects(aWorkerPrivate, nullLoadGroup); +} + +bool +WorkerLoadInfo::ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate, + nsCOMPtr<nsILoadGroup>& aLoadGroupToCancel) +{ + + static const uint32_t kDoomedCount = 10; + nsTArray<nsCOMPtr<nsISupports>> doomed(kDoomedCount); + + SwapToISupportsArray(mWindow, doomed); + SwapToISupportsArray(mScriptContext, doomed); + SwapToISupportsArray(mBaseURI, doomed); + SwapToISupportsArray(mResolvedScriptURI, doomed); + SwapToISupportsArray(mPrincipal, doomed); + SwapToISupportsArray(mChannel, doomed); + SwapToISupportsArray(mCSP, doomed); + SwapToISupportsArray(mLoadGroup, doomed); + SwapToISupportsArray(mLoadFailedAsyncRunnable, doomed); + SwapToISupportsArray(mInterfaceRequestor, doomed); + // Before adding anything here update kDoomedCount above! + + MOZ_ASSERT(doomed.Length() == kDoomedCount); + + RefPtr<MainThreadReleaseRunnable> runnable = + new MainThreadReleaseRunnable(doomed, aLoadGroupToCancel); + return NS_SUCCEEDED(aWorkerPrivate->DispatchToMainThread(runnable.forget())); +} + template <class Derived> class WorkerPrivateParent<Derived>::EventTarget final : public nsIEventTarget { // This mutex protects mWorkerPrivate and must be acquired *before* the // WorkerPrivate's mutex whenever they must both be held. mozilla::Mutex mMutex; WorkerPrivate* mWorkerPrivate; @@ -3026,58 +3197,35 @@ WorkerPrivateParent<Derived>::ModifyBusy return false; } } return true; } template <class Derived> -void -WorkerPrivateParent<Derived>::ForgetOverridenLoadGroup( - nsCOMPtr<nsILoadGroup>& aLoadGroupOut) -{ - AssertIsOnParentThread(); - - // If we're not overriden, then do nothing here. Let the load group get - // handled in ForgetMainThreadObjects(). - if (!mLoadInfo.mInterfaceRequestor) { - return; - } - - mLoadInfo.mLoadGroup.swap(aLoadGroupOut); -} - -template <class Derived> -void -WorkerPrivateParent<Derived>::ForgetMainThreadObjects( - nsTArray<nsCOMPtr<nsISupports> >& aDoomed) +bool +WorkerPrivateParent<Derived>::ProxyReleaseMainThreadObjects() { AssertIsOnParentThread(); MOZ_ASSERT(!mMainThreadObjectsForgotten); - static const uint32_t kDoomedCount = 10; - - aDoomed.SetCapacity(kDoomedCount); - - SwapToISupportsArray(mLoadInfo.mWindow, aDoomed); - SwapToISupportsArray(mLoadInfo.mScriptContext, aDoomed); - SwapToISupportsArray(mLoadInfo.mBaseURI, aDoomed); - SwapToISupportsArray(mLoadInfo.mResolvedScriptURI, aDoomed); - SwapToISupportsArray(mLoadInfo.mPrincipal, aDoomed); - SwapToISupportsArray(mLoadInfo.mChannel, aDoomed); - SwapToISupportsArray(mLoadInfo.mCSP, aDoomed); - SwapToISupportsArray(mLoadInfo.mLoadGroup, aDoomed); - SwapToISupportsArray(mLoadInfo.mLoadFailedAsyncRunnable, aDoomed); - SwapToISupportsArray(mLoadInfo.mInterfaceRequestor, aDoomed); - // Before adding anything here update kDoomedCount above! - - MOZ_ASSERT(aDoomed.Length() == kDoomedCount); + nsCOMPtr<nsILoadGroup> loadGroupToCancel; + // If we're not overriden, then do nothing here. Let the load group get + // handled in ForgetMainThreadObjects(). + if (mLoadInfo.mInterfaceRequestor) { + mLoadInfo.mLoadGroup.swap(loadGroupToCancel); + } + + bool result = mLoadInfo.ProxyReleaseMainThreadObjects(ParentAsWorkerPrivate(), + loadGroupToCancel); mMainThreadObjectsForgotten = true; + + return result; } template <class Derived> void WorkerPrivateParent<Derived>::PostMessageInternal(JSContext* aCx, JS::Handle<JS::Value> aMessage, const Sequence<JSObject*>& aTransferable, ErrorResult& aRv) @@ -3651,54 +3799,37 @@ WorkerPrivateParent<Derived>::SetBaseURI mLocationInfo.mHost.Assign(mLocationInfo.mHostname); } nsContentUtils::GetUTFOrigin(aBaseURI, mLocationInfo.mOrigin); } template <class Derived> void -WorkerPrivateParent<Derived>::SetPrincipal(nsIPrincipal* aPrincipal, - nsILoadGroup* aLoadGroup) -{ - AssertIsOnMainThread(); - MOZ_ASSERT(NS_LoadGroupMatchesPrincipal(aLoadGroup, aPrincipal)); - MOZ_ASSERT(!mLoadInfo.mPrincipalInfo); - - mLoadInfo.mPrincipal = aPrincipal; - mLoadInfo.mPrincipalIsSystem = nsContentUtils::IsSystemPrincipal(aPrincipal); - - aPrincipal->GetCsp(getter_AddRefs(mLoadInfo.mCSP)); - - if (mLoadInfo.mCSP) { - mLoadInfo.mCSP->GetAllowsEval(&mLoadInfo.mReportCSPViolations, - &mLoadInfo.mEvalAllowed); - // Set ReferrerPolicy - bool hasReferrerPolicy = false; - uint32_t rp = mozilla::net::RP_Unset; - - nsresult rv = mLoadInfo.mCSP->GetReferrerPolicy(&rp, &hasReferrerPolicy); - NS_ENSURE_SUCCESS_VOID(rv); - - if (hasReferrerPolicy) { - mLoadInfo.mReferrerPolicy = static_cast<net::ReferrerPolicy>(rp); - } - } else { - mLoadInfo.mEvalAllowed = true; - mLoadInfo.mReportCSPViolations = false; - } - - mLoadInfo.mLoadGroup = aLoadGroup; - - mLoadInfo.mPrincipalInfo = new PrincipalInfo(); - mLoadInfo.mOriginAttributes = nsContentUtils::GetOriginAttributes(aLoadGroup); - - MOZ_ALWAYS_SUCCEEDS( - PrincipalToPrincipalInfo(aPrincipal, mLoadInfo.mPrincipalInfo)); -} +WorkerPrivateParent<Derived>::SetPrincipalOnMainThread(nsIPrincipal* aPrincipal, + nsILoadGroup* aLoadGroup) +{ + mLoadInfo.SetPrincipalOnMainThread(aPrincipal, aLoadGroup); +} + +template <class Derived> +nsresult +WorkerPrivateParent<Derived>::SetPrincipalFromChannel(nsIChannel* aChannel) +{ + return mLoadInfo.SetPrincipalFromChannel(aChannel); +} + +#if defined(DEBUG) || !defined(RELEASE_OR_BETA) +template <class Derived> +bool +WorkerPrivateParent<Derived>::FinalChannelPrincipalIsValid(nsIChannel* aChannel) +{ + return mLoadInfo.FinalChannelPrincipalIsValid(aChannel); +} +#endif template <class Derived> void WorkerPrivateParent<Derived>::UpdateOverridenLoadGroup(nsILoadGroup* aBaseLoadGroup) { AssertIsOnMainThread(); // The load group should have been overriden at init time. @@ -4442,32 +4573,34 @@ WorkerPrivate::GetLoadInfo(JSContext* aC MutexAutoLock lock(aParent->mMutex); parentStatus = aParent->mStatus; } if (parentStatus > Running) { return NS_ERROR_FAILURE; } - // StartAssignment() is used instead getter_AddRefs because, getter_AddRefs - // does QI in debug build and, if this worker runs in a child process, - // HttpChannelChild will crash because it's not thread-safe. + // Passing a pointer to our stack loadInfo is safe here because this + // method uses a sync runnable to get the channel from the main thread. rv = ChannelFromScriptURLWorkerThread(aCx, aParent, aScriptURL, - loadInfo.mChannel.StartAssignment()); - NS_ENSURE_SUCCESS(rv, rv); + loadInfo); + if (NS_FAILED(rv)) { + MOZ_ALWAYS_TRUE(loadInfo.ProxyReleaseMainThreadObjects(aParent)); + return rv; + } // Now that we've spun the loop there's no guarantee that our parent is // still alive. We may have received control messages initiating shutdown. { MutexAutoLock lock(aParent->mMutex); parentStatus = aParent->mStatus; } if (parentStatus > Running) { - NS_ReleaseOnMainThread(loadInfo.mChannel.forget()); + MOZ_ALWAYS_TRUE(loadInfo.ProxyReleaseMainThreadObjects(aParent)); return NS_ERROR_FAILURE; } loadInfo.mDomain = aParent->Domain(); loadInfo.mFromWindow = aParent->IsFromWindow(); loadInfo.mWindowID = aParent->WindowID(); loadInfo.mStorageAllowed = aParent->IsStorageAllowed(); loadInfo.mOriginAttributes = aParent->GetOriginAttributes(); @@ -4657,16 +4790,19 @@ WorkerPrivate::GetLoadInfo(JSContext* aC ContentPolicyType(aWorkerType), useDefaultEncoding, getter_AddRefs(loadInfo.mChannel)); NS_ENSURE_SUCCESS(rv, rv); rv = NS_GetFinalChannelURI(loadInfo.mChannel, getter_AddRefs(loadInfo.mResolvedScriptURI)); NS_ENSURE_SUCCESS(rv, rv); + + rv = loadInfo.SetPrincipalFromChannel(loadInfo.mChannel); + NS_ENSURE_SUCCESS(rv, rv); } aLoadInfo->StealFrom(loadInfo); return NS_OK; } // static void
--- a/dom/workers/WorkerPrivate.h +++ b/dom/workers/WorkerPrivate.h @@ -348,21 +348,18 @@ public: } bool Close(); bool ModifyBusyCount(bool aIncrease); - void - ForgetOverridenLoadGroup(nsCOMPtr<nsILoadGroup>& aLoadGroupOut); - - void - ForgetMainThreadObjects(nsTArray<nsCOMPtr<nsISupports> >& aDoomed); + bool + ProxyReleaseMainThreadObjects(); void PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage, const Sequence<JSObject*>& aTransferable, ErrorResult& aRv); void UpdateContextOptions(const JS::ContextOptions& aContextOptions); @@ -606,17 +603,25 @@ public: // access occurs on the main thread. nsIPrincipal* GetPrincipalDontAssertMainThread() const { return mLoadInfo.mPrincipal; } void - SetPrincipal(nsIPrincipal* aPrincipal, nsILoadGroup* aLoadGroup); + SetPrincipalOnMainThread(nsIPrincipal* aPrincipal, nsILoadGroup* aLoadGroup); + + nsresult + SetPrincipalFromChannel(nsIChannel* aChannel); + +#if defined(DEBUG) || !defined(RELEASE_OR_BETA) + bool + FinalChannelPrincipalIsValid(nsIChannel* aChannel); +#endif bool UsesSystemPrincipal() const { return mLoadInfo.mPrincipalIsSystem; } const PrincipalInfo&
--- a/dom/workers/Workers.h +++ b/dom/workers/Workers.h @@ -272,16 +272,39 @@ struct WorkerLoadInfo bool mStorageAllowed; bool mServiceWorkersTestingInWindow; OriginAttributes mOriginAttributes; WorkerLoadInfo(); ~WorkerLoadInfo(); void StealFrom(WorkerLoadInfo& aOther); + + void + SetPrincipalOnMainThread(nsIPrincipal* aPrincipal, nsILoadGroup* aLoadGroup); + + nsresult + GetPrincipalAndLoadGroupFromChannel(nsIChannel* aChannel, + nsIPrincipal** aPrincipalOut, + nsILoadGroup** aLoadGroupOut); + + nsresult + SetPrincipalFromChannel(nsIChannel* aChannel); + +#if defined(DEBUG) || !defined(RELEASE_OR_BETA) + bool + FinalChannelPrincipalIsValid(nsIChannel* aChannel); +#endif + + bool + ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate); + + bool + ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate, + nsCOMPtr<nsILoadGroup>& aLoadGroupToCancel); }; // All of these are implemented in RuntimeService.cpp void CancelWorkersForWindow(nsPIDOMWindowInner* aWindow); void
--- a/dom/workers/test/WorkerTest_badworker.js +++ b/dom/workers/test/WorkerTest_badworker.js @@ -1,7 +1,1 @@ -/** - * Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ - */ -onmessage = function(event) { - throw "Shouldn't be able to read this!"; -} +// doesn't matter what is in here if the URL is bad
--- a/dom/workers/test/WorkerTest_subworker.js +++ b/dom/workers/test/WorkerTest_subworker.js @@ -16,28 +16,18 @@ onmessage = function(event) { xhr.open("GET", mochitestURL, false); xhr.send(); if (!xhr.responseText) { throw "Can't load script file via XHR!"; } // We shouldn't be able to make a ChromeWorker to a non-chrome URL. - let worker = new ChromeWorker(mochitestURL); - worker.onmessage = function(event) { - throw event.data; - }; - worker.onerror = function(event) { - event.preventDefault(); - - // And we shouldn't be able to make a regular Worker to a non-chrome URL. - worker = new Worker(mochitestURL); - worker.onmessage = function(event) { - throw event.data; - }; - worker.onerror = function(event) { - event.preventDefault(); + try{ + new ChromeWorker(mochitestURL); + } catch(e) { + if (e.name === 'SecurityError') { postMessage("Done"); - }; - worker.postMessage("Hi"); - }; - worker.postMessage("Hi"); + return; + } + } + throw('creating a chrome worker with a bad URL should throw a SecurityError'); };
--- a/image/FrameAnimator.cpp +++ b/image/FrameAnimator.cpp @@ -506,18 +506,18 @@ FrameAnimator::DoBlend(IntRect* aDirtyRe return true; } bool needToBlankComposite = false; // Create the Compositing Frame if (!mCompositingFrame) { RefPtr<imgFrame> newFrame = new imgFrame; - nsresult rv = newFrame->InitForDecoder(mSize, - SurfaceFormat::B8G8R8A8); + nsresult rv = newFrame->InitForAnimator(mSize, + SurfaceFormat::B8G8R8A8); if (NS_FAILED(rv)) { mCompositingFrame.reset(); return false; } mCompositingFrame = newFrame->RawAccessRef(); needToBlankComposite = true; } else if (int32_t(aNextFrameIndex) != mLastCompositedFrameIndex+1) { @@ -647,18 +647,18 @@ FrameAnimator::DoBlend(IntRect* aDirtyRe // too if ((nextFrameData.mDisposalMethod == DisposalMethod::RESTORE_PREVIOUS) && (prevFrameData.mDisposalMethod != DisposalMethod::RESTORE_PREVIOUS)) { // We are storing the whole image. // It would be better if we just stored the area that nextFrame is going to // overwrite. if (!mCompositingPrevFrame) { RefPtr<imgFrame> newFrame = new imgFrame; - nsresult rv = newFrame->InitForDecoder(mSize, - SurfaceFormat::B8G8R8A8); + nsresult rv = newFrame->InitForAnimator(mSize, + SurfaceFormat::B8G8R8A8); if (NS_FAILED(rv)) { mCompositingPrevFrame.reset(); return false; } mCompositingPrevFrame = newFrame->RawAccessRef(); }
--- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -600,17 +600,17 @@ RasterImage::GetImageContainer(LayerMana DrawResult drawResult; RefPtr<layers::Image> image; Tie(drawResult, image) = GetCurrentImage(container, aFlags); if (!image) { return nullptr; } // |image| holds a reference to a SourceSurface which in turn holds a lock on - // the current frame's VolatileBuffer, ensuring that it doesn't get freed as + // the current frame's data buffer, ensuring that it doesn't get freed as // long as the layer system keeps this ImageContainer alive. AutoTArray<ImageContainer::NonOwningImage, 1> imageList; imageList.AppendElement(ImageContainer::NonOwningImage(image, TimeStamp(), mLastFrameID++, mImageProducerID)); container->SetCurrentImagesInTransaction(imageList); mLastImageContainerDrawResult = drawResult;
--- a/image/imgFrame.cpp +++ b/image/imgFrame.cpp @@ -15,99 +15,99 @@ #include "gfxPrefs.h" #include "gfxUtils.h" #include "gfxAlphaRecovery.h" #include "GeckoProfiler.h" #include "MainThreadUtils.h" #include "mozilla/CheckedInt.h" #include "mozilla/gfx/Tools.h" +#include "mozilla/layers/SourceSurfaceVolatileData.h" #include "mozilla/Likely.h" #include "mozilla/MemoryReporting.h" #include "nsMargin.h" #include "nsThreadUtils.h" namespace mozilla { using namespace gfx; namespace image { static void -VolatileBufferRelease(void* vbuf) +ScopedMapRelease(void* aMap) { - delete static_cast<VolatileBufferPtr<unsigned char>*>(vbuf); + delete static_cast<DataSourceSurface::ScopedMap*>(aMap); } static int32_t VolatileSurfaceStride(const IntSize& size, SurfaceFormat format) { // Stride must be a multiple of four or cairo will complain. return (size.width * BytesPerPixel(format) + 0x3) & ~0x3; } static already_AddRefed<DataSourceSurface> -CreateLockedSurface(VolatileBuffer* vbuf, +CreateLockedSurface(DataSourceSurface *aSurface, const IntSize& size, SurfaceFormat format) { - VolatileBufferPtr<unsigned char>* vbufptr = - new VolatileBufferPtr<unsigned char>(vbuf); - MOZ_ASSERT(!vbufptr->WasBufferPurged(), "Expected image data!"); - - const int32_t stride = VolatileSurfaceStride(size, format); - - // The VolatileBufferPtr is held by this DataSourceSurface. - RefPtr<DataSourceSurface> surf = - Factory::CreateWrappingDataSourceSurface(*vbufptr, stride, size, format, - &VolatileBufferRelease, - static_cast<void*>(vbufptr)); - if (!surf) { - delete vbufptr; - return nullptr; + DataSourceSurface::ScopedMap* smap = + new DataSourceSurface::ScopedMap(aSurface, DataSourceSurface::READ_WRITE); + if (smap->IsMapped()) { + // The ScopedMap is held by this DataSourceSurface. + RefPtr<DataSourceSurface> surf = + Factory::CreateWrappingDataSourceSurface(smap->GetData(), + aSurface->Stride(), + size, + format, + &ScopedMapRelease, + static_cast<void*>(smap)); + if (surf) { + return surf.forget(); + } } - return surf.forget(); + delete smap; + return nullptr; } -static already_AddRefed<VolatileBuffer> -AllocateBufferForImage(const IntSize& size, SurfaceFormat format) +static already_AddRefed<DataSourceSurface> +AllocateBufferForImage(const IntSize& size, + SurfaceFormat format, + bool aIsAnimated = false) { int32_t stride = VolatileSurfaceStride(size, format); - RefPtr<VolatileBuffer> buf = new VolatileBuffer(); - if (buf->Init(stride * size.height, - size_t(1) << gfxAlphaRecovery::GoodAlignmentLog2())) { - return buf.forget(); + RefPtr<SourceSurfaceVolatileData> newSurf = new SourceSurfaceVolatileData(); + if (newSurf->Init(size, stride, format)) { + return newSurf.forget(); } return nullptr; } static bool -ClearSurface(VolatileBuffer* aVBuf, const IntSize& aSize, SurfaceFormat aFormat) +ClearSurface(DataSourceSurface* aSurface, const IntSize& aSize, SurfaceFormat aFormat) { - VolatileBufferPtr<unsigned char> vbufptr(aVBuf); - if (vbufptr.WasBufferPurged()) { - NS_WARNING("VolatileBuffer was purged"); - return false; - } + int32_t stride = aSurface->Stride(); + uint8_t* data = aSurface->GetData(); + MOZ_ASSERT(data); - int32_t stride = VolatileSurfaceStride(aSize, aFormat); if (aFormat == SurfaceFormat::B8G8R8X8) { // Skia doesn't support RGBX surfaces, so ensure the alpha value is set // to opaque white. While it would be nice to only do this for Skia, // imgFrame can run off main thread and past shutdown where // we might not have gfxPlatform, so just memset everytime instead. - memset(vbufptr, 0xFF, stride * aSize.height); - } else if (aVBuf->OnHeap()) { + memset(data, 0xFF, stride * aSize.height); + } else if (aSurface->OnHeap()) { // We only need to memset it if the buffer was allocated on the heap. // Otherwise, it's allocated via mmap and refers to a zeroed page and will // be COW once it's written to. - memset(vbufptr, 0, stride * aSize.height); + memset(data, 0, stride * aSize.height); } return true; } // Returns true if an image of aWidth x aHeight is allowed and legal. static bool AllowedImageSize(int32_t aWidth, int32_t aHeight) @@ -186,17 +186,18 @@ imgFrame::~imgFrame() mPalettedImageData = nullptr; } nsresult imgFrame::InitForDecoder(const nsIntSize& aImageSize, const nsIntRect& aRect, SurfaceFormat aFormat, uint8_t aPaletteDepth /* = 0 */, - bool aNonPremult /* = false */) + bool aNonPremult /* = false */, + bool aIsAnimated /* = false */) { // Assert for properties that should be verified by decoders, // warn for properties related to bad content. if (!AllowedImageAndFrameDimensions(aImageSize, aRect)) { NS_WARNING("Should have legal image size"); mAborted = true; return NS_ERROR_FAILURE; } @@ -234,33 +235,32 @@ imgFrame::InitForDecoder(const nsIntSize // pixel, so calculating the amount of memory we need is straightforward. size_t dataSize = PaletteDataLength() + mFrameRect.Area(); mPalettedImageData = static_cast<uint8_t*>(calloc(dataSize, sizeof(uint8_t))); if (!mPalettedImageData) { NS_WARNING("Call to calloc for paletted image data should succeed"); } NS_ENSURE_TRUE(mPalettedImageData, NS_ERROR_OUT_OF_MEMORY); } else { - MOZ_ASSERT(!mImageSurface, "Called imgFrame::InitForDecoder() twice?"); + MOZ_ASSERT(!mLockedSurface, "Called imgFrame::InitForDecoder() twice?"); - mVBuf = AllocateBufferForImage(mFrameRect.Size(), mFormat); - if (!mVBuf) { + mRawSurface = AllocateBufferForImage(mFrameRect.Size(), mFormat, aIsAnimated); + if (!mRawSurface) { mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } - mImageSurface = CreateLockedSurface(mVBuf, mFrameRect.Size(), mFormat); - - if (!mImageSurface) { - NS_WARNING("Failed to create ImageSurface"); + mLockedSurface = CreateLockedSurface(mRawSurface, mFrameRect.Size(), mFormat); + if (!mLockedSurface) { + NS_WARNING("Failed to create LockedSurface"); mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } - if (!ClearSurface(mVBuf, mFrameRect.Size(), mFormat)) { + if (!ClearSurface(mRawSurface, mFrameRect.Size(), mFormat)) { NS_WARNING("Could not clear allocated buffer"); mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } } return NS_OK; } @@ -290,49 +290,41 @@ imgFrame::InitWithDrawable(gfxDrawable* RefPtr<DrawTarget> target; bool canUseDataSurface = gfxPlatform::GetPlatform()->CanRenderContentToDataSurface(); if (canUseDataSurface) { // It's safe to use data surfaces for content on this platform, so we can // get away with using volatile buffers. - MOZ_ASSERT(!mImageSurface, "Called imgFrame::InitWithDrawable() twice?"); + MOZ_ASSERT(!mLockedSurface, "Called imgFrame::InitWithDrawable() twice?"); - mVBuf = AllocateBufferForImage(mFrameRect.Size(), mFormat); - if (!mVBuf) { + mRawSurface = AllocateBufferForImage(mFrameRect.Size(), mFormat); + if (!mRawSurface) { mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } - int32_t stride = VolatileSurfaceStride(mFrameRect.Size(), mFormat); - VolatileBufferPtr<uint8_t> ptr(mVBuf); - if (!ptr) { + mLockedSurface = CreateLockedSurface(mRawSurface, mFrameRect.Size(), mFormat); + if (!mLockedSurface) { + NS_WARNING("Failed to create LockedSurface"); mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } - mImageSurface = CreateLockedSurface(mVBuf, mFrameRect.Size(), mFormat); - - if (!mImageSurface) { - NS_WARNING("Failed to create ImageSurface"); - mAborted = true; - return NS_ERROR_OUT_OF_MEMORY; - } - - if (!ClearSurface(mVBuf, mFrameRect.Size(), mFormat)) { + if (!ClearSurface(mRawSurface, mFrameRect.Size(), mFormat)) { NS_WARNING("Could not clear allocated buffer"); mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } target = gfxPlatform::CreateDrawTargetForData( - ptr, + mLockedSurface->GetData(), mFrameRect.Size(), - stride, + mLockedSurface->Stride(), mFormat); } else { // We can't use data surfaces for content, so we'll create an offscreen // surface instead. This means if someone later calls RawAccessRef(), we // may have to do an expensive readback, but we warned callers about that in // the documentation for this method. MOZ_ASSERT(!mOptSurface, "Called imgFrame::InitWithDrawable() twice?"); @@ -352,17 +344,17 @@ imgFrame::InitWithDrawable(gfxDrawable* // Draw using the drawable the caller provided. RefPtr<gfxContext> ctx = gfxContext::CreateOrNull(target); MOZ_ASSERT(ctx); // Already checked the draw target above. gfxUtils::DrawPixelSnapped(ctx, aDrawable, mFrameRect.Size(), ImageRegion::Create(ThebesRect(mFrameRect)), mFormat, aSamplingFilter, aImageFlags); - if (canUseDataSurface && !mImageSurface) { + if (canUseDataSurface && !mLockedSurface) { NS_WARNING("Failed to create VolatileDataSourceSurface"); mAborted = true; return NS_ERROR_OUT_OF_MEMORY; } if (!canUseDataSurface) { // We used an offscreen surface, which is an "optimized" surface from // imgFrame's perspective. @@ -417,33 +409,33 @@ imgFrame::Optimize(DrawTarget* aTarget) // XXX(seth): It's currently unclear if there's any reason why we can't // optimize non-premult surfaces. We should look into removing this. if (mNonPremult) { return NS_OK; } mOptSurface = gfxPlatform::GetPlatform() - ->ScreenReferenceDrawTarget()->OptimizeSourceSurface(mImageSurface); - if (mOptSurface == mImageSurface) { + ->ScreenReferenceDrawTarget()->OptimizeSourceSurface(mLockedSurface); + if (mOptSurface == mLockedSurface) { mOptSurface = nullptr; } if (mOptSurface) { - // There's no reason to keep our volatile buffer around at all if we have an + // There's no reason to keep our original surface around if we have an // optimized surface. Release our reference to it. This will leave - // |mVBufPtr| and |mImageSurface| as the only things keeping it alive, so - // it'll get freed below. - mVBuf = nullptr; + // |mLockedSurface| as the only thing keeping it alive, so it'll get freed + // below. + mRawSurface = nullptr; } - // Release all strong references to our volatile buffer's memory. This will - // allow the operating system to free the memory if it needs to. - mVBufPtr = nullptr; - mImageSurface = nullptr; + // Release all strong references to the surface's memory. If the underlying + // surface is volatile, this will allow the operating system to free the + // memory if it needs to. + mLockedSurface = nullptr; mOptimizable = false; return NS_OK; } DrawableFrameRef imgFrame::DrawableRef() { @@ -531,17 +523,17 @@ bool imgFrame::Draw(gfxContext* aContext if (mPalettedImageData) { MOZ_ASSERT_UNREACHABLE("Directly drawing a paletted image!"); return false; } MonitorAutoLock lock(mMonitor); // Possibly convert this image into a GPU texture, this may also cause our - // mImageSurface to be released and the OS to release the underlying memory. + // mLockedSurface to be released and the OS to release the underlying memory. Optimize(aContext->GetDrawTarget()); bool doPartialDecode = !AreAllPixelsWritten(); RefPtr<SourceSurface> surf = GetSourceSurfaceInternal(); if (!surf) { return false; } @@ -605,17 +597,17 @@ imgFrame::Finish(Opacity aFrameOpacity / mMonitor.NotifyAll(); } uint32_t imgFrame::GetImageBytesPerRow() const { mMonitor.AssertCurrentThreadOwns(); - if (mVBuf) { + if (mRawSurface) { return mFrameRect.width * BytesPerPixel(mFormat); } if (mPaletteDepth) { return mFrameRect.width; } return 0; @@ -635,27 +627,27 @@ imgFrame::GetImageData(uint8_t** aData, } void imgFrame::GetImageDataInternal(uint8_t** aData, uint32_t* aLength) const { mMonitor.AssertCurrentThreadOwns(); MOZ_ASSERT(mLockCount > 0, "Image data should be locked"); - if (mImageSurface) { - *aData = mVBufPtr; + if (mLockedSurface) { + *aData = mLockedSurface->GetData(); MOZ_ASSERT(*aData, - "mImageSurface is non-null, but mVBufPtr is null in GetImageData"); + "mLockedSurface is non-null, but GetData is null in GetImageData"); } else if (mPalettedImageData) { *aData = mPalettedImageData + PaletteDataLength(); MOZ_ASSERT(*aData, "mPalettedImageData is non-null, but result is null in GetImageData"); } else { MOZ_ASSERT(false, - "Have neither mImageSurface nor mPalettedImageData in GetImageData"); + "Have neither mLockedSurface nor mPalettedImageData in GetImageData"); *aData = nullptr; } *aLength = GetImageDataLength(); } uint8_t* imgFrame::GetImageData() const @@ -707,19 +699,18 @@ imgFrame::LockImageData() mLockCount++; // If we are not the first lock, there's nothing to do. if (mLockCount != 1) { return NS_OK; } - // If we're the first lock, but have an image surface, we're OK. - if (mImageSurface) { - mVBufPtr = mVBuf; + // If we're the first lock, but have the locked surface, we're OK. + if (mLockedSurface) { return NS_OK; } // Paletted images don't have surfaces, so there's nothing to do. if (mPalettedImageData) { return NS_OK; } @@ -778,31 +769,22 @@ imgFrame::GetSourceSurfaceInternal() if (mOptSurface->IsValid()) { RefPtr<SourceSurface> surf(mOptSurface); return surf.forget(); } else { mOptSurface = nullptr; } } - if (mImageSurface) { - RefPtr<SourceSurface> surf(mImageSurface); + if (mLockedSurface) { + RefPtr<SourceSurface> surf(mLockedSurface); return surf.forget(); } - if (!mVBuf) { - return nullptr; - } - - VolatileBufferPtr<char> buf(mVBuf); - if (buf.WasBufferPurged()) { - return nullptr; - } - - return CreateLockedSurface(mVBuf, mFrameRect.Size(), mFormat); + return CreateLockedSurface(mRawSurface, mFrameRect.Size(), mFormat); } AnimationData imgFrame::GetAnimationData() const { MonitorAutoLock lock(mMonitor); MOZ_ASSERT(mLockCount > 0, "Image data should be locked"); @@ -886,24 +868,23 @@ imgFrame::AddSizeOfExcludingThis(MallocS size_t& aHeapSizeOut, size_t& aNonHeapSizeOut) const { MonitorAutoLock lock(mMonitor); if (mPalettedImageData) { aHeapSizeOut += aMallocSizeOf(mPalettedImageData); } - if (mImageSurface) { - aHeapSizeOut += aMallocSizeOf(mImageSurface); + if (mLockedSurface) { + aHeapSizeOut += aMallocSizeOf(mLockedSurface); } if (mOptSurface) { aHeapSizeOut += aMallocSizeOf(mOptSurface); } - - if (mVBuf) { - aHeapSizeOut += aMallocSizeOf(mVBuf); - aHeapSizeOut += mVBuf->HeapSizeOfExcludingThis(aMallocSizeOf); - aNonHeapSizeOut += mVBuf->NonHeapSizeOfExcludingThis(); + if (mRawSurface) { + aHeapSizeOut += aMallocSizeOf(mRawSurface); + mRawSurface->AddSizeOfExcludingThis(aMallocSizeOf, aHeapSizeOut, + aNonHeapSizeOut); } } } // namespace image } // namespace mozilla
--- a/image/imgFrame.h +++ b/image/imgFrame.h @@ -6,20 +6,20 @@ #ifndef mozilla_image_imgFrame_h #define mozilla_image_imgFrame_h #include "mozilla/Maybe.h" #include "mozilla/MemoryReporting.h" #include "mozilla/Monitor.h" #include "mozilla/Move.h" -#include "mozilla/VolatileBuffer.h" #include "gfxDrawable.h" #include "imgIContainer.h" #include "MainThreadUtils.h" +#include "nsAutoPtr.h" namespace mozilla { namespace image { class ImageRegion; class DrawableFrameRef; class RawAccessFrameRef; @@ -205,24 +205,24 @@ public: * This is appropriate for use with decoded images, but it should not be used * when drawing content into an imgFrame, as it may use a different graphics * backend than normal content drawing. */ nsresult InitForDecoder(const nsIntSize& aImageSize, const nsIntRect& aRect, SurfaceFormat aFormat, uint8_t aPaletteDepth = 0, - bool aNonPremult = false); + bool aNonPremult = false, + bool aIsAnimated = false); - nsresult InitForDecoder(const nsIntSize& aSize, - SurfaceFormat aFormat, - uint8_t aPaletteDepth = 0) + nsresult InitForAnimator(const nsIntSize& aSize, + SurfaceFormat aFormat) { return InitForDecoder(aSize, nsIntRect(0, 0, aSize.width, aSize.height), - aFormat, aPaletteDepth); + aFormat, 0, false, true); } /** * Initialize this imgFrame with a new surface and draw the provided * gfxDrawable into it. * * This is appropriate to use when drawing content into an imgFrame, as it @@ -390,21 +390,35 @@ private: // data friend class UnlockImageDataRunnable; ////////////////////////////////////////////////////////////////////////////// // Thread-safe mutable data, protected by mMonitor. ////////////////////////////////////////////////////////////////////////////// mutable Monitor mMonitor; - RefPtr<DataSourceSurface> mImageSurface; - RefPtr<SourceSurface> mOptSurface; + /** + * Surface which contains either a weak or a strong reference to its + * underlying data buffer. If it is a weak reference, and there are no strong + * references, the buffer may be released due to events such as low memory. + */ + RefPtr<DataSourceSurface> mRawSurface; - RefPtr<VolatileBuffer> mVBuf; - VolatileBufferPtr<uint8_t> mVBufPtr; + /** + * Refers to the same data as mRawSurface, but when set, it guarantees that + * we hold a strong reference to the underlying data buffer. + */ + RefPtr<DataSourceSurface> mLockedSurface; + + /** + * Optimized copy of mRawSurface for the DrawTarget that will render it. This + * is unused if the DrawTarget is able to render DataSourceSurface buffers + * directly. + */ + RefPtr<SourceSurface> mOptSurface; nsIntRect mDecoded; //! Number of RawAccessFrameRefs currently alive for this imgFrame. int32_t mLockCount; //! The timeout for this frame. FrameTimeout mTimeout; @@ -445,26 +459,37 @@ private: // data /** * A reference to an imgFrame that holds the imgFrame's surface in memory, * allowing drawing. If you have a DrawableFrameRef |ref| and |if (ref)| returns * true, then calls to Draw() and GetSourceSurface() are guaranteed to succeed. */ class DrawableFrameRef final { + typedef gfx::DataSourceSurface DataSourceSurface; + public: DrawableFrameRef() { } explicit DrawableFrameRef(imgFrame* aFrame) : mFrame(aFrame) - , mRef(aFrame->mVBuf) { - if (mRef.WasBufferPurged()) { - mFrame = nullptr; - mRef = nullptr; + // Paletted images won't have a surface so there is no strong reference + // to hold on to. Since Draw() and GetSourceSurface() calls will not work + // in that case, we should be using RawAccessFrameRef exclusively instead. + // See FrameAnimator::GetRawFrame for an example of this behaviour. + if (aFrame->mRawSurface) { + mRef = new DataSourceSurface::ScopedMap(aFrame->mRawSurface, + DataSourceSurface::READ_WRITE); + if (!mRef->IsMapped()) { + mFrame = nullptr; + mRef = nullptr; + } + } else { + MOZ_ASSERT(aFrame->mOptSurface || aFrame->GetIsPaletted()); } } DrawableFrameRef(DrawableFrameRef&& aOther) : mFrame(aOther.mFrame.forget()) , mRef(Move(aOther.mRef)) { } @@ -498,17 +523,17 @@ public: mFrame = nullptr; mRef = nullptr; } private: DrawableFrameRef(const DrawableFrameRef& aOther) = delete; RefPtr<imgFrame> mFrame; - VolatileBufferPtr<uint8_t> mRef; + nsAutoPtr<DataSourceSurface::ScopedMap> mRef; }; /** * A reference to an imgFrame that holds the imgFrame's surface in memory in a * format appropriate for access as raw data. If you have a RawAccessFrameRef * |ref| and |if (ref)| is true, then calls to GetImageData() and * GetPaletteData() are guaranteed to succeed. This guarantee is stronger than * DrawableFrameRef, so everything that a valid DrawableFrameRef guarantees is
--- a/intl/locale/DateTimeFormat.h +++ b/intl/locale/DateTimeFormat.h @@ -10,16 +10,19 @@ #include <time.h> #include "nsIScriptableDateFormat.h" #include "nsStringGlue.h" #include "prtime.h" #ifndef ENABLE_INTL_API #include "nsCOMPtr.h" #include "nsIUnicodeDecoder.h" +#else +#include "gtest/MozGtestFriend.h" +#include "unicode/udat.h" #endif namespace mozilla { class DateTimeFormat { public: // performs a locale sensitive date formatting operation on the time_t parameter static nsresult FormatTime(const nsDateFormatSelector aDateFormatSelector, @@ -42,16 +45,25 @@ public: static void Shutdown(); private: DateTimeFormat() = delete; static nsresult Initialize(); #ifdef ENABLE_INTL_API + FRIEND_TEST(DateTimeFormat, FormatPRExplodedTime); + + // performs a locale sensitive date formatting operation on the UDate parameter + static nsresult FormatUDateTime(const nsDateFormatSelector aDateFormatSelector, + const nsTimeFormatSelector aTimeFormatSelector, + const UDate aUDateTime, + const PRTimeParameters* aTimeParameters, + nsAString& aStringOut); + static nsCString* mLocale; #else // performs a locale sensitive date formatting operation on the struct tm parameter static nsresult FormatTMTime(const nsDateFormatSelector aDateFormatSelector, const nsTimeFormatSelector aTimeFormatSelector, const struct tm* aTmTime, nsAString& aStringOut);
--- a/intl/locale/DateTimeFormatICU.cpp +++ b/intl/locale/DateTimeFormatICU.cpp @@ -3,17 +3,16 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "DateTimeFormat.h" #include "nsCOMPtr.h" #include "nsIServiceManager.h" #include "nsILocaleService.h" -#include "unicode/udat.h" namespace mozilla { nsCString* DateTimeFormat::mLocale = nullptr; /*static*/ nsresult DateTimeFormat::Initialize() { @@ -54,16 +53,37 @@ DateTimeFormat::FormatTime(const nsDateF // performs a locale sensitive date formatting operation on the PRTime parameter /*static*/ nsresult DateTimeFormat::FormatPRTime(const nsDateFormatSelector aDateFormatSelector, const nsTimeFormatSelector aTimeFormatSelector, const PRTime aPrTime, nsAString& aStringOut) { + return FormatUDateTime(aDateFormatSelector, aTimeFormatSelector, (aPrTime / PR_USEC_PER_MSEC), nullptr, aStringOut); +} + +// performs a locale sensitive date formatting operation on the PRExplodedTime parameter +/*static*/ nsresult +DateTimeFormat::FormatPRExplodedTime(const nsDateFormatSelector aDateFormatSelector, + const nsTimeFormatSelector aTimeFormatSelector, + const PRExplodedTime* aExplodedTime, + nsAString& aStringOut) +{ + return FormatUDateTime(aDateFormatSelector, aTimeFormatSelector, (PR_ImplodeTime(aExplodedTime) / PR_USEC_PER_MSEC), &(aExplodedTime->tm_params), aStringOut); +} + +// performs a locale sensitive date formatting operation on the UDate parameter +/*static*/ nsresult +DateTimeFormat::FormatUDateTime(const nsDateFormatSelector aDateFormatSelector, + const nsTimeFormatSelector aTimeFormatSelector, + const UDate aUDateTime, + const PRTimeParameters* aTimeParameters, + nsAString& aStringOut) +{ #define DATETIME_FORMAT_INITIAL_LEN 127 int32_t dateTimeLen = 0; nsresult rv = NS_OK; // return, nothing to format if (aDateFormatSelector == kDateFormatNone && aTimeFormatSelector == kTimeFormatNone) { aStringOut.Truncate(); return NS_OK; @@ -71,18 +91,16 @@ DateTimeFormat::FormatPRTime(const nsDat // set up locale data rv = Initialize(); if (NS_FAILED(rv)) { return rv; } - UDate timeUDate = aPrTime / PR_USEC_PER_MSEC; - // Get the date style for the formatter: UDateFormatStyle dateStyle; switch (aDateFormatSelector) { case kDateFormatLong: dateStyle = UDAT_LONG; break; case kDateFormatShort: dateStyle = UDAT_SHORT; @@ -111,50 +129,55 @@ DateTimeFormat::FormatPRTime(const nsDat NS_ERROR("Unknown nsTimeFormatSelector"); return NS_ERROR_ILLEGAL_VALUE; } // generate date/time string UErrorCode status = U_ZERO_ERROR; - UDateFormat* dateTimeFormat = udat_open(timeStyle, dateStyle, mLocale->get(), nullptr, -1, nullptr, -1, &status); + UDateFormat* dateTimeFormat; + if (aTimeParameters) { + nsAutoString timeZoneID(u"GMT"); + + int32_t totalOffsetMinutes = (aTimeParameters->tp_gmt_offset + aTimeParameters->tp_dst_offset) / 60; + if (totalOffsetMinutes != 0) { + char sign = totalOffsetMinutes < 0 ? '-' : '+'; + int32_t hours = abs(totalOffsetMinutes) / 60; + int32_t minutes = abs(totalOffsetMinutes) % 60; + timeZoneID.AppendPrintf("%c%02d:%02d", sign, hours, minutes); + } + + dateTimeFormat = udat_open(timeStyle, dateStyle, mLocale->get(), reinterpret_cast<const UChar*>(timeZoneID.BeginReading()), timeZoneID.Length(), nullptr, -1, &status); + } else { + dateTimeFormat = udat_open(timeStyle, dateStyle, mLocale->get(), nullptr, -1, nullptr, -1, &status); + } if (U_SUCCESS(status) && dateTimeFormat) { aStringOut.SetLength(DATETIME_FORMAT_INITIAL_LEN); - dateTimeLen = udat_format(dateTimeFormat, timeUDate, reinterpret_cast<UChar*>(aStringOut.BeginWriting()), DATETIME_FORMAT_INITIAL_LEN, nullptr, &status); + dateTimeLen = udat_format(dateTimeFormat, aUDateTime, reinterpret_cast<UChar*>(aStringOut.BeginWriting()), DATETIME_FORMAT_INITIAL_LEN, nullptr, &status); aStringOut.SetLength(dateTimeLen); if (status == U_BUFFER_OVERFLOW_ERROR) { status = U_ZERO_ERROR; - udat_format(dateTimeFormat, timeUDate, reinterpret_cast<UChar*>(aStringOut.BeginWriting()), dateTimeLen, nullptr, &status); + udat_format(dateTimeFormat, aUDateTime, reinterpret_cast<UChar*>(aStringOut.BeginWriting()), dateTimeLen, nullptr, &status); } } if (U_FAILURE(status)) { rv = NS_ERROR_FAILURE; } if (dateTimeFormat) { udat_close(dateTimeFormat); } return rv; } -// performs a locale sensitive date formatting operation on the PRExplodedTime parameter -/*static*/ nsresult -DateTimeFormat::FormatPRExplodedTime(const nsDateFormatSelector aDateFormatSelector, - const nsTimeFormatSelector aTimeFormatSelector, - const PRExplodedTime* aExplodedTime, - nsAString& aStringOut) -{ - return FormatPRTime(aDateFormatSelector, aTimeFormatSelector, PR_ImplodeTime(aExplodedTime), aStringOut); -} - /*static*/ void DateTimeFormat::Shutdown() { if (mLocale) { delete mLocale; } }
new file mode 100644 --- /dev/null +++ b/intl/locale/tests/gtest/TestDateTimeFormat.cpp @@ -0,0 +1,49 @@ +#include "gtest/gtest.h" +#include "DateTimeFormat.h" + +namespace mozilla { + +TEST(DateTimeFormat, FormatPRExplodedTime) { + PRTime prTime = 0; + PRExplodedTime prExplodedTime; + PR_ExplodeTime(prTime, PR_GMTParameters, &prExplodedTime); + + mozilla::DateTimeFormat::mLocale = new nsCString("en-US"); + + nsAutoString formattedTime; + nsresult rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("January 1, 1970 at 12:00:00 AM", NS_ConvertUTF16toUTF8(formattedTime).get()); + + prExplodedTime = { 0, 0, 19, 0, 1, 0, 1970, 4, 0, { (19 * 60), 0 } }; + rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("January 1, 1970 at 12:19:00 AM", NS_ConvertUTF16toUTF8(formattedTime).get()); + + prExplodedTime = { 0, 0, 0, 7, 1, 0, 1970, 4, 0, { (6 * 60 * 60), (1 * 60 * 60) } }; + rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("January 1, 1970 at 7:00:00 AM", NS_ConvertUTF16toUTF8(formattedTime).get()); + + prExplodedTime = { 0, 0, 29, 11, 1, 0, 1970, 4, 0, { (10 * 60 * 60) + (29 * 60), (1 * 60 * 60) } }; + rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("January 1, 1970 at 11:29:00 AM", NS_ConvertUTF16toUTF8(formattedTime).get()); + + prExplodedTime = { 0, 0, 37, 23, 31, 11, 1969, 3, 364, { -(23 * 60), 0 } }; + rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("December 31, 1969 at 11:37:00 PM", NS_ConvertUTF16toUTF8(formattedTime).get()); + + prExplodedTime = { 0, 0, 0, 17, 31, 11, 1969, 3, 364, { -(7 * 60 * 60), 0 } }; + rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("December 31, 1969 at 5:00:00 PM", NS_ConvertUTF16toUTF8(formattedTime).get()); + + prExplodedTime = { 0, 0, 47, 14, 31, 11, 1969, 3, 364, { -((10 * 60 * 60) + (13 * 60)), (1 * 60 * 60) } }; + rv = mozilla::DateTimeFormat::FormatPRExplodedTime(kDateFormatLong, kTimeFormatSeconds, &prExplodedTime, formattedTime); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_STREQ("December 31, 1969 at 2:47:00 PM", NS_ConvertUTF16toUTF8(formattedTime).get()); +} + +}
--- a/intl/locale/tests/gtest/moz.build +++ b/intl/locale/tests/gtest/moz.build @@ -4,15 +4,18 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. UNIFIED_SOURCES += [ 'TestLocaleService.cpp', ] if CONFIG['ENABLE_INTL_API']: - UNIFIED_SOURCES += ['TestOSPreferences.cpp'] + UNIFIED_SOURCES += [ + 'TestDateTimeFormat.cpp', + 'TestOSPreferences.cpp', + ] LOCAL_INCLUDES += [ '/intl/locale', ] FINAL_LIBRARY = 'xul-gtest'
--- a/js/src/builtin/DataViewObject.cpp +++ b/js/src/builtin/DataViewObject.cpp @@ -15,22 +15,22 @@ #include "jscntxt.h" #include "jsnum.h" #include "jsobj.h" #ifdef XP_WIN # include "jswin.h" #endif #include "jswrapper.h" +#include "jit/AtomicOperations.h" #include "js/Conversions.h" #include "vm/ArrayBufferObject.h" #include "vm/GlobalObject.h" #include "vm/Interpreter.h" #include "vm/SharedMem.h" -#include "vm/TypedArrayCommon.h" #include "vm/WrapperObject.h" #include "gc/Nursery-inl.h" #include "gc/StoreBuffer-inl.h" #include "vm/ArrayBufferObject-inl.h" #include "vm/NativeObject-inl.h" using namespace js;
--- a/js/src/builtin/Intl.js +++ b/js/src/builtin/Intl.js @@ -3299,17 +3299,17 @@ function Intl_getDisplayNames(locales, o // 13. Let len be ? ToLength(? Get(keys, "length")). let len = ToLength(keys.length); // 14. Let i be 0. // 15. Repeat, while i < len for (let i = 0; i < len; i++) { // a. Let processedKey be ? ToString(? Get(keys, i)). // b. Perform ? CreateDataPropertyOrThrow(processedKeys, i, processedKey). - callFunction(std_Array_push, processedKeys, ToString(keys[i])); + _DefineDataProperty(processedKeys, i, ToString(keys[i])); } // 16. Let names be ? ComputeDisplayNames(r.[[locale]], style, processedKeys). const names = intl_ComputeDisplayNames(r.locale, style, processedKeys); // 17. Let values be ObjectCreate(%ObjectPrototype%). const values = {};
--- a/js/src/builtin/SIMD.cpp +++ b/js/src/builtin/SIMD.cpp @@ -18,16 +18,17 @@ #include "mozilla/Sprintf.h" #include "jsapi.h" #include "jsfriendapi.h" #include "jsnum.h" #include "jsprf.h" #include "builtin/TypedObject.h" +#include "jit/AtomicOperations.h" #include "jit/InlinableNatives.h" #include "js/GCAPI.h" #include "js/Value.h" #include "jsobjinlines.h" using namespace js;
--- a/js/src/ctypes/CTypes.cpp +++ b/js/src/ctypes/CTypes.cpp @@ -39,16 +39,17 @@ #include "jsfun.h" #include "jsnum.h" #include "jsprf.h" #include "builtin/TypedObject.h" #include "ctypes/Library.h" #include "gc/Policy.h" #include "gc/Zone.h" +#include "jit/AtomicOperations.h" #include "js/Vector.h" #include "jsatominlines.h" #include "jsobjinlines.h" using namespace std; using JS::AutoCheckCannotGC;
--- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -97,17 +97,17 @@ class BackgroundDecommitTask : public GC explicit BackgroundDecommitTask(JSRuntime *rt) : GCParallelTask(rt) {} void setChunksToScan(ChunkVector &chunks); protected: void run() override; private: - UnprotectedData<ChunkVector> toDecommit; + ActiveThreadOrGCTaskData<ChunkVector> toDecommit; }; /* * Encapsulates all of the GC tunables. These are effectively constant and * should only be modified by setParameter. */ class GCSchedulingTunables { @@ -115,70 +115,70 @@ class GCSchedulingTunables * Soft limit on the number of bytes we are allowed to allocate in the GC * heap. Attempts to allocate gcthings over this limit will return null and * subsequently invoke the standard OOM machinery, independent of available * physical memory. */ UnprotectedData<size_t> gcMaxBytes_; /* Maximum nursery size for each zone group. */ - UnprotectedData<size_t> gcMaxNurseryBytes_; + ActiveThreadData<size_t> gcMaxNurseryBytes_; /* * The base value used to compute zone->trigger.gcBytes(). When * usage.gcBytes() surpasses threshold.gcBytes() for a zone, the zone may * be scheduled for a GC, depending on the exact circumstances. */ - UnprotectedData<size_t> gcZoneAllocThresholdBase_; + ActiveThreadOrGCTaskData<size_t> gcZoneAllocThresholdBase_; /* Fraction of threshold.gcBytes() which triggers an incremental GC. */ UnprotectedData<double> zoneAllocThresholdFactor_; /* * Number of bytes to allocate between incremental slices in GCs triggered * by the zone allocation threshold. */ UnprotectedData<size_t> zoneAllocDelayBytes_; /* * Totally disables |highFrequencyGC|, the HeapGrowthFactor, and other * tunables that make GC non-deterministic. */ - UnprotectedData<bool> dynamicHeapGrowthEnabled_; + ActiveThreadData<bool> dynamicHeapGrowthEnabled_; /* * We enter high-frequency mode if we GC a twice within this many * microseconds. This value is stored directly in microseconds. */ - UnprotectedData<uint64_t> highFrequencyThresholdUsec_; + ActiveThreadData<uint64_t> highFrequencyThresholdUsec_; /* * When in the |highFrequencyGC| mode, these parameterize the per-zone * "HeapGrowthFactor" computation. */ - UnprotectedData<uint64_t> highFrequencyLowLimitBytes_; - UnprotectedData<uint64_t> highFrequencyHighLimitBytes_; - UnprotectedData<double> highFrequencyHeapGrowthMax_; - UnprotectedData<double> highFrequencyHeapGrowthMin_; + ActiveThreadData<uint64_t> highFrequencyLowLimitBytes_; + ActiveThreadData<uint64_t> highFrequencyHighLimitBytes_; + ActiveThreadData<double> highFrequencyHeapGrowthMax_; + ActiveThreadData<double> highFrequencyHeapGrowthMin_; /* * When not in |highFrequencyGC| mode, this is the global (stored per-zone) * "HeapGrowthFactor". */ - UnprotectedData<double> lowFrequencyHeapGrowth_; + ActiveThreadData<double> lowFrequencyHeapGrowth_; /* * Doubles the length of IGC slices when in the |highFrequencyGC| mode. */ - UnprotectedData<bool> dynamicMarkSliceEnabled_; + ActiveThreadData<bool> dynamicMarkSliceEnabled_; /* * Controls whether painting can trigger IGC slices. */ - UnprotectedData<bool> refreshFrameSlicesEnabled_; + ActiveThreadData<bool> refreshFrameSlicesEnabled_; /* * Controls the number of empty chunks reserved for future allocation. */ UnprotectedData<uint32_t> minEmptyChunkCount_; UnprotectedData<uint32_t> maxEmptyChunkCount_; public: @@ -521,17 +521,17 @@ class GCSchedulingTunables class GCSchedulingState { /* * Influences how we schedule and run GC's in several subtle ways. The most * important factor is in how it controls the "HeapGrowthFactor". The * growth factor is a measure of how large (as a percentage of the last GC) * the heap is allowed to grow before we try to schedule another GC. */ - UnprotectedData<bool> inHighFrequencyGCMode_; + ActiveThreadData<bool> inHighFrequencyGCMode_; public: GCSchedulingState() : inHighFrequencyGCMode_(false) {} bool inHighFrequencyGCMode() const { return inHighFrequencyGCMode_; } @@ -540,29 +540,29 @@ class GCSchedulingState inHighFrequencyGCMode_ = tunables.isDynamicHeapGrowthEnabled() && lastGCTime && lastGCTime + tunables.highFrequencyThresholdUsec() > currentTime; } }; template<typename F> struct Callback { - UnprotectedData<F> op; - UnprotectedData<void*> data; + ActiveThreadData<F> op; + ActiveThreadData<void*> data; Callback() : op(nullptr), data(nullptr) {} Callback(F op, void* data) : op(op), data(data) {} }; template<typename F> -using CallbackVector = UnprotectedData<Vector<Callback<F>, 4, SystemAllocPolicy>>; +using CallbackVector = ActiveThreadData<Vector<Callback<F>, 4, SystemAllocPolicy>>; template <typename T, typename Iter0, typename Iter1> class ChainedIter { Iter0 iter0_; Iter1 iter1_; public: @@ -974,17 +974,17 @@ class GCRuntime public: JSRuntime* const rt; /* Embedders can use this zone however they wish. */ UnprotectedData<JS::Zone*> systemZone; // List of all zone groups (protected by the GC lock). - UnprotectedData<ZoneGroupVector> groups; + ActiveThreadData<ZoneGroupVector> groups; // The unique atoms zone, which has no zone group. WriteOnceData<Zone*> atomsZone; private: UnprotectedData<gcstats::Statistics> stats_; public: gcstats::Statistics& stats() { return stats_.ref(); } @@ -1018,52 +1018,52 @@ class GCRuntime // is moved back to the emptyChunks pool and scheduled for eventual // release. UnprotectedData<ChunkPool> availableChunks_; // When all arenas in a chunk are used, it is moved to the fullChunks pool // so as to reduce the cost of operations on the available lists. UnprotectedData<ChunkPool> fullChunks_; - UnprotectedData<RootedValueMap> rootsHash; + ActiveThreadData<RootedValueMap> rootsHash; - UnprotectedData<size_t> maxMallocBytes; + ActiveThreadData<size_t> maxMallocBytes; // An incrementing id used to assign unique ids to cells that require one. mozilla::Atomic<uint64_t, mozilla::ReleaseAcquire> nextCellUniqueId_; /* * Number of the committed arenas in all GC chunks including empty chunks. */ mozilla::Atomic<uint32_t, mozilla::ReleaseAcquire> numArenasFreeCommitted; - UnprotectedData<VerifyPreTracer*> verifyPreData; + ActiveThreadData<VerifyPreTracer*> verifyPreData; private: UnprotectedData<bool> chunkAllocationSinceLastGC; - UnprotectedData<int64_t> lastGCTime; + ActiveThreadData<int64_t> lastGCTime; - UnprotectedData<JSGCMode> mode; + ActiveThreadData<JSGCMode> mode; mozilla::Atomic<size_t, mozilla::ReleaseAcquire> numActiveZoneIters; /* During shutdown, the GC needs to clean up every possible object. */ - UnprotectedData<bool> cleanUpEverything; + ActiveThreadData<bool> cleanUpEverything; // Gray marking must be done after all black marking is complete. However, // we do not have write barriers on XPConnect roots. Therefore, XPConnect // roots must be accumulated in the first slice of incremental GC. We // accumulate these roots in each zone's gcGrayRoots vector and then mark // them later, after black marking is complete for each compartment. This // accumulation can fail, but in that case we switch to non-incremental GC. enum class GrayBufferState { Unused, Okay, Failed }; - UnprotectedData<GrayBufferState> grayBufferState; + ActiveThreadData<GrayBufferState> grayBufferState; bool hasBufferedGrayRoots() const { return grayBufferState == GrayBufferState::Okay; } // Clear each zone's gray buffers, but do not change the current state. void resetBufferedGrayRoots() const; // Reset the gray buffering state to Unused. void clearBufferedGrayRoots() { grayBufferState = GrayBufferState::Unused; @@ -1074,138 +1074,138 @@ class GCRuntime * The gray bits can become invalid if UnmarkGray overflows the stack. A * full GC will reset this bit, since it fills in all the gray bits. */ UnprotectedData<bool> grayBitsValid; mozilla::Atomic<JS::gcreason::Reason, mozilla::Relaxed> majorGCTriggerReason; public: - UnprotectedData<JS::gcreason::Reason> minorGCTriggerReason; + ActiveThreadData<JS::gcreason::Reason> minorGCTriggerReason; private: /* Perform full GC if rt->keepAtoms() becomes false. */ - UnprotectedData<bool> fullGCForAtomsRequested_; + ActiveThreadData<bool> fullGCForAtomsRequested_; /* Incremented at the start of every minor GC. */ - UnprotectedData<uint64_t> minorGCNumber; + ActiveThreadData<uint64_t> minorGCNumber; /* Incremented at the start of every major GC. */ - UnprotectedData<uint64_t> majorGCNumber; + ActiveThreadData<uint64_t> majorGCNumber; /* The major GC number at which to release observed type information. */ - UnprotectedData<uint64_t> jitReleaseNumber; + ActiveThreadData<uint64_t> jitReleaseNumber; /* Incremented on every GC slice. */ - UnprotectedData<uint64_t> number; + ActiveThreadData<uint64_t> number; /* The number at the time of the most recent GC's first slice. */ - UnprotectedData<uint64_t> startNumber; + ActiveThreadData<uint64_t> startNumber; /* Whether the currently running GC can finish in multiple slices. */ - UnprotectedData<bool> isIncremental; + ActiveThreadData<bool> isIncremental; /* Whether all zones are being collected in first GC slice. */ - UnprotectedData<bool> isFull; + ActiveThreadData<bool> isFull; /* Whether the heap will be compacted at the end of GC. */ - UnprotectedData<bool> isCompacting; + ActiveThreadData<bool> isCompacting; /* The invocation kind of the current GC, taken from the first slice. */ - UnprotectedData<JSGCInvocationKind> invocationKind; + ActiveThreadData<JSGCInvocationKind> invocationKind; /* The initial GC reason, taken from the first slice. */ - UnprotectedData<JS::gcreason::Reason> initialReason; + ActiveThreadData<JS::gcreason::Reason> initialReason; /* * The current incremental GC phase. This is also used internally in * non-incremental GC. */ - UnprotectedData<State> incrementalState; + ActiveThreadOrGCTaskData<State> incrementalState; /* Indicates that the last incremental slice exhausted the mark stack. */ - UnprotectedData<bool> lastMarkSlice; + ActiveThreadData<bool> lastMarkSlice; /* Whether any sweeping will take place in the separate GC helper thread. */ - UnprotectedData<bool> sweepOnBackgroundThread; + ActiveThreadData<bool> sweepOnBackgroundThread; /* Whether observed type information is being released in the current GC. */ - UnprotectedData<bool> releaseObservedTypes; + ActiveThreadData<bool> releaseObservedTypes; /* Whether any black->gray edges were found during marking. */ - UnprotectedData<BlackGrayEdgeVector> foundBlackGrayEdges; + ActiveThreadData<BlackGrayEdgeVector> foundBlackGrayEdges; /* Singly linked list of zones to be swept in the background. */ - UnprotectedData<ZoneList> backgroundSweepZones; + ActiveThreadOrGCTaskData<ZoneList> backgroundSweepZones; /* * Free LIFO blocks are transferred to this allocator before being freed on * the background GC thread after sweeping. */ - UnprotectedData<LifoAlloc> blocksToFreeAfterSweeping; + ActiveThreadOrGCTaskData<LifoAlloc> blocksToFreeAfterSweeping; private: /* Index of current zone group (for stats). */ - UnprotectedData<unsigned> zoneGroupIndex; + ActiveThreadData<unsigned> zoneGroupIndex; /* * Incremental sweep state. */ - UnprotectedData<JS::Zone*> zoneGroups; - UnprotectedData<JS::Zone*> currentZoneGroup; - UnprotectedData<bool> sweepingTypes; - UnprotectedData<unsigned> finalizePhase; - UnprotectedData<JS::Zone*> sweepZone; - UnprotectedData<AllocKind> sweepKind; - UnprotectedData<bool> abortSweepAfterCurrentGroup; + ActiveThreadData<JS::Zone*> zoneGroups; + ActiveThreadOrGCTaskData<JS::Zone*> currentZoneGroup; + ActiveThreadData<bool> sweepingTypes; + ActiveThreadData<unsigned> finalizePhase; + ActiveThreadData<JS::Zone*> sweepZone; + ActiveThreadData<AllocKind> sweepKind; + ActiveThreadData<bool> abortSweepAfterCurrentGroup; /* * Concurrent sweep infrastructure. */ void startTask(GCParallelTask& task, gcstats::Phase phase, AutoLockHelperThreadState& locked); void joinTask(GCParallelTask& task, gcstats::Phase phase, AutoLockHelperThreadState& locked); /* * List head of arenas allocated during the sweep phase. */ - UnprotectedData<Arena*> arenasAllocatedDuringSweep; + ActiveThreadData<Arena*> arenasAllocatedDuringSweep; /* * Incremental compacting state. */ - UnprotectedData<bool> startedCompacting; - UnprotectedData<ZoneList> zonesToMaybeCompact; - UnprotectedData<Arena*> relocatedArenasToRelease; + ActiveThreadData<bool> startedCompacting; + ActiveThreadData<ZoneList> zonesToMaybeCompact; + ActiveThreadData<Arena*> relocatedArenasToRelease; #ifdef JS_GC_ZEAL - UnprotectedData<MarkingValidator*> markingValidator; + ActiveThreadData<MarkingValidator*> markingValidator; #endif /* * Indicates that a GC slice has taken place in the middle of an animation * frame, rather than at the beginning. In this case, the next slice will be * delayed so that we don't get back-to-back slices. */ - UnprotectedData<bool> interFrameGC; + ActiveThreadData<bool> interFrameGC; /* Default budget for incremental GC slice. See js/SliceBudget.h. */ - UnprotectedData<int64_t> defaultTimeBudget_; + ActiveThreadData<int64_t> defaultTimeBudget_; /* * We disable incremental GC if we encounter a Class with a trace hook * that does not implement write barriers. */ - UnprotectedData<bool> incrementalAllowed; + ActiveThreadData<bool> incrementalAllowed; /* * Whether compacting GC can is enabled globally. */ - UnprotectedData<bool> compactingEnabled; + ActiveThreadData<bool> compactingEnabled; - UnprotectedData<bool> poked; + ActiveThreadData<bool> poked; /* * These options control the zealousness of the GC. At every allocation, * nextScheduled is decremented. When it reaches zero we do a full GC. * * At this point, if zeal_ is one of the types that trigger periodic * collection, then nextScheduled is reset to the value of zealFrequency. * Otherwise, no additional GCs take place. @@ -1222,26 +1222,26 @@ class GCRuntime * in jsgc.cpp for more information about this. * * zeal_ values from 8 to 10 periodically run different types of * incremental GC. * * zeal_ value 14 performs periodic shrinking collections. */ #ifdef JS_GC_ZEAL - UnprotectedData<uint32_t> zealModeBits; - UnprotectedData<int> zealFrequency; - UnprotectedData<int> nextScheduled; - UnprotectedData<bool> deterministicOnly; - UnprotectedData<int> incrementalLimit; + ActiveThreadData<uint32_t> zealModeBits; + ActiveThreadData<int> zealFrequency; + ActiveThreadData<int> nextScheduled; + ActiveThreadData<bool> deterministicOnly; + ActiveThreadData<int> incrementalLimit; - UnprotectedData<Vector<JSObject*, 0, SystemAllocPolicy>> selectedForMarking; + ActiveThreadData<Vector<JSObject*, 0, SystemAllocPolicy>> selectedForMarking; #endif - UnprotectedData<bool> fullCompartmentChecks; + ActiveThreadData<bool> fullCompartmentChecks; Callback<JSGCCallback> gcCallback; Callback<JS::DoCycleCollectionCallback> gcDoCycleCollectionCallback; Callback<JSObjectsTenuredCallback> tenuredCallback; CallbackVector<JSFinalizeCallback> finalizeCallbacks; CallbackVector<JSWeakPointerZoneGroupCallback> updateWeakPointerZoneGroupCallbacks; CallbackVector<JSWeakPointerCompartmentCallback> updateWeakPointerCompartmentCallbacks; @@ -1262,36 +1262,36 @@ class GCRuntime * tracing through black roots and the other is for tracing through gray * roots. The black/gray distinction is only relevant to the cycle * collector. */ CallbackVector<JSTraceDataOp> blackRootTracers; Callback<JSTraceDataOp> grayRootTracer; /* Always preserve JIT code during GCs, for testing. */ - UnprotectedData<bool> alwaysPreserveCode; + ActiveThreadData<bool> alwaysPreserveCode; #ifdef DEBUG - UnprotectedData<bool> arenasEmptyAtShutdown; + ActiveThreadData<bool> arenasEmptyAtShutdown; #endif /* Synchronize GC heap access among GC helper threads and main threads. */ friend class js::AutoLockGC; js::Mutex lock; BackgroundAllocTask allocTask; BackgroundDecommitTask decommitTask; GCHelperState helperState; /* * During incremental sweeping, this field temporarily holds the arenas of * the current AllocKind being swept in order of increasing free space. */ - UnprotectedData<SortedArenaList> incrementalSweepList; + ActiveThreadData<SortedArenaList> incrementalSweepList; friend class js::GCHelperState; friend class MarkingValidator; friend class AutoTraceSession; friend class AutoEnterIteration; }; /* Prevent compartments and zones from being collected during iteration. */
--- a/js/src/gc/Marking.h +++ b/js/src/gc/Marking.h @@ -52,23 +52,23 @@ static const size_t INCREMENTAL_MARK_STA * stack list with the pointer to stack top in GCMarker::unmarkedArenaStackTop. * GCMarker::delayMarkingChildren adds arenas to the stack as necessary while * markDelayedChildren pops the arenas from the stack until it empties. */ class MarkStack { friend class GCMarker; - UnprotectedData<uintptr_t*> stack_; - UnprotectedData<uintptr_t*> tos_; - UnprotectedData<uintptr_t*> end_; + ActiveThreadData<uintptr_t*> stack_; + ActiveThreadData<uintptr_t*> tos_; + ActiveThreadData<uintptr_t*> end_; // The capacity we start with and reset() to. - UnprotectedData<size_t> baseCapacity_; - UnprotectedData<size_t> maxCapacity_; + ActiveThreadData<size_t> baseCapacity_; + ActiveThreadData<size_t> maxCapacity_; public: explicit MarkStack(size_t maxCapacity) : stack_(nullptr), tos_(nullptr), end_(nullptr), baseCapacity_(0), maxCapacity_(maxCapacity) @@ -331,39 +331,39 @@ class GCMarker : public JSTracer MOZ_MUST_USE bool restoreValueArray(JSObject* obj, void** vpp, void** endp); void saveValueRanges(); inline void processMarkStackTop(SliceBudget& budget); /* The mark stack. Pointers in this stack are "gray" in the GC sense. */ MarkStack stack; /* The color is only applied to objects and functions. */ - UnprotectedData<uint32_t> color; + ActiveThreadData<uint32_t> color; /* Pointer to the top of the stack of arenas we are delaying marking on. */ - UnprotectedData<js::gc::Arena*> unmarkedArenaStackTop; + ActiveThreadData<js::gc::Arena*> unmarkedArenaStackTop; /* * If the weakKeys table OOMs, disable the linear algorithm and fall back * to iterating until the next GC. */ - UnprotectedData<bool> linearWeakMarkingDisabled_; + ActiveThreadData<bool> linearWeakMarkingDisabled_; #ifdef DEBUG /* Count of arenas that are currently in the stack. */ - UnprotectedData<size_t> markLaterArenas; + ActiveThreadData<size_t> markLaterArenas; /* Assert that start and stop are called with correct ordering. */ - UnprotectedData<bool> started; + ActiveThreadData<bool> started; /* * If this is true, all marked objects must belong to a compartment being * GCed. This is used to look for compartment bugs. */ - UnprotectedData<bool> strictCompartmentChecking; + ActiveThreadData<bool> strictCompartmentChecking; #endif // DEBUG }; #ifdef DEBUG // Return true if this trace is happening on behalf of gray buffering during // the marking phase of incremental GC. bool IsBufferGrayRootsTracer(JSTracer* trc);
--- a/js/src/gc/Zone.h +++ b/js/src/gc/Zone.h @@ -336,17 +336,17 @@ struct Zone : public JS::shadow::Zone, js::ZoneGroupData<mozilla::LinkedList<js::WeakMapBase>> gcWeakMapList_; public: mozilla::LinkedList<js::WeakMapBase>& gcWeakMapList() { return gcWeakMapList_.ref(); } typedef js::Vector<JSCompartment*, 1, js::SystemAllocPolicy> CompartmentVector; private: // The set of compartments in this zone. - js::UnprotectedData<CompartmentVector> compartments_; + js::ActiveThreadOrGCTaskData<CompartmentVector> compartments_; public: CompartmentVector& compartments() { return compartments_.ref(); } // This zone's gray roots. typedef js::Vector<js::gc::Cell*, 0, js::SystemAllocPolicy> GrayRootVector; private: js::ZoneGroupData<GrayRootVector> gcGrayRoots_; public: @@ -405,17 +405,17 @@ struct Zone : public JS::shadow::Zone, bool addTypeDescrObject(JSContext* cx, HandleObject obj); // Malloc counter to measure memory pressure for GC scheduling. It runs from // gcMaxMallocBytes down to zero. This counter should be used only when it's // not possible to know the size of a free. mozilla::Atomic<ptrdiff_t, mozilla::ReleaseAcquire> gcMallocBytes; // GC trigger threshold for allocations on the C heap. - js::UnprotectedData<size_t> gcMaxMallocBytes; + js::ActiveThreadData<size_t> gcMaxMallocBytes; // Whether a GC has been triggered as a result of gcMallocBytes falling // below zero. // // This should be a bool, but Atomic only supports 32-bit and pointer-sized // types. mozilla::Atomic<uint32_t, mozilla::ReleaseAcquire> gcMallocGCTriggered; @@ -577,17 +577,17 @@ struct Zone : public JS::shadow::Zone, void setKeepShapeTables(bool b) { keepShapeTables_ = b; } private: js::ZoneGroupData<js::jit::JitZone*> jitZone_; js::UnprotectedData<GCState> gcState_; - js::UnprotectedData<bool> gcScheduled_; + js::ActiveThreadData<bool> gcScheduled_; js::ZoneGroupData<bool> gcPreserveCode_; js::ZoneGroupData<bool> jitUsingBarriers_; js::ZoneGroupData<bool> keepShapeTables_; // Allow zones to be linked into a list friend class js::gc::ZoneList; static Zone * const NotOnList; js::ZoneGroupOrGCTaskData<Zone*> listNext_; @@ -805,21 +805,21 @@ class ZoneAllocPolicy * not be safe to do so at the current time. This policy puts the object on a * queue to be destroyed at a safe time. */ template <typename T> struct GCManagedDeletePolicy { void operator()(const T* ptr) { if (ptr) { - JSContext* cx = TlsContext.get(); - if (cx->runtime()->zoneGroupFromMainThread()->nursery().isEnabled()) { + JSRuntime* rt = TlsContext.get()->runtime(); + if (CurrentThreadCanAccessRuntime(rt) && rt->zoneGroupFromMainThread()->nursery().isEnabled()) { // The object may contain nursery pointers and must only be // destroyed after a minor GC. - cx->runtime()->zoneGroupFromMainThread()->callAfterMinorGC(deletePtr, const_cast<T*>(ptr)); + rt->zoneGroupFromMainThread()->callAfterMinorGC(deletePtr, const_cast<T*>(ptr)); } else { // The object cannot contain nursery pointers so can be // destroyed immediately. gc::AutoSetThreadIsSweeping threadIsSweeping; js_delete(const_cast<T*>(ptr)); } } }
--- a/js/src/gc/ZoneGroup.cpp +++ b/js/src/gc/ZoneGroup.cpp @@ -12,17 +12,17 @@ namespace js { ZoneGroup::ZoneGroup(JSRuntime* runtime) : runtime(runtime), context(TlsContext.get()), enterCount(this, 1), zones_(), - nursery_(this), + nursery_(this, this), storeBuffer_(this, runtime, nursery()), blocksToFreeAfterMinorGC((size_t) JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE), caches_(this), #ifdef DEBUG ionBailAfter_(this, 0), #endif jitZoneGroup(this, nullptr), debuggerList_(this),
--- a/js/src/gc/ZoneGroup.h +++ b/js/src/gc/ZoneGroup.h @@ -49,35 +49,35 @@ class ZoneGroup ZoneGroupData<size_t> enterCount; void enter(); void leave(); bool ownedByCurrentThread(); // All zones in the group. private: - UnprotectedData<ZoneVector> zones_; + ActiveThreadOrGCTaskData<ZoneVector> zones_; public: ZoneVector& zones() { return zones_.ref(); } explicit ZoneGroup(JSRuntime* runtime); ~ZoneGroup(); bool init(size_t maxNurseryBytes); private: - UnprotectedData<Nursery> nursery_; + ZoneGroupData<Nursery> nursery_; ZoneGroupData<gc::StoreBuffer> storeBuffer_; public: Nursery& nursery() { return nursery_.ref(); } gc::StoreBuffer& storeBuffer() { return storeBuffer_.ref(); } // Free LIFO blocks are transferred to this allocator before being freed // after minor GC. - UnprotectedData<LifoAlloc> blocksToFreeAfterMinorGC; + ActiveThreadData<LifoAlloc> blocksToFreeAfterMinorGC; void minorGC(JS::gcreason::Reason reason, gcstats::Phase phase = gcstats::PHASE_MINOR_GC) JS_HAZ_GC_CALL; void evictNursery(JS::gcreason::Reason reason = JS::gcreason::EVICT_NURSERY) { minorGC(reason, gcstats::PHASE_EVICT_NURSERY); } void freeAllLifoBlocksAfterMinorGC(LifoAlloc* lifo);
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/auto-regress/bug1335135.js @@ -0,0 +1,11 @@ +if (this.Intl) { + Object.defineProperty(Object.prototype, 0, { + set: function() {} + }); + function checkDisplayNames(names, expected) {} + addIntlExtras(Intl); + let gDN = Intl.getDisplayNames; + checkDisplayNames(gDN('ar', { + keys: ['dates/fields/month', ] + }), {}); +}
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/gc/bug1336866.js @@ -0,0 +1,1 @@ +JSON.stringify(this);
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/gc/bug1337324.js @@ -0,0 +1,6 @@ +if (!('oomTest' in this)) + quit(); +oomTest(function () { + offThreadCompileModule(''); + finishOffThreadModule(); +});
--- a/js/src/jit-test/tests/ion/bug1333946.js +++ b/js/src/jit-test/tests/ion/bug1333946.js @@ -1,6 +1,8 @@ -// |jit-test| exitstatus: 6; +// |jit-test| error: 42; for (var x of [0]) { - timeout(0.001); - for (;;) {} + for (var i = 0; ; i++) { + if (i === 20000) + throw 42; + } }
--- a/js/src/jit-test/tests/wasm/integer.js +++ b/js/src/jit-test/tests/wasm/integer.js @@ -119,18 +119,21 @@ testBinary32('rem_s', 0, -3, 0); testBinary32('rem_s', 5, 2, 1); testBinary32('rem_s', 65, 64, 1); testBinary32('rem_s', -65, 64, -1); testBinary32('rem_u', 40, -3, 40); testBinary32('rem_u', 41, 8, 1); testBinary32('and', 42, 6, 2); testBinary32('or', 42, 6, 46); testBinary32('xor', 42, 2, 40); +testBinary32('shl', 40, 0, 40); testBinary32('shl', 40, 2, 160); +testBinary32('shr_s', -40, 0, -40); testBinary32('shr_s', -40, 2, -10); +testBinary32('shr_u', -40, 0, -40); testBinary32('shr_u', -40, 2, 1073741814); testTrap32('div_s', 42, 0, /integer divide by zero/); testTrap32('div_s', 0x80000000 | 0, -1, /integer overflow/); testTrap32('div_u', 42, 0, /integer divide by zero/); testTrap32('rem_s', 42, 0, /integer divide by zero/); testTrap32('rem_u', 42, 0, /integer divide by zero/); @@ -216,23 +219,26 @@ assertEq(testTrunc(13.37), 1); testBinary64('shl', 0xff00ff, 28, "0x0ff00ff0000000"); testBinary64('shl', 0xff00ff, 30, "0x3fc03fc0000000"); testBinary64('shl', 0xff00ff, 31, "0x7f807f80000000"); testBinary64('shl', 0xff00ff, 32, "0xff00ff00000000"); testBinary64('shl', 1, 63, "0x8000000000000000"); testBinary64('shl', 1, 64, 1); testBinary64('shl', 40, 2, 160); + testBinary64('shl', 40, 0, 40); + testBinary64('shr_s', -40, 0, -40); testBinary64('shr_s', -40, 2, -10); testBinary64('shr_s', "0xff00ff0000000", 28, 0xff00ff); testBinary64('shr_s', "0xff00ff0000000", 30, 0x3fc03f); testBinary64('shr_s', "0xff00ff0000000", 31, 0x1fe01f); testBinary64('shr_s', "0xff00ff0000000", 32, 0x0ff00f); + testBinary64('shr_u', -40, 0, -40); testBinary64('shr_u', -40, 2, "0x3ffffffffffffff6"); testBinary64('shr_u', "0x8ffff00ff0000000", 30, "0x23fffc03f"); testBinary64('shr_u', "0x8ffff00ff0000000", 31, "0x11fffe01f"); testBinary64('shr_u', "0x8ffff00ff0000000", 32, "0x08ffff00f"); testBinary64('shr_u', "0x8ffff00ff0000000", 56, 0x8f); testBinary64('and', 42, 0, 0); testBinary64('and', 42, 6, 2);
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/wasm/regress/long-select.js @@ -0,0 +1,42 @@ +load(libdir + "wasm.js"); + +// Bug 1337060 causes too much register pressure on x86 by requiring four int64 +// values in registers at the same time. + +setJitCompilerOption('wasm.test-mode', 1); + +wasmFullPassI64(` +(module + (func (result i64) + i64.const 0x2800000033 + i64.const 0x9900000044 + i64.const 0x1000000012 + i64.const 0x1000000013 + i64.lt_s + select) (export "run" 0))`, createI64("0x2800000033")); + +wasmFullPassI64(` +(module + (func (result i64) + i64.const 0x2800000033 + i64.const 0x9900000044 + i64.const 0x1000000013 + i64.const 0x1000000012 + i64.lt_s + select) (export "run" 0))`, createI64("0x9900000044")); + +wasmFullPassI64(` +(module + (func (export "run") (result i64) (param f32) + i64.const 0x13100000001 + i64.const 0x23370000002 + i64.const 0x34480000003 + i32.const 1 + select + i32.const 1 + select + i64.const 0x45590000004 + i32.const 1 + select + ) +)`, createI64("0x13100000001"));
--- a/js/src/jit/BacktrackingAllocator.cpp +++ b/js/src/jit/BacktrackingAllocator.cpp @@ -832,18 +832,22 @@ BacktrackingAllocator::go() while (!allocationQueue.empty()) { if (mir->shouldCancel("Backtracking Allocation")) return false; QueueItem item = allocationQueue.removeHighest(); if (!processBundle(mir, item.bundle)) return false; } + JitSpew(JitSpew_RegAlloc, "Main allocation loop complete"); + if (!tryAllocatingRegistersForSpillBundles()) + return false; + if (!pickStackSlots()) return false; if (JitSpewEnabled(JitSpew_RegAlloc)) dumpAllocations(); if (!resolveControlFlow()) return false; @@ -1205,17 +1209,18 @@ BacktrackingAllocator::tryAllocateNonFix if (!tryAllocateRegister(registers[reg.code()], bundle, success, pfixed, conflicting)) return false; if (*success) return true; } // Spill bundles which have no hint or register requirement. if (requirement.kind() == Requirement::NONE && hint.kind() != Requirement::REGISTER) { - if (!spill(bundle)) + JitSpew(JitSpew_RegAlloc, " postponed spill (no hint or register requirement)"); + if (!spilledBundles.append(bundle)) return false; *success = true; return true; } if (conflicting.empty() || minimalBundle(bundle)) { // Search for any available register which the bundle can be // allocated to. @@ -1225,17 +1230,18 @@ BacktrackingAllocator::tryAllocateNonFix if (*success) return true; } } // Spill bundles which have no register requirement if they didn't get // allocated. if (requirement.kind() == Requirement::NONE) { - if (!spill(bundle)) + JitSpew(JitSpew_RegAlloc, " postponed spill (no register requirement)"); + if (!spilledBundles.append(bundle)) return false; *success = true; return true; } // We failed to allocate this bundle. MOZ_ASSERT(!*success); return true; @@ -1584,16 +1590,48 @@ BacktrackingAllocator::spill(LiveBundle* } return true; } return bundle->spillSet()->addSpilledBundle(bundle); } bool +BacktrackingAllocator::tryAllocatingRegistersForSpillBundles() +{ + for (auto it = spilledBundles.begin(); it != spilledBundles.end(); it++) { + LiveBundle* bundle = *it; + LiveBundleVector conflicting; + bool fixed = false; + bool success = false; + + if (mir->shouldCancel("Backtracking Try Allocating Spilled Bundles")) + return false; + + if (JitSpewEnabled(JitSpew_RegAlloc)) + JitSpew(JitSpew_RegAlloc, "Spill or allocate %s", bundle->toString().get()); + + // Search for any available register which the bundle can be + // allocated to. + for (size_t i = 0; i < AnyRegister::Total; i++) { + if (!tryAllocateRegister(registers[i], bundle, &success, &fixed, conflicting)) + return false; + if (success) + break; + } + + // If the bundle still has no register, spill the bundle. + if (!success && !spill(bundle)) + return false; + } + + return true; +} + +bool BacktrackingAllocator::pickStackSlots() { for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { VirtualRegister& reg = vregs[i]; if (mir->shouldCancel("Backtracking Pick Stack Slots")) return false;
--- a/js/src/jit/BacktrackingAllocator.h +++ b/js/src/jit/BacktrackingAllocator.h @@ -667,16 +667,18 @@ class BacktrackingAllocator : protected : alloc(slot), allocated(alloc) {} }; typedef InlineForwardList<SpillSlot> SpillSlotList; // All allocated slots of each width. SpillSlotList normalSlots, doubleSlots, quadSlots; + Vector<LiveBundle*, 4, SystemAllocPolicy> spilledBundles; + public: BacktrackingAllocator(MIRGenerator* mir, LIRGenerator* lir, LIRGraph& graph, bool testbed) : RegisterAllocator(mir, lir, graph), testbed(testbed), liveIn(nullptr), callRanges(nullptr) { } @@ -715,16 +717,17 @@ class BacktrackingAllocator : protected Requirement *phint); bool hasFixedUseOverlap(LiveBundle* bundle, const LiveBundleVector& conflicting); MOZ_MUST_USE bool tryAllocateRegister(PhysicalRegister& r, LiveBundle* bundle, bool* success, bool* pfixed, LiveBundleVector& conflicting); MOZ_MUST_USE bool evictBundle(LiveBundle* bundle); MOZ_MUST_USE bool splitAndRequeueBundles(LiveBundle* bundle, const LiveBundleVector& newBundles); MOZ_MUST_USE bool spill(LiveBundle* bundle); + MOZ_MUST_USE bool tryAllocatingRegistersForSpillBundles(); bool isReusedInput(LUse* use, LNode* ins, bool considerCopy); bool isRegisterUse(UsePosition* use, LNode* ins, bool considerCopy = false); bool isRegisterDefinition(LiveRange* range); MOZ_MUST_USE bool pickStackSlot(SpillSet* spill); MOZ_MUST_USE bool insertAllRanges(LiveRangeSet& set, LiveBundle* bundle); // Reification methods.
--- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -27,17 +27,16 @@ # include "jit/PerfSpewer.h" #endif #include "jit/SharedICHelpers.h" #include "jit/VMFunctions.h" #include "js/Conversions.h" #include "js/GCVector.h" #include "vm/Opcodes.h" #include "vm/SelfHosting.h" -#include "vm/TypedArrayCommon.h" #include "vm/TypedArrayObject.h" #include "jsboolinlines.h" #include "jsscriptinlines.h" #include "jit/JitFrames-inl.h" #include "jit/MacroAssembler-inl.h" #include "jit/shared/Lowering-shared-inl.h"
--- a/js/src/jit/IonCaches.h +++ b/js/src/jit/IonCaches.h @@ -16,17 +16,17 @@ #elif defined(JS_CODEGEN_MIPS64) # include "jit/mips64/Assembler-mips64.h" #endif #include "jit/JitCompartment.h" #include "jit/Registers.h" #include "jit/shared/Assembler-shared.h" #include "js/TrackedOptimizationInfo.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" namespace js { namespace jit { class LInstruction; #define IONCACHE_KIND_LIST(_) \ _(SetProperty) \
--- a/js/src/jit/JitCompartment.h +++ b/js/src/jit/JitCompartment.h @@ -82,20 +82,20 @@ class PatchableBackedge : public InlineL class JitRuntime { private: friend class JitCompartment; // Executable allocator for all code except wasm code and Ion code with // patchable backedges (see below). - UnprotectedData<ExecutableAllocator> execAlloc_; + ActiveThreadData<ExecutableAllocator> execAlloc_; // Executable allocator for Ion scripts with patchable backedges. - UnprotectedData<ExecutableAllocator> backedgeExecAlloc_; + ActiveThreadData<ExecutableAllocator> backedgeExecAlloc_; // Shared exception-handler tail. ExclusiveAccessLockWriteOnceData<JitCode*> exceptionTail_; // Shared post-bailout-handler tail. ExclusiveAccessLockWriteOnceData<JitCode*> bailoutTail_; // Shared profiler exit frame tail.
--- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -4856,16 +4856,19 @@ LIRGenerator::visitBlock(MBasicBlock* bl if (block->successorWithPhis()) { // If we have a successor with phis, lower the phi input now that we // are approaching the join point. MBasicBlock* successor = block->successorWithPhis(); uint32_t position = block->positionInPhiSuccessor(); size_t lirIndex = 0; for (MPhiIterator phi(successor->phisBegin()); phi != successor->phisEnd(); phi++) { + if (!gen->ensureBallast()) + return false; + MDefinition* opd = phi->getOperand(position); ensureDefined(opd); MOZ_ASSERT(opd->type() == phi->type()); if (phi->type() == MIRType::Value) { lowerUntypedPhiInput(*phi, position, successor->lir(), lirIndex); lirIndex += BOX_PIECES;
--- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -25,17 +25,17 @@ #include "jit/JitAllocPolicy.h" #include "jit/MacroAssembler.h" #include "jit/MOpcodes.h" #include "jit/TypedObjectPrediction.h" #include "jit/TypePolicy.h" #include "vm/ArrayObject.h" #include "vm/EnvironmentObject.h" #include "vm/SharedMem.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "vm/UnboxedObject.h" // Undo windows.h damage on Win64 #undef MemoryBarrier namespace js { class StringObject;
--- a/js/src/jit/RangeAnalysis.cpp +++ b/js/src/jit/RangeAnalysis.cpp @@ -10,17 +10,17 @@ #include "jit/Ion.h" #include "jit/IonAnalysis.h" #include "jit/JitSpewer.h" #include "jit/MIR.h" #include "jit/MIRGenerator.h" #include "jit/MIRGraph.h" #include "js/Conversions.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "jsopcodeinlines.h" using namespace js; using namespace js::jit; using mozilla::Abs; using mozilla::CountLeadingZeroes32;
--- a/js/src/jit/SharedIC.h +++ b/js/src/jit/SharedIC.h @@ -12,17 +12,17 @@ #include "jsgc.h" #include "jit/BaselineICList.h" #include "jit/BaselineJIT.h" #include "jit/MacroAssembler.h" #include "jit/SharedICList.h" #include "jit/SharedICRegisters.h" #include "vm/ReceiverGuard.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" namespace js { namespace jit { class AutoShapeVector; // // Baseline Inline Caches are polymorphic caches that aggressively
--- a/js/src/jit/arm/MacroAssembler-arm-inl.h +++ b/js/src/jit/arm/MacroAssembler-arm-inl.h @@ -665,19 +665,20 @@ MacroAssembler::lshiftPtr(Imm32 imm, Reg MOZ_ASSERT(0 <= imm.value && imm.value < 32); ma_lsl(imm, dest, dest); } void MacroAssembler::lshift64(Imm32 imm, Register64 dest) { MOZ_ASSERT(0 <= imm.value && imm.value < 64); - if (imm.value == 0) { + if (imm.value == 0) return; - } else if (imm.value < 32) { + + if (imm.value < 32) { as_mov(dest.high, lsl(dest.high, imm.value)); as_orr(dest.high, dest.high, lsr(dest.low, 32 - imm.value)); as_mov(dest.low, lsl(dest.low, imm.value)); } else { as_mov(dest.high, lsl(dest.low, imm.value - 32)); ma_mov(Imm32(0), dest.low); } } @@ -711,17 +712,18 @@ MacroAssembler::lshift32(Imm32 imm, Regi MOZ_ASSERT(0 <= imm.value && imm.value < 32); lshiftPtr(imm, dest); } void MacroAssembler::rshiftPtr(Imm32 imm, Register dest) { MOZ_ASSERT(0 <= imm.value && imm.value < 32); - ma_lsr(imm, dest, dest); + if (imm.value) + ma_lsr(imm, dest, dest); } void MacroAssembler::rshift32(Register src, Register dest) { ma_lsr(src, dest, dest); } @@ -731,23 +733,26 @@ MacroAssembler::rshift32(Imm32 imm, Regi MOZ_ASSERT(0 <= imm.value && imm.value < 32); rshiftPtr(imm, dest); } void MacroAssembler::rshiftPtrArithmetic(Imm32 imm, Register dest) { MOZ_ASSERT(0 <= imm.value && imm.value < 32); - ma_asr(imm, dest, dest); + if (imm.value) + ma_asr(imm, dest, dest); } void MacroAssembler::rshift64Arithmetic(Imm32 imm, Register64 dest) { MOZ_ASSERT(0 <= imm.value && imm.value < 64); + if (!imm.value) + return; if (imm.value < 32) { as_mov(dest.low, lsr(dest.low, imm.value)); as_orr(dest.low, dest.low, lsl(dest.high, 32 - imm.value)); as_mov(dest.high, asr(dest.high, imm.value)); } else if (imm.value == 32) { as_mov(dest.low, O2Reg(dest.high)); as_mov(dest.high, asr(dest.high, 31)); @@ -797,16 +802,19 @@ MacroAssembler::rshift32Arithmetic(Imm32 rshiftPtrArithmetic(imm, dest); } void MacroAssembler::rshift64(Imm32 imm, Register64 dest) { MOZ_ASSERT(0 <= imm.value && imm.value < 64); MOZ_ASSERT(0 <= imm.value && imm.value < 64); + if (!imm.value) + return; + if (imm.value < 32) { as_mov(dest.low, lsr(dest.low, imm.value)); as_orr(dest.low, dest.low, lsl(dest.high, 32 - imm.value)); as_mov(dest.high, lsr(dest.high, imm.value)); } else if (imm.value == 32) { ma_mov(dest.high, dest.low); ma_mov(Imm32(0), dest.high); } else {
--- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -82,17 +82,16 @@ #include "vm/Runtime.h" #include "vm/SavedStacks.h" #include "vm/SelfHosting.h" #include "vm/Shape.h" #include "vm/StopIterationObject.h" #include "vm/String.h" #include "vm/StringBuffer.h" #include "vm/Symbol.h" -#include "vm/TypedArrayCommon.h" #include "vm/WrapperObject.h" #include "vm/Xdr.h" #include "wasm/AsmJS.h" #include "wasm/WasmModule.h" #include "jsatominlines.h" #include "jsfuninlines.h" #include "jsscriptinlines.h"
--- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -30,17 +30,17 @@ #include "jit/InlinableNatives.h" #include "js/Class.h" #include "js/Conversions.h" #include "vm/ArgumentsObject.h" #include "vm/Interpreter.h" #include "vm/SelfHosting.h" #include "vm/Shape.h" #include "vm/StringBuffer.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "vm/WrapperObject.h" #include "jsatominlines.h" #include "vm/ArgumentsObject-inl.h" #include "vm/ArrayObject-inl.h" #include "vm/Caches-inl.h" #include "vm/Interpreter-inl.h"
--- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -7489,16 +7489,17 @@ ZoneGCDelayBytesGetter(JSContext* cx, un args.rval().setNumber(double(cx->zone()->gcDelayBytes)); return true; } static bool ZoneGCHeapGrowthFactorGetter(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); + AutoLockGC lock(cx->runtime()); args.rval().setNumber(cx->zone()->threshold.gcHeapGrowthFactor()); return true; } static bool ZoneGCNumberGetter(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp);
--- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -646,17 +646,17 @@ class ArenaLists BackgroundFinalizeState; /* The current background finalization state, accessed atomically. */ UnprotectedData<AllAllocKindArray<BackgroundFinalizeState>> backgroundFinalizeState_; BackgroundFinalizeState& backgroundFinalizeState(AllocKind i) { return backgroundFinalizeState_.ref()[i]; } const BackgroundFinalizeState& backgroundFinalizeState(AllocKind i) const { return backgroundFinalizeState_.ref()[i]; } /* For each arena kind, a list of arenas remaining to be swept. */ - UnprotectedData<AllAllocKindArray<Arena*>> arenaListsToSweep_; + ActiveThreadOrGCTaskData<AllAllocKindArray<Arena*>> arenaListsToSweep_; Arena*& arenaListsToSweep(AllocKind i) { return arenaListsToSweep_.ref()[i]; } Arena* arenaListsToSweep(AllocKind i) const { return arenaListsToSweep_.ref()[i]; } /* During incremental sweeping, a list of the arenas already swept. */ ZoneGroupOrGCTaskData<AllocKind> incrementalSweptArenaKind; ZoneGroupOrGCTaskData<ArenaList> incrementalSweptArenas; // Arena lists which have yet to be swept, but need additional foreground @@ -872,17 +872,17 @@ class GCHelperState JSRuntime* const rt; // Condvar for notifying the main thread when work has finished. This is // associated with the runtime's GC lock --- the worker thread state // condvars can't be used here due to lock ordering issues. js::ConditionVariable done; // Activity for the helper to do, protected by the GC lock. - UnprotectedData<State> state_; + ActiveThreadOrGCTaskData<State> state_; // Whether work is being performed on some thread. GCLockData<bool> hasThread; void startBackgroundThread(State newState, const AutoLockGC& lock, const AutoLockHelperThreadState& helperLock); void waitForBackgroundThread(js::AutoLockGC& lock); @@ -944,17 +944,17 @@ class GCParallelTask enum TaskState { NotStarted, Dispatched, Finished, }; UnprotectedData<TaskState> state; // Amount of time this task took to execute. - UnprotectedData<mozilla::TimeDuration> duration_; + ActiveThreadOrGCTaskData<mozilla::TimeDuration> duration_; explicit GCParallelTask(const GCParallelTask&) = delete; protected: // A flag to signal a request for early completion of the off-thread task. mozilla::Atomic<bool> cancel_; virtual void run() = 0;
--- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -27,17 +27,17 @@ #include "ds/Sort.h" #include "gc/Marking.h" #include "js/Proxy.h" #include "vm/GeneratorObject.h" #include "vm/GlobalObject.h" #include "vm/Interpreter.h" #include "vm/Shape.h" #include "vm/StopIterationObject.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "jsscriptinlines.h" #include "vm/NativeObject-inl.h" #include "vm/Stack-inl.h" #include "vm/String-inl.h" using namespace js;
--- a/js/src/jsmath.cpp +++ b/js/src/jsmath.cpp @@ -51,16 +51,50 @@ #endif #if defined(ANDROID) || defined(XP_DARWIN) || defined(__DragonFly__) || \ defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) # include <stdlib.h> # define HAVE_ARC4RANDOM #endif +#if defined(__linux__) +# include <linux/random.h> // For GRND_NONBLOCK. +# include <sys/syscall.h> // For SYS_getrandom. + +// Older glibc versions don't define SYS_getrandom, so we define it here if +// it's not available. See bug 995069. +# if defined(__x86_64__) +# define GETRANDOM_NR 318 +# elif defined(__i386__) +# define GETRANDOM_NR 355 +# elif defined(__arm__) +# define GETRANDOM_NR 384 +# endif + +# if defined(SYS_getrandom) +// We have SYS_getrandom. Use it to check GETRANDOM_NR. Only do this if we set +// GETRANDOM_NR so tier 3 platforms with recent glibc are not forced to define +// it for no good reason. +# if defined(GETRANDOM_NR) +static_assert(GETRANDOM_NR == SYS_getrandom, + "GETRANDOM_NR should match the actual SYS_getrandom value"); +# endif +# else +# define SYS_getrandom GETRANDOM_NR +# endif + +# if defined(GRND_NONBLOCK) +static_assert(GRND_NONBLOCK == 1, "If GRND_NONBLOCK is not 1 the #define below is wrong"); +# else +# define GRND_NONBLOCK 1 +# endif + +#endif // defined(__linux__) + using namespace js; using mozilla::Abs; using mozilla::NumberEqualsInt32; using mozilla::NumberIsInt32; using mozilla::ExponentComponent; using mozilla::FloatingPoint; using mozilla::IsFinite; @@ -681,27 +715,38 @@ js::GenerateRandomSeed() { uint64_t seed = 0; #if defined(XP_WIN) MOZ_ALWAYS_TRUE(RtlGenRandom(&seed, sizeof(seed))); #elif defined(HAVE_ARC4RANDOM) seed = (static_cast<uint64_t>(arc4random()) << 32) | arc4random(); #elif defined(XP_UNIX) - int fd = open("/dev/urandom", O_RDONLY); - if (fd >= 0) { - mozilla::Unused << read(fd, static_cast<void*>(&seed), sizeof(seed)); - close(fd); + bool done = false; +# if defined(__linux__) + // Try the relatively new getrandom syscall first. It's the preferred way + // on Linux as /dev/urandom may not work inside chroots and is harder to + // sandbox (see bug 995069). + int ret = syscall(SYS_getrandom, &seed, sizeof(seed), GRND_NONBLOCK); + done = (ret == sizeof(seed)); +# endif + if (!done) { + int fd = open("/dev/urandom", O_RDONLY); + if (fd >= 0) { + mozilla::Unused << read(fd, static_cast<void*>(&seed), sizeof(seed)); + close(fd); + } } #else # error "Platform needs to implement GenerateRandomSeed()" #endif // Also mix in PRMJ_Now() in case we couldn't read random bits from the OS. - return seed ^ PRMJ_Now(); + uint64_t timestamp = PRMJ_Now(); + return seed ^ timestamp ^ (timestamp << 32); } void js::GenerateXorShift128PlusSeed(mozilla::Array<uint64_t, 2>& seed) { // XorShift128PlusRNG must be initialized with a non-zero seed. do { seed[0] = GenerateRandomSeed();
--- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -48,17 +48,17 @@ #include "js/Proxy.h" #include "js/UbiNode.h" #include "js/UniquePtr.h" #include "vm/ArgumentsObject.h" #include "vm/Interpreter.h" #include "vm/ProxyObject.h" #include "vm/RegExpStaticsObject.h" #include "vm/Shape.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "jsatominlines.h" #include "jsboolinlines.h" #include "jscntxtinlines.h" #include "jscompartmentinlines.h" #include "vm/ArrayObject-inl.h" #include "vm/BooleanObject-inl.h"
--- a/js/src/jsobjinlines.h +++ b/js/src/jsobjinlines.h @@ -18,17 +18,17 @@ #include "builtin/TypedObject.h" #include "gc/Allocator.h" #include "vm/ArrayObject.h" #include "vm/DateObject.h" #include "vm/EnvironmentObject.h" #include "vm/NumberObject.h" #include "vm/Probes.h" #include "vm/StringObject.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "jsatominlines.h" #include "jscompartmentinlines.h" #include "jsgcinlines.h" #include "vm/ShapedObject-inl.h" #include "vm/TypeInference-inl.h"
--- a/js/src/threading/ProtectedData.cpp +++ b/js/src/threading/ProtectedData.cpp @@ -31,16 +31,37 @@ OnBackgroundThread() return true; } return false; } template <AllowedBackgroundThread Background> void +CheckActiveThread<Background>::check() const +{ + // When interrupting a thread on Windows, changes are made to the runtime + // and active thread's state from another thread while the active thread is + // suspended. We need a way to mark these accesses as being tantamount to + // accesses by the active thread. See bug 1323066. +#ifndef XP_WIN + if (OnBackgroundThread<Background>()) + return; + + JSContext* cx = TlsContext.get(); + MOZ_ASSERT(cx == cx->runtime()->activeContext); +#endif // XP_WIN +} + +template class CheckActiveThread<AllowedBackgroundThread::None>; +template class CheckActiveThread<AllowedBackgroundThread::GCTask>; +template class CheckActiveThread<AllowedBackgroundThread::IonCompile>; + +template <AllowedBackgroundThread Background> +void CheckZoneGroup<Background>::check() const { if (OnBackgroundThread<Background>()) return; if (group) { // This check is disabled for now because helper thread parse tasks // access data in the same zone group that the single main thread is
--- a/js/src/threading/ProtectedData.h +++ b/js/src/threading/ProtectedData.h @@ -197,16 +197,38 @@ enum class AllowedBackgroundThread { None, GCTask, IonCompile, GCTaskOrIonCompile }; template <AllowedBackgroundThread Background> +class CheckActiveThread +{ + public: + void check() const; +}; + +// Data which may only be accessed by the runtime's cooperatively scheduled +// active thread. +template <typename T> +using ActiveThreadData = + ProtectedDataNoCheckArgs<CheckActiveThread<AllowedBackgroundThread::None>, T>; + +// Data which may only be accessed by the runtime's cooperatively scheduled +// active thread, or by various helper thread tasks. +template <typename T> +using ActiveThreadOrGCTaskData = + ProtectedDataNoCheckArgs<CheckActiveThread<AllowedBackgroundThread::GCTask>, T>; +template <typename T> +using ActiveThreadOrIonCompileData = + ProtectedDataNoCheckArgs<CheckActiveThread<AllowedBackgroundThread::IonCompile>, T>; + +template <AllowedBackgroundThread Background> class CheckZoneGroup { #ifdef DEBUG ZoneGroup* group; public: explicit CheckZoneGroup(ZoneGroup* group) : group(group) {} void check() const; @@ -218,29 +240,23 @@ class CheckZoneGroup // Data which may only be accessed by threads with exclusive access to the // associated zone group. template <typename T> using ZoneGroupData = ProtectedDataZoneGroupArg<CheckZoneGroup<AllowedBackgroundThread::None>, T>; // Data which may only be accessed by threads with exclusive access to the -// associated zone group, or by GC helper thread tasks. +// associated zone group, or by various helper thread tasks. template <typename T> using ZoneGroupOrGCTaskData = ProtectedDataZoneGroupArg<CheckZoneGroup<AllowedBackgroundThread::GCTask>, T>; - -// Data which may only be accessed by threads with exclusive access to the -// associated zone group, or by Ion compilation helper thread tasks. template <typename T> using ZoneGroupOrIonCompileData = ProtectedDataZoneGroupArg<CheckZoneGroup<AllowedBackgroundThread::IonCompile>, T>; - -// Data which may only be accessed by threads with exclusive access to the -// associated zone group, or by either GC helper or Ion compilation tasks. template <typename T> using ZoneGroupOrGCTaskOrIonCompileData = ProtectedDataZoneGroupArg<CheckZoneGroup<AllowedBackgroundThread::GCTaskOrIonCompile>, T>; // Runtime wide locks which might protect some data. enum class GlobalLock { GCLock,
--- a/js/src/vm/HelperThreads.cpp +++ b/js/src/vm/HelperThreads.cpp @@ -1178,20 +1178,20 @@ js::GCParallelTask::runFromMainThread(JS run(); duration_ = mozilla::TimeStamp::Now() - timeStart; } void js::GCParallelTask::runFromHelperThread(AutoLockHelperThreadState& locked) { JSContext cx(runtime(), JS::ContextOptions()); + gc::AutoSetThreadIsPerformingGC performingGC; { AutoUnlockHelperThreadState parallelSection(locked); - gc::AutoSetThreadIsPerformingGC performingGC; mozilla::TimeStamp timeStart = mozilla::TimeStamp::Now(); cx.heapState = JS::HeapState::MajorCollecting; run(); cx.heapState = JS::HeapState::Idle; duration_ = mozilla::TimeStamp::Now() - timeStart; } state = Finished;
--- a/js/src/vm/NativeObject.cpp +++ b/js/src/vm/NativeObject.cpp @@ -9,17 +9,17 @@ #include "mozilla/ArrayUtils.h" #include "mozilla/Casting.h" #include "jswatchpoint.h" #include "gc/Marking.h" #include "js/Value.h" #include "vm/Debugger.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "jsobjinlines.h" #include "gc/Nursery-inl.h" #include "vm/ArrayObject-inl.h" #include "vm/EnvironmentObject-inl.h" #include "vm/Shape-inl.h"
--- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -90,16 +90,17 @@ ReturnZeroSize(const void* p) return 0; } JSRuntime::JSRuntime(JSRuntime* parentRuntime) : parentRuntime(parentRuntime), #ifdef DEBUG updateChildRuntimeCount(parentRuntime), #endif + activeContext(nullptr), profilerSampleBufferGen_(0), profilerSampleBufferLapCount_(1), telemetryCallback(nullptr), getIncumbentGlobalCallback(nullptr), enqueuePromiseJobCallback(nullptr), enqueuePromiseJobCallbackData(nullptr), promiseRejectionTrackerCallback(nullptr), promiseRejectionTrackerCallbackData(nullptr), @@ -186,16 +187,18 @@ JSRuntime::JSRuntime(JSRuntime* parentRu } bool JSRuntime::init(JSContext* cx, uint32_t maxbytes, uint32_t maxNurseryBytes) { if (CanUseExtraThreads() && !EnsureHelperThreadsInitialized()) return false; + activeContext = cx; + singletonContext = cx; defaultFreeOp_ = js_new<js::FreeOp>(this); if (!defaultFreeOp_) return false; ScopedJSDeletePtr<ZoneGroup> zoneGroup(js_new<ZoneGroup>(this)); if (!zoneGroup)
--- a/js/src/vm/Runtime.h +++ b/js/src/vm/Runtime.h @@ -292,16 +292,21 @@ struct JSRuntime : public js::MallocProv if (parent_) parent_->childRuntimeCount--; } }; AutoUpdateChildRuntimeCount updateChildRuntimeCount; #endif + // The context for the thread which currently has exclusive access to most + // contents of the runtime. When execution on the runtime is cooperatively + // scheduled, this is the thread which is currently running. + mozilla::Atomic<JSContext*, mozilla::ReleaseAcquire> activeContext; + /* * The profiler sampler generation after the latest sample. * * The lapCount indicates the number of largest number of 'laps' * (wrapping from high to low) that occurred when writing entries * into the sample buffer. All JitcodeGlobalMap entries referenced * from a given sample are assigned the generation of the sample buffer * at the START of the run. If multiple laps occur, then some entries @@ -349,88 +354,88 @@ struct JSRuntime : public js::MallocProv break; if (profilerSampleBufferLapCount_.compareExchange(curLapCount, lapCount)) break; } } /* Call this to accumulate telemetry data. */ - js::UnprotectedData<JSAccumulateTelemetryDataCallback> telemetryCallback; + js::ActiveThreadData<JSAccumulateTelemetryDataCallback> telemetryCallback; public: // Accumulates data for Firefox telemetry. |id| is the ID of a JS_TELEMETRY_* // histogram. |key| provides an additional key to identify the histogram. // |sample| is the data to add to the histogram. void addTelemetry(int id, uint32_t sample, const char* key = nullptr); void setTelemetryCallback(JSRuntime* rt, JSAccumulateTelemetryDataCallback callback); public: - js::UnprotectedData<JSGetIncumbentGlobalCallback> getIncumbentGlobalCallback; - js::UnprotectedData<JSEnqueuePromiseJobCallback> enqueuePromiseJobCallback; - js::UnprotectedData<void*> enqueuePromiseJobCallbackData; + js::ActiveThreadData<JSGetIncumbentGlobalCallback> getIncumbentGlobalCallback; + js::ActiveThreadData<JSEnqueuePromiseJobCallback> enqueuePromiseJobCallback; + js::ActiveThreadData<void*> enqueuePromiseJobCallbackData; - js::UnprotectedData<JSPromiseRejectionTrackerCallback> promiseRejectionTrackerCallback; - js::UnprotectedData<void*> promiseRejectionTrackerCallbackData; + js::ActiveThreadData<JSPromiseRejectionTrackerCallback> promiseRejectionTrackerCallback; + js::ActiveThreadData<void*> promiseRejectionTrackerCallbackData; - js::UnprotectedData<JS::StartAsyncTaskCallback> startAsyncTaskCallback; + js::ActiveThreadData<JS::StartAsyncTaskCallback> startAsyncTaskCallback; js::UnprotectedData<JS::FinishAsyncTaskCallback> finishAsyncTaskCallback; js::ExclusiveData<js::PromiseTaskPtrVector> promiseTasksToDestroy; JSObject* getIncumbentGlobal(JSContext* cx); bool enqueuePromiseJob(JSContext* cx, js::HandleFunction job, js::HandleObject promise, js::HandleObject incumbentGlobal); void addUnhandledRejectedPromise(JSContext* cx, js::HandleObject promise); void removeUnhandledRejectedPromise(JSContext* cx, js::HandleObject promise); /* Had an out-of-memory error which did not populate an exception. */ mozilla::Atomic<bool> hadOutOfMemory; /* * Allow relazifying functions in compartments that are active. This is * only used by the relazifyFunctions() testing function. */ - js::UnprotectedData<bool> allowRelazificationForTesting; + js::ActiveThreadData<bool> allowRelazificationForTesting; /* Compartment destroy callback. */ - js::UnprotectedData<JSDestroyCompartmentCallback> destroyCompartmentCallback; + js::ActiveThreadData<JSDestroyCompartmentCallback> destroyCompartmentCallback; /* Compartment memory reporting callback. */ - js::UnprotectedData<JSSizeOfIncludingThisCompartmentCallback> sizeOfIncludingThisCompartmentCallback; + js::ActiveThreadData<JSSizeOfIncludingThisCompartmentCallback> sizeOfIncludingThisCompartmentCallback; /* Zone destroy callback. */ - js::UnprotectedData<JSZoneCallback> destroyZoneCallback; + js::ActiveThreadData<JSZoneCallback> destroyZoneCallback; /* Zone sweep callback. */ - js::UnprotectedData<JSZoneCallback> sweepZoneCallback; + js::ActiveThreadData<JSZoneCallback> sweepZoneCallback; /* Call this to get the name of a compartment. */ - js::UnprotectedData<JSCompartmentNameCallback> compartmentNameCallback; + js::ActiveThreadData<JSCompartmentNameCallback> compartmentNameCallback; /* Callback for doing memory reporting on external strings. */ - js::UnprotectedData<JSExternalStringSizeofCallback> externalStringSizeofCallback; + js::ActiveThreadData<JSExternalStringSizeofCallback> externalStringSizeofCallback; - js::UnprotectedData<mozilla::UniquePtr<js::SourceHook>> sourceHook; + js::ActiveThreadData<mozilla::UniquePtr<js::SourceHook>> sourceHook; - js::UnprotectedData<const JSSecurityCallbacks*> securityCallbacks; - js::UnprotectedData<const js::DOMCallbacks*> DOMcallbacks; - js::UnprotectedData<JSDestroyPrincipalsOp> destroyPrincipals; - js::UnprotectedData<JSReadPrincipalsOp> readPrincipals; + js::ActiveThreadData<const JSSecurityCallbacks*> securityCallbacks; + js::ActiveThreadData<const js::DOMCallbacks*> DOMcallbacks; + js::ActiveThreadData<JSDestroyPrincipalsOp> destroyPrincipals; + js::ActiveThreadData<JSReadPrincipalsOp> readPrincipals; /* Optional warning reporter. */ - js::UnprotectedData<JS::WarningReporter> warningReporter; + js::ActiveThreadData<JS::WarningReporter> warningReporter; private: /* Gecko profiling metadata */ js::UnprotectedData<js::GeckoProfiler> geckoProfiler_; public: js::GeckoProfiler& geckoProfiler() { return geckoProfiler_.ref(); } // Heap GC roots for PersistentRooted pointers. - js::UnprotectedData<mozilla::EnumeratedArray<JS::RootKind, JS::RootKind::Limit, + js::ActiveThreadData<mozilla::EnumeratedArray<JS::RootKind, JS::RootKind::Limit, mozilla::LinkedList<JS::PersistentRooted<void*>>>> heapRoots; void tracePersistentRoots(JSTracer* trc); void finishPersistentRoots(); void finishRoots(); public: @@ -440,40 +445,40 @@ struct JSRuntime : public js::MallocProv js::UnprotectedData<JS::AsmJSCacheOps> asmJSCacheOps; private: js::UnprotectedData<const JSPrincipals*> trustedPrincipals_; public: void setTrustedPrincipals(const JSPrincipals* p) { trustedPrincipals_ = p; } const JSPrincipals* trustedPrincipals() const { return trustedPrincipals_; } - js::UnprotectedData<const JSWrapObjectCallbacks*> wrapObjectCallbacks; - js::UnprotectedData<js::PreserveWrapperCallback> preserveWrapperCallback; + js::ActiveThreadData<const JSWrapObjectCallbacks*> wrapObjectCallbacks; + js::ActiveThreadData<js::PreserveWrapperCallback> preserveWrapperCallback; - js::UnprotectedData<js::ScriptEnvironmentPreparer*> scriptEnvironmentPreparer; + js::ActiveThreadData<js::ScriptEnvironmentPreparer*> scriptEnvironmentPreparer; - js::UnprotectedData<js::CTypesActivityCallback> ctypesActivityCallback; + js::ActiveThreadData<js::CTypesActivityCallback> ctypesActivityCallback; private: - js::UnprotectedData<const js::Class*> windowProxyClass_; + js::WriteOnceData<const js::Class*> windowProxyClass_; public: const js::Class* maybeWindowProxyClass() const { return windowProxyClass_; } void setWindowProxyClass(const js::Class* clasp) { windowProxyClass_ = clasp; } private: /* * Head of circular list of all enabled Debuggers that have * onNewGlobalObject handler methods established. */ - js::UnprotectedData<JSCList> onNewGlobalObjectWatchers_; + js::ActiveThreadData<JSCList> onNewGlobalObjectWatchers_; public: JSCList& onNewGlobalObjectWatchers() { return onNewGlobalObjectWatchers_.ref(); } private: /* * Lock taken when using per-runtime or per-zone data that could otherwise * be accessed simultaneously by multiple threads. * @@ -503,26 +508,26 @@ struct JSRuntime : public js::MallocProv return (!exclusiveThreadsPresent() && mainThreadHasExclusiveAccess) || exclusiveAccessLock.ownedByCurrentThread(); } #endif // How many compartments there are across all zones. This number includes // off main thread context compartments, so it isn't necessarily equal to the // number of compartments visited by CompartmentsIter. - js::UnprotectedData<size_t> numCompartments; + js::ActiveThreadData<size_t> numCompartments; /* Locale-specific callbacks for string conversion. */ - js::UnprotectedData<const JSLocaleCallbacks*> localeCallbacks; + js::ActiveThreadData<const JSLocaleCallbacks*> localeCallbacks; /* Default locale for Internationalization API */ - js::UnprotectedData<char*> defaultLocale; + js::ActiveThreadData<char*> defaultLocale; /* Default JSVersion. */ - js::UnprotectedData<JSVersion> defaultVersion_; + js::ActiveThreadData<JSVersion> defaultVersion_; private: /* Code coverage output. */ js::UnprotectedData<js::coverage::LCovRuntime> lcovOutput_; public: js::coverage::LCovRuntime& lcovOutput() { return lcovOutput_.ref(); } private: @@ -775,17 +780,17 @@ struct JSRuntime : public js::MallocProv bool transformToPermanentAtoms(JSContext* cx); // Cached well-known symbols (ES6 rev 24 6.1.5.1). Like permanent atoms, // these are shared with the parentRuntime, if any. js::WriteOnceData<js::WellKnownSymbols*> wellKnownSymbols; /* Shared Intl data for this runtime. */ - js::UnprotectedData<js::SharedIntlData> sharedIntlData; + js::ActiveThreadData<js::SharedIntlData> sharedIntlData; void traceSharedIntlData(JSTracer* trc); // Table of bytecode and other data that may be shared across scripts // within the runtime. This may be modified by threads using // AutoLockForExclusiveAccess. private: js::ExclusiveAccessLockData<js::ScriptDataTable> scriptDataTable_; @@ -846,17 +851,17 @@ struct JSRuntime : public js::MallocProv void addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* runtime); private: // Settings for how helper threads can be used. mozilla::Atomic<bool> offthreadIonCompilationEnabled_; mozilla::Atomic<bool> parallelParsingEnabled_; - js::UnprotectedData<bool> autoWritableJitCodeActive_; + js::ActiveThreadData<bool> autoWritableJitCodeActive_; public: // Note: these values may be toggled dynamically (in response to about:config // prefs changing). void setOffthreadIonCompilationEnabled(bool value) { offthreadIonCompilationEnabled_ = value; } @@ -871,22 +876,22 @@ struct JSRuntime : public js::MallocProv } void toggleAutoWritableJitCodeActive(bool b) { MOZ_ASSERT(autoWritableJitCodeActive_ != b, "AutoWritableJitCode should not be nested."); autoWritableJitCodeActive_ = b; } /* See comment for JS::SetLargeAllocationFailureCallback in jsapi.h. */ - js::UnprotectedData<JS::LargeAllocationFailureCallback> largeAllocationFailureCallback; - js::UnprotectedData<void*> largeAllocationFailureCallbackData; + js::ActiveThreadData<JS::LargeAllocationFailureCallback> largeAllocationFailureCallback; + js::ActiveThreadData<void*> largeAllocationFailureCallbackData; /* See comment for JS::SetOutOfMemoryCallback in jsapi.h. */ - js::UnprotectedData<JS::OutOfMemoryCallback> oomCallback; - js::UnprotectedData<void*> oomCallbackData; + js::ActiveThreadData<JS::OutOfMemoryCallback> oomCallback; + js::ActiveThreadData<void*> oomCallbackData; /* * These variations of malloc/calloc/realloc will call the * large-allocation-failure callback on OOM and retry the allocation. */ static const unsigned LARGE_ALLOCATION = 25 * 1024 * 1024; template <typename T> @@ -914,23 +919,23 @@ struct JSRuntime : public js::MallocProv } return static_cast<T*>(onOutOfMemoryCanGC(js::AllocFunction::Realloc, bytes, p)); } /* * Debugger.Memory functions like takeCensus use this embedding-provided * function to assess the size of malloc'd blocks of memory. */ - js::UnprotectedData<mozilla::MallocSizeOf> debuggerMallocSizeOf; + js::ActiveThreadData<mozilla::MallocSizeOf> debuggerMallocSizeOf; /* Last time at which an animation was played for this runtime. */ mozilla::Atomic<int64_t> lastAnimationTime; private: - js::UnprotectedData<js::PerformanceMonitoring> performanceMonitoring_; + js::ActiveThreadData<js::PerformanceMonitoring> performanceMonitoring_; public: js::PerformanceMonitoring& performanceMonitoring() { return performanceMonitoring_.ref(); } private: /* List of Ion compilation waiting to get linked. */ typedef mozilla::LinkedList<js::jit::IonBuilder> IonBuilderList; js::HelperThreadLockData<IonBuilderList> ionLazyLinkList_;
--- a/js/src/vm/SelfHosting.cpp +++ b/js/src/vm/SelfHosting.cpp @@ -40,17 +40,17 @@ #include "js/CharacterEncoding.h" #include "js/Date.h" #include "vm/Compression.h" #include "vm/GeneratorObject.h" #include "vm/Interpreter.h" #include "vm/RegExpObject.h" #include "vm/String.h" #include "vm/StringBuffer.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "vm/WrapperObject.h" #include "jsatominlines.h" #include "jsfuninlines.h" #include "jsobjinlines.h" #include "jsscriptinlines.h" #include "vm/BooleanObject-inl.h"
--- a/js/src/vm/Shape-inl.h +++ b/js/src/vm/Shape-inl.h @@ -10,17 +10,17 @@ #include "vm/Shape.h" #include "mozilla/TypeTraits.h" #include "jsobj.h" #include "gc/Allocator.h" #include "vm/Interpreter.h" -#include "vm/TypedArrayCommon.h" +#include "vm/TypedArrayObject.h" #include "jsatominlines.h" #include "jscntxtinlines.h" namespace js { inline AutoKeepShapeTables::AutoKeepShapeTables(JSContext* cx)
--- a/js/src/vm/SharedArrayObject.cpp +++ b/js/src/vm/SharedArrayObject.cpp @@ -17,18 +17,18 @@ #include "jswrapper.h" #ifndef XP_WIN # include <sys/mman.h> #endif #ifdef MOZ_VALGRIND # include <valgrind/memcheck.h> #endif +#include "jit/AtomicOperations.h" #include "vm/SharedMem.h" -#include "vm/TypedArrayCommon.h" #include "wasm/AsmJS.h" #include "wasm/WasmTypes.h" #include "jsobjinlines.h" #include "vm/NativeObject-inl.h" using namespace js;
rename from js/src/vm/TypedArrayCommon.h rename to js/src/vm/TypedArrayObject-inl.h --- a/js/src/vm/TypedArrayCommon.h +++ b/js/src/vm/TypedArrayObject-inl.h @@ -1,34 +1,35 @@ /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef vm_TypedArrayCommon_h -#define vm_TypedArrayCommon_h +#ifndef vm_TypedArrayObject_inl_h +#define vm_TypedArrayObject_inl_h /* Utilities and common inline code for TypedArray */ +#include "vm/TypedArrayObject.h" + #include "mozilla/Assertions.h" #include "mozilla/FloatingPoint.h" #include "mozilla/PodOperations.h" #include "jsarray.h" #include "jscntxt.h" #include "jsnum.h" #include "jit/AtomicOperations.h" #include "js/Conversions.h" #include "js/Value.h" #include "vm/NativeObject.h" -#include "vm/TypedArrayObject.h" namespace js { // ValueIsLength happens not to be according to ES6, which mandates // the use of ToLength, which in turn includes ToNumber, ToInteger, // and clamping. ValueIsLength is used in the current TypedArray code // but will disappear when that code is made spec-compliant. @@ -253,64 +254,56 @@ class UnsharedOps mozilla::PodMove(dest.unwrapUnshared(), src.unwrapUnshared(), nelem); } static SharedMem<void*> extract(TypedArrayObject* obj) { return SharedMem<void*>::unshared(obj->viewDataUnshared()); } }; -template<class SpecificArray, typename Ops> +template<typename T, typename Ops> class ElementSpecific { - typedef typename SpecificArray::ElementType T; - typedef typename SpecificArray::SomeTypedArray SomeTypedArray; - public: /* * Copy |source|'s elements into |target|, starting at |target[offset]|. * Act as if the assignments occurred from a fresh copy of |source|, in * case the two memory ranges overlap. */ static bool setFromTypedArray(JSContext* cx, - Handle<SomeTypedArray*> target, HandleObject source, + Handle<TypedArrayObject*> target, Handle<TypedArrayObject*> source, uint32_t offset) { - MOZ_ASSERT(SpecificArray::ArrayTypeID() == target->type(), + MOZ_ASSERT(TypeIDOfType<T>::id == target->type(), "calling wrong setFromTypedArray specialization"); MOZ_ASSERT(offset <= target->length()); - MOZ_ASSERT(source->as<TypedArrayObject>().length() <= target->length() - offset); + MOZ_ASSERT(source->length() <= target->length() - offset); - if (source->is<SomeTypedArray>()) { - Rooted<SomeTypedArray*> src(cx, source.as<SomeTypedArray>()); - if (SomeTypedArray::sameBuffer(target, src)) - return setFromOverlappingTypedArray(cx, target, src, offset); - } + if (TypedArrayObject::sameBuffer(target, source)) + return setFromOverlappingTypedArray(cx, target, source, offset); - SharedMem<T*> dest = - target->template as<TypedArrayObject>().viewDataEither().template cast<T*>() + offset; - uint32_t count = source->as<TypedArrayObject>().length(); + SharedMem<T*> dest = target->viewDataEither().template cast<T*>() + offset; + uint32_t count = source->length(); - if (source->as<TypedArrayObject>().type() == target->type()) { - Ops::podCopy(dest, source->as<TypedArrayObject>().viewDataEither().template cast<T*>(), - count); + if (source->type() == target->type()) { + Ops::podCopy(dest, source->viewDataEither().template cast<T*>(), count); return true; } // Inhibit unaligned accesses on ARM (bug 1097253, a compiler bug). #ifdef __arm__ # define JS_VOLATILE_ARM volatile #else # define JS_VOLATILE_ARM #endif - SharedMem<void*> data = Ops::extract(source.as<TypedArrayObject>()); - switch (source->as<TypedArrayObject>().type()) { + SharedMem<void*> data = Ops::extract(source); + switch (source->type()) { case Scalar::Int8: { SharedMem<JS_VOLATILE_ARM int8_t*> src = data.cast<JS_VOLATILE_ARM int8_t*>(); for (uint32_t i = 0; i < count; ++i) Ops::store(dest++, ConvertNumber<T>(Ops::load(src++))); break; } case Scalar::Uint8: case Scalar::Uint8Clamped: { @@ -365,32 +358,31 @@ class ElementSpecific } /* * Copy |source[0]| to |source[len]| (exclusive) elements into the typed * array |target|, starting at index |offset|. |source| must not be a * typed array. */ static bool - setFromNonTypedArray(JSContext* cx, Handle<SomeTypedArray*> target, HandleObject source, + setFromNonTypedArray(JSContext* cx, Handle<TypedArrayObject*> target, HandleObject source, uint32_t len, uint32_t offset = 0) { - MOZ_ASSERT(target->type() == SpecificArray::ArrayTypeID(), + MOZ_ASSERT(target->type() == TypeIDOfType<T>::id, "target type and NativeType must match"); MOZ_ASSERT(!source->is<TypedArrayObject>(), "use setFromTypedArray instead of this method"); uint32_t i = 0; if (source->isNative()) { // Attempt fast-path infallible conversion of dense elements up to // the first potentially side-effectful lookup or conversion. uint32_t bound = Min(source->as<NativeObject>().getDenseInitializedLength(), len); - SharedMem<T*> dest = - target->template as<TypedArrayObject>().viewDataEither().template cast<T*>() + offset; + SharedMem<T*> dest = target->viewDataEither().template cast<T*>() + offset; MOZ_ASSERT(!canConvertInfallibly(MagicValue(JS_ELEMENTS_HOLE)), "the following loop must abort on holes"); const Value* srcValues = source->as<NativeObject>().getDenseElements(); for (; i < bound; i++) { if (!canConvertInfallibly(srcValues[i])) break; @@ -410,45 +402,42 @@ class ElementSpecific if (!valueToNative(cx, v, &n)) return false; len = Min(len, target->length()); if (i >= len) break; // Compute every iteration in case getElement/valueToNative is wacky. - SharedMem<T*> dest = - target->template as<TypedArrayObject>().viewDataEither().template cast<T*>() + - offset + i; + SharedMem<T*> dest = target->viewDataEither().template cast<T*>() + offset + i; Ops::store(dest, n); } return true; } /* * Copy |source| into the typed array |target|. */ static bool - initFromIterablePackedArray(JSContext* cx, Handle<SomeTypedArray*> target, + initFromIterablePackedArray(JSContext* cx, Handle<TypedArrayObject*> target, HandleArrayObject source) { - MOZ_ASSERT(target->type() == SpecificArray::ArrayTypeID(), + MOZ_ASSERT(target->type() == TypeIDOfType<T>::id, "target type and NativeType must match"); MOZ_ASSERT(IsPackedArray(source), "source array must be packed"); MOZ_ASSERT(source->getDenseInitializedLength() <= target->length()); uint32_t len = source->getDenseInitializedLength(); uint32_t i = 0; // Attempt fast-path infallible conversion of dense elements up to the // first potentially side-effectful conversion. - SharedMem<T*> dest = - target->template as<TypedArrayObject>().viewDataEither().template cast<T*>(); + SharedMem<T*> dest = target->viewDataEither().template cast<T*>(); const Value* srcValues = source->getDenseElements(); for (; i < len; i++) { if (!canConvertInfallibly(srcValues[i])) break; Ops::store(dest + i, infallibleValueToNative(srcValues[i])); } if (i == len) @@ -469,58 +458,55 @@ class ElementSpecific return false; // |target| is a newly allocated typed array and not yet visible to // content script, so valueToNative can't detach the underlying // buffer. MOZ_ASSERT(i < target->length()); // Compute every iteration in case GC moves the data. - SharedMem<T*> newDest = - target->template as<TypedArrayObject>().viewDataEither().template cast<T*>(); + SharedMem<T*> newDest = target->viewDataEither().template cast<T*>(); Ops::store(newDest + i, n); } return true; } private: static bool setFromOverlappingTypedArray(JSContext* cx, - Handle<SomeTypedArray*> target, - Handle<SomeTypedArray*> source, + Handle<TypedArrayObject*> target, + Handle<TypedArrayObject*> source, uint32_t offset) { - MOZ_ASSERT(SpecificArray::ArrayTypeID() == target->type(), + MOZ_ASSERT(TypeIDOfType<T>::id == target->type(), "calling wrong setFromTypedArray specialization"); - MOZ_ASSERT(SomeTypedArray::sameBuffer(target, source), + MOZ_ASSERT(TypedArrayObject::sameBuffer(target, source), "the provided arrays don't actually overlap, so it's " "undesirable to use this method"); MOZ_ASSERT(offset <= target->length()); MOZ_ASSERT(source->length() <= target->length() - offset); - SharedMem<T*> dest = - target->template as<TypedArrayObject>().viewDataEither().template cast<T*>() + offset; + SharedMem<T*> dest = target->viewDataEither().template cast<T*>() + offset; uint32_t len = source->length(); if (source->type() == target->type()) { - SharedMem<T*> src = - source->template as<TypedArrayObject>().viewDataEither().template cast<T*>(); + SharedMem<T*> src = source->viewDataEither().template cast<T*>(); Ops::podMove(dest, src, len); return true; } // Copy |source| in case it overlaps the target elements being set. size_t sourceByteLen = len * source->bytesPerElement(); void* data = target->zone()->template pod_malloc<uint8_t>(sourceByteLen); if (!data) return false; Ops::memcpy(SharedMem<void*>::unshared(data), - source->template as<TypedArrayObject>().viewDataEither(), + source->viewDataEither(), sourceByteLen); switch (source->type()) { case Scalar::Int8: { int8_t* src = static_cast<int8_t*>(data); for (uint32_t i = 0; i < len; ++i) Ops::store(dest++, ConvertNumber<T>(*src++)); break; @@ -628,260 +614,19 @@ class ElementSpecific // inconsistency could confuse deterministic testing, so always // canonicalize NaN values in more-deterministic builds. d = JS::CanonicalizeNaN(d); #endif return T(d); } if (MOZ_UNLIKELY(mozilla::IsNaN(d))) return T(0); - if (SpecificArray::ArrayTypeID() == Scalar::Uint8Clamped) + if (TypeIDOfType<T>::id == Scalar::Uint8Clamped) return T(d); if (TypeIsUnsigned<T>()) return T(JS::ToUint32(d)); return T(JS::ToInt32(d)); } }; -template<typename SomeTypedArray> -class TypedArrayMethods -{ - static_assert(mozilla::IsSame<SomeTypedArray, TypedArrayObject>::value, - "methods must be shared/unshared-specific, not " - "element-type-specific"); - - typedef typename SomeTypedArray::BufferType BufferType; - - typedef typename SomeTypedArray::template OfType<int8_t>::Type Int8ArrayType; - typedef typename SomeTypedArray::template OfType<uint8_t>::Type Uint8ArrayType; - typedef typename SomeTypedArray::template OfType<int16_t>::Type Int16ArrayType; - typedef typename SomeTypedArray::template OfType<uint16_t>::Type Uint16ArrayType; - typedef typename SomeTypedArray::template OfType<int32_t>::Type Int32ArrayType; - typedef typename SomeTypedArray::template OfType<uint32_t>::Type Uint32ArrayType; - typedef typename SomeTypedArray::template OfType<float>::Type Float32ArrayType; - typedef typename SomeTypedArray::template OfType<double>::Type Float64ArrayType; - typedef typename SomeTypedArray::template OfType<uint8_clamped>::Type Uint8ClampedArrayType; - - public: - /* set(array[, offset]) */ - static bool - set(JSContext* cx, const CallArgs& args) - { - MOZ_ASSERT(SomeTypedArray::is(args.thisv())); - - Rooted<SomeTypedArray*> target(cx, &args.thisv().toObject().as<SomeTypedArray>()); - - // The first argument must be either a typed array or arraylike. - if (args.length() == 0 || !args[0].isObject()) { - JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS); - return false; - } - - int32_t offset = 0; - if (args.length() > 1) { - if (!ToInt32(cx, args[1], &offset)) - return false; - - if (offset < 0 || uint32_t(offset) > target->length()) { - // the given offset is bogus - JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_INDEX); - return false; - } - } - - RootedObject arg0(cx, &args[0].toObject()); - if (arg0->is<TypedArrayObject>()) { - if (arg0->as<TypedArrayObject>().length() > target->length() - offset) { - JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH); - return false; - } - - if (!setFromTypedArray(cx, target, arg0, offset)) - return false; - } else { - uint32_t len; - if (!GetLengthProperty(cx, arg0, &len)) - return false; - - if (uint32_t(offset) > target->length() || len > target->length() - offset) { - JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH); - return false; - } - - if (!setFromNonTypedArray(cx, target, arg0, len, offset)) - return false; - } - - args.rval().setUndefined(); - return true; - } - - static bool - setFromTypedArray(JSContext* cx, Handle<SomeTypedArray*> target, HandleObject source, - uint32_t offset = 0) - { - MOZ_ASSERT(source->is<TypedArrayObject>(), "use setFromNonTypedArray"); - - bool isShared = target->isSharedMemory() || source->as<TypedArrayObject>().isSharedMemory(); - - switch (target->type()) { - case Scalar::Int8: - if (isShared) - return ElementSpecific<Int8ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Int8ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Uint8: - if (isShared) - return ElementSpecific<Uint8ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Uint8ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Int16: - if (isShared) - return ElementSpecific<Int16ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Int16ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Uint16: - if (isShared) - return ElementSpecific<Uint16ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Uint16ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Int32: - if (isShared) - return ElementSpecific<Int32ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Int32ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Uint32: - if (isShared) - return ElementSpecific<Uint32ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Uint32ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Float32: - if (isShared) - return ElementSpecific<Float32ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Float32ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Float64: - if (isShared) - return ElementSpecific<Float64ArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Float64ArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Uint8Clamped: - if (isShared) - return ElementSpecific<Uint8ClampedArrayType, SharedOps>::setFromTypedArray(cx, target, source, offset); - return ElementSpecific<Uint8ClampedArrayType, UnsharedOps>::setFromTypedArray(cx, target, source, offset); - case Scalar::Int64: - case Scalar::Float32x4: - case Scalar::Int8x16: - case Scalar::Int16x8: - case Scalar::Int32x4: - case Scalar::MaxTypedArrayViewType: - break; - } - - MOZ_CRASH("nonsense target element type"); - } - - static bool - setFromNonTypedArray(JSContext* cx, Handle<SomeTypedArray*> target, HandleObject source, - uint32_t len, uint32_t offset = 0) - { - MOZ_ASSERT(!source->is<TypedArrayObject>(), "use setFromTypedArray"); - - bool isShared = target->isSharedMemory(); - - switch (target->type()) { - case Scalar::Int8: - if (isShared) - return ElementSpecific<Int8ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Int8ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Uint8: - if (isShared) - return ElementSpecific<Uint8ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Uint8ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Int16: - if (isShared) - return ElementSpecific<Int16ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Int16ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Uint16: - if (isShared) - return ElementSpecific<Uint16ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Uint16ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Int32: - if (isShared) - return ElementSpecific<Int32ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Int32ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Uint32: - if (isShared) - return ElementSpecific<Uint32ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Uint32ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Float32: - if (isShared) - return ElementSpecific<Float32ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Float32ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Float64: - if (isShared) - return ElementSpecific<Float64ArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Float64ArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Uint8Clamped: - if (isShared) - return ElementSpecific<Uint8ClampedArrayType, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - return ElementSpecific<Uint8ClampedArrayType, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); - case Scalar::Int64: - case Scalar::Float32x4: - case Scalar::Int8x16: - case Scalar::Int16x8: - case Scalar::Int32x4: - case Scalar::MaxTypedArrayViewType: - break; - } - MOZ_CRASH("bad target array type"); - } - - static bool - initFromIterablePackedArray(JSContext* cx, Handle<SomeTypedArray*> target, - HandleArrayObject source) - { - bool isShared = target->isSharedMemory(); - - switch (target->type()) { - case Scalar::Int8: - if (isShared) - return ElementSpecific<Int8ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Int8ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Uint8: - if (isShared) - return ElementSpecific<Uint8ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Uint8ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Int16: - if (isShared) - return ElementSpecific<Int16ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Int16ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Uint16: - if (isShared) - return ElementSpecific<Uint16ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Uint16ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Int32: - if (isShared) - return ElementSpecific<Int32ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Int32ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Uint32: - if (isShared) - return ElementSpecific<Uint32ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Uint32ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Float32: - if (isShared) - return ElementSpecific<Float32ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Float32ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Float64: - if (isShared) - return ElementSpecific<Float64ArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Float64ArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Uint8Clamped: - if (isShared) - return ElementSpecific<Uint8ClampedArrayType, SharedOps>::initFromIterablePackedArray(cx, target, source); - return ElementSpecific<Uint8ClampedArrayType, UnsharedOps>::initFromIterablePackedArray(cx, target, source); - case Scalar::Int64: - case Scalar::Float32x4: - case Scalar::Int8x16: - case Scalar::Int16x8: - case Scalar::Int32x4: - case Scalar::MaxTypedArrayViewType: - break; - } - MOZ_CRASH("bad target array type"); - } -}; - } // namespace js -#endif // vm_TypedArrayCommon_h +#endif // vm_TypedArrayObject_inl_h
--- a/js/src/vm/TypedArrayObject.cpp +++ b/js/src/vm/TypedArrayObject.cpp @@ -1,14 +1,15 @@ /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "vm/TypedArrayObject-inl.h" #include "vm/TypedArrayObject.h" #include "mozilla/Alignment.h" #include "mozilla/Casting.h" #include "mozilla/FloatingPoint.h" #include "mozilla/PodOperations.h" #include <string.h> @@ -36,17 +37,16 @@ #include "jit/InlinableNatives.h" #include "js/Conversions.h" #include "vm/ArrayBufferObject.h" #include "vm/GlobalObject.h" #include "vm/Interpreter.h" #include "vm/PIC.h" #include "vm/SelfHosting.h" #include "vm/SharedMem.h" -#include "vm/TypedArrayCommon.h" #include "vm/WrapperObject.h" #include "jsatominlines.h" #include "gc/Nursery-inl.h" #include "gc/StoreBuffer-inl.h" #include "vm/ArrayBufferObject-inl.h" #include "vm/NativeObject-inl.h" @@ -341,18 +341,16 @@ enum class SpeciesConstructorOverride { }; template<typename NativeType> class TypedArrayObjectTemplate : public TypedArrayObject { friend class TypedArrayObject; public: - typedef NativeType ElementType; - static constexpr Scalar::Type ArrayTypeID() { return TypeIDOfType<NativeType>::id; } static bool ArrayTypeIsUnsigned() { return TypeIsUnsigned<NativeType>(); } static bool ArrayTypeIsFloatingPoint() { return TypeIsFloatingPoint<NativeType>(); } static const size_t BYTES_PER_ELEMENT = sizeof(NativeType); static JSObject* createPrototype(JSContext* cx, JSProtoKey key) @@ -1023,22 +1021,16 @@ js::TypedArrayCreateWithTemplate(JSConte return TypedArrayObjectTemplate<T>::makeTypedArrayWithTemplate(cx, tobj, len); JS_FOR_EACH_TYPED_ARRAY(CREATE_TYPED_ARRAY) #undef CREATE_TYPED_ARRAY default: MOZ_CRASH("Unsupported TypedArray type"); } } -template<typename T> -struct TypedArrayObject::OfType -{ - typedef TypedArrayObjectTemplate<T> Type; -}; - // ES 2016 draft Mar 25, 2016 24.1.1.1. // byteLength = count * unit template<typename T> /* static */ bool TypedArrayObjectTemplate<T>::AllocateArrayBuffer(JSContext* cx, HandleValue ctor, uint32_t count, uint32_t unit, MutableHandle<ArrayBufferObject*> buffer) { @@ -1275,18 +1267,24 @@ TypedArrayObjectTemplate<T>::fromTypedAr } // Steps 3, 4 (remaining part), 19-22. Rooted<TypedArrayObject*> obj(cx, makeInstance(cx, buffer, 0, elementLength, proto)); if (!obj) return nullptr; // Step 18.d-g or 24.1.1.4 step 11. - if (!TypedArrayMethods<TypedArrayObject>::setFromTypedArray(cx, obj, srcArray)) - return nullptr; + MOZ_ASSERT(!obj->isSharedMemory()); + if (isShared) { + if (!ElementSpecific<T, SharedOps>::setFromTypedArray(cx, obj, srcArray, 0)) + return nullptr; + } else { + if (!ElementSpecific<T, UnsharedOps>::setFromTypedArray(cx, obj, srcArray, 0)) + return nullptr; + } // Step 23. return obj; } static MOZ_ALWAYS_INLINE bool IsOptimizableInit(JSContext* cx, HandleObject iterable, bool* optimized) { @@ -1332,17 +1330,18 @@ TypedArrayObjectTemplate<T>::fromObject( if (!maybeCreateArrayBuffer(cx, len, BYTES_PER_ELEMENT, nullptr, &buffer)) return nullptr; Rooted<TypedArrayObject*> obj(cx, makeInstance(cx, buffer, 0, len, proto)); if (!obj) return nullptr; // Steps 6.d-e. - if (!TypedArrayMethods<TypedArrayObject>::initFromIterablePackedArray(cx, obj, array)) + MOZ_ASSERT(!obj->isSharedMemory()); + if (!ElementSpecific<T, UnsharedOps>::initFromIterablePackedArray(cx, obj, array)) return nullptr; // Step 6.f (The assertion isn't applicable for the fast path). // Step 6.g. return obj; } @@ -1398,17 +1397,18 @@ TypedArrayObjectTemplate<T>::fromObject( if (!maybeCreateArrayBuffer(cx, len, BYTES_PER_ELEMENT, nullptr, &buffer)) return nullptr; Rooted<TypedArrayObject*> obj(cx, makeInstance(cx, buffer, 0, len, proto)); if (!obj) return nullptr; // Steps 11-12. - if (!TypedArrayMethods<TypedArrayObject>::setFromNonTypedArray(cx, obj, arrayLike, len)) + MOZ_ASSERT(!obj->isSharedMemory()); + if (!ElementSpecific<T, UnsharedOps>::setFromNonTypedArray(cx, obj, arrayLike, len)) return nullptr; // Step 13. return obj; } bool TypedArrayConstructor(JSContext* cx, unsigned argc, Value* vp) @@ -1450,17 +1450,17 @@ JS_FOR_EACH_TYPED_ARRAY(CHECK_TYPED_ARRA * going to be around forever (and since this bug is fixed with the newer GCC * versions we use on JB and KK), the workaround here is designed for ease of * removal. When you stop seeing ICS Emulator builds on TBPL, remove these 3 * JSNatives and insert the templated callee directly into the JS_PSG below. */ static bool TypedArray_lengthGetter(JSContext* cx, unsigned argc, Value* vp) { - return TypedArrayObject::Getter<TypedArrayObject::lengthValue>(cx, argc, vp); \ + return TypedArrayObject::Getter<TypedArrayObject::lengthValue>(cx, argc, vp); } static bool TypedArray_byteLengthGetter(JSContext* cx, unsigned argc, Value* vp) { return TypedArrayObject::Getter<TypedArrayObject::byteLengthValue>(cx, argc, vp); } @@ -1493,22 +1493,115 @@ TypedArrayObject::protoAccessors[] = { JS_PSG("length", TypedArray_lengthGetter, 0), JS_PSG("buffer", TypedArray_bufferGetter, 0), JS_PSG("byteLength", TypedArray_byteLengthGetter, 0), JS_PSG("byteOffset", TypedArray_byteOffsetGetter, 0), JS_SELF_HOSTED_SYM_GET(toStringTag, "TypedArrayToStringTag", 0), JS_PS_END }; +template<typename T> +static inline bool +SetFromTypedArray(JSContext* cx, Handle<TypedArrayObject*> target, + Handle<TypedArrayObject*> source, uint32_t offset) +{ + if (target->isSharedMemory() || source->isSharedMemory()) + return ElementSpecific<T, SharedOps>::setFromTypedArray(cx, target, source, offset); + return ElementSpecific<T, UnsharedOps>::setFromTypedArray(cx, target, source, offset); +} + +template<typename T> +static inline bool +SetFromNonTypedArray(JSContext* cx, Handle<TypedArrayObject*> target, HandleObject source, + uint32_t len, uint32_t offset) +{ + MOZ_ASSERT(!source->is<TypedArrayObject>(), "use SetFromTypedArray"); + + if (target->isSharedMemory()) + return ElementSpecific<T, SharedOps>::setFromNonTypedArray(cx, target, source, len, offset); + return ElementSpecific<T, UnsharedOps>::setFromNonTypedArray(cx, target, source, len, offset); +} + +/* set(array[, offset]) */ +/* static */ bool +TypedArrayObject::set_impl(JSContext* cx, const CallArgs& args) +{ + MOZ_ASSERT(TypedArrayObject::is(args.thisv())); + + Rooted<TypedArrayObject*> target(cx, &args.thisv().toObject().as<TypedArrayObject>()); + + // The first argument must be either a typed array or arraylike. + if (args.length() == 0 || !args[0].isObject()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS); + return false; + } + + int32_t offset = 0; + if (args.length() > 1) { + if (!ToInt32(cx, args[1], &offset)) + return false; + + if (offset < 0 || uint32_t(offset) > target->length()) { + // the given offset is bogus + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_INDEX); + return false; + } + } + + RootedObject arg0(cx, &args[0].toObject()); + if (arg0->is<TypedArrayObject>()) { + Handle<TypedArrayObject*> source = arg0.as<TypedArrayObject>(); + if (source->length() > target->length() - offset) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH); + return false; + } + + switch (target->type()) { +#define SET_FROM_TYPED_ARRAY(T, N) \ + case Scalar::N: \ + if (!SetFromTypedArray<T>(cx, target, source, offset)) \ + return false; \ + break; +JS_FOR_EACH_TYPED_ARRAY(SET_FROM_TYPED_ARRAY) +#undef SET_FROM_TYPED_ARRAY + default: + MOZ_CRASH("Unsupported TypedArray type"); + } + } else { + uint32_t len; + if (!GetLengthProperty(cx, arg0, &len)) + return false; + + if (uint32_t(offset) > target->length() || len > target->length() - offset) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH); + return false; + } + + switch (target->type()) { +#define SET_FROM_NON_TYPED_ARRAY(T, N) \ + case Scalar::N: \ + if (!SetFromNonTypedArray<T>(cx, target, arg0, len, offset)) \ + return false; \ + break; +JS_FOR_EACH_TYPED_ARRAY(SET_FROM_NON_TYPED_ARRAY) +#undef SET_FROM_NON_TYPED_ARRAY + default: + MOZ_CRASH("Unsupported TypedArray type"); + } + } + + args.rval().setUndefined(); + return true; +} + /* static */ bool TypedArrayObject::set(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); - return CallNonGenericMethod<TypedArrayObject::is, - TypedArrayMethods<TypedArrayObject>::set>(cx, args); + return CallNonGenericMethod<TypedArrayObject::is, TypedArrayObject::set_impl>(cx, args); } /* static */ const JSFunctionSpec TypedArrayObject::protoFunctions[] = { JS_SELF_HOSTED_FN("subarray", "TypedArraySubarray", 2, 0), #if 0 /* disabled until perf-testing is completed */ JS_SELF_HOSTED_FN("set", "TypedArraySet", 2, 0), #else
--- a/js/src/vm/TypedArrayObject.h +++ b/js/src/vm/TypedArrayObject.h @@ -7,16 +7,17 @@ #ifndef vm_TypedArrayObject_h #define vm_TypedArrayObject_h #include "mozilla/Attributes.h" #include "jsobj.h" #include "gc/Barrier.h" +#include "gc/Zone.h" #include "js/Class.h" #include "vm/ArrayBufferObject.h" #include "vm/SharedArrayObject.h" #define JS_FOR_EACH_TYPED_ARRAY(macro) \ macro(int8_t, Int8) \ macro(uint8_t, Uint8) \ macro(int16_t, Int16) \ @@ -75,21 +76,16 @@ class TypedArrayObject : public NativeOb // // This offset is exposed for performance reasons - so that it // need not be looked up on accesses. static const size_t DATA_SLOT = 3; static_assert(js::detail::TypedArrayLengthSlot == LENGTH_SLOT, "bad inlined constant in jsfriendapi.h"); - typedef TypedArrayObject SomeTypedArray; - typedef ArrayBufferObject BufferType; - - template<typename T> struct OfType; - static bool sameBuffer(Handle<TypedArrayObject*> a, Handle<TypedArrayObject*> b) { // Inline buffers. if (!a->hasBuffer() || !b->hasBuffer()) return a.get() == b.get(); // Shared buffers. if (a->isSharedMemory() && b->isSharedMemory()) { return (a->bufferObject()->as<SharedArrayBufferObject>().globalID() == @@ -302,16 +298,19 @@ class TypedArrayObject : public NativeOb static const JSFunctionSpec staticFunctions[]; static const JSPropertySpec staticProperties[]; /* Accessors and functions */ static bool is(HandleValue v); static bool set(JSContext* cx, unsigned argc, Value* vp); + + private: + static bool set_impl(JSContext* cx, const CallArgs& args); }; MOZ_MUST_USE bool TypedArray_bufferGetter(JSContext* cx, unsigned argc, Value* vp); extern TypedArrayObject* TypedArrayCreateWithTemplate(JSContext* cx, HandleObject templateObj, int32_t len); inline bool
--- a/js/src/wasm/AsmJS.cpp +++ b/js/src/wasm/AsmJS.cpp @@ -28,16 +28,17 @@ #include "jsstr.h" #include "jsutil.h" #include "jswrapper.h" #include "builtin/SIMD.h" #include "frontend/Parser.h" #include "gc/Policy.h" +#include "jit/AtomicOperations.h" #include "js/MemoryMetrics.h" #include "vm/SelfHosting.h" #include "vm/StringBuffer.h" #include "vm/Time.h" #include "vm/TypedArrayObject.h" #include "wasm/WasmCompile.h" #include "wasm/WasmGenerator.h" #include "wasm/WasmInstance.h"
--- a/js/src/wasm/WasmBaselineCompile.cpp +++ b/js/src/wasm/WasmBaselineCompile.cpp @@ -6406,23 +6406,50 @@ BaseCompiler::emitSelect() emitBranchPerform(&b); moveI32(r1, r0); masm.bind(&done); freeI32(r1); pushI32(r0); break; } case ValType::I64: { +#ifdef JS_CODEGEN_X86 + // There may be as many as four Int64 values in registers at a time: two + // for the latent branch operands, and two for the true/false values we + // normally pop before executing the branch. On x86 this is one value + // too many, so we need to generate more complicated code here, and for + // simplicity's sake we do so even if the branch operands are not Int64. + // However, the resulting control flow diamond is complicated since the + // arms of the diamond will have to stay synchronized with respect to + // their evaluation stack and regalloc state. To simplify further, we + // use a double branch and a temporary boolean value for now. + RegI32 tmp = needI32(); + loadConstI32(tmp, 0); + emitBranchPerform(&b); + loadConstI32(tmp, 1); + masm.bind(&done); + + Label trueValue; + RegI64 r0, r1; + pop2xI64(&r0, &r1); + masm.branch32(Assembler::Equal, tmp, Imm32(0), &trueValue); + moveI64(r1, r0); + masm.bind(&trueValue); + freeI32(tmp); + freeI64(r1); + pushI64(r0); +#else RegI64 r0, r1; pop2xI64(&r0, &r1); emitBranchPerform(&b); moveI64(r1, r0); masm.bind(&done); freeI64(r1); pushI64(r0); +#endif break; } case ValType::F32: { RegF32 r0, r1; pop2xF32(&r0, &r1); emitBranchPerform(&b); moveF32(r1, r0); masm.bind(&done);
--- a/layout/style/FontFaceSet.cpp +++ b/layout/style/FontFaceSet.cpp @@ -1497,17 +1497,17 @@ FontFaceSet::CheckLoadingStarted() if (mStatus == FontFaceSetLoadStatus::Loading) { // We have already dispatched a loading event and replaced mReady // with a fresh, unresolved promise. return; } mStatus = FontFaceSetLoadStatus::Loading; (new AsyncEventDispatcher(this, NS_LITERAL_STRING("loading"), - false))->RunDOMEventWhenSafe(); + false))->PostDOMEvent(); if (PrefEnabled()) { if (mReady) { if (GetParentObject()) { ErrorResult rv; mReady = Promise::Create(GetParentObject(), rv); } } @@ -1653,17 +1653,17 @@ FontFaceSet::DispatchLoadingFinishedEven OwningNonNull<FontFace>* elements = init.mFontfaces.AppendElements(aFontFaces.Length(), fallible); MOZ_ASSERT(elements); for (size_t i = 0; i < aFontFaces.Length(); i++) { elements[i] = aFontFaces[i]; } RefPtr<FontFaceSetLoadEvent> event = FontFaceSetLoadEvent::Constructor(this, aType, init); - (new AsyncEventDispatcher(this, event))->RunDOMEventWhenSafe(); + (new AsyncEventDispatcher(this, event))->PostDOMEvent(); } // nsIDOMEventListener NS_IMETHODIMP FontFaceSet::HandleEvent(nsIDOMEvent* aEvent) { nsString type;
--- a/layout/style/test/mochitest.ini +++ b/layout/style/test/mochitest.ini @@ -31,20 +31,19 @@ support-files = visited_image_loading_frame.html visited_image_loading.sjs visited-lying-inner.html visited-pref-iframe.html xbl_bindings.xml [test_acid3_test46.html] [test_addSheet.html] -skip-if = stylo # bug 1290224 support-files = additional_sheets_helper.html [test_additional_sheets.html] -skip-if = stylo # bug 1290224 +skip-if = stylo # bug 1337258 support-files = additional_sheets_helper.html [test_align_justify_computed_values.html] [test_align_shorthand_serialization.html] [test_all_shorthand.html] [test_animations.html] skip-if = toolkit == 'android' [test_animations_async_tests.html] support-files = ../../reftests/fonts/Ahem.ttf file_animations_async_tests.html @@ -136,17 +135,16 @@ support-files = file_bug645998-1.css fil [test_bug732153.html] [test_bug732209.html] support-files = bug732209-css.sjs [test_bug765590.html] [test_bug771043.html] [test_bug795520.html] [test_bug798567.html] [test_bug798843_pref.html] -skip-if = stylo # 1332969 [test_bug829816.html] [test_bug874919.html] support-files = file_bug829816.css [test_bug887741_at-rules_in_declaration_lists.html] [test_bug892929.html] [test_bug1055933.html] support-files = file_bug1055933_circle-xxl.png [test_bug1089417.html] @@ -179,17 +177,16 @@ skip-if = toolkit == 'android' #bug 5366 [test_css_loader_crossorigin_data_url.html] [test_css_supports.html] [test_css_supports_variables.html] [test_default_bidi_css.html] [test_default_computed_style.html] [test_descriptor_storage.html] [test_descriptor_syntax_errors.html] [test_dont_use_document_colors.html] -skip-if = stylo # bug 1332969 [test_dynamic_change_causing_reflow.html] [test_exposed_prop_accessors.html] [test_extra_inherit_initial.html] [test_flexbox_child_display_values.xhtml] [test_flexbox_flex_grow_and_shrink.html] [test_flexbox_flex_shorthand.html] [test_flexbox_layout.html] support-files = flexbox_layout_testcases.js @@ -222,27 +219,25 @@ skip-if = toolkit == 'android' [test_load_events_on_stylesheets.html] [test_logical_properties.html] [test_media_queries.html] skip-if = android_version == '18' #debug-only failure; timed out #Android 4.3 aws only; bug 1030419 [test_media_queries_dynamic.html] [test_media_queries_dynamic_xbl.html] [test_media_query_list.html] [test_moz_device_pixel_ratio.html] -skip-if = stylo # bug 1332969 [test_namespace_rule.html] [test_of_type_selectors.xhtml] [test_page_parser.html] [test_parse_eof.html] [test_parse_ident.html] [test_parse_rule.html] [test_parse_url.html] [test_parser_diagnostics_unprintables.html] [test_pixel_lengths.html] -skip-if = stylo # bug 1332969 [test_pointer-events.html] [test_position_float_display.html] [test_position_sticky.html] [test_priority_preservation.html] [test_property_database.html] [test_property_syntax_errors.html] [test_pseudoelement_state.html] [test_pseudoelement_parsing.html] @@ -315,10 +310,9 @@ skip-if = (toolkit == 'android' || stylo skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo [test_visited_lying.html] skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo [test_visited_pref.html] skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo [test_visited_reftests.html] skip-if = (toolkit == 'android' || stylo) # TIMED_OUT for android, timeout bug 1328511 for stylo [test_webkit_device_pixel_ratio.html] -skip-if = stylo # bug 1332969 [test_webkit_flex_display.html]
--- a/layout/style/test/test_font_loading_api.html +++ b/layout/style/test/test_font_loading_api.html @@ -1119,24 +1119,28 @@ function runTest() { }).then(function() { // (TEST 37) Test that a FontFace only has one loadingdone event dispatched // at the FontFaceSet containing it. var p = Promise.resolve(); sources.forEach(function({ win, doc, what}, i) { p = p.then(function() { + return setTimeoutZero(); // wait for any previous events to be dispatched + }).then(function() { var events = [], face, face2; - doc.fonts.onloadingdone = function(e) { - events.push(e); - }; - doc.fonts.onloadingerror = function(e) { - events.push(e); - }; + var awaitEvents = new Promise(function(aResolve, aReject) { + doc.fonts.onloadingdone = doc.fonts.onloadingerror = function(e) { + events.push(e); + if (events.length == 2) { + aResolve(); + } + }; + }); is(doc.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" (TEST 37) (" + what + ")"); face = new win.FontFace("test", "url(BitPattern.woff?test37." + i + "a)"); face.load(); doc.fonts.add(face); is(doc.fonts.status, "loading", "document.fonts.status should have status \"loading\" after first font added (TEST 37) (" + what + ")"); @@ -1147,16 +1151,18 @@ function runTest() { face2 = new win.FontFace("test2", "url(BitPattern.woff?test37." + i + "b)"); face2.load(); doc.fonts.add(face2); is(doc.fonts.status, "loading", "document.fonts.status should have status \"loading\" after second font added (TEST 37) (" + what + ")"); return doc.fonts.ready; }).then(function() { + return awaitEvents; + }).then(function() { is(doc.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" after second font loaded (TEST 37) (" + what + ")"); is(face2.status, "loaded", "second FontFace should have status \"loaded\" (TEST 37) (" + what + ")"); is(events.length, 2, "should receive two events (TEST 37) (" + what + ")"); is(events[0].type, "loadingdone", "first event should be \"loadingdone\" (TEST 37) (" + what + ")"); is(events[0].fontfaces.length, 1, "first event should have 1 FontFace (TEST 37) (" + what + ")"); is(events[0].fontfaces[0], face, "first event should have the first FontFace"); @@ -1177,24 +1183,28 @@ function runTest() { }).then(function() { // (TEST 38) Test that a FontFace only has one loadingerror event dispatched // at the FontFaceSet containing it. var p = Promise.resolve(); sources.forEach(function({ win, doc, what }) { p = p.then(function() { + return setTimeoutZero(); // wait for any previous events to be dispatched + }).then(function() { var events = [], face, face2; - doc.fonts.onloadingdone = function(e) { - events.push(e); - }; - doc.fonts.onloadingerror = function(e) { - events.push(e); - }; + var awaitEvents = new Promise(function(aResolve, aReject) { + doc.fonts.onloadingdone = doc.fonts.onloadingerror = function(e) { + events.push(e); + if (events.length == 4) { + aResolve(); + } + }; + }); is(doc.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" (TEST 38) (" + what + ")"); face = new win.FontFace("test", "url(x)"); face.load(); doc.fonts.add(face); is(doc.fonts.status, "loading", "document.fonts.status should have status \"loading\" after first font added (TEST 38) (" + what + ")"); @@ -1205,16 +1215,18 @@ function runTest() { face2 = new win.FontFace("test2", "url(x)"); face2.load(); doc.fonts.add(face2); is(doc.fonts.status, "loading", "document.fonts.status should have status \"loading\" after second font added (TEST 38) (" + what + ")"); return doc.fonts.ready; }).then(function() { + return awaitEvents; + }).then(function() { is(doc.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" after second font failed to load (TEST 38) (" + what + ")"); is(face2.status, "error", "second FontFace should have status \"error\" (TEST 38) (" + what + ")"); is(events.length, 4, "should receive four events (TEST 38) (" + what + ")"); is(events[0].type, "loadingdone", "first event should be \"loadingdone\" (TEST 38) (" + what + ")"); is(events[0].fontfaces.length, 0, "first event should have no FontFaces (TEST 38) (" + what + ")"); @@ -1238,48 +1250,56 @@ function runTest() { }); return p; }).then(function() { // (TEST 39) Test that a FontFace for an @font-face rule only has one // loadingdone event dispatched at the FontFaceSet containing it. - var style = document.querySelector("style"); - var ruleText = "@font-face { font-family: test; src: url(BitPattern.woff?test39a); } " + - "@font-face { font-family: test2; src: url(BitPattern.woff?test39b); }"; + var style, all, events, awaitEvents; - style.textContent = ruleText; + return setTimeoutZero() // wait for any previous events to be dispatched + .then(function() { + style = document.querySelector("style"); + var ruleText = "@font-face { font-family: test; src: url(BitPattern.woff?test39a); } " + + "@font-face { font-family: test2; src: url(BitPattern.woff?test39b); }"; - var all = Array.from(document.fonts); - var events = []; + style.textContent = ruleText; + + all = Array.from(document.fonts); + events = []; - document.fonts.onloadingdone = function(e) { - events.push(e); - }; - document.fonts.onloadingerror = function(e) { - events.push(e); - }; + awaitEvents = new Promise(function(aResolve, aReject) { + document.fonts.onloadingdone = document.fonts.onloadingerror = function(e) { + events.push(e); + if (events.length == 2) { + aResolve(); + } + }; + }); - is(document.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" (TEST 39)"); + is(document.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" (TEST 39)"); - all[0].load(); - is(document.fonts.status, "loading", "document.fonts.status should have status \"loading\" after first font loading (TEST 39)"); + all[0].load(); + is(document.fonts.status, "loading", "document.fonts.status should have status \"loading\" after first font loading (TEST 39)"); - return document.fonts.ready - .then(function() { + return document.fonts.ready + }).then(function() { is(document.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" after first font loaded (TEST 39)"); is(all[0].status, "loaded", "first FontFace should have status \"loaded\" (TEST 39)"); is(all[1].status, "unloaded", "second FontFace should have status \"unloaded\" (TEST 39)"); all[1].load(); is(document.fonts.status, "loading", "document.fonts.status should have status \"loading\" after second font loading (TEST 39)"); return document.fonts.ready; }).then(function() { + return awaitEvents; + }).then(function() { is(document.fonts.status, "loaded", "document.fonts.status should have status \"loaded\" after second font loaded (TEST 39)"); is(all[1].status, "loaded", "second FontFace should have status \"loaded\" (TEST 39)"); is(events.length, 2, "should receive two events (TEST 39)"); is(events[0].type, "loadingdone", "first event should be \"loadingdone\" (TEST 39)"); is(events[0].fontfaces.length, 1, "first event should have 1 FontFace (TEST 39)"); is(events[0].fontfaces[0], all[0], "first event should have the first FontFace");
--- a/netwerk/base/nsIOService.cpp +++ b/netwerk/base/nsIOService.cpp @@ -786,17 +786,19 @@ nsIOService::NewChannelFromURIWithProxyF } } else { rv = handler->NewChannel2(aURI, aLoadInfo, getter_AddRefs(channel)); // if calling newChannel2() fails we try to fall back to // creating a new channel by calling NewChannel(). if (NS_FAILED(rv)) { rv = handler->NewChannel(aURI, getter_AddRefs(channel)); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + return rv; + } // The protocol handler does not implement NewChannel2, so // maybe we need to wrap the channel (see comment in MaybeWrap // function). channel = nsSecCheckWrapChannel::MaybeWrap(channel, aLoadInfo); } } // Make sure that all the individual protocolhandlers attach a loadInfo.
--- a/netwerk/base/nsNetUtilInlines.h +++ b/netwerk/base/nsNetUtilInlines.h @@ -172,17 +172,19 @@ NS_NewChannelInternal(nsIChannel aUri, aLoadingNode ? aLoadingNode->AsDOMNode() : nullptr, aLoadingPrincipal, aTriggeringPrincipal, aSecurityFlags, aContentPolicyType, getter_AddRefs(channel)); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + return rv; + } if (aLoadGroup) { rv = channel->SetLoadGroup(aLoadGroup); NS_ENSURE_SUCCESS(rv, rv); } if (aCallbacks) { rv = channel->SetNotificationCallbacks(aCallbacks);
--- a/netwerk/test/unit/test_file_partial_inputstream.js +++ b/netwerk/test/unit/test_file_partial_inputstream.js @@ -2,16 +2,18 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // Test nsIPartialFileInputStream // NOTE! These tests often use do_check_true(a == b) rather than // do_check_eq(a, b) to avoid outputting characters which confuse // the console +"use strict"; + var CC = Components.Constructor; const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream", "setInputStream"); const PR_RDONLY = 0x1; // see prio.h // We need the profile directory so the test harness will clean up our test // files. @@ -29,16 +31,17 @@ function run_test() let binaryFile = do_get_file(binary_test_file_name); let size = binaryFile.fileSize; // Want to make sure we're working with a large enough file dump("**** binary file size is: " + size + " ****\n"); do_check_true(size > 65536); let binaryStream = new BinaryInputStream(new_file_input_stream(binaryFile)); test_file_data = ""; + let avail = 0; while ((avail = binaryStream.available()) > 0) { test_file_data += binaryStream.readBytes(avail); } do_check_eq(test_file_data.length, size); binaryStream.close(); test_binary_portion(0, 10); test_binary_portion(0, 20000);
--- a/netwerk/test/unit/test_protocolproxyservice.js +++ b/netwerk/test/unit/test_protocolproxyservice.js @@ -12,16 +12,19 @@ // run_filter_test3() // run_pref_test(); // run_pac_test(); // run_pac_cancel_test(); // run_proxy_host_filters_test(); // run_myipaddress_test(); // run_failed_script_test(); // run_isresolvable_test(); + +"use strict"; + Cu.import("resource://gre/modules/NetUtil.jsm"); var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var pps = Components.classes["@mozilla.org/network/protocol-proxy-service;1"] .getService(); var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); @@ -161,17 +164,17 @@ resolveCallback.prototype = { QueryInterface : function (iid) { const interfaces = [Components.interfaces.nsIProtocolProxyCallback, Components.interfaces.nsISupports]; if (!interfaces.some( function(v) { return iid.equals(v) } )) throw Components.results.NS_ERROR_NO_INTERFACE; return this; }, - onProxyAvailable : function (req, uri, pi, status) { + onProxyAvailable : function (req, channel, pi, status) { this.nextFunction(pi); } }; function run_filter_test() { var channel = NetUtil.newChannel({ uri: "http://www.mozilla.org/", loadUsingSystemPrincipal: true @@ -491,24 +494,24 @@ TestResolveCallback.prototype = { function TestResolveCallback_QueryInterface(iid) { if (iid.equals(Components.interfaces.nsIProtocolProxyCallback) || iid.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_ERROR_NO_INTERFACE; }, onProxyAvailable: - function TestResolveCallback_onProxyAvailable(req, uri, pi, status) { - dump("*** uri=" + uri.spec + ", status=" + status + "\n"); + function TestResolveCallback_onProxyAvailable(req, channel, pi, status) { + dump("*** channelURI=" + channel.URI.spec + ", status=" + status + "\n"); if (this.type == null) { do_check_eq(pi, null); } else { do_check_neq(req, null); - do_check_neq(uri, null); + do_check_neq(channel, null); do_check_eq(status, 0); do_check_neq(pi, null); check_proxy(pi, this.type, "foopy", 8080, 0, -1, true); check_proxy(pi.failoverProxy, "direct", "", -1, -1, -1, false); } this.nexttest(); } @@ -608,21 +611,21 @@ TestResolveCancelationCallback.prototype function TestResolveCallback_QueryInterface(iid) { if (iid.equals(Components.interfaces.nsIProtocolProxyCallback) || iid.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_ERROR_NO_INTERFACE; }, onProxyAvailable: - function TestResolveCancelationCallback_onProxyAvailable(req, uri, pi, status) { - dump("*** uri=" + uri.spec + ", status=" + status + "\n"); + function TestResolveCancelationCallback_onProxyAvailable(req, channel, pi, status) { + dump("*** channelURI=" + channel.URI.spec + ", status=" + status + "\n"); do_check_neq(req, null); - do_check_neq(uri, null); + do_check_neq(channel, null); do_check_eq(status, Components.results.NS_ERROR_ABORT); do_check_eq(pi, null); prefs.setCharPref("network.proxy.autoconfig_url", ""); prefs.setIntPref("network.proxy.type", 0); run_proxy_host_filters_test(); } @@ -696,16 +699,17 @@ function host_filter_cb(proxy) // Verify that hists in the host filter list are not proxied // refers to "network.proxy.no_proxies_on" var uriStrUseProxyList; var uriStrUseProxyList; var hostFilterList; +var uriStrFilterList; function run_proxy_host_filters_test() { // Get prefs object from DOM // Setup a basic HTTP proxy configuration // - pps.resolve() needs this to return proxy info for non-filtered hosts prefs.setIntPref("network.proxy.type", 1); prefs.setCharPref("network.proxy.http", "foopy"); prefs.setIntPref("network.proxy.http_port", 8080);
--- a/netwerk/test/unit/test_reopen.js +++ b/netwerk/test/unit/test_reopen.js @@ -1,14 +1,20 @@ // This testcase verifies that channels can't be reopened // See https://bugzilla.mozilla.org/show_bug.cgi?id=372486 +"use strict"; + Cu.import("resource://testing-common/httpd.js"); Cu.import("resource://gre/modules/NetUtil.jsm"); +const BinaryInputStream = Components.Constructor( + "@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream", + "setInputStream"); + const NS_ERROR_IN_PROGRESS = 0x804b000f; const NS_ERROR_ALREADY_OPENED = 0x804b0049; var chan = null; var httpserv = null; [ test_data_channel,
--- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1150,9 +1150,9 @@ static const TransportSecurityPreload kP { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, }; // Pinning Preload List Length = 477; static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1494864501893000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1494948627599000);
--- a/security/manager/ssl/nsSTSPreloadList.errors +++ b/security/manager/ssl/nsSTSPreloadList.errors @@ -26,16 +26,17 @@ 1p.ro: could not connect to host 1password.com: did not receive HSTS header 1xcess.com: did not receive HSTS header 1years.cc: did not receive HSTS header 206rc.net: max-age too low: 2592000 247loan.com: max-age too low: 0 25daysof.io: could not connect to host 2600hq.com: could not connect to host 2859cc.com: could not connect to host +2brokegirls.org: could not connect to host 2or3.tk: could not connect to host 300651.ru: did not receive HSTS header 301.website: could not connect to host 302.nyc: could not connect to host 33drugstore.com: did not receive HSTS header 360ds.co.in: could not connect to host 360gradus.com: did not receive HSTS header 365.or.jp: did not receive HSTS header @@ -137,20 +138,20 @@ agrimap.com: did not receive HSTS header agrios.de: did not receive HSTS header agro-id.gov.ua: could not connect to host agroline.by: could not connect to host ahabingo.com: did not receive HSTS header ahmedabadflowermall.com: did not receive HSTS header ahoynetwork.com: could not connect to host ahri.ovh: could not connect to host aidanwoods.com: did not receive HSTS header -aimeeandalec.com: did not receive HSTS header +aikido-linz.at: could not connect to host +aikido-wels.at: could not connect to host airbnb.com: did not receive HSTS header aircomms.com: did not receive HSTS header -airlinecheckins.com: could not connect to host airproto.com: did not receive HSTS header aishnair.com: could not connect to host aiticon.de: did not receive HSTS header aiw-thkoeln.online: could not connect to host ajmahal.com: could not connect to host akclinics.org: did not receive HSTS header akombakom.net: did not receive HSTS header akostecki.de: did not receive HSTS header @@ -162,34 +163,32 @@ aladdinschools.appspot.com: did not rece alainwolf.net: could not connect to host alanlee.net: could not connect to host alanrickmanflipstable.com: could not connect to host alariel.de: did not receive HSTS header alarmsystemreviews.com: did not receive HSTS header albertopimienta.com: did not receive HSTS header alcazaar.com: could not connect to host aleax.me: could not connect to host -alecpap.com: did not receive HSTS header -alecpapierniak.com: did not receive HSTS header alecvannoten.be: did not receive HSTS header alenan.org: could not connect to host alessandro.pw: did not receive HSTS header alethearose.com: did not receive HSTS header alexandre.sh: did not receive HSTS header alexisabarca.com: did not receive HSTS header alexsergeyev.com: could not connect to host +alfa24.pro: could not connect to host alittlebitcheeky.com: did not receive HSTS header alkami.com: did not receive HSTS header all-subtitles.com: did not receive HSTS header all.tf: could not connect to host alldaymonitoring.com: could not connect to host allforyou.at: could not connect to host allinnote.com: could not connect to host allmbw.com: could not connect to host -allo-symo.fr: did not receive HSTS header allstarswithus.com: could not connect to host alpha.irccloud.com: could not connect to host alphabit-secure.com: could not connect to host alphabuild.io: did not receive HSTS header alphalabs.xyz: could not connect to host alt33c3.org: could not connect to host altfire.ca: could not connect to host altmv.com: max-age too low: 7776000 @@ -197,17 +196,16 @@ alwaysmine.fi: did not receive HSTS head amaforums.org: could not connect to host amavis.org: did not receive HSTS header amees.me: could not connect to host ameho.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] american-truck-simulator.de: could not connect to host american-truck-simulator.net: could not connect to host americanworkwear.nl: did not receive HSTS header amigogeek.net: could not connect to host -amilum.org: could not connect to host amilx.com: could not connect to host amilx.org: could not connect to host amimoto-ami.com: max-age too low: 3153600 amitube.com: could not connect to host amoory.com: did not receive HSTS header amri.nl: could not connect to host amunoz.org: did not receive HSTS header anagra.ms: could not connect to host @@ -279,21 +277,23 @@ appsdash.io: could not connect to host appseccalifornia.org: did not receive HSTS header appson.co.uk: did not receive HSTS header arabdigitalexpression.org: did not receive HSTS header aradulconteaza.ro: could not connect to host aran.me.uk: could not connect to host arbeitslosenverwaltung.de: did not receive HSTS header arboineuropa.nl: did not receive HSTS header arbu.eu: could not connect to host +arctic.gov: did not receive HSTS header arlen.se: could not connect to host armory.consulting: could not connect to host armory.supplies: could not connect to host armytricka.cz: did not receive HSTS header arnaudfeld.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] +arnetdigital.eu: could not connect to host arpa.ph: could not connect to host arpr.co: did not receive HSTS header arrayify.com: could not connect to host arrow-cloud.nl: could not connect to host ars-design.net: could not connect to host ars.toscana.it: max-age too low: 0 artiming.com: could not connect to host artistnetwork.nl: did not receive HSTS header @@ -319,33 +319,32 @@ asset-alive.net: did not receive HSTS he astrath.net: could not connect to host astrolpost.com: could not connect to host astromelody.com: did not receive HSTS header asuhe.cc: did not receive HSTS header atavio.at: could not connect to host atavio.ch: could not connect to host atavio.de: did not receive HSTS header atbeckett.com: did not receive HSTS header -atelierdesflammesnoires.fr: could not connect to host athaliasoft.com: did not receive HSTS header athenelive.com: could not connect to host athul.xyz: did not receive HSTS header atlex.nl: did not receive HSTS header atomik.pro: could not connect to host atop.io: could not connect to host attimidesigns.com: did not receive HSTS header au.search.yahoo.com: max-age too low: 172800 aubiosales.com: did not receive HSTS header aucubin.moe: could not connect to host aufmerksamkeitsstudie.com: could not connect to host aujapan.ru: could not connect to host aurainfosec.com: did not receive HSTS header aurainfosec.com.au: could not connect to host -auraredeye.com: could not connect to host -auraredshield.com: could not connect to host +auraredeye.com: did not receive HSTS header +auraredshield.com: did not receive HSTS header auroratownshipfd.org: could not connect to host ausnah.me: could not connect to host ausoptic.com.au: max-age too low: 2592000 auszeit.bio: did not receive HSTS header auth.mail.ru: did not receive HSTS header authentication.io: could not connect to host authoritynutrition.com: did not receive HSTS header auto-serwis.zgorzelec.pl: did not receive HSTS header @@ -396,17 +395,16 @@ bashcode.ninja: could not connect to hos basicsolutionsus.com: did not receive HSTS header basilisk.io: could not connect to host basnieuwenhuizen.nl: could not connect to host bassh.net: could not connect to host baud.ninja: could not connect to host baumstark.ca: could not connect to host baysse.eu: could not connect to host bazarstupava.sk: could not connect to host -bbb1991.me: could not connect to host bcbsmagentprofile.com: could not connect to host bccx.com: could not connect to host bckp.de: could not connect to host bcm.com.au: max-age too low: 0 bcnx.de: max-age too low: 0 bcsytv.com: could not connect to host bcweightlifting.ca: could not connect to host be.search.yahoo.com: did not receive HSTS header @@ -427,24 +425,22 @@ beier.io: did not receive HSTS header belairsewvac.com: could not connect to host belics.com: did not receive HSTS header belliash.eu.org: did not receive HSTS header belltower.io: could not connect to host beneffy.com: did not receive HSTS header benk.press: could not connect to host benny003.de: did not receive HSTS header benzkosmetik.de: could not connect to host -berasavocate.com: could not connect to host berger.work: did not receive HSTS header berlatih.com: could not connect to host berlinleaks.com: could not connect to host bermytraq.bm: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] berrymark.be: max-age too low: 0 besixdouze.world: could not connect to host -besnik.de: could not connect to host bestbeards.ca: could not connect to host bestcellular.com: did not receive HSTS header betafive.net: could not connect to host betnet.fr: could not connect to host betplanning.it: did not receive HSTS header bets.de: did not receive HSTS header bettween.com: could not connect to host betz.ro: did not receive HSTS header @@ -499,33 +495,33 @@ bl4ckb0x.eu: did not receive HSTS header bl4ckb0x.info: did not receive HSTS header bl4ckb0x.net: did not receive HSTS header bl4ckb0x.org: did not receive HSTS header black-armada.com.pl: could not connect to host black-armada.pl: could not connect to host blackburn.link: could not connect to host blacklane.com: did not receive HSTS header blackly.uk: max-age too low: 0 +blacknova.io: could not connect to host blackpayment.ru: could not connect to host blackscytheconsulting.com: could not connect to host blackunicorn.wtf: could not connect to host blakerandall.xyz: could not connect to host blantik.net: could not connect to host blenheimchalcot.com: did not receive HSTS header blha303.com.au: could not connect to host blindsexdate.nl: could not connect to host blocksatz-medien.de: did not receive HSTS header blog-ritaline.com: could not connect to host blog.cyveillance.com: did not receive HSTS header blog.lookout.com: did not receive HSTS header bloglikepro.com: could not connect to host blubbablasen.de: could not connect to host blucas.org: did not receive HSTS header blueglobalmedia.com: max-age too low: 0 -blueimp.net: did not receive HSTS header blueliv.com: did not receive HSTS header bluescloud.xyz: could not connect to host bluetenmeer.com: did not receive HSTS header blupig.net: did not receive HSTS header bm-trading.nl: did not receive HSTS header bngsecure.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] bnhlibrary.com: could not connect to host bobiji.com: did not receive HSTS header @@ -534,17 +530,17 @@ bodyblog.nl: did not receive HSTS header bodybuilding-legends.com: could not connect to host bodyweightsolution.com: could not connect to host boensou.com: did not receive HSTS header bogosity.se: could not connect to host bohan.life: could not connect to host bombsquad.studio: could not connect to host bonapp.restaurant: could not connect to host bonfi.net: did not receive HSTS header -bonigo.de: did not receive HSTS header +bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] bonitabrazilian.co.nz: did not receive HSTS header bonnyprints.fr: could not connect to host bookcelerator.com: did not receive HSTS header booked.holiday: could not connect to host bookourdjs.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] boomerang.com: could not connect to host boosterlearnpro.com: did not receive HSTS header bootjp.me: did not receive HSTS header @@ -563,43 +559,39 @@ braintreepayments.com: did not receive H brainvation.de: did not receive HSTS header bran.cc: could not connect to host branchtrack.com: did not receive HSTS header branchzero.com: did not receive HSTS header brandnewdays.nl: could not connect to host brandon.so: could not connect to host brandred.net: could not connect to host brandspray.com: did not receive HSTS header -bratislava-airport-taxi.com: could not connect to host brettabel.com: did not receive HSTS header brianmwaters.net: did not receive HSTS header brickoo.com: could not connect to host -brid.gy: did not receive HSTS header britzer-toner.de: did not receive HSTS header brks.xyz: could not connect to host broken-oak.com: could not connect to host brookechase.com: did not receive HSTS header browserid.org: did not receive HSTS header brunix.net: did not receive HSTS header bsagan.fr: could not connect to host bsdtips.com: could not connect to host bsquared.org: could not connect to host btcdlc.com: could not connect to host buchheld.at: did not receive HSTS header bucket.tk: could not connect to host budgetthostels.nl: did not receive HSTS header budskap.eu: could not connect to host -bugs.chromium.org: did not receive HSTS header (error ignored - included regardless) bugtrack.io: did not receive HSTS header buhler.pro: did not receive HSTS header buildci.asia: could not connect to host -buildsaver.co.za: could not connect to host +buildsaver.co.za: did not receive HSTS header built.by: did not receive HSTS header builtritetrailerplans.com: could not connect to host -bullbits.com: could not connect to host bulletpoint.cz: did not receive HSTS header bulmafox.com: could not connect to host bumarkamoda.com: could not connect to host bunaken.asia: could not connect to host burian-server.cz: could not connect to host burrow.ovh: could not connect to host burtrum.me: could not connect to host burtrum.top: could not connect to host @@ -616,60 +608,59 @@ buyfox.de: did not receive HSTS header bws16.de: did not receive HSTS header by4cqb.cn: could not connect to host bypassed.press: could not connect to host bypro.xyz: could not connect to host bysymphony.com: max-age too low: 0 byte.wtf: did not receive HSTS header bytepark.de: did not receive HSTS header bytesund.biz: could not connect to host +bytesystems.com: could not connect to host +bzv-fr.eu: could not connect to host c1yd3i.me: could not connect to host c3b.info: could not connect to host cabarave.com: could not connect to host cabusar.fr: could not connect to host caconnect.org: could not connect to host cadao.me: did not receive HSTS header cafe-scientifique.org.ec: could not connect to host caim.cz: did not receive HSTS header cainhosting.com: did not receive HSTS header cajapopcorn.com: did not receive HSTS header cake.care: could not connect to host calendarr.com: did not receive HSTS header calgaryconstructionjobs.com: did not receive HSTS header calix.com: max-age too low: 0 calltrackingreports.com: could not connect to host -calories.org: could not connect to host calvin.me: max-age too low: 2592000 calvinallen.net: did not receive HSTS header calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] camolist.com: could not connect to host canadiangamblingchoice.com: did not receive HSTS header cancelmyprofile.com: did not receive HSTS header candicontrols.com: did not receive HSTS header candratech.com: could not connect to host candylion.rocks: could not connect to host cannyfoxx.me: could not connect to host canyonshoa.com: did not receive HSTS header -capecycles.co.za: could not connect to host -capper.de: could not connect to host +capecycles.co.za: did not receive HSTS header captchatheprize.com: could not connect to host capturethepen.co.uk: could not connect to host -caputodesign.com: could not connect to host car-navi.ph: did not receive HSTS header carano-service.de: did not receive HSTS header caraudio69.cz: could not connect to host cardoni.net: did not receive HSTS header +cardse.net: could not connect to host cardstream.com: did not receive HSTS header cardurl.com: did not receive HSTS header cargobay.net: could not connect to host caringladies.org: could not connect to host carlandfaith.com: did not receive HSTS header carlolly.co.uk: could not connect to host carlosalves.info: could not connect to host -carnildo.com: could not connect to host carsforbackpackers.com: could not connect to host casedi.org: max-age too low: 0 cashmojo.com: max-age too low: 0 casinostest.com: did not receive HSTS header casioshop.eu: could not connect to host casovi.cf: could not connect to host catarsisvr.com: did not receive HSTS header catinmay.com: did not receive HSTS header @@ -699,19 +690,19 @@ cesal.net: could not connect to host cesidianroot.eu: could not connect to host cevrimici.com: could not connect to host cfcproperties.com: did not receive HSTS header cfetengineering.com: could not connect to host cg.search.yahoo.com: did not receive HSTS header chainmonitor.com: could not connect to host chamathellawala.com: could not connect to host championsofregnum.com: did not receive HSTS header -chandlerredding.com: could not connect to host +chandlerredding.com: did not receive HSTS header changelab.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] -changetip.com: could not connect to host +changetip.com: did not receive HSTS header chaos.fail: did not receive HSTS header chargejuice.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] charityclear.com: did not receive HSTS header charnleyhouse.co.uk: max-age too low: 604800 chartpen.com: did not receive HSTS header chartstoffarm.de: max-age too low: 10 chatbot.me: did not receive HSTS header chateauconstellation.ch: did not receive HSTS header @@ -752,26 +743,27 @@ christophheich.me: did not receive HSTS chrisupjohn.com: could not connect to host chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless) chrome.google.com: did not receive HSTS header (error ignored - included regardless) chromiumbugs.appspot.com: did not receive HSTS header (error ignored - included regardless) chromiumcodereview.appspot.com: did not receive HSTS header (error ignored - included regardless) chroniclesofgeorge.com: did not receive HSTS header chrst.ph: could not connect to host chua.cf: could not connect to host +chua.family: could not connect to host chuckame.fr: could not connect to host chulado.com: did not receive HSTS header cidr.ml: could not connect to host cig-dem.com: could not connect to host cigarblogs.net: could not connect to host cigi.site: could not connect to host cim2b.de: could not connect to host cimalando.eu: could not connect to host cinefilzonen.se: could not connect to host -ciplanutrition.com: could not connect to host +ciplanutrition.com: did not receive HSTS header circara.com: did not receive HSTS header ciscommerce.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] citiagent.cz: could not connect to host citizenscience.gov: could not connect to host cityoflaurel.org: did not receive HSTS header clara-baumert.de: could not connect to host classicsandexotics.com: did not receive HSTS header classicspublishing.com: could not connect to host @@ -811,56 +803,59 @@ cmci.dk: did not receive HSTS header cmlachapelle.ch: did not receive HSTS header cmlancy.ch: did not receive HSTS header cmlignon.ch: did not receive HSTS header cmplainpalais.ch: did not receive HSTS header cmsbattle.com: could not connect to host cmscafe.ru: did not receive HSTS header cn.search.yahoo.com: did not receive HSTS header cni-certing.it: max-age too low: 0 +cnwarn.com: could not connect to host co50.com: did not receive HSTS header cocaine-import.agency: could not connect to host cocktailfuture.fr: could not connect to host codabix.com: did not receive HSTS header codabix.de: could not connect to host codabix.net: could not connect to host code.google.com: did not receive HSTS header (error ignored - included regardless) codeco.pw: could not connect to host codeforce.io: could not connect to host codelayer.ca: could not connect to host -codemonkeyrawks.net: could not connect to host codepoet.de: could not connect to host +codepult.com: could not connect to host codepx.com: did not receive HSTS header codereview.appspot.com: did not receive HSTS header (error ignored - included regardless) codereview.chromium.org: did not receive HSTS header (error ignored - included regardless) codiva.io: max-age too low: 2592000 coffeeetc.co.uk: did not receive HSTS header coffeestrategies.com: max-age too low: 2592000 coiffeurschnittstelle.ch: did not receive HSTS header coindam.com: could not connect to host colisfrais.com: did not receive HSTS header collegepulse.org: could not connect to host collies.eu: did not receive HSTS header collins.kg: did not receive HSTS header collins.press: did not receive HSTS header colmexpro.com: did not receive HSTS header colognegaming.net: could not connect to host coloradocomputernetworking.net: could not connect to host +comfortdom.ua: did not receive HSTS header comfortticket.de: did not receive HSTS header comfy.moe: could not connect to host comicspines.com: could not connect to host compalytics.com: could not connect to host comparejewelleryprices.co.uk: could not connect to host completeid.com: max-age too low: 86400 completionist.audio: could not connect to host compucorner.com.mx: could not connect to host concord-group.co.jp: did not receive HSTS header condesaelectronics.com: max-age too low: 0 confirm365.com: could not connect to host conformal.com: could not connect to host +connect-ed.network: could not connect to host connect.ua: did not receive HSTS header conrad-kostecki.de: did not receive HSTS header consciousandglamorous.com: could not connect to host console.python.org: did not receive HSTS header constructionjobs.com: did not receive HSTS header contactbig.com: did not receive HSTS header contarkos.xyz: could not connect to host content-api-dev.azurewebsites.net: could not connect to host @@ -946,26 +941,29 @@ curlybracket.co.uk: could not connect to curroapp.com: could not connect to host custe.rs: could not connect to host cuvva.insure: did not receive HSTS header cyanogenmod.xxx: could not connect to host cyberpunk.ca: could not connect to host cybershambles.com: could not connect to host cycleluxembourg.lu: did not receive HSTS header cydia-search.io: could not connect to host +cyph.com: did not receive HSTS header cyphertite.com: could not connect to host czlx.co: could not connect to host +d0xq.net: could not connect to host dad256.tk: could not connect to host dadtheimpaler.com: could not connect to host dah5.com: did not receive HSTS header dailystormerpodcasts.com: did not receive HSTS header daimadi.com: could not connect to host dakrib.net: could not connect to host daku.gdn: did not receive HSTS header dalingk.co: could not connect to host +dallmeier.net: could not connect to host damianuv-blog.cz: did not receive HSTS header dango.in: did not receive HSTS header danielcowie.me: could not connect to host danieldk.eu: did not receive HSTS header danieliancu.com: could not connect to host danielworthy.com: did not receive HSTS header danijobs.com: could not connect to host danrl.de: could not connect to host @@ -993,25 +991,25 @@ datatekniikka.com: could not connect to datenkeks.de: did not receive HSTS header dateno1.com: max-age too low: 2592000 datenreiter.cf: could not connect to host datenreiter.gq: could not connect to host datenreiter.ml: could not connect to host datenreiter.tk: could not connect to host datewon.net: did not receive HSTS header davidglidden.eu: could not connect to host -davidgreig.uk: could not connect to host -davidgrudl.com: did not receive HSTS header +davidgreig.uk: did not receive HSTS header +davidgrudl.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] davidhunter.scot: did not receive HSTS header davidnoren.com: did not receive HSTS header davidreinhardt.de: could not connect to host davidscherzer.at: could not connect to host daylightcompany.com: did not receive HSTS header daytonaseaside.com: did not receive HSTS header -db.gy: could not connect to host +db.gy: did not receive HSTS header dbx.ovh: could not connect to host dccode.gov: could not connect to host dcurt.is: did not receive HSTS header dden.ca: could not connect to host dden.website: could not connect to host dden.xyz: could not connect to host debank.tv: did not receive HSTS header debatch.se: could not connect to host @@ -1046,52 +1044,49 @@ dentaldomain.ph: could not connect to ho depeche-mode.moscow: max-age too low: 7200 depijl-mz.nl: did not receive HSTS header depixion.agency: could not connect to host dequehablamos.es: could not connect to host derevtsov.com: did not receive HSTS header derhil.de: did not receive HSTS header derwolfe.net: did not receive HSTS header desiccantpackets.com: did not receive HSTS header -designgears.com: could not connect to host designthinking.or.jp: did not receive HSTS header despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] destinationbijoux.fr: could not connect to host destom.be: could not connect to host detector.exposed: could not connect to host devcu.net: did not receive HSTS header deviltracks.net: could not connect to host devincrow.me: could not connect to host -devtub.com: could not connect to host +devtub.com: did not receive HSTS header devuan.org: did not receive HSTS header diablotine.rocks: could not connect to host diarbag.us: did not receive HSTS header diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] diedrich.co: did not receive HSTS header digioccumss.ddns.net: could not connect to host digitalbank.kz: could not connect to host digitaldaddy.net: could not connect to host -digitaleoverheid.nl: did not receive HSTS header digitalriver.tk: could not connect to host digitalskillswap.com: could not connect to host dim.lighting: could not connect to host dinamoelektrik.com: max-age too low: 0 dinkum.online: could not connect to host discoveringdocker.com: did not receive HSTS header discovery.lookout.com: did not receive HSTS header dislocated.de: did not receive HSTS header disowned.net: max-age too low: 0 dissimulo.me: could not connect to host dittvertshus.no: could not connect to host diva-ey.com: could not connect to host dizihocasi.com: did not receive HSTS header dizorg.net: could not connect to host -dj4et.de: did not receive HSTS header +dj4et.de: could not connect to host djz4music.com: did not receive HSTS header -dkds.us: could not connect to host dl.google.com: did not receive HSTS header (error ignored - included regardless) dlc.viasinc.com: could not connect to host dlemper.de: did not receive HSTS header dlouwrink.nl: could not connect to host dn42.eu: could not connect to host dns.google.com: did not receive HSTS header (error ignored - included regardless) dnsknowledge.com: did not receive HSTS header do-do.tk: could not connect to host @@ -1105,29 +1100,29 @@ docufiel.com: could not connect to host doeswindowssuckforeveryoneorjustme.com: could not connect to host dogbox.se: did not receive HSTS header dohosting.ru: could not connect to host dokan.online: could not connect to host dollarstore24.com: could not connect to host dollywiki.co.uk: could not connect to host dolphin-cloud.com: could not connect to host dolphincorp.co.uk: could not connect to host -domadillo.com: could not connect to host domaris.de: did not receive HSTS header dominique-mueller.de: did not receive HSTS header donttrustrobots.nl: could not connect to host donzelot.co.uk: max-age too low: 3600 doomleika.com: could not connect to host dopost.it: could not connect to host doridian.com: could not connect to host doridian.de: could not connect to host doridian.net: did not receive HSTS header doridian.org: could not connect to host dossplumbing.co.za: did not receive HSTS header dotadata.me: could not connect to host +dovecotadmin.org: could not connect to host dovetailnow.com: could not connect to host download.jitsi.org: did not receive HSTS header downsouthweddings.com.au: did not receive HSTS header doyoucheck.com: did not receive HSTS header dpratt.de: could not connect to host dragonisles.net: could not connect to host dragons-of-highlands.cz: could not connect to host dragontrainingmobilezoo.com.au: max-age too low: 0 @@ -1147,22 +1142,24 @@ dshiv.io: could not connect to host dubrovskiy.net: could not connect to host dubrovskiy.pro: could not connect to host duesee.org: could not connect to host dullsir.com: did not receive HSTS header duria.de: max-age too low: 3600 dustri.org: did not receive HSTS header dutchrank.com: could not connect to host dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] +dworzak.ch: could not connect to host dxa.io: could not connect to host dycontrol.de: could not connect to host dylanscott.com.au: did not receive HSTS header dymersion.com: did not receive HSTS header dzimejl.sk: did not receive HSTS header dzlibs.io: could not connect to host +dzndk.com: could not connect to host dzndk.org: could not connect to host e-deca2.org: did not receive HSTS header e-sa.com: did not receive HSTS header e3amn2l.com: could not connect to host earlybirdsnacks.com: could not connect to host easez.net: did not receive HSTS header easychiller.org: could not connect to host easyhaul.com: did not receive HSTS header @@ -1215,16 +1212,17 @@ elemprendedor.com.ve: could not connect elenag.ga: could not connect to host elenoon.ir: did not receive HSTS header elgacien.de: could not connect to host elimdengelen.com: did not receive HSTS header elisabeth-kostecki.de: did not receive HSTS header elisabethkostecki.de: did not receive HSTS header elitefishtank.com: could not connect to host elliotgluck.com: could not connect to host +elliriehl.at: could not connect to host elnutricionista.es: did not receive HSTS header eloanpersonal.com: max-age too low: 0 elpo.xyz: could not connect to host elsamakhin.com: could not connect to host elsitar.com: did not receive HSTS header email.lookout.com: could not connect to host emanatepixels.com: could not connect to host emeldi-commerce.com: max-age too low: 0 @@ -1238,21 +1236,23 @@ empleostampico.com: did not receive HSTS enaah.de: could not connect to host enargia.jp: max-age too low: 0 encode.space: did not receive HSTS header encoder.pw: could not connect to host encontrebarato.com.br: did not receive HSTS header encrypted.google.com: did not receive HSTS header (error ignored - included regardless) end.pp.ua: could not connect to host endlessdark.net: max-age too low: 600 +endlessdiy.ca: could not connect to host endlesstone.com: did not receive HSTS header enersec.co.uk: could not connect to host -engelwerbung.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] +engelwerbung.com: did not receive HSTS header enigmacpt.com: did not receive HSTS header enigmail.net: did not receive HSTS header +enjoy-nepal.de: max-age too low: 0 enskat.de: could not connect to host enskatson-sippe.de: could not connect to host enteente.club: could not connect to host enteente.space: could not connect to host enteente.xyz: could not connect to host enterdev.co: did not receive HSTS header enterprise-threat-monitor.com: max-age too low: 0 entersynapse.com: could not connect to host @@ -1273,18 +1273,16 @@ erawanarifnugroho.com: did not receive H eressea.xyz: could not connect to host eridanus.uk: could not connect to host ernaehrungsberatung-zurich.ch: could not connect to host ernesto.at: could not connect to host eromixx.com: did not receive HSTS header erotalia.es: could not connect to host eroticen.com: did not receive HSTS header erotische-aanbiedingen.nl: could not connect to host -erp-band.ru: could not connect to host -erpband.ru: could not connect to host errlytics.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] errolz.com: could not connect to host errors.zenpayroll.com: could not connect to host ersindemirtas.com: did not receive HSTS header escotour.com: did not receive HSTS header esec.rs: did not receive HSTS header esln.org: did not receive HSTS header esoterikerforum.de: did not receive HSTS header @@ -1292,33 +1290,31 @@ espra.com: could not connect to host esquonic.com: could not connect to host essexcosmeticdentists.co.uk: did not receive HSTS header essexghosthunters.co.uk: did not receive HSTS header estilosapeca.com: could not connect to host etdonline.co.uk: could not connect to host eternitylove.us: could not connect to host ethanfaust.com: could not connect to host ethicalexploiting.com: could not connect to host -etrker.com: did not receive HSTS header etsysecure.com: could not connect to host etula.ga: could not connect to host etula.me: could not connect to host euanbaines.com: did not receive HSTS header eucl3d.com: did not receive HSTS header euclideanpostulates.xyz: could not connect to host eulerpi.io: could not connect to host euph.eu: did not receive HSTS header eupho.me: could not connect to host euroshop24.net: could not connect to host -evanhandgraaf.nl: did not receive HSTS header evantage.org: could not connect to host evdenevenakliyatankara.pw: did not receive HSTS header everybooks.com: max-age too low: 60 everything.place: could not connect to host -evi.be: did not receive HSTS header +evilized.de: could not connect to host evin.ml: could not connect to host evites.me: could not connect to host evomon.com: could not connect to host evossd.tk: could not connect to host ewuchuan.com: could not connect to host excelgum.ca: did not receive HSTS header exfiles.cz: did not receive HSTS header exgravitus.com: could not connect to host @@ -1342,25 +1338,27 @@ fabhub.io: could not connect to host fabianasantiago.com: could not connect to host fabianfischer.de: did not receive HSTS header facebook-atom.appspot.com: did not receive HSTS header factorable.net: did not receive HSTS header factorygw.com: did not receive HSTS header fadilus.com: did not receive HSTS header faesser.com: did not receive HSTS header fail4free.de: did not receive HSTS header +failproof.be: could not connect to host fairlyoddtreasures.com: did not receive HSTS header faizan.net: did not receive HSTS header faizan.xyz: could not connect to host fakeletters.org: did not receive HSTS header faktura.pl: did not receive HSTS header falconfrag.com: could not connect to host falkena.net: max-age too low: 5184000 falkp.no: did not receive HSTS header fallenangelspirits.uk: could not connect to host +familie-sprink.de: could not connect to host familie-zimmermann.at: could not connect to host fanyl.cn: could not connect to host farhadexchange.com: did not receive HSTS header fashioncare.cz: did not receive HSTS header fasset.jp: could not connect to host fastograph.com: could not connect to host fastopen.ml: could not connect to host fatgeekflix.net: could not connect to host @@ -1383,17 +1381,16 @@ fenteo.com: could not connect to host feragon.net: max-age too low: 84600 ferrolatino.com: could not connect to host festember.com: did not receive HSTS header festrip.com: could not connect to host fexmen.com: could not connect to host ffmradio.de: did not receive HSTS header fhdhelp.de: could not connect to host fhdhilft.de: could not connect to host -fierman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] fiftyshadesofluca.ml: could not connect to host fig.co: did not receive HSTS header fightr.co: could not connect to host fikt.space: could not connect to host filmipop.com: max-age too low: 0 finalgear.com: did not receive HSTS header financieringsportaal.nl: did not receive HSTS header finanzkontor.net: could not connect to host @@ -1414,26 +1411,26 @@ fit4medien.de: did not receive HSTS head fitbylo.com: did not receive HSTS header fitiapp.com: could not connect to host fitnesswerk.de: could not connect to host five.vn: did not receive HSTS header fivestarsitters.com: did not receive HSTS header fixatom.com: did not receive HSTS header fixingdns.com: did not receive HSTS header fj.search.yahoo.com: did not receive HSTS header -fjruiz.es: could not connect to host +fjruiz.es: did not receive HSTS header flags.ninja: could not connect to host flamewall.net: could not connect to host +flamingcow.tv: did not receive HSTS header flareon.net: could not connect to host flawcheck.com: did not receive HSTS header fleurette.me: max-age too low: 0 fliexer.com: could not connect to host flirchi.com: did not receive HSTS header floless.co.uk: did not receive HSTS header -florent-tatard.fr: could not connect to host florian-lillpopp.de: max-age too low: 10 florianlillpopp.de: max-age too low: 10 floridaescapes.co.uk: did not receive HSTS header flouartistique.ch: could not connect to host flow.pe: could not connect to host flow.su: could not connect to host flowersandclouds.com: could not connect to host flushstudios.com: did not receive HSTS header @@ -1484,17 +1481,16 @@ freeutopia.org: did not receive HSTS hea frenzel.dk: could not connect to host freqlabs.com: could not connect to host freshfind.xyz: could not connect to host frezbo.com: could not connect to host frforms.com: did not receive HSTS header friendica.ch: could not connect to host frizo.com: did not receive HSTS header froggstack.de: could not connect to host -fromscratch.rocks: could not connect to host frontmin.com: did not receive HSTS header frost-ci.xyz: could not connect to host frosty-gaming.xyz: did not receive HSTS header fruitusers.com: could not connect to host frusky.net: could not connect to host fspphoto.com: could not connect to host ftctele.com: did not receive HSTS header fuckbilibili.com: did not receive HSTS header @@ -1516,16 +1512,17 @@ fzn.io: could not connect to host fzslm.me: did not receive HSTS header g2a.co: did not receive HSTS header g2g.com: did not receive HSTS header g4w.co: did not receive HSTS header (error ignored - included regardless) gabber.scot: could not connect to host gaelleetarnaud.com: did not receive HSTS header gafachi.com: could not connect to host gakkainavi4.com: could not connect to host +galactic-crew.org: could not connect to host galardi.org: did not receive HSTS header galenskap.eu: could not connect to host gallery44.org: did not receive HSTS header galoisvpn.xyz: could not connect to host game.yt: could not connect to host gamecave.de: could not connect to host gamechasm.com: could not connect to host gamefund.me: did not receive HSTS header @@ -1579,17 +1576,16 @@ getgeek.nu: did not receive HSTS header getgeek.se: did not receive HSTS header getinternet.de: max-age too low: 0 getkai.co.nz: did not receive HSTS header getlantern.org: did not receive HSTS header getlifti.com: did not receive HSTS header getlittleapps.com: could not connect to host getlolaccount.com: could not connect to host getmassage.com.ng: could not connect to host -getmdl.io: did not receive HSTS header getremembrall.com: could not connect to host getsello.com: did not receive HSTS header getwashdaddy.com: could not connect to host gfm.tech: could not connect to host gfournier.ca: could not connect to host gfwsb.ml: could not connect to host gglks.com: did not receive HSTS header gh16.com.ar: could not connect to host @@ -1696,16 +1692,17 @@ gtlfsonlinepay.com: did not receive HSTS gtraxapp.com: could not connect to host gts-schulsoftware.de: did not receive HSTS header guava.studio: did not receive HSTS header guilde-vindicta.fr: did not receive HSTS header gulenet.com: could not connect to host gunnarhafdal.com: did not receive HSTS header gurom.lv: could not connect to host gurusupe.com: could not connect to host +guso.ml: could not connect to host gussi.is: did not receive HSTS header gvt2.com: could not connect to host (error ignored - included regardless) gvt3.com: could not connect to host (error ignored - included regardless) gw2reload.eu: could not connect to host gwijaya.com: could not connect to host gwtest.us: could not connect to host gxlrx.net: could not connect to host gyboche.com: could not connect to host @@ -1739,16 +1736,17 @@ halo.red: could not connect to host hancc.net: could not connect to host hanfu.la: could not connect to host hang333.pw: did not receive HSTS header hannover-banditen.de: did not receive HSTS header hansen.hn: could not connect to host hao2taiwan.com: max-age too low: 0 haoyugao.com: could not connect to host hapissl.com: could not connect to host +happist.com: did not receive HSTS header happyfabric.me: did not receive HSTS header happygastro.com: could not connect to host harabuhouse.com: did not receive HSTS header harbor-light.net: could not connect to host hardline.xyz: could not connect to host haribosupermix.com: could not connect to host harmonycosmetic.com: max-age too low: 300 harristony.com: could not connect to host @@ -1764,16 +1762,17 @@ hastherebeenamassshooting.today: could n hatoko.net: could not connect to host haufschild.de: could not connect to host haurumcraft.net: could not connect to host hausarzt-stader-str.de: did not receive HSTS header haveeruexaminer.com: could not connect to host haxoff.com: did not receive HSTS header haydenhill.us: could not connect to host hazcod.com: could not connect to host +hazyrom.net: could not connect to host hcie.pl: could not connect to host hcs-company.com: did not receive HSTS header hcs-company.nl: did not receive HSTS header hd-offensive.at: could not connect to host hdm.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] hdsmigrationtool.com: could not connect to host hduin.xyz: could not connect to host hdwallpapers.net: did not receive HSTS header @@ -1783,20 +1782,23 @@ heartlandrentals.com: did not receive HS heftkaufen.de: did not receive HSTS header helloworldhost.com: did not receive HSTS header helpadmin.net: could not connect to host helpium.de: could not connect to host helpmebuild.com: did not receive HSTS header hemdal.se: could not connect to host hencagon.com: could not connect to host henriknoerr.com: could not connect to host +henrock.net: could not connect to host hepteract.us: did not receive HSTS header hermes-net.de: could not connect to host herpaderp.net: could not connect to host herzbotschaft.de: did not receive HSTS header +heutger.net: did not receive HSTS header +hexagon-e.com: could not connect to host hibilog.com: could not connect to host hicn.gq: could not connect to host hiddendepth.ie: max-age too low: 0 hiddenmail.xyz: could not connect to host hiddenrefuge.eu.org: could not connect to host highseer.com: did not receive HSTS header highsurf-miyazaki.com: did not receive HSTS header highvelocitydesign.com: could not connect to host @@ -1842,29 +1844,29 @@ howbigismybuilding.com: [Exception... "C howrandom.org: could not connect to host howtocuremysciatica.com: could not connect to host hr-intranet.com: did not receive HSTS header hsandbox.tech: max-age too low: 2592000 hsir.me: could not connect to host hsts.date: could not connect to host hstsfail.appspot.com: did not receive HSTS header hstspreload.appspot.com: did not receive HSTS header -hstspreload.org: did not receive HSTS header http418.xyz: could not connect to host httpstatuscode418.xyz: could not connect to host hu.search.yahoo.com: did not receive HSTS header huarongdao.com: did not receive HSTS header hugocollignon.fr: could not connect to host hugosleep.com.au: did not receive HSTS header humblefinances.com: could not connect to host humeurs.net: could not connect to host humpteedumptee.in: did not receive HSTS header huntshomeinspections.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] hup.blue: could not connect to host hurricanelabs.com: did not receive HSTS header +hushfile.it: could not connect to host huskybutt.dog: could not connect to host hydra.ws: could not connect to host hydronium.cf: could not connect to host hydronium.ga: could not connect to host hydronium.me: could not connect to host hydronium.tk: could not connect to host hyper69.com: did not receive HSTS header i-jp.net: could not connect to host @@ -1880,44 +1882,43 @@ ichnichtskaufmann.de: could not connect ichoosebtec.com: could not connect to host icpc2016.in.th: could not connect to host icreative.nl: did not receive HSTS header ictual.com: max-age too low: 0 id-co.in: could not connect to host id-conf.com: could not connect to host idacmedia.com: max-age too low: 5184000 idcrane.com: could not connect to host -ideadozz.hu: could not connect to host ideal-envelopes.co.uk: did not receive HSTS header ideasmeetingpoint.com: could not connect to host ideation-inc.co.jp: did not receive HSTS header idecode.net: could not connect to host idedr.com: could not connect to host identitylabs.uk: could not connect to host idgsupply.com: could not connect to host idlekernel.com: could not connect to host idontexist.me: did not receive HSTS header ie.search.yahoo.com: did not receive HSTS header ies-italia.it: did not receive HSTS header ies.id.lv: could not connect to host ifad.org: did not receive HSTS header +iflare.de: could not connect to host ifleurs.com: could not connect to host ignatisd.gr: did not receive HSTS header igule.net: could not connect to host ihrlotto.de: could not connect to host ihrnationalrat.ch: could not connect to host ihsbsd.me: could not connect to host ihuanmeng.com: did not receive HSTS header ikujii.com: max-age too low: 0 ikwilguidobellen.nl: did not receive HSTS header ilbuongiorno.it: did not receive HSTS header ilhadocaranguejo.com.br: could not connect to host ilikerainbows.co: could not connect to host ilikerainbows.co.uk: could not connect to host -illorenese.fr: could not connect to host ilmconpm.de: did not receive HSTS header ilona.graphics: max-age too low: 3600 iluvscotland.co.uk: did not receive HSTS header imakepoems.net: could not connect to host ime.moe: could not connect to host imguoguo.com: did not receive HSTS header imim.pw: did not receive HSTS header immoprotect.ca: did not receive HSTS header @@ -1960,33 +1961,35 @@ insane-bullets.com: could not connect to insane.zone: could not connect to host insite-feedback.com: did not receive HSTS header inspire-av.com: did not receive HSTS header inspiroinc.com: could not connect to host instacart.com: did not receive HSTS header instagram-atom.appspot.com: did not receive HSTS header installgentoo.net: could not connect to host instantdev.io: could not connect to host +instela.com: did not receive HSTS header institutoflordelavida.com: could not connect to host institutolancaster.com: did not receive HSTS header intarweb.ca: could not connect to host intel.li: could not connect to host intelldynamics.com: could not connect to host interference.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] interlun.com: could not connect to host internetcasinos.de: could not connect to host internetcensus.org: could not connect to host +internethering.de: could not connect to host interserved.com: did not receive HSTS header intex.es: max-age too low: 0 intim-uslugi-kazan.net: could not connect to host intimtoy.com.ua: could not connect to host inverselink-user-content.com: could not connect to host inverselink.com: could not connect to host invite24.pro: could not connect to host -inwesttitle.com: could not connect to host +inwesttitle.com: max-age too low: 0 ionx.co.uk: did not receive HSTS header iop.intuit.com: max-age too low: 86400 iosmods.com: could not connect to host iostips.ru: could not connect to host iotsms.io: could not connect to host ip6.im: did not receive HSTS header ipmimagazine.com: did not receive HSTS header iprody.com: could not connect to host @@ -1996,20 +1999,20 @@ ipv6cloud.club: could not connect to hos iqcn.co: did not receive HSTS header iqualtech.com: did not receive HSTS header iranianlawschool.com: could not connect to host iraqidinar.org: did not receive HSTS header irazimina.ru: did not receive HSTS header irccloud.com: did not receive HSTS header ireef.tv: could not connect to host irelandesign.com: did not receive HSTS header +iridiumflare.de: could not connect to host ischool.co.jp: did not receive HSTS header iseek.biz: max-age too low: 0 iseulde.com: could not connect to host -ishangirdhar.com: did not receive HSTS header isitamor.pm: could not connect to host iskaz.rs: did not receive HSTS header israkurort.com: did not receive HSTS header istaspirtslietas.lv: did not receive HSTS header isteinbaby.de: could not connect to host it-go.net: did not receive HSTS header itechgeek.com: max-age too low: 0 itos.asia: did not receive HSTS header @@ -2026,16 +2029,17 @@ ivi.es: max-age too low: 0 ivk.website: could not connect to host izdiwho.com: could not connect to host izolight.ch: could not connect to host izoox.com: did not receive HSTS header izzzorgconcerten.nl: could not connect to host ja-publications.com: did not receive HSTS header jabbari.io: did not receive HSTS header jackalworks.com: could not connect to host +jackdelik.de: could not connect to host jacobparry.ca: did not receive HSTS header jagido.de: did not receive HSTS header jahliveradio.com: could not connect to host jakenbake.com: did not receive HSTS header jakubtopic.cz: could not connect to host james.je: could not connect to host jamesandpame.la: could not connect to host jamesbradach.com: did not receive HSTS header @@ -2099,29 +2103,30 @@ jhejderup.me: could not connect to host jia1hao.com: could not connect to host jikken.de: could not connect to host jimas.eu: did not receive HSTS header jimmycai.org: could not connect to host jirav.io: could not connect to host jkb.pics: could not connect to host jkbuster.com: could not connect to host jmdekker.it: could not connect to host -jmk.hu: could not connect to host joakimalgroy.com: could not connect to host jobmedic.com: did not receive HSTS header joedavison.me: could not connect to host jogi-server.de: did not receive HSTS header +johannes-sprink.de: could not connect to host johners.me: could not connect to host johnrom.com: did not receive HSTS header jonas-keidel.de: did not receive HSTS header jonasgroth.se: did not receive HSTS header jonathan.ir: could not connect to host jonathancarter.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] jonn.me: could not connect to host joostbovee.nl: did not receive HSTS header +jopsens.de: could not connect to host jordanhamilton.me: could not connect to host joretapo.fr: could not connect to host josahrens.me: could not connect to host joshi.su: could not connect to host joshstroup.me: could not connect to host jottit.com: could not connect to host jpbike.cz: could not connect to host jrc9.ca: did not receive HSTS header @@ -2129,46 +2134,45 @@ jrgold.me: could not connect to host jrmd.io: could not connect to host jrvar.com: did not receive HSTS header jsanders.us: did not receive HSTS header jsg-technologies.de: did not receive HSTS header jualautoclave.com: did not receive HSTS header jualssh.com: could not connect to host juliamweber.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] julian-kipka.de: could not connect to host -julibear.com: could not connect to host jumbox.xyz: could not connect to host junaos.xyz: did not receive HSTS header junge-selbsthilfe.info: could not connect to host junqtion.com: could not connect to host jupp0r.de: did not receive HSTS header -justanothercompany.name: could not connect to host justlikethat.hosting: did not receive HSTS header justnaw.co.uk: could not connect to host justudin.com: did not receive HSTS header juwairen.cn: did not receive HSTS header jvoice.net: could not connect to host jwilsson.me: could not connect to host jxm.in: could not connect to host jznet.org: max-age too low: 86400 k-dev.de: could not connect to host ka-clan.com: could not connect to host kabuabc.com: did not receive HSTS header +kabus.org: could not connect to host kadioglumakina.com.tr: did not receive HSTS header kaela.design: could not connect to host kahopoon.net: could not connect to host kaisers.de: did not receive HSTS header kalami.nl: did not receive HSTS header kaliaa.fi: could not connect to host kamikano.com: could not connect to host kaneo-gmbh.de: did not receive HSTS header kaplatz.is: could not connect to host kapucini.si: max-age too low: 0 karaoketonight.com: could not connect to host -kasilag.me: did not receive HSTS header +kasilag.me: could not connect to host katericke.com: could not connect to host katiaetdavid.fr: could not connect to host katproxy.online: could not connect to host katproxy.site: could not connect to host katproxy.tech: could not connect to host kaufkraftkiel.de: could not connect to host kausch.at: did not receive HSTS header kavinvin.me: did not receive HSTS header @@ -2184,17 +2188,17 @@ keeley.ml: could not connect to host keeleysam.com: could not connect to host keeleysam.me: could not connect to host keepclean.me: could not connect to host ken.fm: did not receive HSTS header kenderbeton-magyarorszag.hu: did not receive HSTS header kenderbetonmagyarorszag.hu: did not receive HSTS header kenderhaz-magyarorszag.hu: did not receive HSTS header kenderhazmagyarorszag.hu: did not receive HSTS header -kennethlim.me: could not connect to host +kennethlim.me: did not receive HSTS header kerangalam.com: could not connect to host kerksanders.nl: did not receive HSTS header kermadec.net: could not connect to host kernl.us: did not receive HSTS header keymaster.lookout.com: did not receive HSTS header keysupport.org: could not connect to host kgxtech.com: max-age too low: 2592000 ki-on.net: did not receive HSTS header @@ -2206,17 +2210,16 @@ kimpost.org: could not connect to host kinderly.co.uk: did not receive HSTS header kinderwagen-test24.de: could not connect to host kindof.ninja: could not connect to host kingmanhall.org: could not connect to host kinkdr.com: could not connect to host kinnon.enterprises: could not connect to host kionetworks.com: did not receive HSTS header kipira.com: could not connect to host -kirbear.com: could not connect to host kirkforcongress.com: could not connect to host kirkforsenate.com: could not connect to host kirkpatrickdavis.com: could not connect to host kisa.io: could not connect to host kisalt.im: did not receive HSTS header kissart.net: could not connect to host kissflow.com: did not receive HSTS header kisun.co.jp: could not connect to host @@ -2224,26 +2227,27 @@ kitakemon.com: could not connect to host kitchenpunx.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] kitk.at: could not connect to host kitsostech.com: could not connect to host kitsta.com: could not connect to host kiwiirc.com: max-age too low: 5256000 kizil.net: could not connect to host kjaermaxi.me: did not receive HSTS header kjchernov.info: could not connect to host -klauwd.com: could not connect to host +klauwd.com: did not receive HSTS header klaxn.org: could not connect to host kleertjesvoordelig.nl: did not receive HSTS header kleinblogje.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] kletterkater.com: did not receive HSTS header klicktojob.de: could not connect to host kmartin.io: did not receive HSTS header +knapen.io: could not connect to host knccloud.com: could not connect to host knightsbridgegroup.org: could not connect to host -knowledgesnap.com: did not receive HSTS header +knowledgesnap.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] knowledgesnapsites.com: could not connect to host kodokushi.fr: could not connect to host koen.io: did not receive HSTS header koenrouwhorst.nl: did not receive HSTS header kojipkgs.fedoraproject.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] kollabria.com: max-age too low: 0 komikito.com: could not connect to host kompetenzwerft.de: did not receive HSTS header @@ -2259,17 +2263,16 @@ kostuumstore.nl: did not receive HSTS he kotonehoko.net: could not connect to host kotovstyle.ru: could not connect to host kr.search.yahoo.com: did not receive HSTS header kramsj.uk: could not connect to host krayx.com: could not connect to host kreavis.com: did not receive HSTS header kredite.sale: could not connect to host kriegt.es: could not connect to host -kristikala.nl: could not connect to host krmela.com: could not connect to host kroetenfuchs.de: could not connect to host kropkait.pl: could not connect to host krouzkyliduska.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] krunut.com: did not receive HSTS header krypteia.org: could not connect to host kryptomech.com: could not connect to host ksfh-mail.de: could not connect to host @@ -2281,16 +2284,17 @@ kummerlaender.eu: did not receive HSTS h kupelne-ptacek.sk: did not receive HSTS header kuppingercole.com: did not receive HSTS header kura.io: could not connect to host kurehun.org: could not connect to host kurtmclester.com: did not receive HSTS header kusaka-abacus.jp: max-age too low: 0 kvhile.com: could not connect to host kweddingplanning.com: did not receive HSTS header +kwok.tv: could not connect to host kyanite.co: could not connect to host kylapps.com: did not receive HSTS header kylinj.com: could not connect to host kyochon.fr: could not connect to host kz.search.yahoo.com: did not receive HSTS header kzjnet.com: could not connect to host labaia.info: could not connect to host labina.com.tr: did not receive HSTS header @@ -2311,26 +2315,28 @@ lancehoteis.com.br: could not connect to landscape.canonical.com: max-age too low: 2592000 langenbach.rocks: could not connect to host langhun.me: did not receive HSTS header laozhu.me: did not receive HSTS header laserfuchs.de: did not receive HSTS header lashstuff.com: did not receive HSTS header lask.in: did not receive HSTS header latour-managedcare.ch: did not receive HSTS header -latrine.cz: did not receive HSTS header latus.xyz: could not connect to host lausitzer-widerstand.de: could not connect to host lavine.ch: did not receive HSTS header lavval.com: could not connect to host lawformt.com: could not connect to host laxatus.com: did not receive HSTS header laxiongames.es: could not connect to host lbrt.xyz: could not connect to host ldarby.me.uk: could not connect to host +le-dev.de: could not connect to host +le-h.de: could not connect to host +le-hosting.de: could not connect to host leadership9.com: could not connect to host leardev.de: did not receive HSTS header learnedovo.com: could not connect to host learnfrenchfluently.com: did not receive HSTS header learningorder.com: could not connect to host lechiennoir.net: did not receive HSTS header ledgerscope.net: could not connect to host leermotorrijden.nl: max-age too low: 300 @@ -2382,16 +2388,17 @@ lifeinitsownway.com: did not receive HST lifeskillsdirect.com: did not receive HSTS header lifestylehunter.co.uk: did not receive HSTS header lifetimemoneymachine.com: did not receive HSTS header lifi.digital: did not receive HSTS header lifi.is: could not connect to host lightarmory.com: could not connect to host lightpaste.com: could not connect to host lightworx.io: did not receive HSTS header +lijero.co: could not connect to host lillpopp.eu: max-age too low: 10 lilpwny.com: could not connect to host limalama.eu: max-age too low: 1 limeyeti.com: could not connect to host limiteddata.co.uk: could not connect to host limpido.it: could not connect to host lincolnwayflorist.com: could not connect to host lindberg.io: did not receive HSTS header @@ -2410,17 +2417,16 @@ liquorsanthe.in: could not connect to ho lisonfan.com: did not receive HSTS header listafirmelor.com: could not connect to host litespeed.io: could not connect to host livedemo.io: could not connect to host livej.am: could not connect to host livi.co: did not receive HSTS header loadingdeck.com: did not receive HSTS header loafbox.com: could not connect to host -locchat.com: did not receive HSTS header locktheirphone.com: could not connect to host locomotive.ca: did not receive HSTS header loforo.com: could not connect to host login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless) loginseite.com: could not connect to host lonal.com: could not connect to host londonlanguageexchange.com: could not connect to host look-at-my.site: could not connect to host @@ -2525,16 +2531,17 @@ manufacturing.gov: could not connect to maomaofuli.vip: could not connect to host marchagen.nl: did not receive HSTS header marcontrol.com: did not receive HSTS header marcush.de: did not receive HSTS header marcuskoh.com: could not connect to host mariannematthew.com: could not connect to host marie-curie.fr: could not connect to host marie-elisabeth.dk: did not receive HSTS header +marie.club: did not receive HSTS header mario.party: could not connect to host markaconnor.com: could not connect to host markayapilandirma.com: could not connect to host market.android.com: did not receive HSTS header (error ignored - included regardless) markrego.com: could not connect to host marktboten.de: did not receive HSTS header markus-dev.com: did not receive HSTS header markusweimar.de: did not receive HSTS header @@ -2628,41 +2635,41 @@ mfiles.pl: [Exception... "Component retu mgrossklaus.de: did not receive HSTS header mh-bloemen.co.jp: could not connect to host mhdsyarif.com: did not receive HSTS header mhealthdemocamp.com: could not connect to host mhertel.com: did not receive HSTS header mhict.nl: max-age too low: 0 mhx.pw: could not connect to host mia.to: could not connect to host -michaelcullen.name: could not connect to host -michaelfitzpatrickruth.com: could not connect to host +michaelfitzpatrickruth.com: did not receive HSTS header michaelwaite.org: could not connect to host michal-kral.cz: could not connect to host michalborka.cz: could not connect to host +michasfahrschule.com: could not connect to host michelchouinard.ca: could not connect to host michiganunionoptout.com: could not connect to host miconware.de: did not receive HSTS header micro-dv.ru: could not connect to host micro-rain-systems.com: did not receive HSTS header microme.ga: could not connect to host micropple.net: could not connect to host microtalk.org: could not connect to host midwestwomenworkers.org: did not receive HSTS header mightydicks.io: could not connect to host mightydicks.tech: could not connect to host mightysounds.cz: max-age too low: 0 mijcorijneveld.nl: did not receive HSTS header mijn-email.org: could not connect to host mikaelemilsson.net: did not receive HSTS header mikeburns.com: did not receive HSTS header +mikecb.org: did not receive HSTS header mikeg.de: did not receive HSTS header mikek.work: could not connect to host mikeology.org: could not connect to host -mikeybot.com: could not connect to host mikonmaa.fi: could not connect to host mikrom.cz: did not receive HSTS header miku.be: did not receive HSTS header miku.hatsune.my: max-age too low: 5184000 milang.xyz: could not connect to host milesgeek.com: did not receive HSTS header mindcraft.ga: could not connect to host mindoktor.se: did not receive HSTS header @@ -2683,17 +2690,17 @@ mitchellrenouf.ca: could not connect to mitsign.com: could not connect to host mittenhacks.com: could not connect to host miui-germany.de: did not receive HSTS header mivcon.net: could not connect to host mixtape.moe: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] miyoshi-kikaku.co.jp: did not receive HSTS header miyoshi-kikaku.com: did not receive HSTS header mizd.at: could not connect to host -mizi.name: did not receive HSTS header +mizi.name: could not connect to host mkes.com: did not receive HSTS header mlpepilepsy.org: could not connect to host mmgazhomeloans.com: did not receive HSTS header mnemotiv.com: could not connect to host mnetworkingsolutions.co.uk: did not receive HSTS header mobaircon.com: could not connect to host mobifinans.ru: did not receive HSTS header mobilekey.co: could not connect to host @@ -2722,45 +2729,47 @@ moparisthebest.info: could not connect t moparscape.org: did not receive HSTS header mor.gl: could not connect to host morethanadream.lv: could not connect to host moriz.net: could not connect to host morningcalculation.com: could not connect to host morotech.com.br: did not receive HSTS header morpork.xyz: could not connect to host mortgagecentersmo.com: did not receive HSTS header -morz.org: did not receive HSTS header +morz.org: could not connect to host mostwuat.com: could not connect to host motherbase.io: could not connect to host motionpicturesolutions.com: did not receive HSTS header motocyklovedily.cz: did not receive HSTS header motoryz.com: max-age too low: 300 mottvd.com: could not connect to host moula.com.au: did not receive HSTS header mountainmusicpromotions.com: did not receive HSTS header moviesabout.net: could not connect to host moy-gorod.od.ua: did not receive HSTS header moy.cat: could not connect to host mp3juices.is: could not connect to host +mplusm.eu: could not connect to host mqas.net: could not connect to host mrettich.org: did not receive HSTS header mrnonz.com: max-age too low: 0 mrpopat.in: did not receive HSTS header mrs-shop.com: did not receive HSTS header msc-seereisen.net: could not connect to host msno.no: did not receive HSTS header mszaki.com: did not receive HSTS header mt.me.uk: could not connect to host mt.search.yahoo.com: did not receive HSTS header mtcgf.com: did not receive HSTS header mtg-esport.de: could not connect to host mu.search.yahoo.com: did not receive HSTS header mudcrab.us: did not receive HSTS header mujadin.se: did not receive HSTS header munich-rage.de: could not connect to host +munuc.org: could not connect to host munzee.com: did not receive HSTS header muriburi.land: could not connect to host muriburiland.com: could not connect to host murodese.org: could not connect to host murraycoin.org: could not connect to host murrayrun.com: could not connect to host musikkfondene.no: did not receive HSTS header mustika.cf: could not connect to host @@ -2792,17 +2801,16 @@ myni.io: could not connect to host mypagella.com: could not connect to host mypagella.eu: could not connect to host mypagella.it: could not connect to host mypension.ca: could not connect to host myphonebox.de: could not connect to host myraytech.net: did not receive HSTS header mysecretrewards.com: did not receive HSTS header mystery-science-theater-3000.de: did not receive HSTS header -mystudy.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] myvirtualserver.com: max-age too low: 2592000 myzone.com: did not receive HSTS header n0psled.nl: could not connect to host n2x.in: could not connect to host n4l.pw: could not connect to host nagelfam.com: could not connect to host nagoya-kyuyo.com: could not connect to host naiharngym.com: did not receive HSTS header @@ -2836,16 +2844,17 @@ nbb.io: could not connect to host nbg-ha.de: could not connect to host ncc60205.info: could not connect to host ncpc.gov: could not connect to host nct.org.uk: max-age too low: 1 nctx.co.uk: did not receive HSTS header near.st: did not receive HSTS header neftaly.com: did not receive HSTS header negativecurvature.net: could not connect to host +neilgreen.net: did not receive HSTS header neko-life.com: did not receive HSTS header neko-system.com: did not receive HSTS header nella-project.org: could not connect to host nellacms.com: could not connect to host nellacms.org: could not connect to host nellafw.org: could not connect to host nemno.de: could not connect to host nemovement.org: did not receive HSTS header @@ -2959,48 +2968,49 @@ numericacu.com: did not receive HSTS hea numero-di-telefono.it: could not connect to host nuos.org: could not connect to host nurserybook.co: did not receive HSTS header nutleyeducationalfoundation.org: did not receive HSTS header nutleyef.org: did not receive HSTS header nutrienti.eu: could not connect to host nutritionculture.com: could not connect to host nutsandboltsmedia.com: did not receive HSTS header +nuxer.fr: could not connect to host nwa.xyz: could not connect to host nwgh.org: max-age too low: 86400 nwork.media: could not connect to host nyantec.com: did not receive HSTS header nysepho.pw: could not connect to host nystart.no: did not receive HSTS header nz.search.yahoo.com: max-age too low: 172800 nzb.cat: max-age too low: 7776000 nzquakes.maori.nz: did not receive HSTS header o0o.one: did not receive HSTS header oasis.mobi: could not connect to host oasisim.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] oauth-dropins.appspot.com: did not receive HSTS header obsydian.org: could not connect to host occentus.net: did not receive HSTS header ochaken.cf: could not connect to host +octocat.ninja: did not receive HSTS header odifi.com: could not connect to host odin.xxx: did not receive HSTS header oe8.bet: could not connect to host ofcourselanguages.com: could not connect to host offshore-firma.org: could not connect to host ogogoshop.com: could not connect to host oishioffice.com: did not receive HSTS header okane.love: could not connect to host okay.coffee: could not connect to host okok-rent.com: could not connect to host okok.rent: could not connect to host okutama.in.th: could not connect to host olafnorge.de: could not connect to host olanderflorist.com: could not connect to host oldoakflorist.com: could not connect to host -oliveraiedelabastideblanche.fr: could not connect to host oliverdunk.com: did not receive HSTS header ollehbizev.co.kr: could not connect to host ollie.io: did not receive HSTS header omgaanmetidealen.com: could not connect to host ominto.com: max-age too low: 0 omniti.com: max-age too low: 1 omquote.gq: could not connect to host oneb4nk.com: could not connect to host @@ -3009,16 +3019,17 @@ onefour.co: could not connect to host onehourloan.com: could not connect to host oneminute.io: did not receive HSTS header onepluscamps.com: could not connect to host onespiritinc.com: did not receive HSTS header onet.space: could not connect to host oniichan.us: did not receive HSTS header online-casino.eu: did not receive HSTS header online-wetten.de: did not receive HSTS header +online.marketing: did not receive HSTS header onlinecompliance.org: did not receive HSTS header onlinedeposit.us: could not connect to host onlinekasino.de: did not receive HSTS header onlinepollsph.com: could not connect to host onlinespielothek.com: did not receive HSTS header onlinewetten.de: could not connect to host onlyshopstation.com: did not receive HSTS header ononpay.com: did not receive HSTS header @@ -3050,16 +3061,17 @@ opsbears.com: did not receive HSTS heade optenhoefel.de: could not connect to host optimista.soy: could not connect to host optometriepunt.nl: did not receive HSTS header optumrxhealthstore.com: did not receive HSTS header oracaodocredo.com.br: could not connect to host orbiosales.com: could not connect to host orbitcom.de: max-age too low: 0 orbograph-hrcm.com: could not connect to host +ordereat.fr: could not connect to host orf-digitalsatkarte.at: could not connect to host organiplan.com: could not connect to host orioncustompcs.com: could not connect to host orionfcu.com: did not receive HSTS header orleika.ml: could not connect to host orthodoxy.lt: did not receive HSTS header osaiyuwu.com: could not connect to host oslfoundation.org: could not connect to host @@ -3099,18 +3111,18 @@ pacelink.de: could not connect to host packlane.com: did not receive HSTS header pader-deko.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] paestbin.com: could not connect to host pagerate.io: did not receive HSTS header pagetoimage.com: could not connect to host pahae.de: did not receive HSTS header paintingat.com: could not connect to host paisaone.com: did not receive HSTS header +pakke.de: could not connect to host paku.me: could not connect to host -palmer.im: could not connect to host pamplona.tv: could not connect to host pamsoft.pl: max-age too low: 0 panaceallc.net: could not connect to host panamaequity.com: did not receive HSTS header panamateakforestry.com: did not receive HSTS header pansu.space: could not connect to host pants-off.xyz: could not connect to host pantsu.cat: did not receive HSTS header @@ -3189,19 +3201,20 @@ pewboards.com: could not connect to host pgpm.io: could not connect to host pharmgkb.org: could not connect to host phil.tw: could not connect to host phoebe.co.nz: did not receive HSTS header phonenumberinfo.co.uk: could not connect to host phongmay24h.com: could not connect to host photoblogverona.com: could not connect to host php-bach.org: could not connect to host -phpfashion.com: did not receive HSTS header +phpfashion.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] phurl.de: could not connect to host phus.lu: did not receive HSTS header +pickme.nl: could not connect to host pickr.co: could not connect to host picotronic.biz: could not connect to host picscare.co.uk: did not receive HSTS header pieperhome.de: could not connect to host pijuice.com: could not connect to host pilgermaske.org: did not receive HSTS header piligrimname.com: could not connect to host pillowandpepper.com: did not receive HSTS header @@ -3262,16 +3275,17 @@ pompompoes.com: could not connect to hos pontokay.com.br: did not receive HSTS header pontualcomp.com: max-age too low: 2592000 poolsandstuff.com: did not receive HSTS header poon.tech: could not connect to host pornstars.me: could not connect to host portalplatform.net: did not receive HSTS header poshpak.com: max-age too low: 86400 postcodewise.co.uk: did not receive HSTS header +posterspy.com: did not receive HSTS header postscheduler.org: could not connect to host posylka.de: did not receive HSTS header poussinooz.fr: could not connect to host povitria.net: could not connect to host power99press.com: did not receive HSTS header powerplannerapp.com: did not receive HSTS header powerxequality.com: could not connect to host ppr-truby.ru: could not connect to host @@ -3369,42 +3383,42 @@ r10n.com: did not receive HSTS header r15.me: could not connect to host r3bl.me: did not receive HSTS header raajheshkannaa.com: could not connect to host radicaleducation.net: could not connect to host rafaelcz.de: could not connect to host railgun.com.cn: could not connect to host rainbowbarracuda.com: could not connect to host ramonj.nl: could not connect to host +ramshair.jp: could not connect to host randomcage.com: did not receive HSTS header randomcloud.net: could not connect to host rankthespot.com: could not connect to host rannseier.org: did not receive HSTS header rapidresearch.me: could not connect to host rapidthunder.io: could not connect to host rasing.me: did not receive HSTS header raspass.me: could not connect to host rastreador.com.es: did not receive HSTS header ratajczak.fr: could not connect to host rate-esport.de: could not connect to host +rathorian.fr: could not connect to host raulfraile.net: could not connect to host -ravkr.duckdns.org: could not connect to host rawet.se: did not receive HSTS header rawstorieslondon.com: could not connect to host raydan.space: could not connect to host raydobe.me: could not connect to host rbhighinc.org: could not connect to host rc-rp.com: did not receive HSTS header -rc4.io: did not receive HSTS header +rc4.io: could not connect to host rcafox.com: could not connect to host rcpcbd.com: did not receive HSTS header rdns.im: did not receive HSTS header re-customer.net: could not connect to host readr.pw: could not connect to host -readytongue.com: could not connect to host realmic.net: could not connect to host realmofespionage.com: could not connect to host reardenporn.com: could not connect to host recommended.reviews: could not connect to host redar.xyz: did not receive HSTS header reddiseals.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] reddit.com: did not receive HSTS header rede.ca: did not receive HSTS header @@ -3414,17 +3428,16 @@ redlatam.org: did not receive HSTS heade redmbk.com: did not receive HSTS header redports.org: could not connect to host regaloaks.com: did not receive HSTS header regalpalms.com: did not receive HSTS header regenbogenwald.de: did not receive HSTS header regenerescence.com: did not receive HSTS header reggae-cdmx.com: did not receive HSTS header reic.me: could not connect to host -reinaertvandecruys.me: could not connect to host reisyukaku.org: did not receive HSTS header rejo.in: could not connect to host rejuvemedspa.com: did not receive HSTS header relatethesport.com: could not connect to host reliable-mail.de: did not receive HSTS header relisten.nl: did not receive HSTS header rem.pe: could not connect to host remitatm.com: could not connect to host @@ -3441,25 +3454,28 @@ reprolife.co.uk: max-age too low: 0 res-rheingau.de: did not receive HSTS header res42.com: could not connect to host research.facebook.com: did not receive HSTS header reserve-online.net: did not receive HSTS header respice.xyz: could not connect to host respostas.com.br: did not receive HSTS header restchart.com: did not receive HSTS header retrotracks.net: max-age too low: 0 +revealdata.com: did not receive HSTS header revello.org: did not receive HSTS header reverie.pw: could not connect to host reviews.anime.my: max-age too low: 5184000 revtut.net: did not receive HSTS header rewardstock.com: max-age too low: 0 rhapsodhy.hu: could not connect to host rhdigital.pro: could not connect to host +rhering.de: could not connect to host rhodri.io: could not connect to host richardb.me: could not connect to host +richardhering.de: could not connect to host richiemail.net: did not receive HSTS header richmondsunlight.com: did not receive HSTS header richsiciliano.com: could not connect to host rid-wan.com: could not connect to host rideworks.com: did not receive HSTS header riesenweber.id.au: did not receive HSTS header right2.org: could not connect to host righttoknow.ie: did not receive HSTS header @@ -3472,32 +3488,29 @@ rippleunion.com: could not connect to ho riskmgt.com.au: could not connect to host rivastation.de: did not receive HSTS header rj.gg: could not connect to host rk6.cz: could not connect to host rkmantpur.org: did not receive HSTS header rme.li: did not receive HSTS header rngmeme.com: could not connect to host roan24.pl: did not receive HSTS header -robandjanine.com: could not connect to host robertglastra.com: could not connect to host robigalia.org: did not receive HSTS header -robspc.repair: could not connect to host robteix.com: did not receive HSTS header robtex.net: did not receive HSTS header robtex.org: did not receive HSTS header rochman.id: could not connect to host rocksberg.net: did not receive HSTS header rockstarloan.com: max-age too low: 0 roddis.net: did not receive HSTS header rodney.id.au: did not receive HSTS header rodosto.com: did not receive HSTS header roeper.party: could not connect to host -rogerbastien.com: could not connect to host -rolandszabo.com: could not connect to host +rohitagr.com: did not receive HSTS header rolemaster.net: could not connect to host romans-place.me.uk: could not connect to host ron2k.za.net: could not connect to host ronvandordt.info: could not connect to host ronwo.de: max-age too low: 1 room-checkin24.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] rootforum.org: did not receive HSTS header rootservice.org: did not receive HSTS header @@ -3516,18 +3529,17 @@ rsf.io: could not connect to host rsmaps.org: could not connect to host rubbereggs.ca: could not connect to host rubberfurs.org: max-age too low: 86400 rubecodeberg.com: could not connect to host rubenschulz.nl: did not receive HSTS header ruborr.se: did not receive HSTS header rubyshop.nl: max-age too low: 604800 rudeotter.com: could not connect to host -rudloff.pro: could not connect to host -ruffbeatz.com: could not connect to host +rudloff.pro: did not receive HSTS header rugirlfriend.com: could not connect to host ruiming.me: did not receive HSTS header runawebinar.nl: could not connect to host runementors.com: could not connect to host runtondev.com: did not receive HSTS header ruqu.nl: could not connect to host rusadmin.biz: did not receive HSTS header rusl.me: could not connect to host @@ -3535,16 +3547,17 @@ russmarshall.com: could not connect to h ruxit.com: did not receive HSTS header rw.search.yahoo.com: did not receive HSTS header rx-contact.com: did not receive HSTS header rxprep.com: did not receive HSTS header rxv.cc: could not connect to host ryansmithphotography.com: did not receive HSTS header ryanteck.uk: did not receive HSTS header s.how: did not receive HSTS header +s007.co: could not connect to host safelist.eu: did not receive HSTS header safematix.com: could not connect to host safewings-nh.nl: did not receive HSTS header safic.net: could not connect to host sageth.com: max-age too low: 0 sah3.net: could not connect to host sairai.bid: did not receive HSTS header sakaki.anime.my: max-age too low: 5184000 @@ -3554,21 +3567,21 @@ salesmachine.io: did not receive HSTS he salserocafe.com: did not receive HSTS header salserototal.com: did not receive HSTS header salud.top: did not receive HSTS header saml2.com: could not connect to host sampoznay.ru: did not receive HSTS header samraskauskas.com: could not connect to host samsen.club: did not receive HSTS header samuelkeeley.com: could not connect to host -sanasalud.org: did not receive HSTS header +sanasalud.org: could not connect to host sandrolittke.de: did not receive HSTS header sandviks.com: did not receive HSTS header sangwon.org: could not connect to host -sansemea.com: could not connect to host +sansemea.com: did not receive HSTS header sansonehowell.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] sarah-beckett-harpist.com: did not receive HSTS header sarahsweetlife.com: could not connect to host sarisonproductions.com: did not receive HSTS header saruwebshop.co.za: could not connect to host sat.rent: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] satmep.com: did not receive HSTS header satrent.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] @@ -3656,17 +3669,16 @@ semps.de: did not receive HSTS header senedirect.com: did not receive HSTS header sensiblemn.org: could not connect to host sensibus.com: did not receive HSTS header seo.consulting: did not receive HSTS header seomobo.com: could not connect to host seowarp.net: did not receive HSTS header sep23.ru: did not receive HSTS header seq.tf: did not receive HSTS header -serafin.tech: could not connect to host serenitycreams.com: did not receive HSTS header serfdom.io: did not receive HSTS header serized.pw: could not connect to host servercode.ca: did not receive HSTS header serverdensity.io: did not receive HSTS header servergno.me: did not receive HSTS header servermonkey.nl: could not connect to host seryo.moe: could not connect to host @@ -3689,17 +3701,17 @@ shanewadleigh.com: could not connect to shareimg.xyz: could not connect to host sharepass.pw: could not connect to host sharescope.co.uk: max-age too low: 14400 sharevari.com: did not receive HSTS header shauncrowley.co.uk: could not connect to host shaunwheelhou.se: could not connect to host shawnh.net: could not connect to host shellsec.pw: did not receive HSTS header -sherbers.de: could not connect to host +shereallyheals.com: could not connect to host shibe.club: could not connect to host shiftins.com: did not receive HSTS header shiinko.com: could not connect to host shinebijoux.com.br: could not connect to host shinju.moe: could not connect to host shinonome-lab.eu.org: did not receive HSTS header shiona.xyz: could not connect to host shocksrv.com: did not receive HSTS header @@ -3710,16 +3722,17 @@ shops.neonisi.com: could not connect to shortr.li: could not connect to host showkeeper.tv: did not receive HSTS header shrike.me: could not connect to host shukatsu-note.com: could not connect to host shv25.se: could not connect to host shwongacc.com: could not connect to host shyrydan.es: could not connect to host siammedia.co: could not connect to host +sickfile.com: could not connect to host siddhant.me: could not connect to host siebens.net: could not connect to host sifls.com: could not connect to host sig6.org: could not connect to host silentcircle.org: could not connect to host silicagelpackets.ca: did not receive HSTS header silver-drachenkrieger.de: did not receive HSTS header silverhome.ninja: could not connect to host @@ -3731,50 +3744,51 @@ simon.butcher.name: max-age too low: 262 simongong.net: did not receive HSTS header simpleai.net: max-age too low: 600 simplefraud.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] simplelearner.com: could not connect to host simplepractice.com: did not receive HSTS header simply-premium.com: max-age too low: 0 sin30.net: could not connect to host sincron.org: could not connect to host +sinful.pw: could not connect to host +singul4rity.com: could not connect to host +sinosky.org: could not connect to host siriad.com: did not receive HSTS header sirius-lee.net: could not connect to host sitennisclub.com: did not receive HSTS header sites.google.com: did not receive HSTS header (error ignored - included regardless) sitesten.com: did not receive HSTS header sitsy.ru: did not receive HSTS header sixtwentyten.com: did not receive HSTS header skeeley.com: could not connect to host skhosting.eu: did not receive HSTS header skidstresser.com: could not connect to host skile.ru: could not connect to host skk.io: could not connect to host skoda-clever-lead.de: could not connect to host skoda-im-dialog.de: could not connect to host -skoleniphp.cz: did not receive HSTS header -skotty.io: could not connect to host skullhouse.nyc: did not receive HSTS header skyasker.cn: could not connect to host skyflix.me: did not receive HSTS header skyoy.com: could not connect to host slash-dev.de: did not receive HSTS header slashand.co: could not connect to host +slashem.me: did not receive HSTS header slattery.co: could not connect to host sleep10.com: could not connect to host slicketl.com: did not receive HSTS header slightfuture.click: could not connect to host slix.io: could not connect to host slope.haus: could not connect to host slovakiana.sk: did not receive HSTS header sluitkampzeist.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] slycurity.de: did not receive HSTS header smart-mirror.de: did not receive HSTS header smart-ov.nl: could not connect to host -smartairkey.com: did not receive HSTS header smartcoin.com.br: could not connect to host smartlend.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] smartofficesandsmarthomes.com: did not receive HSTS header smartrak.co.nz: did not receive HSTS header smatch.com: did not receive HSTS header smdev.fr: could not connect to host smet.us: could not connect to host smimea.com: could not connect to host @@ -3812,21 +3826,20 @@ sogeek.me: did not receive HSTS header sol-3.de: did not receive HSTS header solidfuelappliancespares.co.uk: did not receive HSTS header solinter.com.br: did not receive HSTS header solit.systems: did not receive HSTS header soll-i.ch: did not receive HSTS header solsystems.ru: could not connect to host someshit.xyz: could not connect to host somethingnew.xyz: did not receive HSTS header -sonic.sk: max-age too low: 0 sonicrainboom.rocks: could not connect to host sotiran.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] sotor.de: did not receive HSTS header -soulboy.io: did not receive HSTS header +soulboy.io: could not connect to host soulema.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] soulfulglamour.uk: could not connect to host sourcelair.com: did not receive HSTS header southmeriden-vfd.org: could not connect to host southside-crew.club: could not connect to host southworcestershiregpservices.co.uk: could not connect to host souyar.de: could not connect to host souyar.net: could not connect to host @@ -3849,34 +3862,33 @@ speedcounter.net: did not receive HSTS h speedtest-russia.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] speedy.lt: max-age too low: 0 speidel.com.tr: did not receive HSTS header spencerbaer.com: could not connect to host sperohub.io: could not connect to host spherenix.org: could not connect to host spicydog.tk: could not connect to host spiegels.nl: could not connect to host -spikeykc.me: could not connect to host +spikeykc.me: did not receive HSTS header spillmaker.no: did not receive HSTS header spilsbury.io: could not connect to host spititout.it: could not connect to host spittersberger.recipes: did not receive HSTS header sponsortobias.com: did not receive HSTS header sportwette.eu: did not receive HSTS header spot-events.com: could not connect to host spotifyripper.tk: could not connect to host spotlightsrule.ddns.net: could not connect to host spreadsheets.google.com: did not receive HSTS header (error ignored - included regardless) spreed.me: did not receive HSTS header sproutconnections.com: did not receive HSTS header sprybear.com: did not receive HSTS header square.gs: could not connect to host squatldf.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] sqzryang.com: did not receive HSTS header -srcc.fr: could not connect to host srevilak.net: did not receive HSTS header srna.sk: could not connect to host srrr.ca: could not connect to host ss.wtf: could not connect to host ssl.panoramio.com: did not receive HSTS header ssl.rip: could not connect to host sslpoint.com: did not receive HSTS header ssmato.me: could not connect to host @@ -3901,17 +3913,17 @@ stayokhotelscdc-mailing.com: could not c stcomex.com: did not receive HSTS header stefanweiser.de: did not receive HSTS header stephanierxo.com: did not receive HSTS header stephenandburns.com: did not receive HSTS header stevensononthe.net: did not receive HSTS header stewartremodelingadvantage.com: did not receive HSTS header stig.io: did not receive HSTS header stigroom.com: could not connect to host -stillyarts.com: could not connect to host +stillblackhat.id: could not connect to host stirlingpoon.xyz: could not connect to host stkbn.com: did not receive HSTS header stmbgr.com: could not connect to host stn.me.uk: did not receive HSTS header stnl.de: could not connect to host stocktrade.de: could not connect to host stoffe-monster.de: did not receive HSTS header stole-my.bike: could not connect to host @@ -3937,32 +3949,34 @@ stuartbaxter.co: could not connect to ho student-scientist.org: did not receive HSTS header studentresearcher.org: did not receive HSTS header studentskydenik.cz: could not connect to host studenttravel.cz: did not receive HSTS header studiozelden.com: did not receive HSTS header studybay.com: did not receive HSTS header studydrive.net: did not receive HSTS header stugb.de: did not receive HSTS header +stuur.nl: did not receive HSTS header stw-group.at: could not connect to host stygium.net: could not connect to host stylenda.com: could not connect to host subbing.work: could not connect to host subdimension.org: could not connect to host subeesu.com: could not connect to host subrosa.io: could not connect to host subsys.no: did not receive HSTS header subtitle.rip: could not connect to host sudo.li: did not receive HSTS header suian.or.jp: max-age too low: 86400 suite73.org: could not connect to host suksit.com: could not connect to host sumoatm.com: did not receive HSTS header sumoscout.de: did not receive HSTS header suncountrymarine.com: did not receive HSTS header +sunflyer.cn: did not receive HSTS header sunnyfruit.ru: did not receive HSTS header sunshinepress.org: could not connect to host supcro.com: could not connect to host superbabysitting.ch: could not connect to host superbike.tw: could not connect to host supereight.net: did not receive HSTS header superiorfloridavacation.com: did not receive HSTS header supersalescontest.nl: did not receive HSTS header @@ -4036,34 +4050,33 @@ tc-bonito.de: max-age too low: 3600 tcao.info: could not connect to host tcby45.xyz: did not receive HSTS header tcdw.net: could not connect to host tcl.ath.cx: did not receive HSTS header tcomms.org: max-age too low: 0 tcp.expert: did not receive HSTS header teachforcanada.ca: did not receive HSTS header team-teasers.com: could not connect to host -teamsocial.co: could not connect to host +teamsocial.co: did not receive HSTS header teamzeus.cz: could not connect to host tech55i.com: did not receive HSTS header techassist.io: did not receive HSTS header techhipster.net: could not connect to host techhub.ml: could not connect to host techllage.com: could not connect to host techloaner.com: could not connect to host techmatehq.com: could not connect to host technogroup.cz: did not receive HSTS header technosavvyport.com: did not receive HSTS header techpointed.com: could not connect to host tedb.us: did not receive HSTS header tegelsensanitaironline.nl: did not receive HSTS header tekshrek.com: did not receive HSTS header telefonnummer.online: could not connect to host telefoonnummerinfo.nl: could not connect to host -telling.xyz: could not connect to host temehu.com: did not receive HSTS header tempcraft.net: could not connect to host tendertool.nl: could not connect to host tenni.xyz: could not connect to host tensionup.com: could not connect to host teos.online: could not connect to host teriiphotography.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] terra.by: did not receive HSTS header @@ -4095,17 +4108,16 @@ thebigfail.net: could not connect to hos thebrotherswarde.com: could not connect to host thecapitalbank.com: did not receive HSTS header thecharlestonwaldorf.com: did not receive HSTS header theclementinebutchers.com: could not connect to host theclubjersey.com: did not receive HSTS header thecoffeehouse.xyz: could not connect to host thediaryofadam.com: did not receive HSTS header theendofzion.com: did not receive HSTS header -theeyeopener.com: did not receive HSTS header theflowerbasketonline.com: could not connect to host thefootballanalyst.com: could not connect to host thefrozenfire.com: did not receive HSTS header thegcccoin.com: did not receive HSTS header thego2swatking.com: could not connect to host thehiddenbay.eu: could not connect to host thehiddenbay.me: could not connect to host thehiddenbay.net: could not connect to host @@ -4209,17 +4221,16 @@ tonsit.org: did not receive HSTS header tonyfantjr.com: could not connect to host toomanypillows.com: could not connect to host topbargains.com.au: did not receive HSTS header topdeskdev.net: could not connect to host topmarine.se: could not connect to host topnewstoday.org: could not connect to host topshelfguild.com: could not connect to host torahanytime.com: did not receive HSTS header -toretfaction.net: could not connect to host tosecure.link: could not connect to host toshnix.com: could not connect to host totem-eshop.cz: could not connect to host toucedo.de: could not connect to host tourpeer.com: did not receive HSTS header toxme.se: could not connect to host tpbcdn.com: could not connect to host tpe-edu.com: could not connect to host @@ -4228,17 +4239,16 @@ tracktivity.com.au: did not receive HSTS tradingcentre.com.au: did not receive HSTS header tradinghope.com: could not connect to host traindb.nl: did not receive HSTS header trainut.com: could not connect to host translate.googleapis.com: did not receive HSTS header (error ignored - included regardless) transportal.sk: did not receive HSTS header treeby.net: could not connect to host trendberry.ru: could not connect to host -trimage.org: could not connect to host trinityaffirmations.com: max-age too low: 0 trinitycore.org: max-age too low: 2592000 trior.net: could not connect to host tripdelta.com: did not receive HSTS header trixies-wish.nz: could not connect to host trollme.me: could not connect to host trunkjunk.co: did not receive HSTS header trusitio.com: did not receive HSTS header @@ -4277,31 +4287,31 @@ twinkseason.xyz: could not connect to ho twist.party: could not connect to host twogo.com: did not receive HSTS header twolinepassbrewing.com: could not connect to host tx041cap.org: did not receive HSTS header txclimbers.com: could not connect to host txf.pw: could not connect to host ty2u.com: did not receive HSTS header tylian.net: max-age too low: 0 +typingrevolution.com: did not receive HSTS header tyrelius.com: did not receive HSTS header tyroproducts.eu: did not receive HSTS header tzappa.net: could not connect to host u-blox.com: max-age too low: 0 ua.search.yahoo.com: did not receive HSTS header uadp.pw: did not receive HSTS header uasmi.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] ubicloud.de: could not connect to host ubicv.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] ublox.com: did not receive HSTS header ubtce.com: could not connect to host ubuntuhot.com: did not receive HSTS header uega.net: did not receive HSTS header ufgaming.com: did not receive HSTS header -ufindme.at: could not connect to host ufotable.uk: did not receive HSTS header ui8.net: max-age too low: 86400 ukas.com: did not receive HSTS header ukdropshipment.co.uk: did not receive HSTS header ukdropshipment.com: did not receive HSTS header ukrgadget.com: could not connect to host ulabox.cat: did not receive HSTS header ulabox.es: did not receive HSTS header @@ -4398,21 +4408,21 @@ venixplays-stream.ml: could not connect verifikatorindonesia.com: could not connect to host vermontcareergateway.org: could not connect to host versia.ru: did not receive HSTS header veryhax.de: could not connect to host vetmgmt.com: could not connect to host vfree.org: could not connect to host vglimg.com: could not connect to host vhost.co.id: could not connect to host -vicenage.com: could not connect to host videnskabsklubben.dk: did not receive HSTS header videomuz.com: did not receive HSTS header vidz.ga: could not connect to host vieaw.com: could not connect to host +viemeister.com: could not connect to host viewsea.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] vigilo.cf: could not connect to host viktorsvantesson.net: did not receive HSTS header vincentkooijman.at: did not receive HSTS header vincentkooijman.nl: did not receive HSTS header vincentpancol.com: could not connect to host vintageheartcoffee.com: did not receive HSTS header vio.no: did not receive HSTS header @@ -4452,35 +4462,36 @@ vzk.io: could not connect to host w-spotlight.appspot.com: did not receive HSTS header (error ignored - included regardless) w4a.fr: did not receive HSTS header w4xzr.top: could not connect to host w4xzr.xyz: could not connect to host waixingrenfuli7.vip: could not connect to host wakapp.de: could not connect to host walkeryoung.ca: could not connect to host wallet.google.com: did not receive HSTS header (error ignored - included regardless) +wallpapers.pub: could not connect to host wallsblog.dk: could not connect to host walnutgaming.co.uk: could not connect to host wan.pp.ua: could not connect to host wanban.io: could not connect to host wangqiliang.org: could not connect to host wangzuan168.cc: did not receive HSTS header wapjt.cn: could not connect to host warandpeace.xyz: could not connect to host warehost.de: did not receive HSTS header warhistoryonline.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] warlions.info: did not receive HSTS header warmlyyours.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] warped.com: did not receive HSTS header warsentech.com: did not receive HSTS header +washingtonviews.com: did not receive HSTS header watchium.com: did not receive HSTS header watsonhall.uk: could not connect to host wave.is: could not connect to host wavefrontsystemstech.com: could not connect to host -wayne.cloud: did not receive HSTS header wealthfactory.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] wear2work.nl: did not receive HSTS header weaverhairextensions.nl: could not connect to host web-torrent.com: max-age too low: 0 web.cc: did not receive HSTS header web4all.fr: did not receive HSTS header web4pro.fr: did not receive HSTS header webandwords.com.au: could not connect to host @@ -4511,17 +4522,16 @@ weddingenvelopes.co.uk: did not receive weekly.fyi: could not connect to host weizenke.im: could not connect to host wellastore.ru: did not receive HSTS header wellsolveit.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] weltmeisterschaft.net: could not connect to host weltverschwoerung.de: did not receive HSTS header weme.eu: could not connect to host wendalyncheng.com: could not connect to host -wendigo.pl: could not connect to host werdeeintimo.de: did not receive HSTS header werkenbijkfc.nl: did not receive HSTS header werkplaatsoost.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] werkruimtebottendaal.nl: did not receive HSTS header wesleyharris.ca: did not receive HSTS header westendzone.com: max-age too low: 0 westerhoud.nl: did not receive HSTS header wettbuero.de: did not receive HSTS header @@ -4556,22 +4566,22 @@ whysuck.com: could not connect to host whyworldhot.com: could not connect to host wienholding.at: max-age too low: 0 wieninternational.at: did not receive HSTS header wiire.me: could not connect to host wikisports.eu: could not connect to host wilf1rst.com: could not connect to host willcipriano.com: could not connect to host william.si: did not receive HSTS header +williamsonshore.com: could not connect to host willosagiede.com: did not receive HSTS header winaes.com: did not receive HSTS header winclient.cn: could not connect to host winecodeavocado.com: could not connect to host winged.io: could not connect to host -wingos.net: could not connect to host wingumd.net: could not connect to host winhistory-forum.net: did not receive HSTS header winpack.cf: could not connect to host winpack.eu.org: could not connect to host winsec.nl: did not receive HSTS header winshiplending.com: did not receive HSTS header winterschoen.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] wirc.gr: could not connect to host @@ -4594,28 +4604,28 @@ wodice.com: could not connect to host wohlgemuth.rocks: could not connect to host wohnungsbau-ludwigsburg.de: did not receive HSTS header woima.fi: max-age too low: 604800 wolfesden.com: could not connect to host womosale.de: could not connect to host wonderfall.xyz: could not connect to host wonderhost.info: could not connect to host woodmafia.com.au: max-age too low: 0 +woontegelwinkel.nl: did not receive HSTS header woording.com: could not connect to host wootton95.com: could not connect to host woresite.jp: did not receive HSTS header workfone.io: did not receive HSTS header wowapi.org: could not connect to host wphostingspot.com: did not receive HSTS header wpmetadatastandardsproject.org: could not connect to host writeapp.me: did not receive HSTS header wsscompany.com.ve: could not connect to host wufu.org: did not receive HSTS header wuhengmin.com: did not receive HSTS header -wukongmusic.us: could not connect to host wurzelzwerg.net: could not connect to host wusx.club: could not connect to host www.apollo-auto.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] www.braintreepayments.com: did not receive HSTS header www.calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] www.cueup.com: could not connect to host www.cyveillance.com: did not receive HSTS header www.developer.mydigipass.com: could not connect to host @@ -4632,16 +4642,17 @@ www.moneybookers.com: did not receive HS www.neonisi.com: could not connect to host www.paycheckrecords.com: did not receive HSTS header www.rme.li: did not receive HSTS header www.sandbox.mydigipass.com: could not connect to host www.surfeasy.com: did not receive HSTS header www.zenpayroll.com: did not receive HSTS header www3.info: could not connect to host wxukang.cn: could not connect to host +wyzphoto.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] x2w.io: could not connect to host xa.search.yahoo.com: did not receive HSTS header xandocs.com: could not connect to host xatr0z.org: could not connect to host xavierbarroso.com: could not connect to host xbrlsuccess.appspot.com: did not receive HSTS header (error ignored - included regardless) xcoop.me: could not connect to host xellos.ga: could not connect to host @@ -4706,16 +4717,17 @@ ydy.jp: could not connect to host yello.website: could not connect to host yellowcar.website: could not connect to host yenniferallulli.de: could not connect to host yenniferallulli.es: did not receive HSTS header yenniferallulli.moda: could not connect to host yenniferallulli.nl: could not connect to host yestees.com: did not receive HSTS header yetcore.io: could not connect to host +yhb.io: could not connect to host yingyj.com: could not connect to host yippie.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] yizhu.com: could not connect to host yjsoft.me: did not receive HSTS header yjsw.sh.cn: could not connect to host ynode.co: did not receive HSTS header ynsn.nl: did not receive HSTS header yokeepo.com: max-age too low: 0
--- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -3,17 +3,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /*****************************************************************************/ /* This is an automatically generated file. If you're not */ /* nsSiteSecurityService.cpp, you shouldn't be #including it. */ /*****************************************************************************/ #include <stdint.h> -const PRTime gPreloadListExpirationTime = INT64_C(1497283691334000); +const PRTime gPreloadListExpirationTime = INT64_C(1497367817933000); static const char kSTSHostTable[] = { /* "0.me.uk", true */ '0', '.', 'm', 'e', '.', 'u', 'k', '\0', /* "007-preisvergleich.de", true */ '0', '0', '7', '-', 'p', 'r', 'e', 'i', 's', 'v', 'e', 'r', 'g', 'l', 'e', 'i', 'c', 'h', '.', 'd', 'e', '\0', /* "0100dev.com", true */ '0', '1', '0', '0', 'd', 'e', 'v', '.', 'c', 'o', 'm', '\0', /* "0100dev.nl", true */ '0', '1', '0', '0', 'd', 'e', 'v', '.', 'n', 'l', '\0', /* "01electronica.com.ar", true */ '0', '1', 'e', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 'a', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', /* "01seguridad.com.ar", true */ '0', '1', 's', 'e', 'g', 'u', 'r', 'i', 'd', 'a', 'd', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', @@ -116,17 +116,16 @@ static const char kSTSHostTable[] = { /* "24ip.fr", true */ '2', '4', 'i', 'p', '.', 'f', 'r', '\0', /* "24sihu.com", true */ '2', '4', 's', 'i', 'h', 'u', '.', 'c', 'o', 'm', '\0', /* "2600edinburgh.org", true */ '2', '6', '0', '0', 'e', 'd', 'i', 'n', 'b', 'u', 'r', 'g', 'h', '.', 'o', 'r', 'g', '\0', /* "263.info", true */ '2', '6', '3', '.', 'i', 'n', 'f', 'o', '\0', /* "28spots.net", true */ '2', '8', 's', 'p', 'o', 't', 's', '.', 'n', 'e', 't', '\0', /* "2acbi-asso.fr", true */ '2', 'a', 'c', 'b', 'i', '-', 'a', 's', 's', 'o', '.', 'f', 'r', '\0', /* "2bas.nl", true */ '2', 'b', 'a', 's', '.', 'n', 'l', '\0', /* "2bis10.de", true */ '2', 'b', 'i', 's', '1', '0', '.', 'd', 'e', '\0', - /* "2brokegirls.org", true */ '2', 'b', 'r', 'o', 'k', 'e', 'g', 'i', 'r', 'l', 's', '.', 'o', 'r', 'g', '\0', /* "2carpros.com", false */ '2', 'c', 'a', 'r', 'p', 'r', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "2cash.ru", true */ '2', 'c', 'a', 's', 'h', '.', 'r', 'u', '\0', /* "2cv-fahrer.de", true */ '2', 'c', 'v', '-', 'f', 'a', 'h', 'r', 'e', 'r', '.', 'd', 'e', '\0', /* "2gen.com", true */ '2', 'g', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "2hypeenterprises.com", true */ '2', 'h', 'y', 'p', 'e', 'e', 'n', 't', 'e', 'r', 'p', 'r', 'i', 's', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "2intermediate.co.uk", true */ '2', 'i', 'n', 't', 'e', 'r', 'm', 'e', 'd', 'i', 'a', 't', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "2kgwf.fi", true */ '2', 'k', 'g', 'w', 'f', '.', 'f', 'i', '\0', /* "2nains.ch", true */ '2', 'n', 'a', 'i', 'n', 's', '.', 'c', 'h', '\0', @@ -478,26 +477,26 @@ static const char kSTSHostTable[] = { /* "aia.de", true */ 'a', 'i', 'a', '.', 'd', 'e', '\0', /* "aidanmontare.net", true */ 'a', 'i', 'd', 'a', 'n', 'm', 'o', 'n', 't', 'a', 'r', 'e', '.', 'n', 'e', 't', '\0', /* "aidikofflaw.com", true */ 'a', 'i', 'd', 'i', 'k', 'o', 'f', 'f', 'l', 'a', 'w', '.', 'c', 'o', 'm', '\0', /* "aids.gov", true */ 'a', 'i', 'd', 's', '.', 'g', 'o', 'v', '\0', /* "aie.de", true */ 'a', 'i', 'e', '.', 'd', 'e', '\0', /* "aiesecarad.ro", true */ 'a', 'i', 'e', 's', 'e', 'c', 'a', 'r', 'a', 'd', '.', 'r', 'o', '\0', /* "aify.eu", true */ 'a', 'i', 'f', 'y', '.', 'e', 'u', '\0', /* "aigcev.org", true */ 'a', 'i', 'g', 'c', 'e', 'v', '.', 'o', 'r', 'g', '\0', - /* "aikido-linz.at", true */ 'a', 'i', 'k', 'i', 'd', 'o', '-', 'l', 'i', 'n', 'z', '.', 'a', 't', '\0', - /* "aikido-wels.at", true */ 'a', 'i', 'k', 'i', 'd', 'o', '-', 'w', 'e', 'l', 's', '.', 'a', 't', '\0', + /* "aimeeandalec.com", true */ 'a', 'i', 'm', 'e', 'e', 'a', 'n', 'd', 'a', 'l', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "aimotive.com", true */ 'a', 'i', 'm', 'o', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "aiois.com", true */ 'a', 'i', 'o', 'i', 's', '.', 'c', 'o', 'm', '\0', /* "airbly.com", true */ 'a', 'i', 'r', 'b', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "airbnbopen.com", true */ 'a', 'i', 'r', 'b', 'n', 'b', 'o', 'p', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "airedaleterrier.com.br", true */ 'a', 'i', 'r', 'e', 'd', 'a', 'l', 'e', 't', 'e', 'r', 'r', 'i', 'e', 'r', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "airhart.me", true */ 'a', 'i', 'r', 'h', 'a', 'r', 't', '.', 'm', 'e', '\0', /* "airhelp.com", true */ 'a', 'i', 'r', 'h', 'e', 'l', 'p', '.', 'c', 'o', 'm', '\0', /* "airlea.com", true */ 'a', 'i', 'r', 'l', 'e', 'a', '.', 'c', 'o', 'm', '\0', + /* "airlinecheckins.com", true */ 'a', 'i', 'r', 'l', 'i', 'n', 'e', 'c', 'h', 'e', 'c', 'k', 'i', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "airnow.gov", true */ 'a', 'i', 'r', 'n', 'o', 'w', '.', 'g', 'o', 'v', '\0', /* "airpbx.com", true */ 'a', 'i', 'r', 'p', 'b', 'x', '.', 'c', 'o', 'm', '\0', /* "airsoft.ch", true */ 'a', 'i', 'r', 's', 'o', 'f', 't', '.', 'c', 'h', '\0', /* "airvuz.com", true */ 'a', 'i', 'r', 'v', 'u', 'z', '.', 'c', 'o', 'm', '\0', /* "aisle3.space", true */ 'a', 'i', 's', 'l', 'e', '3', '.', 's', 'p', 'a', 'c', 'e', '\0', /* "aistockcharts.com", true */ 'a', 'i', 's', 't', 'o', 'c', 'k', 'c', 'h', 'a', 'r', 't', 's', '.', 'c', 'o', 'm', '\0', /* "aiticon.com", true */ 'a', 'i', 't', 'i', 'c', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "aitosoftware.com", true */ 'a', 'i', 't', 'o', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -535,16 +534,18 @@ static const char kSTSHostTable[] = { /* "alberguecimballa.es", true */ 'a', 'l', 'b', 'e', 'r', 'g', 'u', 'e', 'c', 'i', 'm', 'b', 'a', 'l', 'l', 'a', '.', 'e', 's', '\0', /* "albersdruck.de", true */ 'a', 'l', 'b', 'e', 'r', 's', 'd', 'r', 'u', 'c', 'k', '.', 'd', 'e', '\0', /* "albertbogdanowicz.pl", true */ 'a', 'l', 'b', 'e', 'r', 't', 'b', 'o', 'g', 'd', 'a', 'n', 'o', 'w', 'i', 'c', 'z', '.', 'p', 'l', '\0', /* "albion2.org", true */ 'a', 'l', 'b', 'i', 'o', 'n', '2', '.', 'o', 'r', 'g', '\0', /* "alboweb.nl", true */ 'a', 'l', 'b', 'o', 'w', 'e', 'b', '.', 'n', 'l', '\0', /* "albuic.tk", true */ 'a', 'l', 'b', 'u', 'i', 'c', '.', 't', 'k', '\0', /* "alcorao.org", true */ 'a', 'l', 'c', 'o', 'r', 'a', 'o', '.', 'o', 'r', 'g', '\0', /* "aldes.co.za", true */ 'a', 'l', 'd', 'e', 's', '.', 'c', 'o', '.', 'z', 'a', '\0', + /* "alecpap.com", true */ 'a', 'l', 'e', 'c', 'p', 'a', 'p', '.', 'c', 'o', 'm', '\0', + /* "alecpapierniak.com", true */ 'a', 'l', 'e', 'c', 'p', 'a', 'p', 'i', 'e', 'r', 'n', 'i', 'a', 'k', '.', 'c', 'o', 'm', '\0', /* "alecrust.com", true */ 'a', 'l', 'e', 'c', 'r', 'u', 's', 't', '.', 'c', 'o', 'm', '\0', /* "aleksib.fi", true */ 'a', 'l', 'e', 'k', 's', 'i', 'b', '.', 'f', 'i', '\0', /* "alela.fr", true */ 'a', 'l', 'e', 'l', 'a', '.', 'f', 'r', '\0', /* "alertaenlinea.gov", true */ 'a', 'l', 'e', 'r', 't', 'a', 'e', 'n', 'l', 'i', 'n', 'e', 'a', '.', 'g', 'o', 'v', '\0', /* "alertboxx.com", true */ 'a', 'l', 'e', 'r', 't', 'b', 'o', 'x', 'x', '.', 'c', 'o', 'm', '\0', /* "alertwire.com", true */ 'a', 'l', 'e', 'r', 't', 'w', 'i', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "alessandroz.pro", true */ 'a', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', 'z', '.', 'p', 'r', 'o', '\0', /* "alex-ross.co.uk", true */ 'a', 'l', 'e', 'x', '-', 'r', 'o', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -570,17 +571,16 @@ static const char kSTSHostTable[] = { /* "alexn.org", true */ 'a', 'l', 'e', 'x', 'n', '.', 'o', 'r', 'g', '\0', /* "alexpavel.com", true */ 'a', 'l', 'e', 'x', 'p', 'a', 'v', 'e', 'l', '.', 'c', 'o', 'm', '\0', /* "alexsexton.com", true */ 'a', 'l', 'e', 'x', 's', 'e', 'x', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "alextsang.net", true */ 'a', 'l', 'e', 'x', 't', 's', 'a', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "alexvetter.de", true */ 'a', 'l', 'e', 'x', 'v', 'e', 't', 't', 'e', 'r', '.', 'd', 'e', '\0', /* "alexwardweb.com", true */ 'a', 'l', 'e', 'x', 'w', 'a', 'r', 'd', 'w', 'e', 'b', '.', 'c', 'o', 'm', '\0', /* "alexyang.me", true */ 'a', 'l', 'e', 'x', 'y', 'a', 'n', 'g', '.', 'm', 'e', '\0', /* "alfa-tech.su", true */ 'a', 'l', 'f', 'a', '-', 't', 'e', 'c', 'h', '.', 's', 'u', '\0', - /* "alfa24.pro", true */ 'a', 'l', 'f', 'a', '2', '4', '.', 'p', 'r', 'o', '\0', /* "alfredxing.com", false */ 'a', 'l', 'f', 'r', 'e', 'd', 'x', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "algarmatic-automatismos.pt", true */ 'a', 'l', 'g', 'a', 'r', 'm', 'a', 't', 'i', 'c', '-', 'a', 'u', 't', 'o', 'm', 'a', 't', 'i', 's', 'm', 'o', 's', '.', 'p', 't', '\0', /* "algolia.com", true */ 'a', 'l', 'g', 'o', 'l', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "alicestudio.it", true */ 'a', 'l', 'i', 'c', 'e', 's', 't', 'u', 'd', 'i', 'o', '.', 'i', 't', '\0', /* "alienstat.com", true */ 'a', 'l', 'i', 'e', 'n', 's', 't', 'a', 't', '.', 'c', 'o', 'm', '\0', /* "alinasmusicstudio.com", true */ 'a', 'l', 'i', 'n', 'a', 's', 'm', 'u', 's', 'i', 'c', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'o', 'm', '\0', /* "alinode.com", true */ 'a', 'l', 'i', 'n', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "alisonisrealestate.com", true */ 'a', 'l', 'i', 's', 'o', 'n', 'i', 's', 'r', 'e', 'a', 'l', 'e', 's', 't', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0', @@ -597,16 +597,17 @@ static const char kSTSHostTable[] = { /* "allbenjoy.de", true */ 'a', 'l', 'l', 'b', 'e', 'n', 'j', 'o', 'y', '.', 'd', 'e', '\0', /* "allcarepharmacy.com", true */ 'a', 'l', 'l', 'c', 'a', 'r', 'e', 'p', 'h', 'a', 'r', 'm', 'a', 'c', 'y', '.', 'c', 'o', 'm', '\0', /* "alldewall.de", true */ 'a', 'l', 'l', 'd', 'e', 'w', 'a', 'l', 'l', '.', 'd', 'e', '\0', /* "allfreelancers.su", true */ 'a', 'l', 'l', 'f', 'r', 'e', 'e', 'l', 'a', 'n', 'c', 'e', 'r', 's', '.', 's', 'u', '\0', /* "alliances-faq.de", true */ 'a', 'l', 'l', 'i', 'a', 'n', 'c', 'e', 's', '-', 'f', 'a', 'q', '.', 'd', 'e', '\0', /* "alliedfrozenstorage.com", true */ 'a', 'l', 'l', 'i', 'e', 'd', 'f', 'r', 'o', 'z', 'e', 'n', 's', 't', 'o', 'r', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "allinonecyprus.com", true */ 'a', 'l', 'l', 'i', 'n', 'o', 'n', 'e', 'c', 'y', 'p', 'r', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "allmystery.de", true */ 'a', 'l', 'l', 'm', 'y', 's', 't', 'e', 'r', 'y', '.', 'd', 'e', '\0', + /* "allo-symo.fr", true */ 'a', 'l', 'l', 'o', '-', 's', 'y', 'm', 'o', '.', 'f', 'r', '\0', /* "allrealty.co.za", true */ 'a', 'l', 'l', 'r', 'e', 'a', 'l', 't', 'y', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "alltheducks.com", true */ 'a', 'l', 'l', 't', 'h', 'e', 'd', 'u', 'c', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "allthethings.co.nz", true */ 'a', 'l', 'l', 't', 'h', 'e', 't', 'h', 'i', 'n', 'g', 's', '.', 'c', 'o', '.', 'n', 'z', '\0', /* "allthings.me", true */ 'a', 'l', 'l', 't', 'h', 'i', 'n', 'g', 's', '.', 'm', 'e', '\0', /* "allthingssquared.com", true */ 'a', 'l', 'l', 't', 'h', 'i', 'n', 'g', 's', 's', 'q', 'u', 'a', 'r', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "allthingswild.co.uk", true */ 'a', 'l', 'l', 't', 'h', 'i', 'n', 'g', 's', 'w', 'i', 'l', 'd', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "alltubedownload.net", true */ 'a', 'l', 'l', 't', 'u', 'b', 'e', 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', '.', 'n', 'e', 't', '\0', /* "alluvion.studio", true */ 'a', 'l', 'l', 'u', 'v', 'i', 'o', 'n', '.', 's', 't', 'u', 'd', 'i', 'o', '\0', @@ -679,16 +680,17 @@ static const char kSTSHostTable[] = { /* "amerimarkdirect.com", true */ 'a', 'm', 'e', 'r', 'i', 'm', 'a', 'r', 'k', 'd', 'i', 'r', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0', /* "amerimex.cc", true */ 'a', 'm', 'e', 'r', 'i', 'm', 'e', 'x', '.', 'c', 'c', '\0', /* "ameza.co.uk", true */ 'a', 'm', 'e', 'z', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "ameza.com.mx", true */ 'a', 'm', 'e', 'z', 'a', '.', 'c', 'o', 'm', '.', 'm', 'x', '\0', /* "ameza.io", true */ 'a', 'm', 'e', 'z', 'a', '.', 'i', 'o', '\0', /* "ameza.me", true */ 'a', 'm', 'e', 'z', 'a', '.', 'm', 'e', '\0', /* "ami-de-bastanes.fr", true */ 'a', 'm', 'i', '-', 'd', 'e', '-', 'b', 'a', 's', 't', 'a', 'n', 'e', 's', '.', 'f', 'r', '\0', /* "amihub.com", true */ 'a', 'm', 'i', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0', + /* "amilum.org", true */ 'a', 'm', 'i', 'l', 'u', 'm', '.', 'o', 'r', 'g', '\0', /* "amineptine.com", true */ 'a', 'm', 'i', 'n', 'e', 'p', 't', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "amisharingstuff.com", true */ 'a', 'm', 'i', 's', 'h', 'a', 'r', 'i', 'n', 'g', 's', 't', 'u', 'f', 'f', '.', 'c', 'o', 'm', '\0', /* "amishsecurity.com", true */ 'a', 'm', 'i', 's', 'h', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "amnesy.fr", true */ 'a', 'm', 'n', 'e', 's', 'y', '.', 'f', 'r', '\0', /* "amphetamines.org", true */ 'a', 'm', 'p', 'h', 'e', 't', 'a', 'm', 'i', 'n', 'e', 's', '.', 'o', 'r', 'g', '\0', /* "amphibo.ly", true */ 'a', 'm', 'p', 'h', 'i', 'b', 'o', '.', 'l', 'y', '\0', /* "ams.co.rs", true */ 'a', 'm', 's', '.', 'c', 'o', '.', 'r', 's', '\0', /* "amsportuk.com", true */ 'a', 'm', 's', 'p', 'o', 'r', 't', 'u', 'k', '.', 'c', 'o', 'm', '\0', @@ -907,17 +909,16 @@ static const char kSTSHostTable[] = { /* "arbeitskreis-asyl-eningen.de", true */ 'a', 'r', 'b', 'e', 'i', 't', 's', 'k', 'r', 'e', 'i', 's', '-', 'a', 's', 'y', 'l', '-', 'e', 'n', 'i', 'n', 'g', 'e', 'n', '.', 'd', 'e', '\0', /* "arbitrarion.com", true */ 'a', 'r', 'b', 'i', 't', 'r', 'a', 'r', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "arbitrary.ch", true */ 'a', 'r', 'b', 'i', 't', 'r', 'a', 'r', 'y', '.', 'c', 'h', '\0', /* "arboworks.com", true */ 'a', 'r', 'b', 'o', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "archimedicx.com", true */ 'a', 'r', 'c', 'h', 'i', 'm', 'e', 'd', 'i', 'c', 'x', '.', 'c', 'o', 'm', '\0', /* "architectdirect.nl", true */ 'a', 'r', 'c', 'h', 'i', 't', 'e', 'c', 't', 'd', 'i', 'r', 'e', 'c', 't', '.', 'n', 'l', '\0', /* "architecte-interieur.be", true */ 'a', 'r', 'c', 'h', 'i', 't', 'e', 'c', 't', 'e', '-', 'i', 'n', 't', 'e', 'r', 'i', 'e', 'u', 'r', '.', 'b', 'e', '\0', /* "archlinux.de", true */ 'a', 'r', 'c', 'h', 'l', 'i', 'n', 'u', 'x', '.', 'd', 'e', '\0', - /* "arctic.gov", true */ 'a', 'r', 'c', 't', 'i', 'c', '.', 'g', 'o', 'v', '\0', /* "ardao.me", true */ 'a', 'r', 'd', 'a', 'o', '.', 'm', 'e', '\0', /* "ardtrade.ru", true */ 'a', 'r', 'd', 't', 'r', 'a', 'd', 'e', '.', 'r', 'u', '\0', /* "areafiftylan.nl", true */ 'a', 'r', 'e', 'a', 'f', 'i', 'f', 't', 'y', 'l', 'a', 'n', '.', 'n', 'l', '\0', /* "areatrend.com", true */ 'a', 'r', 'e', 'a', 't', 'r', 'e', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "arendburgers.nl", true */ 'a', 'r', 'e', 'n', 'd', 'b', 'u', 'r', 'g', 'e', 'r', 's', '.', 'n', 'l', '\0', /* "arewedubstepyet.com", true */ 'a', 'r', 'e', 'w', 'e', 'd', 'u', 'b', 's', 't', 'e', 'p', 'y', 'e', 't', '.', 'c', 'o', 'm', '\0', /* "argekultur.at", true */ 'a', 'r', 'g', 'e', 'k', 'u', 'l', 't', 'u', 'r', '.', 'a', 't', '\0', /* "argh.io", true */ 'a', 'r', 'g', 'h', '.', 'i', 'o', '\0', @@ -941,17 +942,16 @@ static const char kSTSHostTable[] = { /* "armor.com", true */ 'a', 'r', 'm', 'o', 'r', '.', 'c', 'o', 'm', '\0', /* "armored.ninja", true */ 'a', 'r', 'm', 'o', 'r', 'e', 'd', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "armstrongsengineering.com", true */ 'a', 'r', 'm', 's', 't', 'r', 'o', 'n', 'g', 's', 'e', 'n', 'g', 'i', 'n', 'e', 'e', 'r', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "army24.cz", true */ 'a', 'r', 'm', 'y', '2', '4', '.', 'c', 'z', '\0', /* "armyprodej.cz", true */ 'a', 'r', 'm', 'y', 'p', 'r', 'o', 'd', 'e', 'j', '.', 'c', 'z', '\0', /* "arnaudb.net", true */ 'a', 'r', 'n', 'a', 'u', 'd', 'b', '.', 'n', 'e', 't', '\0', /* "arne-petersen.net", true */ 'a', 'r', 'n', 'e', '-', 'p', 'e', 't', 'e', 'r', 's', 'e', 'n', '.', 'n', 'e', 't', '\0', /* "arnesolutions.com", true */ 'a', 'r', 'n', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', - /* "arnetdigital.eu", false */ 'a', 'r', 'n', 'e', 't', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'e', 'u', '\0', /* "arnor.org", true */ 'a', 'r', 'n', 'o', 'r', '.', 'o', 'r', 'g', '\0', /* "arokha.com", true */ 'a', 'r', 'o', 'k', 'h', 'a', '.', 'c', 'o', 'm', '\0', /* "aromaclub.nl", true */ 'a', 'r', 'o', 'm', 'a', 'c', 'l', 'u', 'b', '.', 'n', 'l', '\0', /* "aroonchande.com", true */ 'a', 'r', 'o', 'o', 'n', 'c', 'h', 'a', 'n', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "arrakis.se", true */ 'a', 'r', 'r', 'a', 'k', 'i', 's', '.', 's', 'e', '\0', /* "arrive.by", true */ 'a', 'r', 'r', 'i', 'v', 'e', '.', 'b', 'y', '\0', /* "arrmaforum.com", true */ 'a', 'r', 'r', 'm', 'a', 'f', 'o', 'r', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "arrow-analytics.nl", true */ 'a', 'r', 'r', 'o', 'w', '-', 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', '.', 'n', 'l', '\0', @@ -1037,16 +1037,17 @@ static const char kSTSHostTable[] = { /* "at.search.yahoo.com", false */ 'a', 't', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "atc.io", true */ 'a', 't', 'c', '.', 'i', 'o', '\0', /* "atchleyjazz.com", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'j', 'a', 'z', 'z', '.', 'c', 'o', 'm', '\0', /* "atchleyjazz.org", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'j', 'a', 'z', 'z', '.', 'o', 'r', 'g', '\0', /* "atchleylab.org", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0', /* "ateli.com", true */ 'a', 't', 'e', 'l', 'i', '.', 'c', 'o', 'm', '\0', /* "atelier-naruby.cz", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', '-', 'n', 'a', 'r', 'u', 'b', 'y', '.', 'c', 'z', '\0', /* "atelier-rk.com", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', '-', 'r', 'k', '.', 'c', 'o', 'm', '\0', + /* "atelierdesflammesnoires.fr", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', 'd', 'e', 's', 'f', 'l', 'a', 'm', 'm', 'e', 's', 'n', 'o', 'i', 'r', 'e', 's', '.', 'f', 'r', '\0', /* "ateliernaruby.cz", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', 'n', 'a', 'r', 'u', 'b', 'y', '.', 'c', 'z', '\0', /* "atencionbimbo.com", true */ 'a', 't', 'e', 'n', 'c', 'i', 'o', 'n', 'b', 'i', 'm', 'b', 'o', '.', 'c', 'o', 'm', '\0', /* "atg.soy", true */ 'a', 't', 'g', '.', 's', 'o', 'y', '\0', /* "atgseed.co.uk", true */ 'a', 't', 'g', 's', 'e', 'e', 'd', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "atgseed.uk", true */ 'a', 't', 'g', 's', 'e', 'e', 'd', '.', 'u', 'k', '\0', /* "ath0.org", true */ 'a', 't', 'h', '0', '.', 'o', 'r', 'g', '\0', /* "athensbusinessresources.us", true */ 'a', 't', 'h', 'e', 'n', 's', 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '.', 'u', 's', '\0', /* "athi.pl", true */ 'a', 't', 'h', 'i', '.', 'p', 'l', '\0', @@ -1326,16 +1327,17 @@ static const char kSTSHostTable[] = { /* "bayden.com", true */ 'b', 'a', 'y', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "bayrisch-fuer-anfaenger.de", true */ 'b', 'a', 'y', 'r', 'i', 's', 'c', 'h', '-', 'f', 'u', 'e', 'r', '-', 'a', 'n', 'f', 'a', 'e', 'n', 'g', 'e', 'r', '.', 'd', 'e', '\0', /* "baywatch.io", true */ 'b', 'a', 'y', 'w', 'a', 't', 'c', 'h', '.', 'i', 'o', '\0', /* "bazdell.com", true */ 'b', 'a', 'z', 'd', 'e', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "bazos.at", true */ 'b', 'a', 'z', 'o', 's', '.', 'a', 't', '\0', /* "bazos.cz", true */ 'b', 'a', 'z', 'o', 's', '.', 'c', 'z', '\0', /* "bazos.sk", true */ 'b', 'a', 'z', 'o', 's', '.', 's', 'k', '\0', /* "bb-shiokaze.jp", true */ 'b', 'b', '-', 's', 'h', 'i', 'o', 'k', 'a', 'z', 'e', '.', 'j', 'p', '\0', + /* "bbb1991.me", false */ 'b', 'b', 'b', '1', '9', '9', '1', '.', 'm', 'e', '\0', /* "bbdos.ru", true */ 'b', 'b', 'd', 'o', 's', '.', 'r', 'u', '\0', /* "bblovess.cn", true */ 'b', 'b', 'l', 'o', 'v', 'e', 's', 's', '.', 'c', 'n', '\0', /* "bbnx.net", true */ 'b', 'b', 'n', 'x', '.', 'n', 'e', 't', '\0', /* "bbuio.com", true */ 'b', 'b', 'u', 'i', 'o', '.', 'c', 'o', 'm', '\0', /* "bbw.dating", true */ 'b', 'b', 'w', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "bbwcs.co.uk", true */ 'b', 'b', 'w', 'c', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "bc-bd.org", true */ 'b', 'c', '-', 'b', 'd', '.', 'o', 'r', 'g', '\0', /* "bcchack.com", true */ 'b', 'c', 'c', 'h', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0', @@ -1435,28 +1437,30 @@ static const char kSTSHostTable[] = { /* "benschnarr.com", true */ 'b', 'e', 'n', 's', 'c', 'h', 'n', 'a', 'r', 'r', '.', 'c', 'o', 'm', '\0', /* "bentertain.de", true */ 'b', 'e', 'n', 't', 'e', 'r', 't', 'a', 'i', 'n', '.', 'd', 'e', '\0', /* "bentley.link", true */ 'b', 'e', 'n', 't', 'l', 'e', 'y', '.', 'l', 'i', 'n', 'k', '\0', /* "bentrask.com", true */ 'b', 'e', 'n', 't', 'r', 'a', 's', 'k', '.', 'c', 'o', 'm', '\0', /* "benzou-space.com", true */ 'b', 'e', 'n', 'z', 'o', 'u', '-', 's', 'p', 'a', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "beourvictim.com", true */ 'b', 'e', 'o', 'u', 'r', 'v', 'i', 'c', 't', 'i', 'm', '.', 'c', 'o', 'm', '\0', /* "bep362.vn", true */ 'b', 'e', 'p', '3', '6', '2', '.', 'v', 'n', '\0', /* "beranovi.com", true */ 'b', 'e', 'r', 'a', 'n', 'o', 'v', 'i', '.', 'c', 'o', 'm', '\0', + /* "berasavocate.com", true */ 'b', 'e', 'r', 'a', 's', 'a', 'v', 'o', 'c', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0', /* "bergenhave.nl", true */ 'b', 'e', 'r', 'g', 'e', 'n', 'h', 'a', 'v', 'e', '.', 'n', 'l', '\0', /* "bergstoneware.com", true */ 'b', 'e', 'r', 'g', 's', 't', 'o', 'n', 'e', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "berlin-kohlefrei.de", true */ 'b', 'e', 'r', 'l', 'i', 'n', '-', 'k', 'o', 'h', 'l', 'e', 'f', 'r', 'e', 'i', '.', 'd', 'e', '\0', /* "berlin.dating", true */ 'b', 'e', 'r', 'l', 'i', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "bermeitinger.eu", true */ 'b', 'e', 'r', 'm', 'e', 'i', 't', 'i', 'n', 'g', 'e', 'r', '.', 'e', 'u', '\0', /* "berna.fr", true */ 'b', 'e', 'r', 'n', 'a', '.', 'f', 'r', '\0', /* "berr.yt", true */ 'b', 'e', 'r', 'r', '.', 'y', 't', '\0', /* "berra.se", true */ 'b', 'e', 'r', 'r', 'a', '.', 's', 'e', '\0', /* "berst.cz", true */ 'b', 'e', 'r', 's', 't', '.', 'c', 'z', '\0', /* "berthabailey.com", true */ 'b', 'e', 'r', 't', 'h', 'a', 'b', 'a', 'i', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0', /* "bertrand.bio", true */ 'b', 'e', 'r', 't', 'r', 'a', 'n', 'd', '.', 'b', 'i', 'o', '\0', /* "beryl.net", true */ 'b', 'e', 'r', 'y', 'l', '.', 'n', 'e', 't', '\0', + /* "besnik.de", true */ 'b', 'e', 's', 'n', 'i', 'k', '.', 'd', 'e', '\0', /* "besola.de", true */ 'b', 'e', 's', 'o', 'l', 'a', '.', 'd', 'e', '\0', /* "bespokestraps.com", true */ 'b', 'e', 's', 'p', 'o', 'k', 'e', 's', 't', 'r', 'a', 'p', 's', '.', 'c', 'o', 'm', '\0', /* "best-wallpaper.net", true */ 'b', 'e', 's', 't', '-', 'w', 'a', 'l', 'l', 'p', 'a', 'p', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "best-wedding-quotes.com", true */ 'b', 'e', 's', 't', '-', 'w', 'e', 'd', 'd', 'i', 'n', 'g', '-', 'q', 'u', 'o', 't', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "bestbrakes.com", true */ 'b', 'e', 's', 't', 'b', 'r', 'a', 'k', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "bestessayhelp.com", true */ 'b', 'e', 's', 't', 'e', 's', 's', 'a', 'y', 'h', 'e', 'l', 'p', '.', 'c', 'o', 'm', '\0', /* "bestgiftever.ca", true */ 'b', 'e', 's', 't', 'g', 'i', 'f', 't', 'e', 'v', 'e', 'r', '.', 'c', 'a', '\0', /* "bestgifts4you.com", true */ 'b', 'e', 's', 't', 'g', 'i', 'f', 't', 's', '4', 'y', 'o', 'u', '.', 'c', 'o', 'm', '\0', @@ -1683,17 +1687,16 @@ static const char kSTSHostTable[] = { /* "blackberrycentral.com", true */ 'b', 'l', 'a', 'c', 'k', 'b', 'e', 'r', 'r', 'y', 'c', 'e', 'n', 't', 'r', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "blackcat.ca", true */ 'b', 'l', 'a', 'c', 'k', 'c', 'a', 't', '.', 'c', 'a', '\0', /* "blackcatinformatics.ca", true */ 'b', 'l', 'a', 'c', 'k', 'c', 'a', 't', 'i', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'c', 's', '.', 'c', 'a', '\0', /* "blackcatinformatics.com", true */ 'b', 'l', 'a', 'c', 'k', 'c', 'a', 't', 'i', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0', /* "blackdesertsp.com", true */ 'b', 'l', 'a', 'c', 'k', 'd', 'e', 's', 'e', 'r', 't', 's', 'p', '.', 'c', 'o', 'm', '\0', /* "blackdown.de", true */ 'b', 'l', 'a', 'c', 'k', 'd', 'o', 'w', 'n', '.', 'd', 'e', '\0', /* "blackdragoninc.org", true */ 'b', 'l', 'a', 'c', 'k', 'd', 'r', 'a', 'g', 'o', 'n', 'i', 'n', 'c', '.', 'o', 'r', 'g', '\0', /* "blackhelicopters.net", true */ 'b', 'l', 'a', 'c', 'k', 'h', 'e', 'l', 'i', 'c', 'o', 'p', 't', 'e', 'r', 's', '.', 'n', 'e', 't', '\0', - /* "blacknova.io", true */ 'b', 'l', 'a', 'c', 'k', 'n', 'o', 'v', 'a', '.', 'i', 'o', '\0', /* "blackonion.com", true */ 'b', 'l', 'a', 'c', 'k', 'o', 'n', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "blackpapermoon.de", true */ 'b', 'l', 'a', 'c', 'k', 'p', 'a', 'p', 'e', 'r', 'm', 'o', 'o', 'n', '.', 'd', 'e', '\0', /* "blackphantom.de", true */ 'b', 'l', 'a', 'c', 'k', 'p', 'h', 'a', 'n', 't', 'o', 'm', '.', 'd', 'e', '\0', /* "blackphoenix.de", true */ 'b', 'l', 'a', 'c', 'k', 'p', 'h', 'o', 'e', 'n', 'i', 'x', '.', 'd', 'e', '\0', /* "blaise.io", true */ 'b', 'l', 'a', 'i', 's', 'e', '.', 'i', 'o', '\0', /* "blameomar.com", true */ 'b', 'l', 'a', 'm', 'e', 'o', 'm', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "blancodent.com", true */ 'b', 'l', 'a', 'n', 'c', 'o', 'd', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "blankersfamily.com", true */ 'b', 'l', 'a', 'n', 'k', 'e', 'r', 's', 'f', 'a', 'm', 'i', 'l', 'y', '.', 'c', 'o', 'm', '\0', @@ -1744,16 +1747,17 @@ static const char kSTSHostTable[] = { /* "blubberladen.de", true */ 'b', 'l', 'u', 'b', 'b', 'e', 'r', 'l', 'a', 'd', 'e', 'n', '.', 'd', 'e', '\0', /* "blue-labs.org", true */ 'b', 'l', 'u', 'e', '-', 'l', 'a', 'b', 's', '.', 'o', 'r', 'g', '\0', /* "blue-leaf81.net", true */ 'b', 'l', 'u', 'e', '-', 'l', 'e', 'a', 'f', '8', '1', '.', 'n', 'e', 't', '\0', /* "blue42.net", true */ 'b', 'l', 'u', 'e', '4', '2', '.', 'n', 'e', 't', '\0', /* "bluebill.net", true */ 'b', 'l', 'u', 'e', 'b', 'i', 'l', 'l', '.', 'n', 'e', 't', '\0', /* "bluechilli.com", true */ 'b', 'l', 'u', 'e', 'c', 'h', 'i', 'l', 'l', 'i', '.', 'c', 'o', 'm', '\0', /* "blueflare.org", true */ 'b', 'l', 'u', 'e', 'f', 'l', 'a', 'r', 'e', '.', 'o', 'r', 'g', '\0', /* "bluefuzz.nl", true */ 'b', 'l', 'u', 'e', 'f', 'u', 'z', 'z', '.', 'n', 'l', '\0', + /* "blueimp.net", true */ 'b', 'l', 'u', 'e', 'i', 'm', 'p', '.', 'n', 'e', 't', '\0', /* "bluemoonroleplaying.com", true */ 'b', 'l', 'u', 'e', 'm', 'o', 'o', 'n', 'r', 'o', 'l', 'e', 'p', 'l', 'a', 'y', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "bluemosh.com", true */ 'b', 'l', 'u', 'e', 'm', 'o', 's', 'h', '.', 'c', 'o', 'm', '\0', /* "blueperil.de", true */ 'b', 'l', 'u', 'e', 'p', 'e', 'r', 'i', 'l', '.', 'd', 'e', '\0', /* "bluepoint.foundation", true */ 'b', 'l', 'u', 'e', 'p', 'o', 'i', 'n', 't', '.', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '\0', /* "bluepoint.institute", true */ 'b', 'l', 'u', 'e', 'p', 'o', 'i', 'n', 't', '.', 'i', 'n', 's', 't', 'i', 't', 'u', 't', 'e', '\0', /* "bluepoint.one", true */ 'b', 'l', 'u', 'e', 'p', 'o', 'i', 'n', 't', '.', 'o', 'n', 'e', '\0', /* "bluepostbox.de", true */ 'b', 'l', 'u', 'e', 'p', 'o', 's', 't', 'b', 'o', 'x', '.', 'd', 'e', '\0', /* "bluex.im", true */ 'b', 'l', 'u', 'e', 'x', '.', 'i', 'm', '\0', @@ -1874,16 +1878,17 @@ static const char kSTSHostTable[] = { /* "brandongomez.me", true */ 'b', 'r', 'a', 'n', 'd', 'o', 'n', 'g', 'o', 'm', 'e', 'z', '.', 'm', 'e', '\0', /* "brandons.site", true */ 'b', 'r', 'a', 'n', 'd', 'o', 'n', 's', '.', 's', 'i', 't', 'e', '\0', /* "brandonwalker.me", true */ 'b', 'r', 'a', 'n', 'd', 'o', 'n', 'w', 'a', 'l', 'k', 'e', 'r', '.', 'm', 'e', '\0', /* "brandtrapselfie.nl", true */ 'b', 'r', 'a', 'n', 'd', 't', 'r', 'a', 'p', 's', 'e', 'l', 'f', 'i', 'e', '.', 'n', 'l', '\0', /* "branw.xyz", true */ 'b', 'r', 'a', 'n', 'w', '.', 'x', 'y', 'z', '\0', /* "brasalcosmetics.com", true */ 'b', 'r', 'a', 's', 'a', 'l', 'c', 'o', 's', 'm', 'e', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0', /* "brashear.me", true */ 'b', 'r', 'a', 's', 'h', 'e', 'a', 'r', '.', 'm', 'e', '\0', /* "brasilmorar.com", true */ 'b', 'r', 'a', 's', 'i', 'l', 'm', 'o', 'r', 'a', 'r', '.', 'c', 'o', 'm', '\0', + /* "bratislava-airport-taxi.com", true */ 'b', 'r', 'a', 't', 'i', 's', 'l', 'a', 'v', 'a', '-', 'a', 'i', 'r', 'p', 'o', 'r', 't', '-', 't', 'a', 'x', 'i', '.', 'c', 'o', 'm', '\0', /* "bratteng.me", false */ 'b', 'r', 'a', 't', 't', 'e', 'n', 'g', '.', 'm', 'e', '\0', /* "bratteng.xyz", true */ 'b', 'r', 'a', 't', 't', 'e', 'n', 'g', '.', 'x', 'y', 'z', '\0', /* "brauingenieur.de", true */ 'b', 'r', 'a', 'u', 'i', 'n', 'g', 'e', 'n', 'i', 'e', 'u', 'r', '.', 'd', 'e', '\0', /* "braunsteinpc.com", true */ 'b', 'r', 'a', 'u', 'n', 's', 't', 'e', 'i', 'n', 'p', 'c', '.', 'c', 'o', 'm', '\0', /* "brava.bg", true */ 'b', 'r', 'a', 'v', 'a', '.', 'b', 'g', '\0', /* "brave.com", true */ 'b', 'r', 'a', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "bravz.de", true */ 'b', 'r', 'a', 'v', 'z', '.', 'd', 'e', '\0', /* "brazilian.dating", true */ 'b', 'r', 'a', 'z', 'i', 'l', 'i', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', @@ -1902,16 +1907,17 @@ static const char kSTSHostTable[] = { /* "brettcornwall.com", true */ 'b', 'r', 'e', 't', 't', 'c', 'o', 'r', 'n', 'w', 'a', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "bretz-hufer.de", true */ 'b', 'r', 'e', 't', 'z', '-', 'h', 'u', 'f', 'e', 'r', '.', 'd', 'e', '\0', /* "brevboxar.se", true */ 'b', 'r', 'e', 'v', 'b', 'o', 'x', 'a', 'r', '.', 's', 'e', '\0', /* "brewtrackr.com", true */ 'b', 'r', 'e', 'w', 't', 'r', 'a', 'c', 'k', 'r', '.', 'c', 'o', 'm', '\0', /* "brianalaway.com", true */ 'b', 'r', 'i', 'a', 'n', 'a', 'l', 'a', 'w', 'a', 'y', '.', 'c', 'o', 'm', '\0', /* "brianalawayconsulting.com", true */ 'b', 'r', 'i', 'a', 'n', 'a', 'l', 'a', 'w', 'a', 'y', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "brianpcurran.com", true */ 'b', 'r', 'i', 'a', 'n', 'p', 'c', 'u', 'r', 'r', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "brickftp.com", true */ 'b', 'r', 'i', 'c', 'k', 'f', 't', 'p', '.', 'c', 'o', 'm', '\0', + /* "brid.gy", true */ 'b', 'r', 'i', 'd', '.', 'g', 'y', '\0', /* "brideandgroomdirect.ie", true */ 'b', 'r', 'i', 'd', 'e', 'a', 'n', 'd', 'g', 'r', 'o', 'o', 'm', 'd', 'i', 'r', 'e', 'c', 't', '.', 'i', 'e', '\0', /* "bridgeout.com", true */ 'b', 'r', 'i', 'd', 'g', 'e', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "bridholm.se", true */ 'b', 'r', 'i', 'd', 'h', 'o', 'l', 'm', '.', 's', 'e', '\0', /* "brie.tech", true */ 'b', 'r', 'i', 'e', '.', 't', 'e', 'c', 'h', '\0', /* "brightfuturemadebyme.com", true */ 'b', 'r', 'i', 'g', 'h', 't', 'f', 'u', 't', 'u', 'r', 'e', 'm', 'a', 'd', 'e', 'b', 'y', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "brightonbank.com", true */ 'b', 'r', 'i', 'g', 'h', 't', 'o', 'n', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "brightstarkids.co.uk", false */ 'b', 'r', 'i', 'g', 'h', 't', 's', 't', 'a', 'r', 'k', 'i', 'd', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "brightstarkids.com.au", false */ 'b', 'r', 'i', 'g', 'h', 't', 's', 't', 'a', 'r', 'k', 'i', 'd', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', @@ -2014,16 +2020,17 @@ static const char kSTSHostTable[] = { /* "bukkenfan.jp", true */ 'b', 'u', 'k', 'k', 'e', 'n', 'f', 'a', 'n', '.', 'j', 'p', '\0', /* "bul3seas.eu", true */ 'b', 'u', 'l', '3', 's', 'e', 'a', 's', '.', 'e', 'u', '\0', /* "bulario.com", true */ 'b', 'u', 'l', 'a', 'r', 'i', 'o', '.', 'c', 'o', 'm', '\0', /* "bulbcompare.com", true */ 'b', 'u', 'l', 'b', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "bulbgenie.com", true */ 'b', 'u', 'l', 'b', 'g', 'e', 'n', 'i', 'e', '.', 'c', 'o', 'm', '\0', /* "buldogueingles.com.br", true */ 'b', 'u', 'l', 'd', 'o', 'g', 'u', 'e', 'i', 'n', 'g', 'l', 'e', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "bulkcandystore.com", true */ 'b', 'u', 'l', 'k', 'c', 'a', 'n', 'd', 'y', 's', 't', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "bulktrade.de", true */ 'b', 'u', 'l', 'k', 't', 'r', 'a', 'd', 'e', '.', 'd', 'e', '\0', + /* "bullbits.com", true */ 'b', 'u', 'l', 'l', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\0', /* "bulldog-hosting.de", true */ 'b', 'u', 'l', 'l', 'd', 'o', 'g', '-', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'd', 'e', '\0', /* "bullterrier.me", true */ 'b', 'u', 'l', 'l', 't', 'e', 'r', 'r', 'i', 'e', 'r', '.', 'm', 'e', '\0', /* "bulmastife.com.br", true */ 'b', 'u', 'l', 'm', 'a', 's', 't', 'i', 'f', 'e', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "bunbomenu.de", true */ 'b', 'u', 'n', 'b', 'o', 'm', 'e', 'n', 'u', '.', 'd', 'e', '\0', /* "bunbun.be", false */ 'b', 'u', 'n', 'b', 'u', 'n', '.', 'b', 'e', '\0', /* "bund-von-theramore.de", true */ 'b', 'u', 'n', 'd', '-', 'v', 'o', 'n', '-', 't', 'h', 'e', 'r', 'a', 'm', 'o', 'r', 'e', '.', 'd', 'e', '\0', /* "bundaberg.com", true */ 'b', 'u', 'n', 'd', 'a', 'b', 'e', 'r', 'g', '.', 'c', 'o', 'm', '\0', /* "bundespolizei-forum.de", true */ 'b', 'u', 'n', 'd', 'e', 's', 'p', 'o', 'l', 'i', 'z', 'e', 'i', '-', 'f', 'o', 'r', 'u', 'm', '.', 'd', 'e', '\0', @@ -2102,22 +2109,20 @@ static const char kSTSHostTable[] = { /* "bytejail.com", true */ 'b', 'y', 't', 'e', 'j', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "bytema.cz", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'c', 'z', '\0', /* "bytema.re", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'r', 'e', '\0', /* "bytesatwork.de", true */ 'b', 'y', 't', 'e', 's', 'a', 't', 'w', 'o', 'r', 'k', '.', 'd', 'e', '\0', /* "bytesatwork.eu", true */ 'b', 'y', 't', 'e', 's', 'a', 't', 'w', 'o', 'r', 'k', '.', 'e', 'u', '\0', /* "byteshark.org", true */ 'b', 'y', 't', 'e', 's', 'h', 'a', 'r', 'k', '.', 'o', 'r', 'g', '\0', /* "bytesofcode.de", true */ 'b', 'y', 't', 'e', 's', 'o', 'f', 'c', 'o', 'd', 'e', '.', 'd', 'e', '\0', /* "bytesunlimited.com", true */ 'b', 'y', 't', 'e', 's', 'u', 'n', 'l', 'i', 'm', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0', - /* "bytesystems.com", true */ 'b', 'y', 't', 'e', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0', /* "byteturtle.eu", true */ 'b', 'y', 't', 'e', 't', 'u', 'r', 't', 'l', 'e', '.', 'e', 'u', '\0', /* "bythisverse.com", true */ 'b', 'y', 't', 'h', 'i', 's', 'v', 'e', 'r', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "bziaks.xyz", true */ 'b', 'z', 'i', 'a', 'k', 's', '.', 'x', 'y', 'z', '\0', /* "bztech.com.br", true */ 'b', 'z', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', - /* "bzv-fr.eu", true */ 'b', 'z', 'v', '-', 'f', 'r', '.', 'e', 'u', '\0', /* "c-path.org", true */ 'c', '-', 'p', 'a', 't', 'h', '.', 'o', 'r', 'g', '\0', /* "c-rickroll-v.pw", true */ 'c', '-', 'r', 'i', 'c', 'k', 'r', 'o', 'l', 'l', '-', 'v', '.', 'p', 'w', '\0', /* "c-shock.org", true */ 'c', '-', 's', 'h', 'o', 'c', 'k', '.', 'o', 'r', 'g', '\0', /* "c-webdesign.net", true */ 'c', '-', 'w', 'e', 'b', 'd', 'e', 's', 'i', 'g', 'n', '.', 'n', 'e', 't', '\0', /* "c-world.co.uk", true */ 'c', '-', 'w', 'o', 'r', 'l', 'd', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "c.cc", true */ 'c', '.', 'c', 'c', '\0', /* "c0rn3j.com", true */ 'c', '0', 'r', 'n', '3', 'j', '.', 'c', 'o', 'm', '\0', /* "c16t.uk", true */ 'c', '1', '6', 't', '.', 'u', 'k', '\0', @@ -2169,16 +2174,17 @@ static const char kSTSHostTable[] = { /* "callabs.net", true */ 'c', 'a', 'l', 'l', 'a', 'b', 's', '.', 'n', 'e', 't', '\0', /* "callaction.co", true */ 'c', 'a', 'l', 'l', 'a', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', '\0', /* "callcap.com", false */ 'c', 'a', 'l', 'l', 'c', 'a', 'p', '.', 'c', 'o', 'm', '\0', /* "callear.org", true */ 'c', 'a', 'l', 'l', 'e', 'a', 'r', '.', 'o', 'r', 'g', '\0', /* "callhub.io", true */ 'c', 'a', 'l', 'l', 'h', 'u', 'b', '.', 'i', 'o', '\0', /* "callision.com", true */ 'c', 'a', 'l', 'l', 'i', 's', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "callsigns.ca", true */ 'c', 'a', 'l', 'l', 's', 'i', 'g', 'n', 's', '.', 'c', 'a', '\0', /* "calomel.org", true */ 'c', 'a', 'l', 'o', 'm', 'e', 'l', '.', 'o', 'r', 'g', '\0', + /* "calories.org", true */ 'c', 'a', 'l', 'o', 'r', 'i', 'e', 's', '.', 'o', 'r', 'g', '\0', /* "caltonnutrition.com", true */ 'c', 'a', 'l', 't', 'o', 'n', 'n', 'u', 't', 'r', 'i', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "calvin.my", true */ 'c', 'a', 'l', 'v', 'i', 'n', '.', 'm', 'y', '\0', /* "calyxengineers.com", true */ 'c', 'a', 'l', 'y', 'x', 'e', 'n', 'g', 'i', 'n', 'e', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "camashop.de", true */ 'c', 'a', 'm', 'a', 's', 'h', 'o', 'p', '.', 'd', 'e', '\0', /* "camaya.net", true */ 'c', 'a', 'm', 'a', 'y', 'a', '.', 'n', 'e', 't', '\0', /* "cambier.org", true */ 'c', 'a', 'm', 'b', 'i', 'e', 'r', '.', 'o', 'r', 'g', '\0', /* "cambodian.dating", true */ 'c', 'a', 'm', 'b', 'o', 'd', 'i', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "cambridgeanalytica.net", true */ 'c', 'a', 'm', 'b', 'r', 'i', 'd', 'g', 'e', 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'a', '.', 'n', 'e', 't', '\0', @@ -2227,39 +2233,40 @@ static const char kSTSHostTable[] = { /* "capacent.is", true */ 'c', 'a', 'p', 'a', 'c', 'e', 'n', 't', '.', 'i', 's', '\0', /* "capeyorkfire.com.au", true */ 'c', 'a', 'p', 'e', 'y', 'o', 'r', 'k', 'f', 'i', 'r', 'e', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "caphane.com", true */ 'c', 'a', 'p', 'h', 'a', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "capitalcap.com", true */ 'c', 'a', 'p', 'i', 't', 'a', 'l', 'c', 'a', 'p', '.', 'c', 'o', 'm', '\0', /* "capitalonecardservice.com", true */ 'c', 'a', 'p', 'i', 't', 'a', 'l', 'o', 'n', 'e', 'c', 'a', 'r', 'd', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "capitalquadatv.org.nz", true */ 'c', 'a', 'p', 'i', 't', 'a', 'l', 'q', 'u', 'a', 'd', 'a', 't', 'v', '.', 'o', 'r', 'g', '.', 'n', 'z', '\0', /* "capitaltg.com", true */ 'c', 'a', 'p', 'i', 't', 'a', 'l', 't', 'g', '.', 'c', 'o', 'm', '\0', /* "capogna.com", true */ 'c', 'a', 'p', 'o', 'g', 'n', 'a', '.', 'c', 'o', 'm', '\0', + /* "capper.de", true */ 'c', 'a', 'p', 'p', 'e', 'r', '.', 'd', 'e', '\0', /* "capriccio.to", true */ 'c', 'a', 'p', 'r', 'i', 'c', 'c', 'i', 'o', '.', 't', 'o', '\0', /* "caps.is", true */ 'c', 'a', 'p', 's', '.', 'i', 's', '\0', /* "captianseb.de", true */ 'c', 'a', 'p', 't', 'i', 'a', 'n', 's', 'e', 'b', '.', 'd', 'e', '\0', /* "captivatedbytabrett.com", true */ 'c', 'a', 'p', 't', 'i', 'v', 'a', 't', 'e', 'd', 'b', 'y', 't', 'a', 'b', 'r', 'e', 't', 't', '.', 'c', 'o', 'm', '\0', /* "capturapp.com", true */ 'c', 'a', 'p', 't', 'u', 'r', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', /* "captured-symphonies.com", true */ 'c', 'a', 'p', 't', 'u', 'r', 'e', 'd', '-', 's', 'y', 'm', 'p', 'h', 'o', 'n', 'i', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "caputo.com", true */ 'c', 'a', 'p', 'u', 't', 'o', '.', 'c', 'o', 'm', '\0', + /* "caputodesign.com", true */ 'c', 'a', 'p', 'u', 't', 'o', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0', /* "car.info", true */ 'c', 'a', 'r', '.', 'i', 'n', 'f', 'o', '\0', /* "car24portal.de", true */ 'c', 'a', 'r', '2', '4', 'p', 'o', 'r', 't', 'a', 'l', '.', 'd', 'e', '\0', /* "carauctionnetwork.com", true */ 'c', 'a', 'r', 'a', 'u', 'c', 't', 'i', 'o', 'n', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'c', 'o', 'm', '\0', /* "carauctionsalabama.com", true */ 'c', 'a', 'r', 'a', 'u', 'c', 't', 'i', 'o', 'n', 's', 'a', 'l', 'a', 'b', 'a', 'm', 'a', '.', 'c', 'o', 'm', '\0', /* "carauctionscarolina.com", true */ 'c', 'a', 'r', 'a', 'u', 'c', 't', 'i', 'o', 'n', 's', 'c', 'a', 'r', 'o', 'l', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0', /* "carauctionsgeorgia.com", true */ 'c', 'a', 'r', 'a', 'u', 'c', 't', 'i', 'o', 'n', 's', 'g', 'e', 'o', 'r', 'g', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "carbon12.org", true */ 'c', 'a', 'r', 'b', 'o', 'n', '1', '2', '.', 'o', 'r', 'g', '\0', /* "carbon12.software", true */ 'c', 'a', 'r', 'b', 'o', 'n', '1', '2', '.', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '\0', /* "carboneselectricosnettosl.info", false */ 'c', 'a', 'r', 'b', 'o', 'n', 'e', 's', 'e', 'l', 'e', 'c', 't', 'r', 'i', 'c', 'o', 's', 'n', 'e', 't', 't', 'o', 's', 'l', '.', 'i', 'n', 'f', 'o', '\0', /* "carbonmade.com", false */ 'c', 'a', 'r', 'b', 'o', 'n', 'm', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "carck.co.uk", true */ 'c', 'a', 'r', 'c', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "card-toka.jp", true */ 'c', 'a', 'r', 'd', '-', 't', 'o', 'k', 'a', '.', 'j', 'p', '\0', /* "cardloan-manual.net", true */ 'c', 'a', 'r', 'd', 'l', 'o', 'a', 'n', '-', 'm', 'a', 'n', 'u', 'a', 'l', '.', 'n', 'e', 't', '\0', /* "cardranking.jp", true */ 'c', 'a', 'r', 'd', 'r', 'a', 'n', 'k', 'i', 'n', 'g', '.', 'j', 'p', '\0', /* "cardrecovery.fr", true */ 'c', 'a', 'r', 'd', 'r', 'e', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'f', 'r', '\0', - /* "cardse.net", true */ 'c', 'a', 'r', 'd', 's', 'e', '.', 'n', 'e', 't', '\0', /* "careerstuds.com", true */ 'c', 'a', 'r', 'e', 'e', 'r', 's', 't', 'u', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "caremad.io", true */ 'c', 'a', 'r', 'e', 'm', 'a', 'd', '.', 'i', 'o', '\0', /* "caretta.co.uk", true */ 'c', 'a', 'r', 'e', 't', 't', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "carey.bio", true */ 'c', 'a', 'r', 'e', 'y', '.', 'b', 'i', 'o', '\0', /* "carey.li", true */ 'c', 'a', 'r', 'e', 'y', '.', 'l', 'i', '\0', /* "carezone.com", false */ 'c', 'a', 'r', 'e', 'z', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "caribbean.dating", true */ 'c', 'a', 'r', 'i', 'b', 'b', 'e', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "caribbeanexams.com", true */ 'c', 'a', 'r', 'i', 'b', 'b', 'e', 'a', 'n', 'e', 'x', 'a', 'm', 's', '.', 'c', 'o', 'm', '\0', @@ -2267,16 +2274,17 @@ static const char kSTSHostTable[] = { /* "carif-idf.org", true */ 'c', 'a', 'r', 'i', 'f', '-', 'i', 'd', 'f', '.', 'o', 'r', 'g', '\0', /* "carigami.fr", true */ 'c', 'a', 'r', 'i', 'g', 'a', 'm', 'i', '.', 'f', 'r', '\0', /* "cariocacooking.com", true */ 'c', 'a', 'r', 'i', 'o', 'c', 'a', 'c', 'o', 'o', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "carlgo11.com", true */ 'c', 'a', 'r', 'l', 'g', 'o', '1', '1', '.', 'c', 'o', 'm', '\0', /* "carlmjohnson.net", true */ 'c', 'a', 'r', 'l', 'm', 'j', 'o', 'h', 'n', 's', 'o', 'n', '.', 'n', 'e', 't', '\0', /* "carlo.mx", true */ 'c', 'a', 'r', 'l', 'o', '.', 'm', 'x', '\0', /* "carlosjeurissen.com", true */ 'c', 'a', 'r', 'l', 'o', 's', 'j', 'e', 'u', 'r', 'i', 's', 's', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "carnaticalifornia.com", true */ 'c', 'a', 'r', 'n', 'a', 't', 'i', 'c', 'a', 'l', 'i', 'f', 'o', 'r', 'n', 'i', 'a', '.', 'c', 'o', 'm', '\0', + /* "carnildo.com", true */ 'c', 'a', 'r', 'n', 'i', 'l', 'd', 'o', '.', 'c', 'o', 'm', '\0', /* "carolcappelletti.com", true */ 'c', 'a', 'r', 'o', 'l', 'c', 'a', 'p', 'p', 'e', 'l', 'l', 'e', 't', 't', 'i', '.', 'c', 'o', 'm', '\0', /* "caroli.com", true */ 'c', 'a', 'r', 'o', 'l', 'i', '.', 'c', 'o', 'm', '\0', /* "carriedin.com", true */ 'c', 'a', 'r', 'r', 'i', 'e', 'd', 'i', 'n', '.', 'c', 'o', 'm', '\0', /* "carroarmato0.be", true */ 'c', 'a', 'r', 'r', 'o', 'a', 'r', 'm', 'a', 't', 'o', '0', '.', 'b', 'e', '\0', /* "carsten.pw", true */ 'c', 'a', 'r', 's', 't', 'e', 'n', '.', 'p', 'w', '\0', /* "carstenfeuls.de", true */ 'c', 'a', 'r', 's', 't', 'e', 'n', 'f', 'e', 'u', 'l', 's', '.', 'd', 'e', '\0', /* "carterorland.com", true */ 'c', 'a', 'r', 't', 'e', 'r', 'o', 'r', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "carto.la", true */ 'c', 'a', 'r', 't', 'o', '.', 'l', 'a', '\0', @@ -2542,17 +2550,16 @@ static const char kSTSHostTable[] = { /* "chrome.com", false */ 'c', 'h', 'r', 'o', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "chrome.google.com", true */ 'c', 'h', 'r', 'o', 'm', 'e', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "chromebookchart.com", true */ 'c', 'h', 'r', 'o', 'm', 'e', 'b', 'o', 'o', 'k', 'c', 'h', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0', /* "chromebooksforwork.com", true */ 'c', 'h', 'r', 'o', 'm', 'e', 'b', 'o', 'o', 'k', 's', 'f', 'o', 'r', 'w', 'o', 'r', 'k', '.', 'c', 'o', 'm', '\0', /* "chromiumbugs.appspot.com", true */ 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', 'b', 'u', 'g', 's', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "chromiumcodereview.appspot.com", true */ 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "chronoshop.cz", true */ 'c', 'h', 'r', 'o', 'n', 'o', 's', 'h', 'o', 'p', '.', 'c', 'z', '\0', /* "chsterz.de", true */ 'c', 'h', 's', 't', 'e', 'r', 'z', '.', 'd', 'e', '\0', - /* "chua.family", true */ 'c', 'h', 'u', 'a', '.', 'f', 'a', 'm', 'i', 'l', 'y', '\0', /* "chun.pro", true */ 'c', 'h', 'u', 'n', '.', 'p', 'r', 'o', '\0', /* "chunche.net", true */ 'c', 'h', 'u', 'n', 'c', 'h', 'e', '.', 'n', 'e', 't', '\0', /* "churchthemes.com", true */ 'c', 'h', 'u', 'r', 'c', 'h', 't', 'h', 'e', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "chxdf.net", true */ 'c', 'h', 'x', 'd', 'f', '.', 'n', 'e', 't', '\0', /* "cianmawhinney.xyz", true */ 'c', 'i', 'a', 'n', 'm', 'a', 'w', 'h', 'i', 'n', 'n', 'e', 'y', '.', 'x', 'y', 'z', '\0', /* "ciat.no", false */ 'c', 'i', 'a', 't', '.', 'n', 'o', '\0', /* "cidbot.com", true */ 'c', 'i', 'd', 'b', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "ciderclub.com", true */ 'c', 'i', 'd', 'e', 'r', 'c', 'l', 'u', 'b', '.', 'c', 'o', 'm', '\0', @@ -2693,17 +2700,16 @@ static const char kSTSHostTable[] = { /* "cmahy.be", true */ 'c', 'm', 'a', 'h', 'y', '.', 'b', 'e', '\0', /* "cmdline.org", true */ 'c', 'm', 'd', 'l', 'i', 'n', 'e', '.', 'o', 'r', 'g', '\0', /* "cmylife.nl", true */ 'c', 'm', 'y', 'l', 'i', 'f', 'e', '.', 'n', 'l', '\0', /* "cnam.net", true */ 'c', 'n', 'a', 'm', '.', 'n', 'e', 't', '\0', /* "cnc-lehrgang.de", true */ 'c', 'n', 'c', '-', 'l', 'e', 'h', 'r', 'g', 'a', 'n', 'g', '.', 'd', 'e', '\0', /* "cncn.us", true */ 'c', 'n', 'c', 'n', '.', 'u', 's', '\0', /* "cnlic.com", true */ 'c', 'n', 'l', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "cnwage.com", true */ 'c', 'n', 'w', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0', - /* "cnwarn.com", true */ 'c', 'n', 'w', 'a', 'r', 'n', '.', 'c', 'o', 'm', '\0', /* "co.search.yahoo.com", false */ 'c', 'o', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "coachingconsultancy.com", true */ 'c', 'o', 'a', 'c', 'h', 'i', 'n', 'g', 'c', 'o', 'n', 's', 'u', 'l', 't', 'a', 'n', 'c', 'y', '.', 'c', 'o', 'm', '\0', /* "coalpointcottage.com", true */ 'c', 'o', 'a', 'l', 'p', 'o', 'i', 'n', 't', 'c', 'o', 't', 't', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "coam.co", true */ 'c', 'o', 'a', 'm', '.', 'c', 'o', '\0', /* "coatl-industries.com", true */ 'c', 'o', 'a', 't', 'l', '-', 'i', 'n', 'd', 'u', 's', 't', 'r', 'i', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "cobalt.io", true */ 'c', 'o', 'b', 'a', 'l', 't', '.', 'i', 'o', '\0', /* "cobrasystems.nl", true */ 'c', 'o', 'b', 'r', 'a', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'n', 'l', '\0', /* "cocaine.ninja", true */ 'c', 'o', 'c', 'a', 'i', 'n', 'e', '.', 'n', 'i', 'n', 'j', 'a', '\0', @@ -2725,21 +2731,21 @@ static const char kSTSHostTable[] = { /* "codecontrollers.de", true */ 'c', 'o', 'd', 'e', 'c', 'o', 'n', 't', 'r', 'o', 'l', 'l', 'e', 'r', 's', '.', 'd', 'e', '\0', /* "codedump.net", true */ 'c', 'o', 'd', 'e', 'd', 'u', 'm', 'p', '.', 'n', 'e', 't', '\0', /* "codeferm.com", true */ 'c', 'o', 'd', 'e', 'f', 'e', 'r', 'm', '.', 'c', 'o', 'm', '\0', /* "codefordus.nrw", true */ 'c', 'o', 'd', 'e', 'f', 'o', 'r', 'd', 'u', 's', '.', 'n', 'r', 'w', '\0', /* "codeforhakodate.org", true */ 'c', 'o', 'd', 'e', 'f', 'o', 'r', 'h', 'a', 'k', 'o', 'd', 'a', 't', 'e', '.', 'o', 'r', 'g', '\0', /* "codefoundry.it", false */ 'c', 'o', 'd', 'e', 'f', 'o', 'u', 'n', 'd', 'r', 'y', '.', 'i', 't', '\0', /* "codeit.guru", true */ 'c', 'o', 'd', 'e', 'i', 't', '.', 'g', 'u', 'r', 'u', '\0', /* "codelove.de", true */ 'c', 'o', 'd', 'e', 'l', 'o', 'v', 'e', '.', 'd', 'e', '\0', + /* "codemonkeyrawks.net", true */ 'c', 'o', 'd', 'e', 'm', 'o', 'n', 'k', 'e', 'y', 'r', 'a', 'w', 'k', 's', '.', 'n', 'e', 't', '\0', /* "codenode.io", true */ 'c', 'o', 'd', 'e', 'n', 'o', 'd', 'e', '.', 'i', 'o', '\0', /* "codeplay.org", true */ 'c', 'o', 'd', 'e', 'p', 'l', 'a', 'y', '.', 'o', 'r', 'g', '\0', /* "codepoints.net", true */ 'c', 'o', 'd', 'e', 'p', 'o', 'i', 'n', 't', 's', '.', 'n', 'e', 't', '\0', /* "codepref.com", true */ 'c', 'o', 'd', 'e', 'p', 'r', 'e', 'f', '.', 'c', 'o', 'm', '\0', - /* "codepult.com", true */ 'c', 'o', 'd', 'e', 'p', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0', /* "codera.co.uk", true */ 'c', 'o', 'd', 'e', 'r', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "codereview.appspot.com", true */ 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "codereview.chromium.org", true */ 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '.', 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', '.', 'o', 'r', 'g', '\0', /* "coderhangout.com", true */ 'c', 'o', 'd', 'e', 'r', 'h', 'a', 'n', 'g', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "codesport.io", true */ 'c', 'o', 'd', 'e', 's', 'p', 'o', 'r', 't', '.', 'i', 'o', '\0', /* "codeux.com", true */ 'c', 'o', 'd', 'e', 'u', 'x', '.', 'c', 'o', 'm', '\0', /* "codewild.de", true */ 'c', 'o', 'd', 'e', 'w', 'i', 'l', 'd', '.', 'd', 'e', '\0', /* "codewiththepros.org", true */ 'c', 'o', 'd', 'e', 'w', 'i', 't', 'h', 't', 'h', 'e', 'p', 'r', 'o', 's', '.', 'o', 'r', 'g', '\0', @@ -2804,17 +2810,16 @@ static const char kSTSHostTable[] = { /* "combron.nl", true */ 'c', 'o', 'm', 'b', 'r', 'o', 'n', '.', 'n', 'l', '\0', /* "comchezmeme.com", true */ 'c', 'o', 'm', 'c', 'h', 'e', 'z', 'm', 'e', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "comdotgame.com", true */ 'c', 'o', 'm', 'd', 'o', 't', 'g', 'a', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "comdurav.com", true */ 'c', 'o', 'm', 'd', 'u', 'r', 'a', 'v', '.', 'c', 'o', 'm', '\0', /* "comercialtrading.eu", true */ 'c', 'o', 'm', 'e', 'r', 'c', 'i', 'a', 'l', 't', 'r', 'a', 'd', 'i', 'n', 'g', '.', 'e', 'u', '\0', /* "comerford.net", true */ 'c', 'o', 'm', 'e', 'r', 'f', 'o', 'r', 'd', '.', 'n', 'e', 't', '\0', /* "cometcache.com", true */ 'c', 'o', 'm', 'e', 't', 'c', 'a', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0', /* "comff.net", true */ 'c', 'o', 'm', 'f', 'f', '.', 'n', 'e', 't', '\0', - /* "comfortdom.ua", true */ 'c', 'o', 'm', 'f', 'o', 'r', 't', 'd', 'o', 'm', '.', 'u', 'a', '\0', /* "comhack.com", true */ 'c', 'o', 'm', 'h', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0', /* "comico.info", true */ 'c', 'o', 'm', 'i', 'c', 'o', '.', 'i', 'n', 'f', 'o', '\0', /* "comitesaustria.at", true */ 'c', 'o', 'm', 'i', 't', 'e', 's', 'a', 'u', 's', 't', 'r', 'i', 'a', '.', 'a', 't', '\0', /* "comiteshopping.com", true */ 'c', 'o', 'm', 'i', 't', 'e', 's', 'h', 'o', 'p', 'p', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "commania.co.kr", true */ 'c', 'o', 'm', 'm', 'a', 'n', 'i', 'a', '.', 'c', 'o', '.', 'k', 'r', '\0', /* "commencepayments.com", true */ 'c', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'p', 'a', 'y', 'm', 'e', 'n', 't', 's', '.', 'c', 'o', 'm', '\0', /* "commerciallocker.com", false */ 'c', 'o', 'm', 'm', 'e', 'r', 'c', 'i', 'a', 'l', 'l', 'o', 'c', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "commoncore4kids.com", true */ 'c', 'o', 'm', 'm', 'o', 'n', 'c', 'o', 'r', 'e', '4', 'k', 'i', 'd', 's', '.', 'c', 'o', 'm', '\0', @@ -2855,17 +2860,16 @@ static const char kSTSHostTable[] = { /* "condosforcash.com", true */ 'c', 'o', 'n', 'd', 'o', 's', 'f', 'o', 'r', 'c', 'a', 's', 'h', '.', 'c', 'o', 'm', '\0', /* "confiancefoundation.org", true */ 'c', 'o', 'n', 'f', 'i', 'a', 'n', 'c', 'e', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '.', 'o', 'r', 'g', '\0', /* "config.schokokeks.org", false */ 'c', 'o', 'n', 'f', 'i', 'g', '.', 's', 'c', 'h', 'o', 'k', 'o', 'k', 'e', 'k', 's', '.', 'o', 'r', 'g', '\0', /* "confiwall.de", true */ 'c', 'o', 'n', 'f', 'i', 'w', 'a', 'l', 'l', '.', 'd', 'e', '\0', /* "conflux.tw", true */ 'c', 'o', 'n', 'f', 'l', 'u', 'x', '.', 't', 'w', '\0', /* "confucio.cl", true */ 'c', 'o', 'n', 'f', 'u', 'c', 'i', 'o', '.', 'c', 'l', '\0', /* "congineer.com", true */ 'c', 'o', 'n', 'g', 'i', 'n', 'e', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "conjugacao.com.br", true */ 'c', 'o', 'n', 'j', 'u', 'g', 'a', 'c', 'a', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', - /* "connect-ed.network", true */ 'c', 'o', 'n', 'n', 'e', 'c', 't', '-', 'e', 'd', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '\0', /* "connect.dating", true */ 'c', 'o', 'n', 'n', 'e', 'c', 't', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "connected-verhuurservice.nl", true */ 'c', 'o', 'n', 'n', 'e', 'c', 't', 'e', 'd', '-', 'v', 'e', 'r', 'h', 'u', 'u', 'r', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'n', 'l', '\0', /* "connectfss.com", true */ 'c', 'o', 'n', 'n', 'e', 'c', 't', 'f', 's', 's', '.', 'c', 'o', 'm', '\0', /* "connectingconcepts.com", true */ 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'n', 'g', 'c', 'o', 'n', 'c', 'e', 'p', 't', 's', '.', 'c', 'o', 'm', '\0', /* "connectum.eu", true */ 'c', 'o', 'n', 'n', 'e', 'c', 't', 'u', 'm', '.', 'e', 'u', '\0', /* "connext.de", true */ 'c', 'o', 'n', 'n', 'e', 'x', 't', '.', 'd', 'e', '\0', /* "connyduck.at", true */ 'c', 'o', 'n', 'n', 'y', 'd', 'u', 'c', 'k', '.', 'a', 't', '\0', /* "consciousbrand.co", true */ 'c', 'o', 'n', 's', 'c', 'i', 'o', 'u', 's', 'b', 'r', 'a', 'n', 'd', '.', 'c', 'o', '\0', @@ -2925,17 +2929,17 @@ static const char kSTSHostTable[] = { /* "coresolutions.ca", true */ 'c', 'o', 'r', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'a', '\0', /* "corex.io", true */ 'c', 'o', 'r', 'e', 'x', '.', 'i', 'o', '\0', /* "coreyjmahler.com", true */ 'c', 'o', 'r', 'e', 'y', 'j', 'm', 'a', 'h', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "corgi.party", true */ 'c', 'o', 'r', 'g', 'i', '.', 'p', 'a', 'r', 't', 'y', '\0', /* "corgicloud.com", true */ 'c', 'o', 'r', 'g', 'i', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0', /* "cormactagging.ie", true */ 'c', 'o', 'r', 'm', 'a', 'c', 't', 'a', 'g', 'g', 'i', 'n', 'g', '.', 'i', 'e', '\0', /* "cornercircle.co.uk", true */ 'c', 'o', 'r', 'n', 'e', 'r', 'c', 'i', 'r', 'c', 'l', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "corniche.com", true */ 'c', 'o', 'r', 'n', 'i', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0', - /* "cornishcamels.com", false */ 'c', 'o', 'r', 'n', 'i', 's', 'h', 'c', 'a', 'm', 'e', 'l', 's', '.', 'c', 'o', 'm', '\0', + /* "cornishcamels.com", true */ 'c', 'o', 'r', 'n', 'i', 's', 'h', 'c', 'a', 'm', 'e', 'l', 's', '.', 'c', 'o', 'm', '\0', /* "cornodo.com", true */ 'c', 'o', 'r', 'n', 'o', 'd', 'o', '.', 'c', 'o', 'm', '\0', /* "corona-academy.com", true */ 'c', 'o', 'r', 'o', 'n', 'a', '-', 'a', 'c', 'a', 'd', 'e', 'm', 'y', '.', 'c', 'o', 'm', '\0', /* "corpfin.net", true */ 'c', 'o', 'r', 'p', 'f', 'i', 'n', '.', 'n', 'e', 't', '\0', /* "corporatesubscriptions.com.au", true */ 'c', 'o', 'r', 'p', 'o', 'r', 'a', 't', 'e', 's', 'u', 'b', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "correct.horse", true */ 'c', 'o', 'r', 'r', 'e', 'c', 't', '.', 'h', 'o', 'r', 's', 'e', '\0', /* "cortexitrecruitment.com", true */ 'c', 'o', 'r', 't', 'e', 'x', 'i', 't', 'r', 'e', 'c', 'r', 'u', 'i', 't', 'm', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "cortisolsupplement.com", true */ 'c', 'o', 'r', 't', 'i', 's', 'o', 'l', 's', 'u', 'p', 'p', 'l', 'e', 'm', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "corvus.eu.org", true */ 'c', 'o', 'r', 'v', 'u', 's', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0', @@ -3195,34 +3199,32 @@ static const char kSTSHostTable[] = { /* "cyclebeads.com", true */ 'c', 'y', 'c', 'l', 'e', 'b', 'e', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "cyclehackluxembourgcity.lu", true */ 'c', 'y', 'c', 'l', 'e', 'h', 'a', 'c', 'k', 'l', 'u', 'x', 'e', 'm', 'b', 'o', 'u', 'r', 'g', 'c', 'i', 't', 'y', '.', 'l', 'u', '\0', /* "cyfly.org", true */ 'c', 'y', 'f', 'l', 'y', '.', 'o', 'r', 'g', '\0', /* "cygnius.net", true */ 'c', 'y', 'g', 'n', 'i', 'u', 's', '.', 'n', 'e', 't', '\0', /* "cyhour.com", true */ 'c', 'y', 'h', 'o', 'u', 'r', '.', 'c', 'o', 'm', '\0', /* "cymtech.net", true */ 'c', 'y', 'm', 't', 'e', 'c', 'h', '.', 'n', 'e', 't', '\0', /* "cyon.ch", true */ 'c', 'y', 'o', 'n', '.', 'c', 'h', '\0', /* "cyph.audio", true */ 'c', 'y', 'p', 'h', '.', 'a', 'u', 'd', 'i', 'o', '\0', - /* "cyph.com", true */ 'c', 'y', 'p', 'h', '.', 'c', 'o', 'm', '\0', /* "cyph.im", true */ 'c', 'y', 'p', 'h', '.', 'i', 'm', '\0', /* "cyph.video", true */ 'c', 'y', 'p', 'h', '.', 'v', 'i', 'd', 'e', 'o', '\0', /* "cyprus-company-service.com", true */ 'c', 'y', 'p', 'r', 'u', 's', '-', 'c', 'o', 'm', 'p', 'a', 'n', 'y', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "cysec.biz", true */ 'c', 'y', 's', 'e', 'c', '.', 'b', 'i', 'z', '\0', /* "cytadel.fr", true */ 'c', 'y', 't', 'a', 'd', 'e', 'l', '.', 'f', 'r', '\0', /* "czakey.net", true */ 'c', 'z', 'a', 'k', 'e', 'y', '.', 'n', 'e', 't', '\0', /* "czbix.com", true */ 'c', 'z', 'b', 'i', 'x', '.', 'c', 'o', 'm', '\0', /* "czechamlp.com", true */ 'c', 'z', 'e', 'c', 'h', 'a', 'm', 'l', 'p', '.', 'c', 'o', 'm', '\0', /* "czechvirus.cz", true */ 'c', 'z', 'e', 'c', 'h', 'v', 'i', 'r', 'u', 's', '.', 'c', 'z', '\0', /* "czerno.com", true */ 'c', 'z', 'e', 'r', 'n', 'o', '.', 'c', 'o', 'm', '\0', /* "czk.mk", true */ 'c', 'z', 'k', '.', 'm', 'k', '\0', /* "d-20.fr", true */ 'd', '-', '2', '0', '.', 'f', 'r', '\0', /* "d-designerin.de", true */ 'd', '-', 'd', 'e', 's', 'i', 'g', 'n', 'e', 'r', 'i', 'n', '.', 'd', 'e', '\0', /* "d-quantum.com", true */ 'd', '-', 'q', 'u', 'a', 'n', 't', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "d-rickroll-e.pw", true */ 'd', '-', 'r', 'i', 'c', 'k', 'r', 'o', 'l', 'l', '-', 'e', '.', 'p', 'w', '\0', /* "d-training.de", true */ 'd', '-', 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '.', 'd', 'e', '\0', - /* "d0xq.net", true */ 'd', '0', 'x', 'q', '.', 'n', 'e', 't', '\0', /* "d3xt3r01.tk", true */ 'd', '3', 'x', 't', '3', 'r', '0', '1', '.', 't', 'k', '\0', /* "d42.no", true */ 'd', '4', '2', '.', 'n', 'o', '\0', /* "d66.nl", true */ 'd', '6', '6', '.', 'n', 'l', '\0', /* "da-ist-kunst.de", true */ 'd', 'a', '-', 'i', 's', 't', '-', 'k', 'u', 'n', 's', 't', '.', 'd', 'e', '\0', /* "daallexx.eu", true */ 'd', 'a', 'a', 'l', 'l', 'e', 'x', 'x', '.', 'e', 'u', '\0', /* "dachb0den.net", true */ 'd', 'a', 'c', 'h', 'b', '0', 'd', 'e', 'n', '.', 'n', 'e', 't', '\0', /* "dadons-laserdiscs.com", true */ 'd', 'a', 'd', 'o', 'n', 's', '-', 'l', 'a', 's', 'e', 'r', 'd', 'i', 's', 'c', 's', '.', 'c', 'o', 'm', '\0', /* "dadrian.io", true */ 'd', 'a', 'd', 'r', 'i', 'a', 'n', '.', 'i', 'o', '\0', @@ -3241,17 +3243,16 @@ static const char kSTSHostTable[] = { /* "dakl-shop.de", true */ 'd', 'a', 'k', 'l', '-', 's', 'h', 'o', 'p', '.', 'd', 'e', '\0', /* "daknob.net", true */ 'd', 'a', 'k', 'n', 'o', 'b', '.', 'n', 'e', 't', '\0', /* "daladubbeln.se", true */ 'd', 'a', 'l', 'a', 'd', 'u', 'b', 'b', 'e', 'l', 'n', '.', 's', 'e', '\0', /* "dale-electric.com", true */ 'd', 'a', 'l', 'e', '-', 'e', 'l', 'e', 'c', 't', 'r', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "dalek.co.nz", true */ 'd', 'a', 'l', 'e', 'k', '.', 'c', 'o', '.', 'n', 'z', '\0', /* "dalfiume.it", false */ 'd', 'a', 'l', 'f', 'i', 'u', 'm', 'e', '.', 'i', 't', '\0', /* "dalfsennet.nl", true */ 'd', 'a', 'l', 'f', 's', 'e', 'n', 'n', 'e', 't', '.', 'n', 'l', '\0', /* "dalingk.com", true */ 'd', 'a', 'l', 'i', 'n', 'g', 'k', '.', 'c', 'o', 'm', '\0', - /* "dallmeier.net", true */ 'd', 'a', 'l', 'l', 'm', 'e', 'i', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "damedrogy.cz", true */ 'd', 'a', 'm', 'e', 'd', 'r', 'o', 'g', 'y', '.', 'c', 'z', '\0', /* "damienoreilly.org", true */ 'd', 'a', 'm', 'i', 'e', 'n', 'o', 'r', 'e', 'i', 'l', 'l', 'y', '.', 'o', 'r', 'g', '\0', /* "dammekens.be", true */ 'd', 'a', 'm', 'm', 'e', 'k', 'e', 'n', 's', '.', 'b', 'e', '\0', /* "damngoodpepper.com", true */ 'd', 'a', 'm', 'n', 'g', 'o', 'o', 'd', 'p', 'e', 'p', 'p', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "dan.me.uk", true */ 'd', 'a', 'n', '.', 'm', 'e', '.', 'u', 'k', '\0', /* "dan.org.nz", true */ 'd', 'a', 'n', '.', 'o', 'r', 'g', '.', 'n', 'z', '\0', /* "danaketh.com", true */ 'd', 'a', 'n', 'a', 'k', 'e', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "danarozmarin.com", true */ 'd', 'a', 'n', 'a', 'r', 'o', 'z', 'm', 'a', 'r', 'i', 'n', '.', 'c', 'o', 'm', '\0', @@ -3527,16 +3528,17 @@ static const char kSTSHostTable[] = { /* "dermapuur.nl", true */ 'd', 'e', 'r', 'm', 'a', 'p', 'u', 'u', 'r', '.', 'n', 'l', '\0', /* "deroo.org", true */ 'd', 'e', 'r', 'o', 'o', '.', 'o', 'r', 'g', '\0', /* "derp.army", true */ 'd', 'e', 'r', 'p', '.', 'a', 'r', 'm', 'y', '\0', /* "derpumpkinfuhrer.com", true */ 'd', 'e', 'r', 'p', 'u', 'm', 'p', 'k', 'i', 'n', 'f', 'u', 'h', 'r', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "derre.fr", true */ 'd', 'e', 'r', 'r', 'e', '.', 'f', 'r', '\0', /* "derreichesack.com", true */ 'd', 'e', 'r', 'r', 'e', 'i', 'c', 'h', 'e', 's', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0', /* "dersoundhunter.de", true */ 'd', 'e', 'r', 's', 'o', 'u', 'n', 'd', 'h', 'u', 'n', 't', 'e', 'r', '.', 'd', 'e', '\0', /* "designed-cybersecurity.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 'e', 'd', '-', 'c', 'y', 'b', 'e', 'r', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', + /* "designgears.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 'g', 'e', 'a', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "designhotel-kronjuwel.de", true */ 'd', 'e', 's', 'i', 'g', 'n', 'h', 'o', 't', 'e', 'l', '-', 'k', 'r', 'o', 'n', 'j', 'u', 'w', 'e', 'l', '.', 'd', 'e', '\0', /* "designpilot.ch", true */ 'd', 'e', 's', 'i', 'g', 'n', 'p', 'i', 'l', 'o', 't', '.', 'c', 'h', '\0', /* "designsbyjanith.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 's', 'b', 'y', 'j', 'a', 'n', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "designville.cz", true */ 'd', 'e', 's', 'i', 'g', 'n', 'v', 'i', 'l', 'l', 'e', '.', 'c', 'z', '\0', /* "designville.sk", true */ 'd', 'e', 's', 'i', 'g', 'n', 'v', 'i', 'l', 'l', 'e', '.', 's', 'k', '\0', /* "desmaakvanplanten.be", true */ 'd', 'e', 's', 'm', 'a', 'a', 'k', 'v', 'a', 'n', 'p', 'l', 'a', 'n', 't', 'e', 'n', '.', 'b', 'e', '\0', /* "desserteagleselvenar.tk", true */ 'd', 'e', 's', 's', 'e', 'r', 't', 'e', 'a', 'g', 'l', 'e', 's', 'e', 'l', 'v', 'e', 'n', 'a', 'r', '.', 't', 'k', '\0', /* "desterman.ru", true */ 'd', 'e', 's', 't', 'e', 'r', 'm', 'a', 'n', '.', 'r', 'u', '\0', @@ -3674,16 +3676,17 @@ static const char kSTSHostTable[] = { /* "digital-eastside.de", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', '-', 'e', 'a', 's', 't', 's', 'i', 'd', 'e', '.', 'd', 'e', '\0', /* "digital1st.co.uk", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', '1', 's', 't', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "digitalbitbox.com", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'b', 'i', 't', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "digitaldeli.org", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'd', 'e', 'l', 'i', '.', 'o', 'r', 'g', '\0', /* "digitaldeli.tv", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'd', 'e', 'l', 'i', '.', 't', 'v', '\0', /* "digitaldeli.us", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'd', 'e', 'l', 'i', '.', 'u', 's', '\0', /* "digitaldeliarchive.com", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'd', 'e', 'l', 'i', 'a', 'r', 'c', 'h', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "digitalehandtekeningen.nl", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'e', 'h', 'a', 'n', 'd', 't', 'e', 'k', 'e', 'n', 'i', 'n', 'g', 'e', 'n', '.', 'n', 'l', '\0', + /* "digitaleoverheid.nl", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'e', 'o', 'v', 'e', 'r', 'h', 'e', 'i', 'd', '.', 'n', 'l', '\0', /* "digitalero.rip", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'e', 'r', 'o', '.', 'r', 'i', 'p', '\0', /* "digitalhurricane.io", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'h', 'u', 'r', 'r', 'i', 'c', 'a', 'n', 'e', '.', 'i', 'o', '\0', /* "digitallocker.com", false */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'l', 'o', 'c', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "digitalnonplus.com", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'n', 'o', 'n', 'p', 'l', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "digitalquery.com", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'q', 'u', 'e', 'r', 'y', '.', 'c', 'o', 'm', '\0', /* "digitalrights.fund", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', 'r', 'i', 'g', 'h', 't', 's', '.', 'f', 'u', 'n', 'd', '\0', /* "digitkon.com", true */ 'd', 'i', 'g', 'i', 't', 'k', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "digminecraft.com", true */ 'd', 'i', 'g', 'm', 'i', 'n', 'e', 'c', 'r', 'a', 'f', 't', '.', 'c', 'o', 'm', '\0', @@ -3751,16 +3754,17 @@ static const char kSTSHostTable[] = { /* "diycc.org", true */ 'd', 'i', 'y', 'c', 'c', '.', 'o', 'r', 'g', '\0', /* "djangoproject.com", true */ 'd', 'j', 'a', 'n', 'g', 'o', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0', /* "djangosnippets.org", true */ 'd', 'j', 'a', 'n', 'g', 'o', 's', 'n', 'i', 'p', 'p', 'e', 't', 's', '.', 'o', 'r', 'g', '\0', /* "djlive.pl", true */ 'd', 'j', 'l', 'i', 'v', 'e', '.', 'p', 'l', '\0', /* "djlnetworks.co.uk", true */ 'd', 'j', 'l', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "djul.net", true */ 'd', 'j', 'u', 'l', '.', 'n', 'e', 't', '\0', /* "djxmmx.net", false */ 'd', 'j', 'x', 'm', 'm', 'x', '.', 'n', 'e', 't', '\0', /* "dk.search.yahoo.com", false */ 'd', 'k', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', + /* "dkds.us", true */ 'd', 'k', 'd', 's', '.', 'u', 's', '\0', /* "dkravchenko.su", true */ 'd', 'k', 'r', 'a', 'v', 'c', 'h', 'e', 'n', 'k', 'o', '.', 's', 'u', '\0', /* "dl.google.com", true */ 'd', 'l', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "dlaspania.pl", true */ 'd', 'l', 'a', 's', 'p', 'a', 'n', 'i', 'a', '.', 'p', 'l', '\0', /* "dlitz.net", true */ 'd', 'l', 'i', 't', 'z', '.', 'n', 'e', 't', '\0', /* "dlld.com", true */ 'd', 'l', 'l', 'd', '.', 'c', 'o', 'm', '\0', /* "dlscomputers.com.au", true */ 'd', 'l', 's', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "dlzz.net", true */ 'd', 'l', 'z', 'z', '.', 'n', 'e', 't', '\0', /* "dm.lookout.com", false */ 'd', 'm', '.', 'l', 'o', 'o', 'k', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0', @@ -3827,16 +3831,17 @@ static const char kSTSHostTable[] = { /* "dolevik.com", true */ 'd', 'o', 'l', 'e', 'v', 'i', 'k', '.', 'c', 'o', 'm', '\0', /* "dolice.net", true */ 'd', 'o', 'l', 'i', 'c', 'e', '.', 'n', 'e', 't', '\0', /* "dollemore.com", true */ 'd', 'o', 'l', 'l', 'e', 'm', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "dolphin-hosting.com", true */ 'd', 'o', 'l', 'p', 'h', 'i', 'n', '-', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "dolphin-it.de", true */ 'd', 'o', 'l', 'p', 'h', 'i', 'n', '-', 'i', 't', '.', 'd', 'e', '\0', /* "dolphinswithlasers.com", true */ 'd', 'o', 'l', 'p', 'h', 'i', 'n', 's', 'w', 'i', 't', 'h', 'l', 'a', 's', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "dom-medicina.ru", true */ 'd', 'o', 'm', '-', 'm', 'e', 'd', 'i', 'c', 'i', 'n', 'a', '.', 'r', 'u', '\0', /* "doma.in", true */ 'd', 'o', 'm', 'a', '.', 'i', 'n', '\0', + /* "domadillo.com", true */ 'd', 'o', 'm', 'a', 'd', 'i', 'l', 'l', 'o', '.', 'c', 'o', 'm', '\0', /* "domain001.info", true */ 'd', 'o', 'm', 'a', 'i', 'n', '0', '0', '1', '.', 'i', 'n', 'f', 'o', '\0', /* "domainexpress.de", true */ 'd', 'o', 'm', 'a', 'i', 'n', 'e', 'x', 'p', 'r', 'e', 's', 's', '.', 'd', 'e', '\0', /* "domainkauf.de", true */ 'd', 'o', 'm', 'a', 'i', 'n', 'k', 'a', 'u', 'f', '.', 'd', 'e', '\0', /* "domains.google.com", true */ 'd', 'o', 'm', 'a', 'i', 'n', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "domainstaff.com", true */ 'd', 'o', 'm', 'a', 'i', 'n', 's', 't', 'a', 'f', 'f', '.', 'c', 'o', 'm', '\0', /* "domenic.me", true */ 'd', 'o', 'm', 'e', 'n', 'i', 'c', '.', 'm', 'e', '\0', /* "domfee.com", true */ 'd', 'o', 'm', 'f', 'e', 'e', '.', 'c', 'o', 'm', '\0', /* "domhaase.me", true */ 'd', 'o', 'm', 'h', 'a', 'a', 's', 'e', '.', 'm', 'e', '\0', @@ -3891,17 +3896,16 @@ static const char kSTSHostTable[] = { /* "dotrox.net", true */ 'd', 'o', 't', 'r', 'o', 'x', '.', 'n', 'e', 't', '\0', /* "dotsiam.com", true */ 'd', 'o', 't', 's', 'i', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "doubleavineyards.com", true */ 'd', 'o', 'u', 'b', 'l', 'e', 'a', 'v', 'i', 'n', 'e', 'y', 'a', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "doublefun.net", true */ 'd', 'o', 'u', 'b', 'l', 'e', 'f', 'u', 'n', '.', 'n', 'e', 't', '\0', /* "doubleyummy.uk", true */ 'd', 'o', 'u', 'b', 'l', 'e', 'y', 'u', 'm', 'm', 'y', '.', 'u', 'k', '\0', /* "dougferris.id.au", true */ 'd', 'o', 'u', 'g', 'f', 'e', 'r', 'r', 'i', 's', '.', 'i', 'd', '.', 'a', 'u', '\0', /* "doujinshi.info", true */ 'd', 'o', 'u', 'j', 'i', 'n', 's', 'h', 'i', '.', 'i', 'n', 'f', 'o', '\0', /* "dounats.com", true */ 'd', 'o', 'u', 'n', 'a', 't', 's', '.', 'c', 'o', 'm', '\0', - /* "dovecotadmin.org", true */ 'd', 'o', 'v', 'e', 'c', 'o', 't', 'a', 'd', 'm', 'i', 'n', '.', 'o', 'r', 'g', '\0', /* "downloadaja.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'a', 'j', 'a', '.', 'c', 'o', 'm', '\0', /* "downloadgamemods.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'g', 'a', 'm', 'e', 'm', 'o', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "downloadgram.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'g', 'r', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "downloadsoftwaregratisan.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', 'g', 'r', 'a', 't', 'i', 's', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "doyoulyft.com", true */ 'd', 'o', 'y', 'o', 'u', 'l', 'y', 'f', 't', '.', 'c', 'o', 'm', '\0', /* "dpd.com.pl", true */ 'd', 'p', 'd', '.', 'c', 'o', 'm', '.', 'p', 'l', '\0', /* "dprd-wonogirikab.go.id", false */ 'd', 'p', 'r', 'd', '-', 'w', 'o', 'n', 'o', 'g', 'i', 'r', 'i', 'k', 'a', 'b', '.', 'g', 'o', '.', 'i', 'd', '\0', /* "dpsg-roden.de", false */ 'd', 'p', 's', 'g', '-', 'r', 'o', 'd', 'e', 'n', '.', 'd', 'e', '\0', @@ -4030,33 +4034,31 @@ static const char kSTSHostTable[] = { /* "dutyfreeonboard.com", true */ 'd', 'u', 't', 'y', 'f', 'r', 'e', 'e', 'o', 'n', 'b', 'o', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "duuu.ch", true */ 'd', 'u', 'u', 'u', '.', 'c', 'h', '\0', /* "dvbris.co.uk", true */ 'd', 'v', 'b', 'r', 'i', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "dvbris.com", true */ 'd', 'v', 'b', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0', /* "dvorupotocnych.sk", true */ 'd', 'v', 'o', 'r', 'u', 'p', 'o', 't', 'o', 'c', 'n', 'y', 'c', 'h', '.', 's', 'k', '\0', /* "dvotx.org", true */ 'd', 'v', 'o', 't', 'x', '.', 'o', 'r', 'g', '\0', /* "dvwc.org", true */ 'd', 'v', 'w', 'c', '.', 'o', 'r', 'g', '\0', /* "dwnld.me", true */ 'd', 'w', 'n', 'l', 'd', '.', 'm', 'e', '\0', - /* "dworzak.ch", true */ 'd', 'w', 'o', 'r', 'z', 'a', 'k', '.', 'c', 'h', '\0', /* "dwtm.ch", true */ 'd', 'w', 't', 'm', '.', 'c', 'h', '\0', /* "dxgl.info", true */ 'd', 'x', 'g', 'l', '.', 'i', 'n', 'f', 'o', '\0', /* "dyeager.org", true */ 'd', 'y', 'e', 'a', 'g', 'e', 'r', '.', 'o', 'r', 'g', '\0', /* "dyktig.as", true */ 'd', 'y', 'k', 't', 'i', 'g', '.', 'a', 's', '\0', /* "dyn-nserve.net", true */ 'd', 'y', 'n', '-', 'n', 's', 'e', 'r', 'v', 'e', '.', 'n', 'e', 't', '\0', /* "dyn.im", true */ 'd', 'y', 'n', '.', 'i', 'm', '\0', /* "dynaloop.net", true */ 'd', 'y', 'n', 'a', 'l', 'o', 'o', 'p', '.', 'n', 'e', 't', '\0', /* "dynamic-innovations.net", true */ 'd', 'y', 'n', 'a', 'm', 'i', 'c', '-', 'i', 'n', 'n', 'o', 'v', 'a', 't', 'i', 'o', 'n', 's', '.', 'n', 'e', 't', '\0', /* "dynamicnet.net", false */ 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'n', 'e', 't', '.', 'n', 'e', 't', '\0', /* "dynamicsnetwork.net", true */ 'd', 'y', 'n', 'a', 'm', 'i', 'c', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'n', 'e', 't', '\0', /* "dynamictostatic.com", true */ 'd', 'y', 'n', 'a', 'm', 'i', 'c', 't', 'o', 's', 't', 'a', 't', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "dynamize.solutions", true */ 'd', 'y', 'n', 'a', 'm', 'i', 'z', 'e', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0', /* "dyrenesverden.no", true */ 'd', 'y', 'r', 'e', 'n', 'e', 's', 'v', 'e', 'r', 'd', 'e', 'n', '.', 'n', 'o', '\0', /* "dyrkar.com", true */ 'd', 'y', 'r', 'k', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "dziekonski.com", true */ 'd', 'z', 'i', 'e', 'k', 'o', 'n', 's', 'k', 'i', '.', 'c', 'o', 'm', '\0', - /* "dzndk.com", true */ 'd', 'z', 'n', 'd', 'k', '.', 'c', 'o', 'm', '\0', /* "dzndk.net", true */ 'd', 'z', 'n', 'd', 'k', '.', 'n', 'e', 't', '\0', /* "dzyabchenko.com", true */ 'd', 'z', 'y', 'a', 'b', 'c', 'h', 'e', 'n', 'k', 'o', '.', 'c', 'o', 'm', '\0', /* "e-aut.net", true */ 'e', '-', 'a', 'u', 't', '.', 'n', 'e', 't', '\0', /* "e-biografias.net", true */ 'e', '-', 'b', 'i', 'o', 'g', 'r', 'a', 'f', 'i', 'a', 's', '.', 'n', 'e', 't', '\0', /* "e-isfa.eu", true */ 'e', '-', 'i', 's', 'f', 'a', '.', 'e', 'u', '\0', /* "e-kontakti.fi", true */ 'e', '-', 'k', 'o', 'n', 't', 'a', 'k', 't', 'i', '.', 'f', 'i', '\0', /* "e-learningbs.com", true */ 'e', '-', 'l', 'e', 'a', 'r', 'n', 'i', 'n', 'g', 'b', 's', '.', 'c', 'o', 'm', '\0', /* "e-lifetechnology.com", true */ 'e', '-', 'l', 'i', 'f', 'e', 't', 'e', 'c', 'h', 'n', 'o', 'l', 'o', 'g', 'y', '.', 'c', 'o', 'm', '\0', @@ -4286,17 +4288,16 @@ static const char kSTSHostTable[] = { /* "elite-porno.ru", true */ 'e', 'l', 'i', 't', 'e', '-', 'p', 'o', 'r', 'n', 'o', '.', 'r', 'u', '\0', /* "elite12.de", true */ 'e', 'l', 'i', 't', 'e', '1', '2', '.', 'd', 'e', '\0', /* "elitegameservers.net", true */ 'e', 'l', 'i', 't', 'e', 'g', 'a', 'm', 'e', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'n', 'e', 't', '\0', /* "elitehosting.de", true */ 'e', 'l', 'i', 't', 'e', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'd', 'e', '\0', /* "elizabethgreenfield.com", true */ 'e', 'l', 'i', 'z', 'a', 'b', 'e', 't', 'h', 'g', 'r', 'e', 'e', 'n', 'f', 'i', 'e', 'l', 'd', '.', 'c', 'o', 'm', '\0', /* "ella-kwikmed.com", false */ 'e', 'l', 'l', 'a', '-', 'k', 'w', 'i', 'k', 'm', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "ellegaard.dk", true */ 'e', 'l', 'l', 'e', 'g', 'a', 'a', 'r', 'd', '.', 'd', 'k', '\0', /* "elliquiy.com", true */ 'e', 'l', 'l', 'i', 'q', '