Merge mozilla-inbound to mozilla-central a=merge
authorRazvan Maries <rmaries@mozilla.com>
Fri, 15 Mar 2019 05:40:21 +0200
changeset 464100 c525a24dffc34f710b52dfcb949fcafeb3f6bac6
parent 464087 5ce27c44f79e369501db52170709194a30d12f8a (current diff)
parent 464099 f3500b0a2f3bbce27476b4602d1e7be26524d909 (diff)
child 464117 6149ddaa39a6436f6d212da737be23bfa1bbf914
child 464138 759a68d0af0fbdf24b36101503d8c61a879cfc25
push id35708
push userrmaries@mozilla.com
push dateFri, 15 Mar 2019 03:45:36 +0000
treeherdermozilla-central@c525a24dffc3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone67.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
Merge mozilla-inbound to mozilla-central a=merge
devtools/client/debugger/new/src/actions/sources/loadSourceText.js
devtools/client/debugger/new/src/actions/types/SourceAction.js
devtools/client/debugger/new/src/reducers/sources.js
--- a/devtools/client/debugger/new/src/actions/sources/loadSourceText.js
+++ b/devtools/client/debugger/new/src/actions/sources/loadSourceText.js
@@ -1,97 +1,128 @@
 /* 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/>. */
 
 // @flow
 
 import { PROMISE } from "../utils/middleware/promise";
-import { getSource } from "../../selectors";
+import { getSource, getSourcesEpoch } from "../../selectors";
 import { setBreakpointPositions } from "../breakpoints";
 
 import * as parser from "../../workers/parser";
 import { isLoaded, isOriginal } from "../../utils/source";
 import { Telemetry } from "devtools-modules";
 
-import defer from "../../utils/defer";
 import type { ThunkArgs } from "../types";
 
 import type { Source } from "../../types";
 
 const requests = new Map();
 
 // Measures the time it takes for a source to load
 const loadSourceHistogram = "DEVTOOLS_DEBUGGER_LOAD_SOURCE_MS";
 const telemetry = new Telemetry();
 
