Merge m-c to f-t
authorPhil Ringnalda <philringnalda@gmail.com>
Sat, 28 Dec 2013 20:22:07 -0800
changeset 161839 589aa7fb54885aeb3f0922fd0e3903b54915edb4
parent 161838 06245a6bf15374c73451b41e024e88560d3e44b5 (current diff)
parent 161834 29882306e8ca0d6b37af342db978098e909237dd (diff)
child 161840 39370ea1f0d6313bd11cbbf05d9d4cf1a5041ff7
push idunknown
push userunknown
push dateunknown
milestone29.0a1
Merge m-c to f-t
--- a/accessible/src/generic/HyperTextAccessible-inl.h
+++ b/accessible/src/generic/HyperTextAccessible-inl.h
@@ -123,26 +123,30 @@ HyperTextAccessible::ConvertMagicOffset(
 inline int32_t
 HyperTextAccessible::AdjustCaretOffset(int32_t aOffset) const
 {
   // It is the same character offset when the caret is visually at the very
   // end of a line or the start of a new line (soft line break). Getting text
   // at the line should provide the line with the visual caret, otherwise
   // screen readers will announce the wrong line as the user presses up or
   // down arrow and land at the end of a line.
-  if (aOffset > 0) {
-    nsRefPtr<nsFrameSelection> frameSelection = FrameSelection();
-    if (frameSelection &&
-      frameSelection->GetHint() == nsFrameSelection::HINTLEFT) {
-      return aOffset - 1;
-    }
-  }
+  if (aOffset > 0 && IsCaretAtEndOfLine())
+    return aOffset - 1;
+
   return aOffset;
 }
 
+inline bool
+HyperTextAccessible::IsCaretAtEndOfLine() const
+{
+  nsRefPtr<nsFrameSelection> frameSelection = FrameSelection();
+  return frameSelection &&
+    frameSelection->GetHint() == nsFrameSelection::HINTLEFT;
+}
+
 inline Selection*
 HyperTextAccessible::DOMSelection() const
 {
   nsRefPtr<nsFrameSelection> frameSelection = FrameSelection();
   return frameSelection ?
     frameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL) :
     nullptr;
 }