-async function loadSource(state, source: Source, { sourceMaps, client }) {
+async function loadSource(
+  state,
+  source: Source,
+  { sourceMaps, client }
+): Promise<?{
+  text: string,
+  contentType: string
+}> {
   if (isOriginal(source)) {
-    return sourceMaps.getOriginalSourceText(source);
+    const result = await sourceMaps.getOriginalSourceText(source);
+    if (!result) {
+      // TODO: This allows pretty files to continue working the way they have
+      // been, but is very ugly. Remove this when we centralize pretty-printing
+      // in loadSource. https://github.com/firefox-devtools/debugger/issues/8071
+      if (source.isPrettyPrinted) {
+        return null;
+      }
+
+      // The way we currently try to load and select a pending
+      // selected location, it is possible that we will try to fetch the
+      // original source text right after the source map has been cleared
+      // after a navigation event.
+      throw new Error("Original source text unavailable");
+    }
+    return result;
   }
 
   if (!source.actors.length) {
     throw new Error("No source actor for loadSource");
   }
 
+  telemetry.start(loadSourceHistogram, source);
   const response = await client.sourceContents(source.actors[0]);
   telemetry.finish(loadSourceHistogram, source);
 
   return {
-    id: source.id,
     text: response.source,
     contentType: response.contentType || "text/javascript"
   };
 }
 
+async function loadSourceTextPromise(
+  source: Source,
+  epoch: number,
+  { dispatch, getState, client, sourceMaps }: ThunkArgs
+): Promise<?Source> {
+  if (isLoaded(source)) {
+    return source;
+  }
+
+  await dispatch({
+    type: "LOAD_SOURCE_TEXT",
+    sourceId: source.id,
+    epoch,
+    [PROMISE]: loadSource(getState(), source, { sourceMaps, client })
+  });
+
+  const newSource = getSource(getState(), source.id);
+  if (!newSource) {
+    return;
+  }
+
+  if (!newSource.isWasm && isLoaded(newSource)) {
+    parser.setSource(newSource);
+    await dispatch(setBreakpointPositions(newSource.id));
+  }
+
+  return newSource;
+}
+
 /**
  * @memberof actions/sources
  * @static
  */
-export function loadSourceText(source: ?Source) {
-  return async ({ dispatch, getState, client, sourceMaps }: ThunkArgs) => {
-    if (!source) {
+export function loadSourceText(inputSource: ?Source) {
+  return async (thunkArgs: ThunkArgs) => {
+    if (!inputSource) {
       return;
     }
+    // This ensures that the falsy check above is preserved into the IIFE
+    // below in a way that Flow is happy with.
+    const source = inputSource;
 
-    const id = source.id;
-    // Fetch the source text only once.
-    if (requests.has(id)) {
-      return requests.get(id);
-    }
+    const epoch = getSourcesEpoch(thunkArgs.getState());
 
-    if (isLoaded(source)) {
-      return Promise.resolve();
+    const id = `${epoch}:${source.id}`;
+    let promise = requests.get(id);
+    if (!promise) {
+      promise = (async () => {
+        try {
+          return await loadSourceTextPromise(source, epoch, thunkArgs);
+        } catch (e) {
+          // TODO: This swallows errors for now. Ideally we would get rid of
+          // this once we have a better handle on our async state management.
+        } finally {
+          requests.delete(id);
+        }
+      })();
+      requests.set(id, promise);
     }
 
-    const deferred = defer();
-    requests.set(id, deferred.promise);
-
-    telemetry.start(loadSourceHistogram, source);
-    try {
-      await dispatch({
-        type: "LOAD_SOURCE_TEXT",
-        sourceId: source.id,
-        [PROMISE]: loadSource(getState(), source, { sourceMaps, client })
-      });
-    } catch (e) {
-      deferred.resolve();
-      requests.delete(id);
-      return;
-    }
-
-    const newSource = getSource(getState(), source.id);
-    if (!newSource) {
-      return;
-    }
-
-    if (!newSource.isWasm && isLoaded(newSource)) {
-      parser.setSource(newSource);
-      await dispatch(setBreakpointPositions(newSource.id));
-    }
-
-    // signal that the action is finished
-    deferred.resolve();
-    requests.delete(id);
-
-    return source;
+    return promise;
   };
 }
--- a/devtools/client/debugger/new/src/actions/types/SourceAction.js
+++ b/devtools/client/debugger/new/src/actions/types/SourceAction.js
@@ -5,17 +5,18 @@
 // @flow
 
 import type { Source, SourceLocation } from "../../types";
 import type { PromiseAction } from "../utils/middleware/promise";
 
 export type LoadSourceAction = PromiseAction<
   {|
     +type: "LOAD_SOURCE_TEXT",
-    +sourceId: string
+    +sourceId: string,
+    +epoch: number
   |},
   Source
 >;
 export type SourceAction =
   | LoadSourceAction
   | {|
       +type: "ADD_SOURCE",
       +source: Source
--- a/devtools/client/debugger/new/src/reducers/sources.js
+++ b/devtools/client/debugger/new/src/reducers/sources.js
@@ -31,16 +31,18 @@ import { mapValues, uniqBy, uniq } from 
 export type SourcesMap = { [SourceId]: Source };
 export type SourcesMapByThread = { [ThreadId]: SourcesMap };
 
 type UrlsMap = { [string]: SourceId[] };
 type DisplayedSources = { [ThreadId]: { [SourceId]: boolean } };
 type GetDisplayedSourcesSelector = OuterState => { [ThreadId]: SourcesMap };
 
 export type SourcesState = {
+  epoch: number,
+
   // All known sources.
   sources: SourcesMap,
 
   // All sources associated with a given URL. When using source maps, multiple
   // sources can have the same URL.
   urls: UrlsMap,
 
   // For each thread, all sources in that thread that are under the project root
@@ -58,16 +60,17 @@ const emptySources = {
   sources: {},
   urls: {},
   displayed: {}
 };
 
 export function initialSourcesState(): SourcesState {
   return {
     ...emptySources,
+    epoch: 1,
     selectedLocation: undefined,
     pendingSelectedLocation: prefs.pendingSelectedLocation,
     projectDirectoryRoot: prefs.projectDirectoryRoot,
     chromeAndExtenstionsEnabled: prefs.chromeAndExtenstionsEnabled,
     focusedItem: null
   };
 }
 
@@ -159,17 +162,20 @@ function update(
         return updateSource(state, { id, isBlackBoxed });
       }
       break;
 
     case "SET_PROJECT_DIRECTORY_ROOT":
       return updateProjectDirectoryRoot(state, action.url);
 
     case "NAVIGATE":
-      return initialSourcesState();
+      return {
+        ...initialSourcesState(),
+        epoch: state.epoch + 1
+      };
 
     case "SET_FOCUSED_SOURCE_ITEM":
       return { ...state, focusedItem: action.item };
   }
 
   return state;
 }
 
@@ -291,25 +297,36 @@ function updateProjectDirectoryRoot(stat
     relativeUrl: getRelativeUrl(source, root)
   }));
 }
 
 /*
  * Update a source's loaded state fields
  * i.e. loadedState, text, error
  */
-function updateLoadedState(state, action: LoadSourceAction): SourcesState {
+function updateLoadedState(
+  state: SourcesState,
+  action: LoadSourceAction
+): SourcesState {
   const { sourceId } = action;
   let source;
 
+  // If there was a navigation between the time the action was started and
+  // completed, we don't want to update the store.
+  if (action.epoch !== state.epoch) {
+    return state;
+  }
+
   if (action.status === "start") {
     source = { id: sourceId, loadedState: "loading" };
   } else if (action.status === "error") {
     source = { id: sourceId, error: action.error, loadedState: "loaded" };
   } else {
+    // TODO: Remove this once we centralize pretty-print and this can no longer
+    // return a null value when loading a in-progress prettyprinting file.
     if (!action.value) {
       return state;
     }
 
     source = {
       id: sourceId,
       text: action.value.text,
       contentType: action.value.contentType,
@@ -517,16 +534,20 @@ export function getHasSiblingOfSameName(
 
   return getSourcesUrlsInSources(state, source.url).length > 1;
 }
 
 export function getSources(state: OuterState) {
   return state.sources.sources;
 }
 
+export function getSourcesEpoch(state: OuterState) {
+  return state.sources.epoch;
+}
+
 export function getUrls(state: OuterState) {
   return state.sources.urls;
 }
 
 export function getSourceList(state: OuterState): Source[] {
   return (Object.values(getSources(state)): any);
 }
 
--- a/dom/base/Document.cpp
+++ b/dom/base/Document.cpp
@@ -6509,16 +6509,18 @@ nsINode* Document::AdoptNode(nsINode& aA
   }
 
   NS_ASSERTION(adoptedNode->OwnerDoc() == this,
                "Should still be in the document we just got adopted into");
 
   return adoptedNode;
 }
 
+bool Document::UseWidthDeviceWidthFallbackViewport() const { return false; }
+
 void Document::ParseWidthAndHeightInMetaViewport(
     const nsAString& aWidthString, const nsAString& aHeightString,
     const nsAString& aScaleString) {
   // The width and height properties
   // https://drafts.csswg.org/css-device-adapt/#width-and-height-properties
   //
   // The width and height viewport <META> properties are translated into width
   // and height descriptors, setting the min-width/min-height value to
@@ -6548,16 +6550,19 @@ void Document::ParseWidthAndHeightInMeta
       }
     }
     // FIXME: Check the scale is not 'auto' once we support auto value for it.
   } else if (!aScaleString.IsEmpty()) {
     if (aHeightString.IsEmpty()) {
       mMinWidth = nsViewportInfo::ExtendToZoom;
       mMaxWidth = nsViewportInfo::ExtendToZoom;
     }
+  } else if (aHeightString.IsEmpty() && UseWidthDeviceWidthFallbackViewport()) {
+    mMinWidth = nsViewportInfo::ExtendToZoom;
+    mMaxWidth = nsViewportInfo::DeviceSize;
   }
 
   mMinHeight = nsViewportInfo::Auto;
   mMaxHeight = nsViewportInfo::Auto;
   if (!aHeightString.IsEmpty()) {
     mMinHeight = nsViewportInfo::ExtendToZoom;
     if (aHeightString.EqualsLiteral("device-height")) {
       mMaxHeight = nsViewportInfo::DeviceSize;
--- a/dom/base/Document.h
+++ b/dom/base/Document.h
@@ -3571,16 +3571,23 @@ class Document : public nsINode,
    * This method is virtual so that XULDocument can
    * override it.
    */
   virtual void InitialDocumentTranslationCompleted();
 
  protected:
   RefPtr<DocumentL10n> mDocumentL10n;
 
+  /**
+   * Return true when you want a document without explicitly specified viewport
+   * dimensions/scale to be treated as if "width=device-width" had in fact been
+   * specified.
+   */
+  virtual bool UseWidthDeviceWidthFallbackViewport() const;
+
  private:
   void InitializeLocalization(nsTArray<nsString>& aResourceIds);
 
   void ParseWidthAndHeightInMetaViewport(const nsAString& aWidthString,
                                          const nsAString& aHeightString,
                                          const nsAString& aScaleString);
 
   FlashClassification DocumentFlashClassificationInternal();
--- a/dom/base/test/reftest/reftest.list
+++ b/dom/base/test/reftest/reftest.list
@@ -1,2 +1,7 @@
 == test_bug920877.html test_bug920877-ref.html
 HTTP == test_xmlPrettyPrint_csp.xml test_xmlPrettyPrint_csp-ref.xml
+# Ordinarily, reftests use a browser.viewport.desktopWidth of 800px, same as the
+# size of the reftest document. This test however needs something more representative
+# of a real mobile device, where the desktop viewport width doesn't match the
+# width of the device screen.
+test-pref(dom.meta-viewport.enabled,true) test-pref(browser.viewport.desktopWidth,1200) test-pref(plain_text.wrap_long_lines,true) == test_bug1525662.txt test_bug1525662-ref.html
new file mode 100644
--- /dev/null
+++ b/dom/base/test/reftest/test_bug1525662-ref.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+<meta name="viewport" content="width=device-width">
+</head>
+<body>
+<pre style="white-space: pre-wrap; word-wrap: break-word">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras ac velit sed tellus facilisis euismod. Proin vel nulla vel turpis tristique dignissim. Donec lacus ipsum, eleifend ut, volutpat a, ultrices adipiscing, arcu. Etiam ligula dolor, adipiscing ut, porta vitae, bibendum non, dolor. Mauris ligula. Sed placerat tincidunt elit. Vestibulum non libero. Curabitur cursus tortor id sem. Integer consectetuer auctor lacus. Proin nisl nisi, pulvinar eget, pharetra at, aliquam eu, velit. Morbi fringilla. Quisque faucibus, mauris posuere vulputate interdum, lectus libero sollicitudin tellus, sit amet ultrices enim purus ac mauris. Pellentesque sit amet mauris eu ante aliquet egestas. Mauris dapibus, velit consectetuer tristique luctus, enim augue pulvinar libero, fringilla dictum lectus felis eu ligula. In ac lorem.
+
+Integer laoreet. Ut ultricies arcu nec est. Aenean varius nisl ut odio. Nullam arcu. Vestibulum non pede. Proin vel est. Nam condimentum fermentum dui. Donec at arcu. Donec at libero adipiscing odio mattis dapibus. Suspendisse libero neque, faucibus sed, facilisis et, convallis sit amet, justo. Duis purus tortor, ornare ac, convallis ut, pretium et, tellus. Nam accumsan, ipsum eget accumsan mollis, sapien dolor adipiscing metus, id tincidunt ipsum metus sed nulla. Praesent hendrerit lectus eget tortor. Morbi id lectus et elit ultrices hendrerit. Cras gravida velit sed mauris. Proin lacinia tempus est. Sed sapien tortor, fringilla vel, elementum in, volutpat ac, ante. Vivamus eu tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+
+Mauris in sem ac felis pretium placerat. Donec tempus cursus sem. Aliquam scelerisque porttitor sem. Curabitur consectetuer, pede vitae aliquam aliquet, sapien lacus vehicula neque, ut rhoncus nibh neque sed velit. In rhoncus, nulla eu dignissim egestas, diam nibh hendrerit mauris, condimentum laoreet sapien arcu quis mi. Sed euismod sem. Nulla non ligula sed lacus tempor molestie. Quisque varius. In hac habitasse platea dictumst. Sed felis ipsum, consequat et, blandit vitae, tincidunt id, quam. Nunc nunc. Duis gravida. In massa neque, cursus quis, rutrum sed, semper quis, erat. Donec enim. Suspendisse condimentum eros vel elit. Vestibulum adipiscing erat id lorem. Maecenas enim dui, cursus a, pulvinar ac, rutrum sed, sem. Suspendisse gravida ante vel lectus.
+
+Vestibulum molestie, ante at dignissim venenatis, pede urna dictum arcu, vel ullamcorper ligula eros eget metus. Pellentesque nec nisl. Morbi ut nibh. Aenean mauris. Mauris rutrum justo nec velit. Nunc condimentum tortor id augue. Quisque semper massa eget nibh. Maecenas ac odio pretium lorem tincidunt faucibus. Sed congue. Cras sit amet orci ut ligula cursus congue. Etiam laoreet lacus sit amet tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus accumsan. Ut gravida urna hendrerit leo. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/base/test/reftest/test_bug1525662.txt
@@ -0,0 +1,7 @@
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras ac velit sed tellus facilisis euismod. Proin vel nulla vel turpis tristique dignissim. Donec lacus ipsum, eleifend ut, volutpat a, ultrices adipiscing, arcu. Etiam ligula dolor, adipiscing ut, porta vitae, bibendum non, dolor. Mauris ligula. Sed placerat tincidunt elit. Vestibulum non libero. Curabitur cursus tortor id sem. Integer consectetuer auctor lacus. Proin nisl nisi, pulvinar eget, pharetra at, aliquam eu, velit. Morbi fringilla. Quisque faucibus, mauris posuere vulputate interdum, lectus libero sollicitudin tellus, sit amet ultrices enim purus ac mauris. Pellentesque sit amet mauris eu ante aliquet egestas. Mauris dapibus, velit consectetuer tristique luctus, enim augue pulvinar libero, fringilla dictum lectus felis eu ligula. In ac lorem.
+
+Integer laoreet. Ut ultricies arcu nec est. Aenean varius nisl ut odio. Nullam arcu. Vestibulum non pede. Proin vel est. Nam condimentum fermentum dui. Donec at arcu. Donec at libero adipiscing odio mattis dapibus. Suspendisse libero neque, faucibus sed, facilisis et, convallis sit amet, justo. Duis purus tortor, ornare ac, convallis ut, pretium et, tellus. Nam accumsan, ipsum eget accumsan mollis, sapien dolor adipiscing metus, id tincidunt ipsum metus sed nulla. Praesent hendrerit lectus eget tortor. Morbi id lectus et elit ultrices hendrerit. Cras gravida velit sed mauris. Proin lacinia tempus est. Sed sapien tortor, fringilla vel, elementum in, volutpat ac, ante. Vivamus eu tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+
+Mauris in sem ac felis pretium placerat. Donec tempus cursus sem. Aliquam scelerisque porttitor sem. Curabitur consectetuer, pede vitae aliquam aliquet, sapien lacus vehicula neque, ut rhoncus nibh neque sed velit. In rhoncus, nulla eu dignissim egestas, diam nibh hendrerit mauris, condimentum laoreet sapien arcu quis mi. Sed euismod sem. Nulla non ligula sed lacus tempor molestie. Quisque varius. In hac habitasse platea dictumst. Sed felis ipsum, consequat et, blandit vitae, tincidunt id, quam. Nunc nunc. Duis gravida. In massa neque, cursus quis, rutrum sed, semper quis, erat. Donec enim. Suspendisse condimentum eros vel elit. Vestibulum adipiscing erat id lorem. Maecenas enim dui, cursus a, pulvinar ac, rutrum sed, sem. Suspendisse gravida ante vel lectus.
+
+Vestibulum molestie, ante at dignissim venenatis, pede urna dictum arcu, vel ullamcorper ligula eros eget metus. Pellentesque nec nisl. Morbi ut nibh. Aenean mauris. Mauris rutrum justo nec velit. Nunc condimentum tortor id augue. Quisque semper massa eget nibh. Maecenas ac odio pretium lorem tincidunt faucibus. Sed congue. Cras sit amet orci ut ligula cursus congue. Etiam laoreet lacus sit amet tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus accumsan. Ut gravida urna hendrerit leo. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
--- a/dom/html/nsHTMLDocument.cpp
+++ b/dom/html/nsHTMLDocument.cpp
@@ -176,17 +176,18 @@ nsHTMLDocument::nsHTMLDocument()
       mLoadFlags(0),
       mTooDeepWriteRecursion(false),
       mDisableDocWrite(false),
       mWarnedWidthHeight(false),
       mContentEditableCount(0),
       mEditingState(EditingState::eOff),
       mDisableCookieAccess(false),
       mPendingMaybeEditingStateChanged(false),
-      mHasBeenEditable(false) {
+      mHasBeenEditable(false),
+      mIsPlainText(false) {
   mType = eHTML;
   mDefaultElementType = kNameSpaceID_XHTML;
   mCompatMode = eCompatibility_NavQuirks;
 }
 
 nsHTMLDocument::~nsHTMLDocument() {}
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED(nsHTMLDocument, Document, mAll,
@@ -487,25 +488,25 @@ nsresult nsHTMLDocument::StartDocumentLo
   if (!(view || viewSource || asData)) {
     MOZ_ASSERT(false, "Bad parser command");
     return NS_ERROR_INVALID_ARG;
   }
 
   bool html = contentType.EqualsLiteral(TEXT_HTML);
   bool xhtml = !html && (contentType.EqualsLiteral(APPLICATION_XHTML_XML) ||
                          contentType.EqualsLiteral(APPLICATION_WAPXHTML_XML));
-  bool plainText =
+  mIsPlainText =
       !html && !xhtml && nsContentUtils::IsPlainTextType(contentType);
-  if (!(html || xhtml || plainText || viewSource)) {
+  if (!(html || xhtml || mIsPlainText || viewSource)) {
     MOZ_ASSERT(false, "Channel with bad content type.");
     return NS_ERROR_INVALID_ARG;
   }
 
   bool forceUtf8 =
-      plainText && nsContentUtils::IsUtf8OnlyPlainTextType(contentType);
+      mIsPlainText && nsContentUtils::IsUtf8OnlyPlainTextType(contentType);
 
   bool loadAsHtml5 = true;
 
   if (!viewSource && xhtml) {
     // We're parsing XHTML as XML, remember that.
     mType = eXHTML;
     mCompatMode = eCompatibility_FullStandards;
     loadAsHtml5 = false;
@@ -544,17 +545,17 @@ nsresult nsHTMLDocument::StartDocumentLo
   }
 
   nsCOMPtr<nsICachingChannel> cachingChan = do_QueryInterface(aChannel);
   nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(aContainer));
 
   bool loadWithPrototype = false;
   if (loadAsHtml5) {
     mParser = nsHtml5Module::NewHtml5Parser();
-    if (plainText) {
+    if (mIsPlainText) {
       if (viewSource) {
         mParser->MarkAsNotScriptCreated("view-source-plain");
       } else {
         mParser->MarkAsNotScriptCreated("plain-text");
       }
     } else if (viewSource && !html) {
       mParser->MarkAsNotScriptCreated("view-source-xml");
     } else {
@@ -701,17 +702,17 @@ nsresult nsHTMLDocument::StartDocumentLo
       // about:blank *only*
       nsCOMPtr<nsIHTMLContentSink> htmlsink;
       NS_NewHTMLContentSink(getter_AddRefs(htmlsink), this, uri, docShell,
                             aChannel);
       mParser->SetContentSink(htmlsink);
     }
   }
 
-  if (plainText && !nsContentUtils::IsChildOfSameType(this) &&
+  if (mIsPlainText && !nsContentUtils::IsChildOfSameType(this) &&
       Preferences::GetBool("plain_text.wrap_long_lines")) {
     nsCOMPtr<nsIStringBundleService> bundleService =
         do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
     NS_ASSERTION(NS_SUCCEEDED(rv) && bundleService,
                  "The bundle service could not be loaded");
     nsCOMPtr<nsIStringBundle> bundle;
     rv = bundleService->CreateBundle(
         "chrome://global/locale/browser.properties", getter_AddRefs(bundle));
@@ -781,16 +782,26 @@ void nsHTMLDocument::SetCompatibilityMod
   }
   mCompatMode = aMode;
   CSSLoader()->SetCompatibilityMode(mCompatMode);
   if (nsPresContext* pc = GetPresContext()) {
     pc->CompatibilityModeChanged();
   }
 }
 
+bool nsHTMLDocument::UseWidthDeviceWidthFallbackViewport() const {
+  if (mIsPlainText) {
+    // Plain text documents are simple enough that font inflation doesn't offer
+    // any appreciable advantage over defaulting to "width=device-width" and
+    // subsequently turning on word-wrapping.
+    return true;
+  }
+  return Document::UseWidthDeviceWidthFallbackViewport();
+}
+
 Element* nsHTMLDocument::GetUnfocusedKeyEventTarget() {
   if (nsGenericHTMLElement* body = GetBody()) {
     return body;
   }
   return Document::GetUnfocusedKeyEventTarget();
 }
 
 already_AddRefed<nsIURI> nsHTMLDocument::GetDomainURI() {
--- a/dom/html/nsHTMLDocument.h
+++ b/dom/html/nsHTMLDocument.h
@@ -63,16 +63,20 @@ class nsHTMLDocument : public mozilla::d
                                      nsISupports* aContainer,
                                      nsIStreamListener** aDocListener,
                                      bool aReset = true,
                                      nsIContentSink* aSink = nullptr) override;
 
   virtual void BeginLoad() override;
   virtual void EndLoad() override;
 
+ protected:
+  virtual bool UseWidthDeviceWidthFallbackViewport() const override;
+
+ public:
   // nsIHTMLDocument
   virtual void SetCompatibilityMode(nsCompatibility aMode) override;
 
   virtual bool IsWriting() override { return mWriteLevel != uint32_t(0); }
 
   virtual Element* GetUnfocusedKeyEventTarget() override;
 
   nsContentList* GetExistingForms() const { return mForms; }
@@ -338,16 +342,21 @@ class nsHTMLDocument : public mozilla::d
    * Temporary flag that is set in EndUpdate() to ignore
    * MaybeEditingStateChanged() script runners from a nested scope.
    */
   bool mPendingMaybeEditingStateChanged;
 
   // mHasBeenEditable is set to true when mEditingState is firstly set to
   // eDesignMode or eContentEditable.
   bool mHasBeenEditable;
+
+  /**
+   * Set to true once we know that we are loading plain text content.
+   */
+  bool mIsPlainText;
 };
 
 namespace mozilla {
 namespace dom {
 
 inline nsHTMLDocument* Document::AsHTMLDocument() {
   MOZ_ASSERT(IsHTMLOrXHTML());
   return static_cast<nsHTMLDocument*>(this);
--- a/image/decoders/nsPNGDecoder.cpp
+++ b/image/decoders/nsPNGDecoder.cpp
@@ -112,16 +112,17 @@ nsPNGDecoder::nsPNGDecoder(RasterImage* 
       mInProfile(nullptr),
       mTransform(nullptr),
       mFormat(SurfaceFormat::UNKNOWN),
       mCMSMode(0),
       mChannels(0),
       mPass(0),
       mFrameIsHidden(false),
       mDisablePremultipliedAlpha(false),
+      mGotInfoCallback(false),
       mNumFrames(0) {}
 
 nsPNGDecoder::~nsPNGDecoder() {
   if (mPNG) {
     png_destroy_read_struct(&mPNG, mInfo ? &mInfo : nullptr, nullptr);
   }
   if (mCMSLine) {
     free(mCMSLine);
@@ -532,16 +533,23 @@ void nsPNGDecoder::info_callback(png_str
   unsigned int channels;
 
   png_bytep trans = nullptr;
   int num_trans = 0;
 
   nsPNGDecoder* decoder =
       static_cast<nsPNGDecoder*>(png_get_progressive_ptr(png_ptr));
 
+  if (decoder->mGotInfoCallback) {
+    MOZ_LOG(sPNGLog, LogLevel::Warning, ("libpng called info_callback more than once\n"));
+    return;
+  }
+
+  decoder->mGotInfoCallback = true;
+
   // Always decode to 24-bit RGB or 32-bit RGBA
   png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
                &interlace_type, &compression_type, &filter_type);
 
   const IntRect frameRect(0, 0, width, height);
 
   // Post our size to the superclass
   decoder->PostSize(frameRect.Width(), frameRect.Height());
--- a/image/decoders/nsPNGDecoder.h
+++ b/image/decoders/nsPNGDecoder.h
@@ -98,16 +98,17 @@ class nsPNGDecoder : public Decoder {
 
   // whether CMS or premultiplied alpha are forced off
   uint32_t mCMSMode;
 
   uint8_t mChannels;
   uint8_t mPass;
   bool mFrameIsHidden;
   bool mDisablePremultipliedAlpha;
+  bool mGotInfoCallback;
 
   struct AnimFrameInfo {
     AnimFrameInfo();
 #ifdef PNG_APNG_SUPPORTED
     AnimFrameInfo(png_structp aPNG, png_infop aInfo);
 #endif
 
     DisposalMethod mDispose;
new file mode 100644
--- /dev/null
+++ b/image/test/crashtests/1526717-1.html
@@ -0,0 +1,1 @@
+<img height="64" width="64" src="fuzz-1311.png?0.5592939664601271">
\ No newline at end of file
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5ac5b32744c0da609e7c5cd99a7a25ff62e951aa
GIT binary patch
literal 318
zc%17D@N?(olHy`uVBq!ia0vp^CxCc02NMGW<L%gz)j*DRiEBj3e}S#-o-U3d6}Qgp
z<=oSWsZ9ZdS%3t?<cBvjffP%+qpu?aW7`757t`W_e5R5hzhDM-!xvr+KptmVfnz$5
zHUwfFhL~RAS3pJ<$cBi+Z?7Bj9Z=wL4h;Spck<%o*`*9=n-l`R?%j}5@hRz|lGF0f
zbJ#pC-Ih0wo|m>vr93|FTiNUB;U<hsEF1y~t1{QTI1zDC_I5=4GwoRnV8N>!78y(b
yU$jO8DDUt`<Y3pinwk`q=&C2>8-TVdSApD9;1OBOz`%D1gc(IOP#md)!;t{?O<>~y
--- a/image/test/crashtests/crashtests.list
+++ b/image/test/crashtests/crashtests.list
@@ -53,8 +53,10 @@ load invalid-size.gif
 load invalid-size-second-frame.gif
 
 load multiple-png-hassize.ico # Bug 863958 - This icon's size is such that it leads to multiple writes to the PNG decoder after we've gotten our size.
 asserts(0-2) load ownerdiscard.html # Bug 1323672, bug 807211
 load truncated-second-frame.png # Bug 863975
 
 # Bug 1509998 - Ensure that we handle empty frame rects in animated images.
 load 1509998.gif
+
+load 1526717-1.html
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -375,16 +375,19 @@ pref("devtools.remote.wifi.enabled", fal
 pref("font.size.inflation.minTwips", 0);
 
 // When true, zooming will be enabled on all sites, even ones that declare user-scalable=no.
 pref("browser.ui.zoom.force-user-scalable", false);
 
 // With the typical screen sizes on mobile devices, we want to wrap page sources by default.
 pref("view_source.wrap_long_lines", true);
 
+// Ditto for plain text documents.
+pref("plain_text.wrap_long_lines", true);
+
 
 pref("ui.touch.radius.enabled", false);
 pref("ui.touch.radius.leftmm", 3);
 pref("ui.touch.radius.topmm", 5);
 pref("ui.touch.radius.rightmm", 3);
 pref("ui.touch.radius.bottommm", 2);
 pref("ui.touch.radius.visitedWeight", 120);
 
index 0e8b0a697693c09cfd0affbb9e4f571e47f31519..ba3b541c315655fd2d04d1fc2d3ef4bb0dc762e1
GIT binary patch
literal 23961
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
I2nYlKJN;R5r~m)}
--- a/security/nss/TAG-INFO
+++ b/security/nss/TAG-INFO
@@ -1,1 +1,1 @@
-NSS_3_43_BETA2
+NSS_3_43_BETA3
--- a/security/nss/coreconf/coreconf.dep
+++ b/security/nss/coreconf/coreconf.dep
@@ -5,9 +5,8 @@
 
 /*
  * A dummy header file that is a dependency for all the object files.
  * Used to force a full recompilation of NSS in Mozilla's Tinderbox
  * depend builds.  See comments in rules.mk.
  */
 
 #error "Do not include this header file."
-
--- a/security/nss/nss.gyp
+++ b/security/nss/nss.gyp
@@ -106,18 +106,16 @@
             'cmd/shlibsign/shlibsign.gyp:shlibsign',
           ],
           'conditions': [
             [ 'comm_client==1', {
               'dependencies': [
                 'cmd/smimetools/smimetools.gyp:cmsutil',
               ],
             }],
-          ],
-          'conditions': [
             [ 'mozilla_client==0', {
               'dependencies': [
                 'cmd/crlutil/crlutil.gyp:crlutil',
                 'cmd/pwdecrypt/pwdecrypt.gyp:pwdecrypt',
                 'cmd/signtool/signtool.gyp:signtool',
                 'cmd/signver/signver.gyp:signver',
                 'cmd/smimetools/smimetools.gyp:cmsutil',
                 'cmd/ssltap/ssltap.gyp:ssltap',