--- a/accessible/src/generic/HyperTextAccessible.cpp
+++ b/accessible/src/generic/HyperTextAccessible.cpp
@@ -666,17 +666,22 @@ HyperTextAccessible::TextAtOffset(int32_
   int32_t adjustedOffset = ConvertMagicOffset(aOffset);
   if (adjustedOffset < 0) {
     NS_ERROR("Wrong given offset!");
     return;
   }
 
   switch (aBoundaryType) {
     case BOUNDARY_CHAR:
-      CharAt(adjustedOffset, aText, aStartOffset, aEndOffset);
+      // Return no char if caret is at the end of wrapped line (case of no line
+      // end character). Returning a next line char is confusing for AT.
+      if (aOffset == nsIAccessibleText::TEXT_OFFSET_CARET && IsCaretAtEndOfLine())
+        *aStartOffset = *aEndOffset = adjustedOffset;
+      else
+        CharAt(adjustedOffset, aText, aStartOffset, aEndOffset);
       break;
 
     case BOUNDARY_WORD_START:
       if (aOffset == nsIAccessibleText::TEXT_OFFSET_CARET)
         adjustedOffset = AdjustCaretOffset(adjustedOffset);
 
       *aEndOffset = FindWordBoundary(adjustedOffset, eDirNext, eStartWord);
       *aStartOffset = FindWordBoundary(*aEndOffset, eDirPrevious, eStartWord);
@@ -729,17 +734,22 @@ HyperTextAccessible::TextAfterOffset(int
   }
 
   int32_t adjustedOffset = convertedOffset;
   if (aOffset == nsIAccessibleText::TEXT_OFFSET_CARET)
     adjustedOffset = AdjustCaretOffset(adjustedOffset);
 
   switch (aBoundaryType) {
     case BOUNDARY_CHAR:
-      CharAt(convertedOffset + 1, aText, aStartOffset, aEndOffset);
+      // If caret is at the end of wrapped line (case of no line end character)
+      // then char after the offset is a first char at next line.
+      if (adjustedOffset >= CharacterCount())
+        *aStartOffset = *aEndOffset = CharacterCount();
+      else
+        CharAt(adjustedOffset + 1, aText, aStartOffset, aEndOffset);
       break;
 
     case BOUNDARY_WORD_START:
       // Move word forward twice to find start and end offsets.
       *aStartOffset = FindWordBoundary(adjustedOffset, eDirNext, eStartWord);
       *aEndOffset = FindWordBoundary(*aStartOffset, eDirNext, eStartWord);
       TextSubstring(*aStartOffset, *aEndOffset, aText);
       break;
--- a/accessible/src/generic/HyperTextAccessible.h
+++ b/accessible/src/generic/HyperTextAccessible.h
@@ -393,16 +393,21 @@ protected:
   int32_t ConvertMagicOffset(int32_t aOffset);
 
   /**
    * Adjust an offset the caret stays at to get a text by line boundary.
    */
   int32_t AdjustCaretOffset(int32_t aOffset) const;
 
   /**
+   * Return true if caret is at end of line.
+   */
+  bool IsCaretAtEndOfLine() const;
+
+  /**
    * Return true if the given offset points to terminal empty line if any.
    */
   bool IsEmptyLastLineOffset(int32_t aOffset)
   {
     return aOffset == static_cast<int32_t>(CharacterCount()) &&
       IsLineEndCharAt(aOffset - 1);
   }
 
--- a/accessible/tests/mochitest/text.js
+++ b/accessible/tests/mochitest/text.js
@@ -549,30 +549,37 @@ function testTextHelper(aID, aOffset, aB
     var text = aTextFunc(aOffset, aBoundaryType,
                          startOffsetObj, endOffsetObj);
 
     if (exceptionFlag) {
       ok(false, startMsg + "no expected failure at offset " + aOffset + endMsg);
       return;
     }
 
-    var isFunc1 = (aToDoFlag1 == kTodo) ? todo_is : is;
-    var isFunc2 = (aToDoFlag2 == kTodo) ? todo_is : is;
-    var isFunc3 = (aToDoFlag3 == kTodo) ? todo_is : is;
+    var isFunc1 = (aToDoFlag1 == kTodo) ? todo : ok;
+    var isFunc2 = (aToDoFlag2 == kTodo) ? todo : ok;
+    var isFunc3 = (aToDoFlag3 == kTodo) ? todo : ok;
 
-    isFunc1(text, aText,
-            startMsg + "wrong text, offset: " + aOffset + endMsg);
-    isFunc2(startOffsetObj.value, aStartOffset,
-            startMsg + "wrong start offset, offset: " + aOffset + endMsg);
-    isFunc3(endOffsetObj.value, aEndOffset,
-            startMsg + "wrong end offset, offset: " + aOffset + endMsg);
+    isFunc1(text == aText,
+            startMsg + "wrong text " +
+            "(got '" + text + "', expected: '" + aText + "')" +
+            ", offset: " + aOffset + endMsg);
+    isFunc2(startOffsetObj.value == aStartOffset,
+            startMsg + "wrong start offset" +
+            "(got '" + startOffsetObj.value + "', expected: '" + aStartOffset + "')" +
+            ", offset: " + aOffset + endMsg);
+    isFunc3(endOffsetObj.value == aEndOffset,
+            startMsg + "wrong end offset" +
+            "(got '" + endOffsetObj.value + "', expected: '" + aEndOffset + "')" +
+            ", offset: " + aOffset + endMsg);
 
   } catch (e) {
     var okFunc = exceptionFlag ? todo : ok;
-    okFunc(false, startMsg + "failed at offset " + aOffset + endMsg);
+    okFunc(false, startMsg + "failed at offset " + aOffset + endMsg +
+           ", exception: " + e);
   }
 }
 
 function boundaryToString(aBoundaryType)
 {
   switch (aBoundaryType) {
     case BOUNDARY_CHAR:
       return "char";
--- a/accessible/tests/mochitest/text/test_atcaretoffset.html
+++ b/accessible/tests/mochitest/text/test_atcaretoffset.html
@@ -30,17 +30,18 @@
     function traverseTextByLines(aQueue, aID, aLines)
     {
       var wholeText = "";
       for (var i = 0; i < aLines.length ; i++)
         wholeText += aLines[i][0] + aLines[i][1];
 
       var baseInvokerFunc = synthClick;
       var charIter = new charIterator(wholeText, aLines);
-      //charIter.debugOffset = 0;
+      //charIter.debugOffset = 10; // enable to run tests at given offset only
+
       while (charIter.next()) {
         aQueue.push(new tmpl_moveTo(aID, baseInvokerFunc, wholeText, charIter));
         baseInvokerFunc = synthRightKey;
       }
     }
 
     /**
      * Used to get test list for each traversed character.
@@ -142,17 +143,35 @@
               (useNextWordForAtWordEnd ? nWord : cWord).end ],
             [ testTextAfterOffset, BOUNDARY_WORD_START,
               nWord.start, nnWord.start ],
             [ testTextAfterOffset, BOUNDARY_WORD_END,
               (isAfterWordEnd ? nWord : cWord).end,
               (isAfterWordEnd ? nnWord : nWord).end ]
           ];
 
-          return lineTests.concat(wordTests);
+          // Character boundary tests.
+          var prevOffset = this.offset > 1 ? this.offset - 1 : 0;
+          var nextOffset = this.offset >= aWholeText.length ?
+            this.offset : this.offset + 1;
+          var nextAfterNextOffset = nextOffset >= aWholeText.length ?
+            nextOffset : nextOffset + 1;
+
+          var charTests = [
+            [ testTextBeforeOffset, BOUNDARY_CHAR,
+              prevOffset, this.offset ],
+            [ testTextAtOffset, BOUNDARY_CHAR,
+              this.offset,
+              this.mAtWrappedLineEnd ? this.offset : nextOffset ],
+            [ testTextAfterOffset, BOUNDARY_CHAR,
+              this.mAtWrappedLineEnd ? this.offset : nextOffset,
+              this.mAtWrappedLineEnd ? nextOffset : nextAfterNextOffset ]
+          ];
+
+          return lineTests.concat(wordTests.concat(charTests));
         }
       });
 
       Object.defineProperty(this, "failures", { get: function()
         {
           if (this.mOffset == this.mLine.start)
             return this.mLine.lineStartFailures;
           if (this.mOffset == this.mLine.end)
--- a/accessible/tests/mochitest/text/test_charboundary.html
+++ b/accessible/tests/mochitest/text/test_charboundary.html
@@ -30,25 +30,17 @@
       testCharAtOffset(IDs, 0, "h", 0, 1);
       testCharAtOffset(IDs, 1, "e", 1, 2);
       testCharAtOffset(IDs, 14, "d", 14, 15);
       testCharAtOffset(IDs, 15, "", 15, 15);
 
       testCharAfterOffset(IDs, 0, "e", 1, 2);
       testCharAfterOffset(IDs, 1, "l", 2, 3);
       testCharAfterOffset(IDs, 14, "", 15, 15);
-
-      // 15 is out of range offset for get text after, keep todos until we
-      // decide how to handle out of range values (ATK and IA2 seems to have
-      // different expectations.
-      testTextAfterOffset(15, BOUNDARY_CHAR, "", 15, 15,
-                          "i1", kOk, kTodo, kTodo,
-                          "d1", kOk, kTodo, kTodo,
-                          "e1", kOk, kTodo, kTodo,
-                          "t1", kOk, kTodo, kTodo);
+      testCharAfterOffset(IDs, 15, "", 15, 15);
 
       //////////////////////////////////////////////////////////////////////////
       //
       // __B__r__a__v__e__ __S__i__r__ __ __R__o__b__i__n__ __ __ __r__a__n
       //  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21
 
       IDs = [ "i2", "d2", "e2", "t2" ];
 
--- a/content/svg/content/src/SVGMotionSMILAttr.cpp
+++ b/content/svg/content/src/SVGMotionSMILAttr.cpp
@@ -6,16 +6,17 @@
 /* representation of a dummy attribute targeted by <animateMotion> element */
 
 #include "SVGMotionSMILAttr.h"
 #include "SVGMotionSMILType.h"
 #include "mozilla/dom/SVGAnimationElement.h"
 #include "nsSMILValue.h"
 #include "nsDebug.h"
 #include "nsSVGElement.h"
+#include "gfx2DGlue.h"
 
 namespace mozilla {
 
 nsresult
 SVGMotionSMILAttr::ValueFromString(const nsAString& aStr,
                                    const dom::SVGAnimationElement* aSrcElement,
                                    nsSMILValue& aValue,
                                    bool& aPreventCachingOfSandwich) const
@@ -35,17 +36,17 @@ void
 SVGMotionSMILAttr::ClearAnimValue()
 {
   mSVGElement->SetAnimateMotionTransform(nullptr);
 }
 
 nsresult
 SVGMotionSMILAttr::SetAnimValue(const nsSMILValue& aValue)
 {
-  gfxMatrix matrix = SVGMotionSMILType::CreateMatrix(aValue);
+  gfx::Matrix matrix = gfx::ToMatrix(SVGMotionSMILType::CreateMatrix(aValue));
   mSVGElement->SetAnimateMotionTransform(&matrix);
   return NS_OK;
 }
 
 const nsIContent*
 SVGMotionSMILAttr::GetTargetNode() const
 {
   return mSVGElement;
--- a/content/svg/content/src/SVGTransformableElement.cpp
+++ b/content/svg/content/src/SVGTransformableElement.cpp
@@ -104,40 +104,40 @@ SVGTransformableElement::PrependLocalTra
 
   NS_ABORT_IF_FALSE(aWhich == eAllTransforms || aWhich == eUserSpaceToParent,
                     "Unknown TransformTypes");
 
   // animateMotion's resulting transform is supposed to apply *on top of*
   // any transformations from the |transform| attribute. So since we're
   // PRE-multiplying, we need to apply the animateMotion transform *first*.
   if (mAnimateMotionTransform) {
-    result.PreMultiply(*mAnimateMotionTransform);
+    result.PreMultiply(ThebesMatrix(*mAnimateMotionTransform));
   }
 
   if (mTransforms) {
     result.PreMultiply(mTransforms->GetAnimValue().GetConsolidationMatrix());
   }
 
   return result;
 }
 
-const gfxMatrix*
+const gfx::Matrix*
 SVGTransformableElement::GetAnimateMotionTransform() const
 {
   return mAnimateMotionTransform.get();
 }
 
 void
-SVGTransformableElement::SetAnimateMotionTransform(const gfxMatrix* aMatrix)
+SVGTransformableElement::SetAnimateMotionTransform(const gfx::Matrix* aMatrix)
 {
   if ((!aMatrix && !mAnimateMotionTransform) ||
       (aMatrix && mAnimateMotionTransform && *aMatrix == *mAnimateMotionTransform)) {
     return;
   }
-  mAnimateMotionTransform = aMatrix ? new gfxMatrix(*aMatrix) : nullptr;
+  mAnimateMotionTransform = aMatrix ? new gfx::Matrix(*aMatrix) : nullptr;
   DidAnimateTransformList();
   nsIFrame* frame = GetPrimaryFrame();
   if (frame) {
     // If the result of this transform and any other transforms on this frame
     // is the identity matrix, then DoApplyRenderingChangeToTree won't handle
     // our nsChangeHint_UpdateTransformLayer hint since aFrame->IsTransformed()
     // will return false. That's fine, but we still need to schedule a repaint,
     // and that won't otherwise happen. Since it's cheap to call SchedulePaint,
--- a/content/svg/content/src/SVGTransformableElement.h
+++ b/content/svg/content/src/SVGTransformableElement.h
@@ -5,16 +5,17 @@
 
 #ifndef SVGTransformableElement_h
 #define SVGTransformableElement_h
 
 #include "mozilla/Attributes.h"
 #include "nsSVGAnimatedTransformList.h"
 #include "nsSVGElement.h"
 #include "gfxMatrix.h"
+#include "mozilla/gfx/Matrix.h"
 
 namespace mozilla {
 namespace dom {
 
 class SVGAnimatedTransformList;
 class SVGGraphicsElement;
 class SVGMatrix;
 class SVGIRect;
@@ -45,33 +46,33 @@ public:
                                       int32_t aModType) const MOZ_OVERRIDE;
 
 
   virtual bool IsEventAttributeName(nsIAtom* aName) MOZ_OVERRIDE;
 
 
   virtual gfxMatrix PrependLocalTransformsTo(const gfxMatrix &aMatrix,
                       TransformTypes aWhich = eAllTransforms) const MOZ_OVERRIDE;
-  virtual const gfxMatrix* GetAnimateMotionTransform() const MOZ_OVERRIDE;
-  virtual void SetAnimateMotionTransform(const gfxMatrix* aMatrix) MOZ_OVERRIDE;
+  virtual const gfx::Matrix* GetAnimateMotionTransform() const MOZ_OVERRIDE;
+  virtual void SetAnimateMotionTransform(const gfx::Matrix* aMatrix) MOZ_OVERRIDE;
 
   virtual nsSVGAnimatedTransformList*
     GetAnimatedTransformList(uint32_t aFlags = 0) MOZ_OVERRIDE;
   virtual nsIAtom* GetTransformListAttrName() const MOZ_OVERRIDE {
     return nsGkAtoms::transform;
   }
 
   virtual bool IsTransformable() MOZ_OVERRIDE { return true; }
 
 protected:
   // nsSVGElement overrides
 
   nsAutoPtr<nsSVGAnimatedTransformList> mTransforms;
 
   // XXX maybe move this to property table, to save space on un-animated elems?
-  nsAutoPtr<gfxMatrix> mAnimateMotionTransform;
+  nsAutoPtr<gfx::Matrix> mAnimateMotionTransform;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // SVGTransformableElement_h
 
--- a/content/svg/content/src/nsSVGElement.h
+++ b/content/svg/content/src/nsSVGElement.h
@@ -52,16 +52,21 @@ class SVGNumberList;
 class SVGAnimatedLengthList;
 class SVGUserUnitList;
 class SVGAnimatedPointList;
 class SVGAnimatedPathSegList;
 class SVGAnimatedPreserveAspectRatio;
 class nsSVGAnimatedTransformList;
 class SVGStringList;
 class DOMSVGStringList;
+
+namespace gfx {
+class Matrix;
+}
+
 }
 
 struct gfxMatrix;
 struct nsSVGEnumMapping;
 
 typedef nsStyledElementNotElementCSSInlineStyle nsSVGElementBase;
 
 class nsSVGElement : public nsSVGElementBase    // nsIContent
@@ -163,18 +168,18 @@ public:
    * does not include any transforms due to the 'transform' attribute.
    */
   virtual gfxMatrix PrependLocalTransformsTo(const gfxMatrix &aMatrix,
                       TransformTypes aWhich = eAllTransforms) const;
 
   // Setter for to set the current <animateMotion> transformation
   // Only visible for nsSVGGraphicElement, so it's a no-op here, and that
   // subclass has the useful implementation.
-  virtual void SetAnimateMotionTransform(const gfxMatrix* aMatrix) {/*no-op*/}
-  virtual const gfxMatrix* GetAnimateMotionTransform() const { return nullptr; }
+  virtual void SetAnimateMotionTransform(const mozilla::gfx::Matrix* aMatrix) {/*no-op*/}
+  virtual const mozilla::gfx::Matrix* GetAnimateMotionTransform() const { return nullptr; }
 
   bool IsStringAnimatable(uint8_t aAttrEnum) {
     return GetStringInfo().mStringInfo[aAttrEnum].mIsAnimatable;
   }
   bool NumberAttrAllowsPercentage(uint8_t aAttrEnum) {
     return GetNumberInfo().mNumberInfo[aAttrEnum].mPercentagesAllowed;
   }
   virtual bool HasValidDimensions() const {
--- a/mobile/android/modules/SimpleServiceDiscovery.jsm
+++ b/mobile/android/modules/SimpleServiceDiscovery.jsm
@@ -39,17 +39,16 @@ const SSDP_DISCOVER_TIMEOUT = 10000;
 
 /*
  * SimpleServiceDiscovery manages any discovered SSDP services. It uses a UDP
  * broadcast to locate available services on the local network.
  */
 var SimpleServiceDiscovery = {
   _targets: new Map(),
   _services: new Map(),
-  _localAddress: null,
   _searchSocket: null,
   _searchInterval: 0,
   _searchTimestamp: 0,
   _searchTimeout: Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer),
   _searchRepeat: Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer),
 
   // nsIUDPSocketListener implementation
   onPacketReceived: function(aSocket, aMessage) {
@@ -207,22 +206,16 @@ var SimpleServiceDiscovery = {
     // Use the REST api to request more information about this service
     let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
     xhr.open("GET", aService.location, true);
     xhr.channel.loadFlags |= Ci.nsIRequest.INHIBIT_CACHING;
     xhr.overrideMimeType("text/xml");
 
     xhr.addEventListener("load", (function() {
       if (xhr.status == 200) {
-        if (!this._localAddress) {
-          xhr.channel.QueryInterface(Ci.nsIHttpChannelInternal);
-          this._localAddress = xhr.channel.localAddress;
-        }
-        aService.localAddress = this._localAddress;
-
         let doc = xhr.responseXML;
         aService.appsURL = xhr.getResponseHeader("Application-URL");
         if (aService.appsURL && !aService.appsURL.endsWith("/"))
           aService.appsURL += "/";
         aService.friendlyName = doc.querySelector("friendlyName").textContent;
         aService.uuid = doc.querySelector("UDN").textContent;
         aService.manufacturer = doc.querySelector("manufacturer").textContent;
         aService.modelName = doc.querySelector("modelName").textContent;
--- a/security/manager/boot/src/nsSTSPreloadList.errors
+++ b/security/manager/boot/src/nsSTSPreloadList.errors
@@ -25,17 +25,16 @@ crypto.is: did not receive HSTS header
 csawctf.poly.edu: did not receive HSTS header
 dl.google.com: did not receive HSTS header
 docs.google.com: did not receive HSTS header
 drive.google.com: did not receive HSTS header
 dropcam.com: did not receive HSTS header
 email.lookout.com: could not connect to host
 emailprivacytester.com: did not receive HSTS header
 encrypted.google.com: did not receive HSTS header
-epoxate.com: max-age too low: 259200
 fatzebra.com.au: did not receive HSTS header
 fj.simple.com: did not receive HSTS header
 get.zenpayroll.com: did not receive HSTS header
 glass.google.com: did not receive HSTS header
 gmail.com: did not receive HSTS header
 gocardless.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-hsts-000000000000000/getHSTSPreloadList.js :: processStsHeader :: line 124"  data: no]
 googlemail.com: did not receive HSTS header
 googleplex.com: could not connect to host
@@ -95,17 +94,16 @@ sol.io: could not connect to host
 spreadsheets.google.com: did not receive HSTS header
 square.com: did not receive HSTS header
 ssl.google-analytics.com: did not receive HSTS header
 ssl.panoramio.com: did not receive HSTS header
 sunshinepress.org: could not connect to host
 surfeasy.com: did not receive HSTS header
 talk.google.com: did not receive HSTS header
 talkgadget.google.com: did not receive HSTS header
-torproject.org: did not receive HSTS header
 translate.googleapis.com: did not receive HSTS header
 uprotect.it: could not connect to host
 wallet.google.com: did not receive HSTS header
 whonix.org: did not receive HSTS header
 www.cueup.com: did not receive HSTS header
 www.developer.mydigipass.com: could not connect to host
 www.dropcam.com: max-age too low: 2592000
 www.elanex.biz: did not receive HSTS header
--- a/security/manager/boot/src/nsSTSPreloadList.inc
+++ b/security/manager/boot/src/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(1398510340891000);
+const PRTime gPreloadListExpirationTime = INT64_C(1399115288663000);
 
 class nsSTSPreload
 {
   public:
     const char *mHost;
     const bool mIncludeSubdomains;
 };
 
@@ -57,16 +57,17 @@ static const nsSTSPreload kSTSPreloadLis
   { "dist.torproject.org", false },
   { "dm.lookout.com", false },
   { "dm.mylookout.com", false },
   { "download.jitsi.org", false },
   { "ebanking.indovinabank.com.vn", false },
   { "ecosystem.atlassian.net", true },
   { "eff.org", true },
   { "entropia.de", false },
+  { "epoxate.com", false },
   { "errors.zenpayroll.com", false },
   { "espra.com", true },
   { "factor.cc", false },
   { "faq.lookout.com", false },
   { "forum.linode.com", false },
   { "forum.quantifiedself.com", true },
   { "gernert-server.de", true },
   { "getlantern.org", true },
@@ -132,16 +133,17 @@ static const nsSTSPreload kSTSPreloadLis
   { "squareup.com", false },
   { "stocktrade.de", false },
   { "stripe.com", true },
   { "strongest-privacy.com", true },
   { "support.mayfirst.org", false },
   { "surkatty.org", true },
   { "tent.io", true },
   { "therapynotes.com", false },
+  { "torproject.org", false },
   { "twitter.com", false },
   { "ubertt.org", true },
   { "webmail.gigahost.dk", false },
   { "webmail.mayfirst.org", false },
   { "webmail.onlime.ch", false },
   { "wiki.python.org", true },
   { "wiz.biz", true },
   { "writeapp.me", false },