From 7ee99ec56bec89476a9185d2d51e182df7cfaa74 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Thu, 28 Sep 2017 08:06:23 +0900 Subject: [PATCH 001/108] Bug 1403824 - Keep track of arenas in the arena tree. r=njn Bug 1402174 made all arenas registered in a Red-Black tree. Which means they are iterable through that tree, making the arenas list now redundant. The list is also inconvenient, since it needs to be constantly reallocated, and the allocator in charge of the list doesn't know how to free things. Iteration of arenas is not on any hot path anyways, so even though iterating the RB tree is slower, it doesn't matter. So we remove the arenas list, and keep a direct pointer to the main arena for convenience (instead of calling First() on the RB tree every time) --HG-- extra : rebase_source : 31f12b2de18a886eb4f8f078e11040aad3fdc800 --- memory/build/mozjemalloc.cpp | 151 ++++++++++++----------------------- 1 file changed, 51 insertions(+), 100 deletions(-) diff --git a/memory/build/mozjemalloc.cpp b/memory/build/mozjemalloc.cpp index f36e1badf100..e47d678042d4 100644 --- a/memory/build/mozjemalloc.cpp +++ b/memory/build/mozjemalloc.cpp @@ -1094,12 +1094,7 @@ static size_t base_committed; * Arenas. */ -/* - * Arenas that are used to service external requests. Not all elements of the - * arenas array are necessarily used; arenas are created lazily as needed. - */ -static arena_t** arenas; -// A tree of arenas, arranged by id. +// A tree of all available arenas, arranged by id. // TODO: Move into arena_t as a static member when rb_tree doesn't depend on // the type being defined anymore. static RedBlackTree gArenaTree; @@ -1118,6 +1113,10 @@ static MOZ_THREAD_LOCAL(arena_t*) thread_arena; static mozilla::detail::ThreadLocal thread_arena; #endif +// The main arena, which all threads default to until jemalloc_thread_local_arena +// is called. +static arena_t *gMainArena; + /*******************************/ /* * Runtime configuration options. @@ -2340,9 +2339,7 @@ thread_local_arena(bool enabled) * with `false`, except maybe at shutdown. */ arena = arenas_extend(); } else { - malloc_spin_lock(&arenas_lock); - arena = arenas[0]; - malloc_spin_unlock(&arenas_lock); + arena = gMainArena; } thread_arena.set(arena); return arena; @@ -4063,30 +4060,24 @@ arena_t::Init() static inline arena_t * arenas_fallback() { - /* Only reached if there is an OOM error. */ + /* Only reached if there is an OOM error. */ - /* - * OOM here is quite inconvenient to propagate, since dealing with it - * would require a check for failure in the fast path. Instead, punt - * by using arenas[0]. - * In practice, this is an extremely unlikely failure. - */ - _malloc_message(_getprogname(), - ": (malloc) Error initializing arena\n"); + /* + * OOM here is quite inconvenient to propagate, since dealing with it + * would require a check for failure in the fast path. Instead, punt + * by using the first arena. + * In practice, this is an extremely unlikely failure. + */ + _malloc_message(_getprogname(), + ": (malloc) Error initializing arena\n"); - return arenas[0]; + return gMainArena; } /* Create a new arena and return it. */ static arena_t* arenas_extend() { - /* - * The list of arenas is first allocated to contain at most 16 elements, - * and when the limit is reached, the list is grown such that it can - * contain 16 more elements. - */ - const size_t arenas_growth = 16; arena_t* ret; /* Allocate enough space for trailing bins. */ @@ -4099,32 +4090,9 @@ arenas_extend() malloc_spin_lock(&arenas_lock); // TODO: Use random Ids. - ret->mId = narenas; + ret->mId = narenas++; gArenaTree.Insert(ret); - /* Allocate and initialize arenas. */ - if (narenas % arenas_growth == 0) { - size_t max_arenas = ((narenas + arenas_growth) / arenas_growth) * arenas_growth; - /* - * We're unfortunately leaking the previous allocation ; - * the base allocator doesn't know how to free things - */ - arena_t** new_arenas = (arena_t**)base_alloc(sizeof(arena_t*) * max_arenas); - if (!new_arenas) { - ret = arenas ? arenas_fallback() : nullptr; - malloc_spin_unlock(&arenas_lock); - return ret; - } - memcpy(new_arenas, arenas, narenas * sizeof(arena_t*)); - /* - * Zero the array. In practice, this should always be pre-zeroed, - * since it was just mmap()ed, but let's be sure. - */ - memset(new_arenas + narenas, 0, sizeof(arena_t*) * (max_arenas - narenas)); - arenas = new_arenas; - } - arenas[narenas++] = ret; - malloc_spin_unlock(&arenas_lock); return ret; } @@ -4594,20 +4562,21 @@ MALLOC_OUT: */ gArenaTree.Init(); arenas_extend(); - if (!arenas || !arenas[0]) { + gMainArena = gArenaTree.First(); + if (!gMainArena) { #ifndef XP_WIN malloc_mutex_unlock(&init_lock); #endif return true; } /* arena_t::Init() sets this to a lower value for thread local arenas; - * reset to the default value for the main arenas */ - arenas[0]->mMaxDirty = opt_dirty_max; + * reset to the default value for the main arena. */ + gMainArena->mMaxDirty = opt_dirty_max; /* * Assign the initial arena to the initial thread. */ - thread_arena.set(arenas[0]); + thread_arena.set(gMainArena); chunk_rtree = malloc_rtree_new((SIZEOF_PTR << 3) - opt_chunk_2pow); if (!chunk_rtree) { @@ -4909,7 +4878,7 @@ MozJemalloc::malloc_usable_size(usable_ptr_t aPtr) template<> inline void MozJemalloc::jemalloc_stats(jemalloc_stats_t* aStats) { - size_t i, non_arena_mapped, chunk_header_size; + size_t non_arena_mapped, chunk_header_size; MOZ_ASSERT(aStats); @@ -4954,8 +4923,7 @@ MozJemalloc::jemalloc_stats(jemalloc_stats_t* aStats) malloc_spin_lock(&arenas_lock); /* Iterate over arenas. */ - for (i = 0; i < narenas; i++) { - arena_t* arena = arenas[i]; + for (auto arena : gArenaTree.iter()) { size_t arena_mapped, arena_allocated, arena_committed, arena_dirty, j, arena_unused, arena_headers; arena_run_t* run; @@ -5074,13 +5042,9 @@ arena_t::HardPurge() template<> inline void MozJemalloc::jemalloc_purge_freed_pages() { - size_t i; malloc_spin_lock(&arenas_lock); - for (i = 0; i < narenas; i++) { - arena_t* arena = arenas[i]; - if (arena) { - arena->HardPurge(); - } + for (auto arena : gArenaTree.iter()) { + arena->HardPurge(); } malloc_spin_unlock(&arenas_lock); } @@ -5099,16 +5063,11 @@ MozJemalloc::jemalloc_purge_freed_pages() template<> inline void MozJemalloc::jemalloc_free_dirty_pages(void) { - size_t i; malloc_spin_lock(&arenas_lock); - for (i = 0; i < narenas; i++) { - arena_t* arena = arenas[i]; - - if (arena) { - malloc_spin_lock(&arena->mLock); - arena->Purge(true); - malloc_spin_unlock(&arena->mLock); - } + for (auto arena : gArenaTree.iter()) { + malloc_spin_lock(&arena->mLock); + arena->Purge(true); + malloc_spin_unlock(&arena->mLock); } malloc_spin_unlock(&arenas_lock); } @@ -5185,19 +5144,17 @@ static void _malloc_prefork(void) { - unsigned i; + /* Acquire all mutexes in a safe order. */ - /* Acquire all mutexes in a safe order. */ + malloc_spin_lock(&arenas_lock); - malloc_spin_lock(&arenas_lock); - for (i = 0; i < narenas; i++) { - if (arenas[i]) - malloc_spin_lock(&arenas[i]->mLock); - } + for (auto arena : gArenaTree.iter()) { + malloc_spin_lock(&arena->mLock); + } - malloc_mutex_lock(&base_mtx); + malloc_mutex_lock(&base_mtx); - malloc_mutex_lock(&huge_mtx); + malloc_mutex_lock(&huge_mtx); } #ifndef XP_DARWIN @@ -5206,19 +5163,16 @@ static void _malloc_postfork_parent(void) { - unsigned i; + /* Release all mutexes, now that fork() has completed. */ - /* Release all mutexes, now that fork() has completed. */ + malloc_mutex_unlock(&huge_mtx); - malloc_mutex_unlock(&huge_mtx); + malloc_mutex_unlock(&base_mtx); - malloc_mutex_unlock(&base_mtx); - - for (i = 0; i < narenas; i++) { - if (arenas[i]) - malloc_spin_unlock(&arenas[i]->mLock); - } - malloc_spin_unlock(&arenas_lock); + for (auto arena : gArenaTree.iter()) { + malloc_spin_unlock(&arena->mLock); + } + malloc_spin_unlock(&arenas_lock); } #ifndef XP_DARWIN @@ -5227,19 +5181,16 @@ static void _malloc_postfork_child(void) { - unsigned i; + /* Reinitialize all mutexes, now that fork() has completed. */ - /* Reinitialize all mutexes, now that fork() has completed. */ + malloc_mutex_init(&huge_mtx); - malloc_mutex_init(&huge_mtx); + malloc_mutex_init(&base_mtx); - malloc_mutex_init(&base_mtx); - - for (i = 0; i < narenas; i++) { - if (arenas[i]) - malloc_spin_init(&arenas[i]->mLock); - } - malloc_spin_init(&arenas_lock); + for (auto arena : gArenaTree.iter()) { + malloc_spin_init(&arena->mLock); + } + malloc_spin_init(&arenas_lock); } /* From d721de8d813e6ce19709b69387a8848062e5a781 Mon Sep 17 00:00:00 2001 From: Thomas Nguyen Date: Thu, 14 Sep 2017 17:05:52 +0800 Subject: [PATCH 002/108] Bug 1389315 - Isolate Safe Browsing completions cached by each provider. r=francois MozReview-Commit-ID: INiuM5ydv2f --HG-- extra : rebase_source : 376fa8f04d850d23e8de908e8a3484350269a671 --- .../nsUrlClassifierHashCompleter.js | 15 ++++++++++++++- .../tests/unit/test_hashcompleter.js | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/toolkit/components/url-classifier/nsUrlClassifierHashCompleter.js b/toolkit/components/url-classifier/nsUrlClassifierHashCompleter.js index f802e0ef2103..a2524edc06e9 100644 --- a/toolkit/components/url-classifier/nsUrlClassifierHashCompleter.js +++ b/toolkit/components/url-classifier/nsUrlClassifierHashCompleter.js @@ -322,6 +322,7 @@ function HashCompleterRequest(aCompleter, aGethashUrl) { this._shuttingDown = false; this.gethashUrl = aGethashUrl; + this.provider = ""; // Multiple partial hashes can be associated with the same tables // so we use a map here. this.tableNames = new Map(); @@ -357,6 +358,10 @@ HashCompleterRequest.prototype = { this.tableNames.set(aTableName); // Assuming all tables with the same gethash URL have the same provider + if (this.provider == "") { + this.provider = gUrlUtil.getProvider(aTableName); + } + if (this.telemetryProvider == "") { this.telemetryProvider = gUrlUtil.getTelemetryProvider(aTableName); } @@ -669,6 +674,13 @@ HashCompleterRequest.prototype = { // This adds a complete hash to any entry in |this._requests| that matches // the hash. handleItem: function HCR_handleItem(aData) { + let provider = gUrlUtil.getProvider(aData.tableName); + if (provider != this.provider) { + log("Ignoring table " + aData.tableName + " since it belongs to " + provider + + " while the response came from " + this.provider + "."); + return; + } + for (let i = 0; i < this._requests.length; i++) { let request = this._requests[i]; if (aData.completeHash.startsWith(request.partialHash)) { @@ -764,7 +776,8 @@ HashCompleterRequest.prototype = { } } let success = Components.isSuccessCode(aStatusCode); - log("Received a " + httpStatus + " status code from the gethash server (success=" + success + ")."); + log("Received a " + httpStatus + " status code from the " + this.provider + + " gethash server (success=" + success + ")."); Services.telemetry.getKeyedHistogramById("URLCLASSIFIER_COMPLETE_REMOTE_STATUS2"). add(this.telemetryProvider, httpStatusToBucket(httpStatus)); diff --git a/toolkit/components/url-classifier/tests/unit/test_hashcompleter.js b/toolkit/components/url-classifier/tests/unit/test_hashcompleter.js index 72842db817d9..1a0cd93f9141 100644 --- a/toolkit/components/url-classifier/tests/unit/test_hashcompleter.js +++ b/toolkit/components/url-classifier/tests/unit/test_hashcompleter.js @@ -205,9 +205,9 @@ function getRandomCompletionSet(forceServerError) { completion.forceServerError = true; } if (completion.expectCompletion) { - // Generate a random alpha-numeric string of length at most 6 for the + // Generate a random alpha-numeric string of length start with "test" for the // table name. - completion.table = (rand.nextNum(31)).toString(36); + completion.table = "test" + (rand.nextNum(31)).toString(36); completion.chunkId = rand.nextNum(16); } From 9ce047439890d507b9e2e69e425a960a0b9983c0 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Thu, 28 Sep 2017 16:19:45 +1000 Subject: [PATCH 003/108] Bug 1402094 - Blacklist about:reader from using stylo. r=bholley MozReview-Commit-ID: 6cG1x1tcOwn --HG-- extra : rebase_source : dce6a0b1828f8388952e5ff1993424dff782d3d5 --- dom/base/nsDocument.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index afa7fac21670..471b38680181 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -13608,6 +13608,27 @@ nsIDocument::ReportHasScrollLinkedEffect() "ScrollLinkedEffectFound2"); } +// URL-based blacklist for stylo. +static bool +ShouldUseGeckoBackend(nsIURI* aDocumentURI) +{ + if (!aDocumentURI) { + return false; + } + bool isScheme = false; + if (NS_SUCCEEDED(aDocumentURI->SchemeIs("about", &isScheme))) { + nsAutoCString path; + aDocumentURI->GetFilePath(path); + // about:reader requires support of :scope pseudo-class so we have + // to use Gecko backend for now. See bug 1402094. + // This should be fixed by bug 1204818. + if (path.EqualsLiteral("reader")) { + return true; + } + } + return false; +} + void nsIDocument::UpdateStyleBackendType() { @@ -13626,7 +13647,7 @@ nsIDocument::UpdateStyleBackendType() // Note that, since tests can have XUL support, we still need to // explicitly exclude XUL documents here. if (!nsContentUtils::IsSystemPrincipal(NodePrincipal()) && - !IsXULDocument()) { + !IsXULDocument() && !ShouldUseGeckoBackend(mDocumentURI)) { mStyleBackendType = StyleBackendType::Servo; } } From a79fee5205ba5f6721c9bb6ac2017526916568da Mon Sep 17 00:00:00 2001 From: Ed Lee Date: Wed, 27 Sep 2017 08:28:06 -0400 Subject: [PATCH 004/108] Bug 1403215 - Fix broken Snippets pref, perceived performance and bug fixes to Activity Stream. r=k88hudson,ursula MozReview-Commit-ID: JSvQB4nxduM --HG-- extra : rebase_source : 251b4aad88f9086f3b00100fd8a03675f2a062cf --- .../activity-stream/common/Actions.jsm | 3 +- .../activity-stream/common/PrerenderData.jsm | 3 +- .../activity-stream/common/Reducers.jsm | 4 +- .../content/activity-stream-initial-state.js | 3 - .../content/activity-stream-prerendered.html | 2 +- .../data/content/activity-stream.bundle.js | 122 ++++++++++++++---- .../data/content/activity-stream.css | 48 +++---- .../activity-stream/data/locales.json | 120 +++++++++++------ .../extensions/activity-stream/install.rdf.in | 2 +- .../activity-stream/lib/HighlightsFeed.jsm | 2 +- .../activity-stream/lib/PlacesFeed.jsm | 23 +++- .../activity-stream/lib/PrefsFeed.jsm | 27 ++++ .../activity-stream/lib/SnippetsFeed.jsm | 2 +- .../activity-stream/lib/TelemetryFeed.jsm | 6 +- .../activity-stream/lib/TopSitesFeed.jsm | 2 +- .../test/unit/common/Reducers.test.js | 11 +- .../test/unit/lib/HighlightsFeed.test.js | 4 +- .../test/unit/lib/PlacesFeed.test.js | 15 ++- .../test/unit/lib/PrefsFeed.test.js | 39 ++++++ .../test/unit/lib/TopSitesFeed.test.js | 4 +- .../activity-stream/test/unit/unit-entry.js | 2 + browser/modules/PingCentre.jsm | 10 +- 22 files changed, 330 insertions(+), 124 deletions(-) diff --git a/browser/extensions/activity-stream/common/Actions.jsm b/browser/extensions/activity-stream/common/Actions.jsm index dc823172eb9d..fa37e85b3216 100644 --- a/browser/extensions/activity-stream/common/Actions.jsm +++ b/browser/extensions/activity-stream/common/Actions.jsm @@ -31,6 +31,7 @@ for (const type of [ "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", + "DISABLE_ONBOARDING", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", @@ -49,8 +50,8 @@ for (const type of [ "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", + "PLACES_LINKS_DELETED", "PLACES_LINK_BLOCKED", - "PLACES_LINK_DELETED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", diff --git a/browser/extensions/activity-stream/common/PrerenderData.jsm b/browser/extensions/activity-stream/common/PrerenderData.jsm index b9360662c646..9b040fe0c950 100644 --- a/browser/extensions/activity-stream/common/PrerenderData.jsm +++ b/browser/extensions/activity-stream/common/PrerenderData.jsm @@ -74,8 +74,7 @@ this.PrerenderData = new _PrerenderData({ icon: "pocket", id: "topstories", order: 1, - title: {id: "header_recommended_by", values: {provider: "Pocket"}}, - topics: [{}] + title: {id: "header_recommended_by", values: {provider: "Pocket"}} }, { enabled: true, diff --git a/browser/extensions/activity-stream/common/Reducers.jsm b/browser/extensions/activity-stream/common/Reducers.jsm index 5dbd926f7a3f..a6f83d5f4823 100644 --- a/browser/extensions/activity-stream/common/Reducers.jsm +++ b/browser/extensions/activity-stream/common/Reducers.jsm @@ -288,7 +288,9 @@ function Sections(prevState = INITIAL_STATE.Sections, action) { return item; }) })); - case at.PLACES_LINK_DELETED: + case at.PLACES_LINKS_DELETED: + return prevState.map(section => Object.assign({}, section, + {rows: section.rows.filter(site => !action.data.includes(site.url))})); case at.PLACES_LINK_BLOCKED: return prevState.map(section => Object.assign({}, section, {rows: section.rows.filter(site => site.url !== action.data.url)})); diff --git a/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js b/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js index 572b9ff068e3..24e71dce86c3 100644 --- a/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js +++ b/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js @@ -138,9 +138,6 @@ "enabled": true, "icon": "pocket", "id": "topstories", - "topics": [ - {} - ], "initialized": false }, { diff --git a/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html b/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html index 484493d185a1..798f92331f47 100644 --- a/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html +++ b/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html @@ -9,7 +9,7 @@ -

+

    diff --git a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js index 1dbbaa5ff4dd..27b66f8c20b2 100644 --- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js +++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js @@ -94,7 +94,7 @@ const globalImportContext = typeof Window === "undefined" ? BACKGROUND_PROCESS : // UNINIT: "UNINIT" // } const actionTypes = {}; -for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_EDIT", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) { +for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "DISABLE_ONBOARDING", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_DELETED", "PLACES_LINK_BLOCKED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_EDIT", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) { actionTypes[type] = type; } @@ -638,7 +638,8 @@ function Sections(prevState = INITIAL_STATE.Sections, action) { return item; }) })); - case at.PLACES_LINK_DELETED: + case at.PLACES_LINKS_DELETED: + return prevState.map(section => Object.assign({}, section, { rows: section.rows.filter(site => !action.data.includes(site.url)) })); case at.PLACES_LINK_BLOCKED: return prevState.map(section => Object.assign({}, section, { rows: section.rows.filter(site => site.url !== action.data.url) })); default: @@ -1511,10 +1512,14 @@ class TopSitesEdit extends React.PureComponent { "section", { className: "edit-topsites-inner-wrapper" }, React.createElement( - "h3", - { className: "section-title" }, - React.createElement("span", { className: `icon icon-small-spacer icon-topsites` }), - React.createElement(FormattedMessage, { id: "header_top_sites" }) + "div", + { className: "section-top-bar" }, + React.createElement( + "h3", + { className: "section-title" }, + React.createElement("span", { className: `icon icon-small-spacer icon-topsites` }), + React.createElement(FormattedMessage, { id: "header_top_sites" }) + ) ), React.createElement( "ul", @@ -2569,7 +2574,10 @@ class Section extends React.PureComponent { contextMenuOptions, intl, initialized } = this.props; const maxCards = CARDS_PER_ROW * maxRows; - const shouldShowTopics = id === "topstories" && this.props.topics && this.props.topics.length > 0; + + // Show topics only for top stories and if it's not initialized yet (so + // content doesn't shift when it is loaded) or has loaded with topics + const shouldShowTopics = id === "topstories" && (!this.props.topics || this.props.topics.length > 0); const infoOptionIconA11yAttrs = { "aria-haspopup": "true", @@ -2694,6 +2702,9 @@ const { FormattedMessage } = __webpack_require__(2); const cardContextTypes = __webpack_require__(26); const { actionCreators: ac, actionTypes: at } = __webpack_require__(0); +// Keep track of pending image loads to only request once +const gImageLoading = new Map(); + /** * Card component. * Cards are found within a Section component and contain information about a link such @@ -2706,11 +2717,47 @@ const { actionCreators: ac, actionTypes: at } = __webpack_require__(0); class Card extends React.PureComponent { constructor(props) { super(props); - this.state = { showContextMenu: false, activeCard: null }; + this.state = { + activeCard: null, + imageLoaded: false, + showContextMenu: false + }; this.onMenuButtonClick = this.onMenuButtonClick.bind(this); this.onMenuUpdate = this.onMenuUpdate.bind(this); this.onLinkClick = this.onLinkClick.bind(this); } + + /** + * Helper to conditionally load an image and update state when it loads. + */ + async maybeLoadImage() { + // No need to load if it's already loaded or no image + const { image } = this.props.link; + if (!this.state.imageLoaded && image) { + // Initialize a promise to share a load across multiple card updates + if (!gImageLoading.has(image)) { + const loaderPromise = new Promise((resolve, reject) => { + const loader = new Image(); + loader.addEventListener("load", resolve); + loader.addEventListener("error", reject); + loader.src = image; + }); + + // Save and remove the promise only while it's pending + gImageLoading.set(image, loaderPromise); + loaderPromise.catch(ex => ex).then(() => gImageLoading.delete(image)).catch(); + } + + // Wait for the image whether just started loading or reused promise + await gImageLoading.get(image); + + // Only update state if we're still waiting to load the original image + if (this.props.link.image === image && !this.state.imageLoaded) { + this.setState({ imageLoaded: true }); + } + } + } + onMenuButtonClick(event) { event.preventDefault(); this.setState({ @@ -2742,6 +2789,18 @@ class Card extends React.PureComponent { onMenuUpdate(showContextMenu) { this.setState({ showContextMenu }); } + componentDidMount() { + this.maybeLoadImage(); + } + componentDidUpdate() { + this.maybeLoadImage(); + } + componentWillReceiveProps(nextProps) { + // Clear the image state if changing images + if (nextProps.link.image !== this.props.link.image) { + this.setState({ imageLoaded: false }); + } + } render() { const { index, link, dispatch, contextMenuOptions, eventSource, shouldSendImpressionStats } = this.props; const { props } = this; @@ -2763,7 +2822,7 @@ class Card extends React.PureComponent { hasImage && React.createElement( "div", { className: "card-preview-image-outer" }, - React.createElement("div", { className: `card-preview-image${link.image ? " loaded" : ""}`, style: imageStyle }) + React.createElement("div", { className: `card-preview-image${this.state.imageLoaded ? " loaded" : ""}`, style: imageStyle }) ), React.createElement( "div", @@ -2894,7 +2953,7 @@ class Topics extends React.PureComponent { React.createElement( "ul", null, - topics.map(t => React.createElement(Topic, { key: t.name, url: t.url, name: t.name })) + topics && topics.map(t => React.createElement(Topic, { key: t.name, url: t.url, name: t.name })) ), read_more_endpoint && React.createElement( "a", @@ -2985,8 +3044,7 @@ var PrerenderData = new _PrerenderData({ icon: "pocket", id: "topstories", order: 1, - title: { id: "header_recommended_by", values: { provider: "Pocket" } }, - topics: [{}] + title: { id: "header_recommended_by", values: { provider: "Pocket" } } }, { enabled: true, id: "highlights", @@ -3257,6 +3315,10 @@ class SnippetsMap extends Map { await this.set("blockList", blockList); } + disableOnboarding() { + this._dispatch(ac.SendToMain({ type: at.DISABLE_ONBOARDING })); + } + showFirefoxAccounts() { this._dispatch(ac.SendToMain({ type: at.SHOW_FIREFOX_ACCOUNTS })); } @@ -3395,7 +3457,6 @@ class SnippetsProvider { if (needsUpdate && this.appData.snippetsURL) { this.snippetsMap.set("snippets-last-update", Date.now()); try { - // TODO: timeout? const response = await fetch(this.appData.snippetsURL); if (response.status === 200) { const payload = await response.text(); @@ -3409,10 +3470,18 @@ class SnippetsProvider { } } - _showDefaultSnippets() { + _noSnippetFallback() { // TODO } + _forceOnboardingVisibility(shouldBeVisible) { + const onboardingEl = document.getElementById("onboarding-notification-bar"); + + if (onboardingEl) { + onboardingEl.style.display = shouldBeVisible ? "" : "none"; + } + } + _showRemoteSnippets() { const snippetsEl = document.getElementById(this.elementId); const payload = this.snippetsMap.get("snippets"); @@ -3480,15 +3549,18 @@ class SnippetsProvider { try { this._showRemoteSnippets(); } catch (e) { - this._showDefaultSnippets(e); + this._noSnippetFallback(e); } window.dispatchEvent(new Event(SNIPPETS_ENABLED_EVENT)); + + this._forceOnboardingVisibility(true); this.initialized = true; } uninit() { window.dispatchEvent(new Event(SNIPPETS_DISABLED_EVENT)); + this._forceOnboardingVisibility(false); this.initialized = false; } } @@ -3508,16 +3580,16 @@ function addSnippetsSubscriber(store) { store.subscribe(async () => { const state = store.getState(); - // state.Snippets.initialized: Should snippets be initialised? - // snippets.initialized: Is SnippetsProvider currently initialised? - if (state.Snippets.initialized && !snippets.initialized && state.Snippets.onboardingFinished) { - // Don't call init multiple times - if (!initializing) { - initializing = true; - await snippets.init({ appData: state.Snippets }); - initializing = false; - } - } else if (state.Snippets.initialized === false && snippets.initialized) { + // state.Prefs.values["feeds.snippets"]: Should snippets be shown? + // state.Snippets.initialized Is the snippets data initialized? + // snippets.initialized: Is SnippetsProvider currently initialised? + if (state.Prefs.values["feeds.snippets"] && state.Snippets.initialized && !snippets.initialized && + // Don't call init multiple times + !initializing) { + initializing = true; + await snippets.init({ appData: state.Snippets }); + initializing = false; + } else if (state.Prefs.values["feeds.snippets"] === false && snippets.initialized) { snippets.uninit(); } }); diff --git a/browser/extensions/activity-stream/data/content/activity-stream.css b/browser/extensions/activity-stream/data/content/activity-stream.css index 81e33d2d0e80..6c5d239a2d5a 100644 --- a/browser/extensions/activity-stream/data/content/activity-stream.css +++ b/browser/extensions/activity-stream/data/content/activity-stream.css @@ -457,26 +457,24 @@ main { padding-inline-start: 3px; } .topsite-form .form-wrapper { + margin: auto; + max-width: 350px; padding: 15px 0; } .topsite-form .form-wrapper .field { - margin-inline-start: 205px; position: relative; } .topsite-form .form-wrapper .url input:not(:placeholder-shown):dir(rtl) { direction: ltr; text-align: right; } .topsite-form .form-wrapper .section-title { - margin-bottom: 5px; - margin-inline-start: 205px; } + margin-bottom: 5px; } .topsite-form .form-wrapper input[type='text'] { border: solid 1px rgba(12, 12, 13, 0.2); border-radius: 2px; margin: 5px 0; padding: 7px; - width: 350px; } + width: 100%; } .topsite-form .form-wrapper input[type='text']:focus { border: solid 1px rgba(12, 12, 13, 0.4); } - .topsite-form .form-wrapper input[type='text']::placeholder { - font-style: italic; } .topsite-form .form-wrapper .invalid input[type='text'] { border: solid 1px #D70022; box-shadow: 0 0 0 2px rgba(215, 0, 34, 0.35); } @@ -676,28 +674,19 @@ main { width: 100%; height: 36px; } .search-wrapper input { - border: 0; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); border: 1px solid rgba(0, 0, 0, 0.15); - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); border-radius: 3px; - border-radius: 4px; + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); color: inherit; padding: 0; padding-inline-end: 36px; padding-inline-start: 35px; width: 100%; font-size: 15px; } - .search-wrapper input:focus { - border-color: #0060DF; - box-shadow: 0 0 0 2px #0060DF; - z-index: 1; } - .search-wrapper input:focus + .search-button { - z-index: 1; - background-color: #0060DF; - background-image: url("chrome://browser/skin/forward.svg"); - fill: #FFF; - -moz-context-properties: fill; } + .search-wrapper:active input, + .search-wrapper input:focus { + border-color: #0A84FF; + box-shadow: 0 0 0 2px #0A84FF; } .search-wrapper .search-label { background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px; fill: rgba(12, 12, 13, 0.4); @@ -705,8 +694,7 @@ main { position: absolute; offset-inline-start: 0; height: 100%; - width: 35px; - z-index: 2; } + width: 35px; } .search-wrapper .search-button { background: url("chrome://browser/skin/forward.svg") no-repeat center center; border-radius: 0 3px 3px 0; @@ -718,11 +706,11 @@ main { height: 100%; offset-inline-end: 0; position: absolute; } - .search-wrapper .search-button:hover { - z-index: 1; - background-color: #0060DF; - fill: #FFF; + .search-wrapper .search-button:focus, .search-wrapper .search-button:hover { + background-color: rgba(12, 12, 13, 0.1); cursor: pointer; } + .search-wrapper .search-button:active { + background-color: rgba(12, 12, 13, 0.15); } .search-wrapper .search-button:dir(rtl) { transform: scaleX(-1); } .search-wrapper .contentSearchSuggestionTable { @@ -1009,13 +997,11 @@ main { .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .card-title { color: #0060DF; } .card-outer .card-preview-image-outer { + background-color: #F9F9FA; position: relative; - background: linear-gradient(135deg, #B1B1B3, #D7D7DB); height: 122px; border-radius: 3px 3px 0 0; overflow: hidden; } - .card-outer .card-preview-image-outer:dir(rtl) { - background: linear-gradient(225deg, #B1B1B3, #D7D7DB); } .card-outer .card-preview-image-outer::after { border-bottom: 1px solid rgba(0, 0, 0, 0.05); bottom: 0; @@ -1028,8 +1014,8 @@ main { background-size: cover; background-position: center; background-repeat: no-repeat; - transition: opacity 1s; - opacity: 0; } + opacity: 0; + transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); } .card-outer .card-preview-image-outer .card-preview-image.loaded { opacity: 1; } .card-outer .card-details { diff --git a/browser/extensions/activity-stream/data/locales.json b/browser/extensions/activity-stream/data/locales.json index f24bf2d1c53f..7b06bdba0922 100644 --- a/browser/extensions/activity-stream/data/locales.json +++ b/browser/extensions/activity-stream/data/locales.json @@ -580,7 +580,51 @@ "time_label_hour": "{number}e", "time_label_day": "{number}d", "settings_pane_button_label": "Personelait ho pajenn Ivinell Nevez", - "settings_pane_header": "Gwellvezioù an ivinell nevez" + "settings_pane_header": "Gwellvezioù an ivinell nevez", + "settings_pane_body2": "Dibabit petra a welit war ar bajenn-mañ.", + "settings_pane_search_header": "Klask", + "settings_pane_search_body": "Klask er web adalek an ivinell nevez.", + "settings_pane_topsites_header": "Lec'hiennoù gwellañ", + "settings_pane_topsites_body": "Kit war al lec'hiennoù gweladennet ar muiañ ganeoc'h.", + "settings_pane_topsites_options_showmore": "Diskouez daou vann", + "settings_pane_bookmarks_header": "Sinedoù nevez", + "settings_pane_bookmarks_body": "Ho sinedoù nevez strollet en ul lec'h aes da dizhout.", + "settings_pane_visit_again_header": "Gweladenniñ en-dro", + "settings_pane_visit_again_body": "Firefox a ziskouezo deoc'h ul lodenn eus ho roll istor a c'hallfec'h kaout c'hoant da zerc'hel soñj pe da zistreiñ eno.", + "settings_pane_highlights_header": "Mareoù pouezus", + "settings_pane_highlights_body2": "Adkavit an traoù dedennus gweladennet pe lakaet er sinedoù nevez ’zo.", + "settings_pane_highlights_options_bookmarks": "Sinedoù", + "settings_pane_highlights_options_visited": "Lec'hiennoù gweladennet", + "settings_pane_snippets_header": "Notennigoù", + "settings_pane_snippets_body": "Lennit an hizivadurioù berr ha dous graet gant Mozilla evit Firefox, sevenadur ar genrouedad, hag ur mem dre-zegouezh ur wech an amzer.", + "settings_pane_done_button": "Graet", + "edit_topsites_button_text": "Embann", + "edit_topsites_button_label": "Personelaat ar gevrenn “lec'hiennoù gweladennet ar muiañ”", + "edit_topsites_showmore_button": "Diskouez muioc'h", + "edit_topsites_showless_button": "Diskouez nebeutoc'h", + "edit_topsites_done_button": "Graet", + "edit_topsites_pin_button": "Spilhennañ al lec'hienn-mañ", + "edit_topsites_unpin_button": "Dispilhennañ al lec'hienn-mañ", + "edit_topsites_edit_button": "Embann al lec'hienn-mañ", + "edit_topsites_dismiss_button": "Dilemel al lec'hienn-mañ", + "edit_topsites_add_button": "Ouzhpennañ", + "topsites_form_add_header": "Lec'hiennoù gwellañ nevez", + "topsites_form_edit_header": "Embann al Lec'hiennoù Gwellañ", + "topsites_form_title_placeholder": "Enankañ un titl", + "topsites_form_url_placeholder": "Skrivit pe pegit un URL", + "topsites_form_add_button": "Ouzhpennañ", + "topsites_form_save_button": "Enrollañ", + "topsites_form_cancel_button": "Nullañ", + "topsites_form_url_validation": "URL talvoudek azgoulennet", + "pocket_read_more": "Danvezioù brudet:", + "pocket_read_even_more": "Gwelet muioc'h a istorioù", + "pocket_feedback_header": "Ar gwellañ eus ar web, dibabet gant ouzhpenn 25 milion a dud.", + "pocket_description": "Dizoloit pennadoù eus an dibab ho pije gellout c'hwitout a-hent all warno, a-drugarez da bPocket, hag a zo bremañ ul lodenn deus Mozilla.", + "highlights_empty_state": "Krogit da verdeiñ hag e tiskouezimp deoc’h pennadoù, videoioù ha pajennoù all gweladennet pe lakaet er sinedoù nevez ’zo.", + "topstories_empty_state": "Aet oc'h betek penn. Distroit diwezhatoc'h evit muioc’h a istorioù digant {provider}. N’oc'h ket evit gortoz? Dibabit un danvez brudet evit klask muioc’h a bennadoù dedennus eus pep lec’h er web.", + "manual_migration_explanation2": "Amprouit Firefox gant sinedoù, roll istor ha gerioù-tremen ur merdeer all.", + "manual_migration_cancel_button": "N'am bo ket", + "manual_migration_import_button": "Emporzhiañ bremañ" }, "ca": { "newtab_page_title": "Pestanya nova", @@ -955,6 +999,7 @@ "default_label_loading": "Indlæser…", "header_top_sites": "Mest besøgte websider", "header_stories": "Tophistorier", + "header_highlights": "Højdepunkter", "header_visit_again": "Besøg igen", "header_bookmarks": "Seneste bogmærker", "header_recommended_by": "Anbefalet af {provider}", @@ -986,6 +1031,7 @@ "search_web_placeholder": "Søg på internettet", "search_settings": "Skift søgeindstillinger", "section_info_option": "Info", + "section_info_send_feedback": "Send feedback", "welcome_title": "Velkommen til nyt faneblad", "welcome_body": "Firefox vil bruge denne plads til at vise dine mest relevante bogmærker, artikler, videoer og sider, du har besøgt for nylig - så kan du nemmere finde dem.", "welcome_label": "Finder dine højdepunkter", @@ -995,7 +1041,6 @@ "time_label_day": "{number} d.", "settings_pane_button_label": "Tilpas siden Nyt faneblad", "settings_pane_header": "Indstillinger for Nyt faneblad", - "settings_pane_body": "Vælg, hvad der vises, når du åbner et nyt faneblad.", "settings_pane_search_header": "Søgning", "settings_pane_search_body": "Søg på nettet fra Nyt faneblad.", "settings_pane_topsites_header": "Mest besøgte websider", @@ -1005,8 +1050,6 @@ "settings_pane_bookmarks_body": "Dine seneste bogmærker samlet ét sted.", "settings_pane_visit_again_header": "Besøg igen", "settings_pane_visit_again_body": "Firefox viser dig dele af din browserhistorik, som du måske vil huske på eller vende tilbage til.", - "settings_pane_pocketstories_header": "Tophistorier", - "settings_pane_pocketstories_body": "Pocket, en del af Mozilla-familien, hjælper dig med at opdage indhold af høj kvalitet, som du måske ellers ikke ville have fundet.", "settings_pane_done_button": "Færdig", "edit_topsites_button_text": "Rediger", "edit_topsites_button_label": "Tilpas afsnittet Mest besøgte websider", @@ -1029,10 +1072,7 @@ "pocket_read_more": "Populære emner:", "pocket_read_even_more": "Se flere historier", "pocket_feedback_header": "Det bedste fra nettet, udvalgt af mere end 25 millioner mennesker.", - "pocket_feedback_body": "Pocket, en del af Mozilla-familien, hjælper dig med at opdage indhold af høj kvalitet, som du måske ellers ikke ville have fundet.", - "pocket_send_feedback": "Send feedback", "topstories_empty_state": "Der er ikke flere nye historier. Kom tilbage senere for at se flere tophistorier fra {provider}. Kan du ikke vente? Vælg et populært emne og find flere spændende historier fra hele verden.", - "manual_migration_explanation": "Prøv Firefox med dine favorit-websteder og bogmærker fra en anden browser.", "manual_migration_cancel_button": "Nej tak", "manual_migration_import_button": "Importer nu" }, @@ -3788,8 +3828,8 @@ "kk": { "newtab_page_title": "Жаңа бет", "default_label_loading": "Жүктелуде…", - "header_top_sites": "Топ сайттар", - "header_stories": "Топ хикаялар", + "header_top_sites": "Үздік сайттар", + "header_stories": "Үздік хикаялар", "header_highlights": "Ерекше жаңалықтар", "header_visit_again": "Қайтадан шолу", "header_bookmarks": "Соңғы бетбелгілер", @@ -3815,7 +3855,7 @@ "menu_action_unpin": "Бекітуді алып тастау", "confirm_history_delete_p1": "Бұл парақтың барлық кездесулерін шолу тарихыңыздан өшіруді қалайсыз ба?", "confirm_history_delete_notice_p2": "Бұл әрекетті болдырмау мүмкін болмайды.", - "menu_action_save_to_pocket": "Pocket-ке сақтау", + "menu_action_save_to_pocket": "Pocket ішіне сақтау", "search_for_something_with": "{search_term} ұғымын көмегімен іздеу:", "search_button": "Іздеу", "search_header": "{search_engine_name} іздеуі", @@ -3833,10 +3873,10 @@ "time_label_day": "{number} күн", "settings_pane_button_label": "Жаңа бетті баптаңыз", "settings_pane_header": "Жаңа бет баптаулары", - "settings_pane_body2": "Бұл парақта не көргіңіз келетінді таңдаңыз.", + "settings_pane_body2": "Бұл бетте не көргіңіз келетінді таңдаңыз.", "settings_pane_search_header": "Іздеу", "settings_pane_search_body": "Жаңа беттен интернеттен іздеңіз.", - "settings_pane_topsites_header": "Топ сайттар", + "settings_pane_topsites_header": "Үздік сайттар", "settings_pane_topsites_body": "Көбірек қаралатын сайттарға қатынау.", "settings_pane_topsites_options_showmore": "Екі жолды көрсету", "settings_pane_bookmarks_header": "Соңғы бетбелгілер", @@ -3848,7 +3888,7 @@ "settings_pane_highlights_options_bookmarks": "Бетбелгілер", "settings_pane_highlights_options_visited": "Ашылған сайттар", "settings_pane_snippets_header": "Үзінділер", - "settings_pane_snippets_body": "Mozilla-дан Firefox және интернет мәдениеті туралы қысқа жаңалықтарды, және кездейсоқ мемдерді оқыңыз.", + "settings_pane_snippets_body": "Mozilla ұсынған Firefox және интернет мәдениеті туралы қысқа жаңалықтарды, және кездейсоқ мемдерді оқыңыз.", "settings_pane_done_button": "Дайын", "edit_topsites_button_text": "Түзету", "edit_topsites_button_label": "Топ сайттар санатын баптау", @@ -3874,7 +3914,7 @@ "pocket_description": "Ол болмаса, сіз жіберіп алатын мүмкіндігі бар жоғары сапалы құраманы Pocket көмегімен табыңыз, ол енді Mozilla-ның бөлігі болып табылады.", "highlights_empty_state": "Шолуды бастаңыз, сіз жақында шолған немесе бетбелгілерге қосқан тамаша мақалалар, видеолар немесе басқа парақтардың кейбіреулері осында көрсетіледі.", "topstories_empty_state": "Дайын. {provider} ұсынған көбірек мақалаларды алу үшін кейінірек тексеріңіз. Күте алмайсыз ба? Интернеттен көбірек тамаша мақалаларды алу үшін әйгілі теманы таңдаңыз.", - "manual_migration_explanation2": "Firefox-ты басқа браузер бетбелгілері, тарихы және парольдерімен қолданып көріңіз.", + "manual_migration_explanation2": "Firefox қолданбасын басқа браузер бетбелгілері, тарихы және парольдерімен қолданып көріңіз.", "manual_migration_cancel_button": "Жоқ, рахмет", "manual_migration_import_button": "Қазір импорттау" }, @@ -4203,13 +4243,15 @@ "manual_migration_import_button": "Importuoti dabar" }, "lv": { - "newtab_page_title": "Jauna cilne" + "newtab_page_title": "Jauna cilne", + "default_label_loading": "Notiek ielāde…" }, "mk": { "newtab_page_title": "Ново јазиче", "default_label_loading": "Се вчитува…", - "header_top_sites": "Врвни мрежни места", - "header_stories": "Врвни написи", + "header_top_sites": "Популарни мрежни места", + "header_stories": "Популарни написи", + "header_highlights": "Интереси", "header_visit_again": "Посети повторно", "header_bookmarks": "Скорешни обележувачи", "header_recommended_by": "Препорачано од {provider}", @@ -4232,7 +4274,7 @@ "menu_action_delete": "Избриши од историја", "menu_action_pin": "Прикачи", "menu_action_unpin": "Откачи", - "confirm_history_delete_p1": "Дали сте сигурни дека сакате да ја избришете оваа страница отсекаде во Вашата историја на прелистување?", + "confirm_history_delete_p1": "Дали сте сигурни дека сакате да ја избришете оваа страница отсекаде во вашата историја на прелистување?", "confirm_history_delete_notice_p2": "Ова дејство не може да се одврати.", "menu_action_save_to_pocket": "Зачувај во Pocket", "search_for_something_with": "Пребарај за {search_term} со:", @@ -4241,30 +4283,36 @@ "search_web_placeholder": "Пребарајте на Интернет", "search_settings": "Промени поставувања за пребарување", "section_info_option": "Инфо", + "section_info_send_feedback": "Испрати мислење", + "section_info_privacy_notice": "Белешка за приватност", "welcome_title": "Добредојдовте во новото јазиче", "welcome_body": "Firefox ќе го искористи овој простор за да Ви ги прикаже најрелевантните обележувачи, написи, видеа и страници што сте ги посетиле, за да можете лесно да им се навратите.", - "welcome_label": "Ги откривам Вашите интереси", + "welcome_label": "Ги откривам вашите Интереси", "time_label_less_than_minute": "< 1 м", "time_label_minute": "{number} м", "time_label_hour": "{number} ч", "time_label_day": "{number} д", - "settings_pane_button_label": "Прилагодете ја страницата на Вашето Ново јазиче", + "settings_pane_button_label": "Прилагодете ја страницата на вашето Ново јазиче", "settings_pane_header": "Преференци за Ново јазиче", - "settings_pane_body": "Изберете што ќе гледате кога ќе отворите ново јазиче.", + "settings_pane_body2": "Изберете што ќе гледате на оваа страница.", "settings_pane_search_header": "Пребарување", - "settings_pane_search_body": "Пребарајте низ Интернет од Вашето ново јазиче.", + "settings_pane_search_body": "Пребарајте низ Интернет од вашето ново јазиче.", "settings_pane_topsites_header": "Врвни мрежни места", "settings_pane_topsites_body": "Пристапете до мрежните места што ги посетувате најмногу.", "settings_pane_topsites_options_showmore": "Прикажи два реда", "settings_pane_bookmarks_header": "Скорешни обележувачи", "settings_pane_bookmarks_body": "Вашите нови обележувачи во едно згодно место.", "settings_pane_visit_again_header": "Посети повторно", - "settings_pane_visit_again_body": "Firefox ќе прикаже делови од Вашата историја на прелистување кои можеби би сакале да ги запомните или пак да им се навратите.", - "settings_pane_pocketstories_header": "Врвни написи", - "settings_pane_pocketstories_body": "Pocket, дел од семејството на Mozilla, ќе Ви помогне да стигнете до високо-квалитетни содржини кои можеби не би ги откриле на друг начин.", + "settings_pane_visit_again_body": "Firefox ќе прикаже делови од вашата историја на прелистување кои можеби би сакале да ги запомните или пак да им се навратите.", + "settings_pane_highlights_header": "Интереси", + "settings_pane_highlights_body2": "Навратете се на интересни места што неодамна сте ги посетиле или обележале.", + "settings_pane_highlights_options_bookmarks": "Обележувачи", + "settings_pane_highlights_options_visited": "Посетени мрежни места", + "settings_pane_snippets_header": "Исечоци", + "settings_pane_snippets_body": "Прочитајте кратки и слатки новости од Mozilla во врска со Firefox, Интернет-културата и повремените случајни меми.", "settings_pane_done_button": "Готово", "edit_topsites_button_text": "Уреди", - "edit_topsites_button_label": "Прилагодете ги Вашите Врвни мрежни места", + "edit_topsites_button_label": "Прилагодете ги вашите Популарни мрежни места", "edit_topsites_showmore_button": "Прикажи повеќе", "edit_topsites_showless_button": "Прикажи помалку", "edit_topsites_done_button": "Готово", @@ -4284,10 +4332,10 @@ "pocket_read_more": "Популарни теми:", "pocket_read_even_more": "Види повеќе написи", "pocket_feedback_header": "Најдоброто од Интернет, одбрано од повеќе од 25 милиони луѓе.", - "pocket_feedback_body": "Pocket, дел од семејството на Mozilla, ќе Ви помогне да стигнете до високо-квалитетни содржини кои можеби не би ги откриле на друг начин.", - "pocket_send_feedback": "Остави коментар", + "pocket_description": "Откријте високо-квалитетни содржини, коишто инаку би можеле да ги пропуштите, со помош на Pocket, кој сега е дел од Mozilla.", + "highlights_empty_state": "Започнете со прелистување и ние овде ќе ви прикажеме некои од одличните написи, видеа и други страници што неодамна сте ги поселите или обележале.", "topstories_empty_state": "Имате видено сѐ! Навратете се подоцна за нови содржини од {provider}. Не можете да чекате? Изберете популарна тема и откријте уште одлични содржини ширум Интернет.", - "manual_migration_explanation": "Пробајте го Firefox со Вашите омилени мрежни места и обележувачи од друг прелистувач.", + "manual_migration_explanation2": "Пробајте го Firefox со обележувачите, историјата и лозинките на друг прелистувач.", "manual_migration_cancel_button": "Не, благодарам", "manual_migration_import_button": "Увези сега" }, @@ -6092,7 +6140,7 @@ "header_stories": "เรื่องราวเด่น", "header_highlights": "รายการเด่น", "header_visit_again": "เยี่ยมชมอีกครั้ง", - "header_bookmarks": "ที่คั่นหน้าเมื่อเร็ว ๆ นี้", + "header_bookmarks": "ที่คั่นหน้าล่าสุด", "header_recommended_by": "แนะนำโดย {provider}", "header_bookmarks_placeholder": "คุณยังไม่มีที่คั่นหน้าใด ๆ", "header_stories_from": "จาก", @@ -6139,7 +6187,7 @@ "settings_pane_topsites_header": "ไซต์เด่น", "settings_pane_topsites_body": "เข้าถึงเว็บไซต์ที่คุณเยี่ยมชมมากที่สุด", "settings_pane_topsites_options_showmore": "แสดงสองแถว", - "settings_pane_bookmarks_header": "ที่คั่นหน้าเมื่อเร็ว ๆ นี้", + "settings_pane_bookmarks_header": "ที่คั่นหน้าล่าสุด", "settings_pane_bookmarks_body": "ที่คั่นหน้าที่สร้างใหม่ของคุณในตำแหน่งที่ตั้งเดียวที่สะดวก", "settings_pane_visit_again_header": "เยี่ยมชมอีกครั้ง", "settings_pane_highlights_header": "รายการเด่น", @@ -6617,8 +6665,8 @@ "settings_pane_highlights_body2": "根据您最近访问的页面和添加的书签推荐您感兴趣的东西。", "settings_pane_highlights_options_bookmarks": "书签", "settings_pane_highlights_options_visited": "访问过的网站", - "settings_pane_snippets_header": "板报", - "settings_pane_snippets_body": "阅读和了解 Mozilla 就 Firefox、互联网文化等提供的一些简短而有趣的更新。", + "settings_pane_snippets_header": "只言片语", + "settings_pane_snippets_body": "阅读 Mozilla 就 Firefox、互联网文化、偶尔还有模因提供的一些简短而有趣的小文章。", "settings_pane_done_button": "完成", "edit_topsites_button_text": "编辑", "edit_topsites_button_label": "定制您的“常用网站”区域", @@ -6641,7 +6689,7 @@ "pocket_read_more": "热门主题:", "pocket_read_even_more": "查看更多文章", "pocket_feedback_header": "由超过 2500 万人挑选出来的网上精华内容。", - "pocket_description": "借助 Pocket(目前所属 Mozilla)发现有趣的高品质内容。", + "pocket_description": "借助 Pocket(目前属 Mozilla 旗下)发现您不容错过的高品质内容。", "highlights_empty_state": "开始浏览旅程吧,之后这里会显示您最近看过或加了书签的精彩文章、视频以及其他页面。", "topstories_empty_state": "所有文章都读完啦!晚点再来,{provider} 将推荐更多热门文章。等不及了?选择一个热门话题,找到更多网上的好文章。", "manual_migration_explanation2": "把在其他浏览器中保存的书签、历史记录和密码带到 Firefox 吧。", @@ -6733,8 +6781,8 @@ "topsites_form_url_validation": "請輸入有效的網址", "pocket_read_more": "熱門主題:", "pocket_read_even_more": "檢視更多文章", - "pocket_feedback_header": "由超過兩千五百萬人找出來的 Web 最佳內容。", - "pocket_description": "透過現在也是 Mozilla 旗下一員的 Pocket 的幫助,發現您先前可能錯過的高品質內容。", + "pocket_feedback_header": "超過兩千五百萬人共同探索出的 Web 最佳內容。", + "pocket_description": "透過 Mozilla 旗下的 Pocket 服務,發現您可能錯過的優質內容。", "highlights_empty_state": "開始上網,我們就會把您在網路上發現的好文章、影片、剛加入書籤的頁面顯示於此。", "topstories_empty_state": "所有文章都讀完啦!晚點再來,{provider} 將提供更多推薦故事。等不及了?選擇熱門主題,看看 Web 上各式精采資訊。", "manual_migration_explanation2": "試試將其他瀏覽器的書籤、瀏覽記錄與密碼匯入 Firefox。", diff --git a/browser/extensions/activity-stream/install.rdf.in b/browser/extensions/activity-stream/install.rdf.in index 6d13034a391f..3dc22ac22cc3 100644 --- a/browser/extensions/activity-stream/install.rdf.in +++ b/browser/extensions/activity-stream/install.rdf.in @@ -8,7 +8,7 @@ 2 true false - 2017.09.22.1389-2ee94db4 + 2017.09.28.0389-b24927a8 Activity Stream A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you're looking for in Firefox. true diff --git a/browser/extensions/activity-stream/lib/HighlightsFeed.jsm b/browser/extensions/activity-stream/lib/HighlightsFeed.jsm index d82f6f4d13d5..5732e25c885f 100644 --- a/browser/extensions/activity-stream/lib/HighlightsFeed.jsm +++ b/browser/extensions/activity-stream/lib/HighlightsFeed.jsm @@ -160,7 +160,7 @@ this.HighlightsFeed = class HighlightsFeed { break; case at.MIGRATION_COMPLETED: case at.PLACES_HISTORY_CLEARED: - case at.PLACES_LINK_DELETED: + case at.PLACES_LINKS_DELETED: case at.PLACES_LINK_BLOCKED: this.fetchHighlights(true); break; diff --git a/browser/extensions/activity-stream/lib/PlacesFeed.jsm b/browser/extensions/activity-stream/lib/PlacesFeed.jsm index e4359ae96912..ecdf6c1f3d9c 100644 --- a/browser/extensions/activity-stream/lib/PlacesFeed.jsm +++ b/browser/extensions/activity-stream/lib/PlacesFeed.jsm @@ -42,11 +42,24 @@ class HistoryObserver extends Observer { * @param {obj} uri A URI object representing the link's url * {str} uri.spec The URI as a string */ - onDeleteURI(uri) { - this.dispatch({ - type: at.PLACES_LINK_DELETED, - data: {url: uri.spec} - }); + async onDeleteURI(uri) { + // Add to an existing array of links if we haven't dispatched yet + const {spec} = uri; + if (this._deletedLinks) { + this._deletedLinks.push(spec); + } else { + // Store an array of synchronously deleted links + this._deletedLinks = [spec]; + + // Only dispatch a single action when we've gotten all deleted urls + await Promise.resolve().then(() => { + this.dispatch({ + type: at.PLACES_LINKS_DELETED, + data: this._deletedLinks + }); + delete this._deletedLinks; + }); + } } /** diff --git a/browser/extensions/activity-stream/lib/PrefsFeed.jsm b/browser/extensions/activity-stream/lib/PrefsFeed.jsm index a5391acbde97..8b0a34916544 100644 --- a/browser/extensions/activity-stream/lib/PrefsFeed.jsm +++ b/browser/extensions/activity-stream/lib/PrefsFeed.jsm @@ -8,6 +8,9 @@ const {utils: Cu} = Components; const {actionCreators: ac, actionTypes: at} = Cu.import("resource://activity-stream/common/Actions.jsm", {}); const {Prefs} = Cu.import("resource://activity-stream/lib/ActivityStreamPrefs.jsm", {}); const {PrerenderData} = Cu.import("resource://activity-stream/common/PrerenderData.jsm", {}); +Cu.import("resource://gre/modules/Services.jsm"); + +const ONBOARDING_FINISHED_PREF = "browser.onboarding.notification.finished"; this.PrefsFeed = class PrefsFeed { constructor(prefMap) { @@ -27,11 +30,30 @@ this.PrefsFeed = class PrefsFeed { } } + _initOnboardingPref() { + const snippetsEnabled = this._prefs.get("feeds.snippets"); + if (!snippetsEnabled) { + this.setOnboardingDisabledDefault(true); + } + } + + setOnboardingDisabledDefault(value) { + const branch = Services.prefs.getDefaultBranch(""); + branch.setBoolPref(ONBOARDING_FINISHED_PREF, value); + } + onPrefChanged(name, value) { if (this._prefMap.has(name)) { this.store.dispatch(ac.BroadcastToContent({type: at.PREF_CHANGED, data: {name, value}})); } + this._checkPrerender(name); + + if (name === "feeds.snippets") { + // If snippets are disabled, onboarding notifications should also be + // disabled because they look like snippets. + this.setOnboardingDisabledDefault(!value); + } } init() { @@ -47,6 +69,7 @@ this.PrefsFeed = class PrefsFeed { this.store.dispatch(ac.BroadcastToContent({type: at.PREFS_INITIAL_VALUES, data: values})); this._setPrerenderPref(); + this._initOnboardingPref(); } removeListeners() { this._prefs.ignoreBranch(this); @@ -58,10 +81,14 @@ this.PrefsFeed = class PrefsFeed { break; case at.UNINIT: this.removeListeners(); + this.setOnboardingDisabledDefault(false); break; case at.SET_PREF: this._prefs.set(action.data.name, action.data.value); break; + case at.DISABLE_ONBOARDING: + this.setOnboardingDisabledDefault(true); + break; } } }; diff --git a/browser/extensions/activity-stream/lib/SnippetsFeed.jsm b/browser/extensions/activity-stream/lib/SnippetsFeed.jsm index aba53e9156a2..c95f338f1668 100644 --- a/browser/extensions/activity-stream/lib/SnippetsFeed.jsm +++ b/browser/extensions/activity-stream/lib/SnippetsFeed.jsm @@ -17,8 +17,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "ProfileAge", // Url to fetch snippets, in the urlFormatter service format. const SNIPPETS_URL_PREF = "browser.aboutHomeSnippets.updateUrl"; const TELEMETRY_PREF = "datareporting.healthreport.uploadEnabled"; -const ONBOARDING_FINISHED_PREF = "browser.onboarding.notification.finished"; const FXA_USERNAME_PREF = "services.sync.username"; +const ONBOARDING_FINISHED_PREF = "browser.onboarding.notification.finished"; // Prefix for any target matching a search engine. const TARGET_SEARCHENGINE_PREFIX = "searchEngine-"; diff --git a/browser/extensions/activity-stream/lib/TelemetryFeed.jsm b/browser/extensions/activity-stream/lib/TelemetryFeed.jsm index c7f96352400b..f83c82f03f8f 100644 --- a/browser/extensions/activity-stream/lib/TelemetryFeed.jsm +++ b/browser/extensions/activity-stream/lib/TelemetryFeed.jsm @@ -21,6 +21,7 @@ XPCOMUtils.defineLazyServiceGetter(this, "gUUIDGenerator", "@mozilla.org/uuid-generator;1", "nsIUUIDGenerator"); +const ACTIVITY_STREAM_ID = "activity-stream"; const ACTIVITY_STREAM_ENDPOINT_PREF = "browser.newtabpage.activity-stream.telemetry.ping.endpoint"; // This is a mapping table between the user preferences and its encoding code @@ -160,12 +161,10 @@ this.TelemetryFeed = class TelemetryFeed { * Lazily initialize PingCentre to send pings */ get pingCentre() { - const ACTIVITY_STREAM_ID = "activity-stream"; Object.defineProperty(this, "pingCentre", { value: new PingCentre({ topic: ACTIVITY_STREAM_ID, - filter: ACTIVITY_STREAM_ID, overrideEndpointPref: ACTIVITY_STREAM_ENDPOINT_PREF }) }); @@ -363,7 +362,8 @@ this.TelemetryFeed = class TelemetryFeed { async sendEvent(event_object) { if (this.telemetryEnabled) { - this.pingCentre.sendPing(event_object); + this.pingCentre.sendPing(event_object, + {filter: ACTIVITY_STREAM_ID}); } } diff --git a/browser/extensions/activity-stream/lib/TopSitesFeed.jsm b/browser/extensions/activity-stream/lib/TopSitesFeed.jsm index d6f670e44c37..04dafcd4cd85 100644 --- a/browser/extensions/activity-stream/lib/TopSitesFeed.jsm +++ b/browser/extensions/activity-stream/lib/TopSitesFeed.jsm @@ -264,8 +264,8 @@ this.TopSitesFeed = class TopSitesFeed { // All these actions mean we need new top sites case at.MIGRATION_COMPLETED: case at.PLACES_HISTORY_CLEARED: - case at.PLACES_LINK_DELETED: case at.PLACES_LINK_BLOCKED: + case at.PLACES_LINKS_DELETED: this.frecentCache.expire(); this.refresh(); break; diff --git a/browser/extensions/activity-stream/test/unit/common/Reducers.test.js b/browser/extensions/activity-stream/test/unit/common/Reducers.test.js index 3916b870975e..6d97e29c437d 100644 --- a/browser/extensions/activity-stream/test/unit/common/Reducers.test.js +++ b/browser/extensions/activity-stream/test/unit/common/Reducers.test.js @@ -358,13 +358,22 @@ describe("Reducers", () => { }); it("should remove blocked and deleted urls from all rows in all sections", () => { const blockAction = {type: at.PLACES_LINK_BLOCKED, data: {url: "www.foo.bar"}}; - const deleteAction = {type: at.PLACES_LINK_DELETED, data: {url: "www.foo.bar"}}; + const deleteAction = {type: at.PLACES_LINKS_DELETED, data: ["www.foo.bar"]}; const newBlockState = Sections(oldState, blockAction); const newDeleteState = Sections(oldState, deleteAction); newBlockState.concat(newDeleteState).forEach(section => { assert.deepEqual(section.rows, [{url: "www.other.url"}]); }); }); + it("should remove all deleted urls", () => { + const deleteAction = {type: at.PLACES_LINKS_DELETED, data: ["www.foo.bar", "www.other.url"]}; + + const newState = Sections(oldState, deleteAction); + + newState.forEach(section => { + assert.lengthOf(section.rows, 0); + }); + }); it("should not update state for empty action.data on PLACES_BOOKMARK_ADDED", () => { const nextState = Sections(undefined, {type: at.PLACES_BOOKMARK_ADDED}); assert.equal(nextState, INITIAL_STATE.Sections); diff --git a/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js b/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js index 01fccfb7f636..61566df30a32 100644 --- a/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js @@ -296,10 +296,10 @@ describe("Highlights Feed", () => { assert.calledOnce(feed.fetchHighlights); assert.calledWith(feed.fetchHighlights, true); }); - it("should fetch highlights on PLACES_LINK_DELETED", async () => { + it("should fetch highlights on PLACES_LINKS_DELETED", async () => { await feed.fetchHighlights(); feed.fetchHighlights = sinon.spy(); - feed.onAction({type: at.PLACES_LINK_DELETED}); + feed.onAction({type: at.PLACES_LINKS_DELETED}); assert.calledOnce(feed.fetchHighlights); assert.calledWith(feed.fetchHighlights, true); }); diff --git a/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js b/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js index ec469881bf7e..4f93c84b9183 100644 --- a/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js @@ -179,9 +179,20 @@ describe("PlacesFeed", () => { assert.property(observer, "QueryInterface"); }); describe("#onDeleteURI", () => { - it("should dispatch a PLACES_LINK_DELETED action with the right url", () => { + it("should dispatch a PLACES_LINKS_DELETED action with the right url", async() => { + await observer.onDeleteURI({spec: "foo.com"}); + + assert.calledWith(dispatch, {type: at.PLACES_LINKS_DELETED, data: ["foo.com"]}); + }); + it("should dispatch a PLACES_LINKS_DELETED action with multiple urls", async() => { + const promise = observer.onDeleteURI({spec: "bar.com"}); observer.onDeleteURI({spec: "foo.com"}); - assert.calledWith(dispatch, {type: at.PLACES_LINK_DELETED, data: {url: "foo.com"}}); + await promise; + + const result = dispatch.firstCall.args[0].data; + assert.lengthOf(result, 2); + assert.equal(result[0], "bar.com"); + assert.equal(result[1], "foo.com"); }); }); describe("#onClearHistory", () => { diff --git a/browser/extensions/activity-stream/test/unit/lib/PrefsFeed.test.js b/browser/extensions/activity-stream/test/unit/lib/PrefsFeed.test.js index cd2a1cbf657b..28d194c876bf 100644 --- a/browser/extensions/activity-stream/test/unit/lib/PrefsFeed.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/PrefsFeed.test.js @@ -4,6 +4,7 @@ const {PrerenderData} = require("common/PrerenderData.jsm"); const {initialPrefs} = PrerenderData; const PRERENDER_PREF_NAME = "prerender"; +const ONBOARDING_FINISHED_PREF = "browser.onboarding.notification.finished"; describe("PrefsFeed", () => { let feed; @@ -62,6 +63,44 @@ describe("PrefsFeed", () => { assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, false); }); }); + describe("Onboarding", () => { + let sandbox; + let defaultBranch; + beforeEach(() => { + sandbox = sinon.sandbox.create(); + defaultBranch = {setBoolPref: sandbox.stub()}; + sandbox.stub(global.Services.prefs, "getDefaultBranch").returns(defaultBranch); + }); + afterEach(() => { + sandbox.restore(); + }); + it("should set ONBOARDING_FINISHED_PREF to true if prefs.feeds.snippets if false", () => { + FAKE_PREFS.set("feeds.snippets", false); + feed.onAction({type: at.INIT}); + assert.calledWith(defaultBranch.setBoolPref, ONBOARDING_FINISHED_PREF, true); + }); + it("should not set ONBOARDING_FINISHED_PREF if prefs.feeds.snippets is true", () => { + FAKE_PREFS.set("feeds.snippets", true); + feed.onAction({type: at.INIT}); + assert.notCalled(defaultBranch.setBoolPref); + }); + it("should set ONBOARDING_FINISHED_PREF to true if the feeds.snippets pref changes to false", () => { + feed.onPrefChanged("feeds.snippets", false); + assert.calledWith(defaultBranch.setBoolPref, ONBOARDING_FINISHED_PREF, true); + }); + it("should set ONBOARDING_FINISHED_PREF to false if the feeds.snippets pref changes to true", () => { + feed.onPrefChanged("feeds.snippets", true); + assert.calledWith(defaultBranch.setBoolPref, ONBOARDING_FINISHED_PREF, false); + }); + it("should not set ONBOARDING_FINISHED_PREF if an unrelated pref changes", () => { + feed.onPrefChanged("foo", true); + assert.notCalled(defaultBranch.setBoolPref); + }); + it("should set ONBOARDING_FINISHED_PREF to true if a DISABLE_ONBOARDING action was received", () => { + feed.onAction({type: at.DISABLE_ONBOARDING}); + assert.calledWith(defaultBranch.setBoolPref, ONBOARDING_FINISHED_PREF, true); + }); + }); describe("onPrefChanged prerendering", () => { it("should not change the prerender pref if the pref is not included in invalidatingPrefs", () => { feed.onPrefChanged("foo123", true); diff --git a/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js b/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js index b13dbfc329d9..4cb86e6ca46c 100644 --- a/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js @@ -507,9 +507,9 @@ describe("Top Sites Feed", () => { assert.calledOnce(feed.refresh); assert.equal(feed.refresh.firstCall.args[0], null); }); - it("should call refresh without a target on PLACES_LINK_DELETED action", async () => { + it("should call refresh without a target on PLACES_LINKS_DELETED action", async () => { sinon.stub(feed, "refresh"); - await feed.onAction({type: at.PLACES_LINK_DELETED}); + await feed.onAction({type: at.PLACES_LINKS_DELETED}); assert.calledOnce(feed.refresh); assert.equal(feed.refresh.firstCall.args[0], null); }); diff --git a/browser/extensions/activity-stream/test/unit/unit-entry.js b/browser/extensions/activity-stream/test/unit/unit-entry.js index e0cdd4fd0cd8..0538666a60f8 100644 --- a/browser/extensions/activity-stream/test/unit/unit-entry.js +++ b/browser/extensions/activity-stream/test/unit/unit-entry.js @@ -27,6 +27,8 @@ overrider.set({ ContentSearchUIController: function() {}, // NB: This is a function/constructor dump() {}, fetch() {}, + // eslint-disable-next-line object-shorthand + Image: function() {}, // NB: This is a function/constructor Preferences: FakePrefs, Services: { locale: { diff --git a/browser/modules/PingCentre.jsm b/browser/modules/PingCentre.jsm index 8f3b79fa6245..dace651f99e2 100644 --- a/browser/modules/PingCentre.jsm +++ b/browser/modules/PingCentre.jsm @@ -38,7 +38,6 @@ class PingCentre { } this._topic = options.topic; - this._filter = options.filter; this._prefs = Services.prefs.getBranch(""); this._setPingEndpoint(options.topic, options.overrideEndpointPref); @@ -92,12 +91,12 @@ class PingCentre { this._fhrEnabled = this._prefs.getBoolPref(prefKey); } - _createExperimentsString(activeExperiments) { + _createExperimentsString(activeExperiments, filter) { let experimentsString = ""; for (let experimentID in activeExperiments) { if (!activeExperiments[experimentID] || !activeExperiments[experimentID].branch || - (this._filter && !experimentID.includes(this._filter))) { + (filter && !experimentID.includes(filter))) { continue; } let expString = `${experimentID}:${activeExperiments[experimentID].branch}`; @@ -106,9 +105,10 @@ class PingCentre { return experimentsString; } - async sendPing(data) { + async sendPing(data, options) { + let filter = options && options.filter; let experiments = TelemetryEnvironment.getActiveExperiments(); - let experimentsString = this._createExperimentsString(experiments); + let experimentsString = this._createExperimentsString(experiments, filter); if (!this.enabled) { return Promise.resolve(); } From 0a75705c55dccff493f504f4c6d8849fb7e61dd4 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 27 Sep 2017 16:27:36 +1000 Subject: [PATCH 005/108] Bug 1403127 - Don't try to pass fullscreen element through IPC. r=jaws MozReview-Commit-ID: DaiBNVdqAOh --HG-- extra : rebase_source : 5e48becb2554f0861d554471ca61ba5933b3f1ac --- browser/base/content/nsContextMenu.js | 4 ++-- browser/modules/ContextMenu.jsm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/browser/base/content/nsContextMenu.js b/browser/base/content/nsContextMenu.js index 6970ee4afd5a..899eea8b1b42 100644 --- a/browser/base/content/nsContextMenu.js +++ b/browser/base/content/nsContextMenu.js @@ -379,7 +379,7 @@ nsContextMenu.prototype = { initLeaveDOMFullScreenItems: function CM_initLeaveFullScreenItem() { // only show the option if the user is in DOM fullscreen - var shouldShow = (this.target.ownerDocument.fullscreenElement != null); + var shouldShow = this.target.ownerDocument.fullscreen; this.showItem("context-leave-dom-fullscreen", shouldShow); // Explicitly show if in DOM fullscreen, but do not hide it has already been shown @@ -643,7 +643,7 @@ nsContextMenu.prototype = { this.showItem("context-media-loop", onMedia); this.showItem("context-media-showcontrols", onMedia && !this.target.controls); this.showItem("context-media-hidecontrols", this.target.controls && (this.onVideo || (this.onAudio && !this.inSyntheticDoc))); - this.showItem("context-video-fullscreen", this.onVideo && this.target.ownerDocument.fullscreenElement == null); + this.showItem("context-video-fullscreen", this.onVideo && !this.target.ownerDocument.fullscreen); this.showItem("context-media-eme-learnmore", this.onDRMMedia); this.showItem("context-media-eme-separator", this.onDRMMedia); diff --git a/browser/modules/ContextMenu.jsm b/browser/modules/ContextMenu.jsm index 1d8bba423b13..739ab75f499c 100644 --- a/browser/modules/ContextMenu.jsm +++ b/browser/modules/ContextMenu.jsm @@ -648,7 +648,7 @@ class ContextMenu { cleanTarget.ownerDocument = { // used for nsContextMenu.initLeaveDOMFullScreenItems and // nsContextMenu.initMediaPlayerItems - fullscreenElement: context.target.ownerDocument.fullscreenElement, + fullscreen: context.target.ownerDocument.fullscreen, // used for nsContextMenu.initMiscItems contentType: context.target.ownerDocument.contentType, From a883671274eb28d44e6ed4a8d68ba36c8ec3cc28 Mon Sep 17 00:00:00 2001 From: sajattack Date: Thu, 14 Sep 2017 13:44:36 -0700 Subject: [PATCH 006/108] Bug 1364333 - remove leftover code and strings from standalone about:addons UI r=rhelmer MozReview-Commit-ID: SmDGrX0fz5 --HG-- extra : rebase_source : 70762fa21a33d7c781c0f75423f7a0636c33b26d --- .../chrome/mozapps/extensions/extensions.dtd | 2 -- .../mozapps/extensions/content/extensions.js | 13 -------- .../mozapps/extensions/content/extensions.xul | 16 ---------- .../test/browser/browser_bug562797.js | 32 ------------------- .../shared/extensions/extensions.inc.css | 6 ---- 5 files changed, 69 deletions(-) diff --git a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd index e6215c0308a1..bbef915e8ee2 100644 --- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd +++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd @@ -23,8 +23,6 @@ - - diff --git a/toolkit/mozapps/extensions/content/extensions.js b/toolkit/mozapps/extensions/content/extensions.js index ef014fbdad3d..a4f2b0658b17 100644 --- a/toolkit/mozapps/extensions/content/extensions.js +++ b/toolkit/mozapps/extensions/content/extensions.js @@ -2083,19 +2083,6 @@ var gHeader = { gViewController.loadView("addons://search/" + encodeURIComponent(query)); }); - - function updateNavButtonVisibility() { - var shouldShow = gHeader.shouldShowNavButtons; - document.getElementById("back-btn").hidden = !shouldShow; - document.getElementById("forward-btn").hidden = !shouldShow; - } - - window.addEventListener("focus", function(aEvent) { - if (aEvent.target == window) - updateNavButtonVisibility(); - }); - - updateNavButtonVisibility(); }, focusSearchBox() { diff --git a/toolkit/mozapps/extensions/content/extensions.xul b/toolkit/mozapps/extensions/content/extensions.xul index b52f0956a9c3..2040c4008c30 100644 --- a/toolkit/mozapps/extensions/content/extensions.xul +++ b/toolkit/mozapps/extensions/content/extensions.xul @@ -132,22 +132,6 @@ - - Date: Wed, 27 Sep 2017 19:19:12 +0200 Subject: [PATCH 007/108] Bug 1403615: Also follow the NODE_DESCENDANTS_NEED_FRAMES bit in ClearRestyleStateFromSubtree. r=bholley We don't follow this bit intentionally because we know that even if it's set, when none of the other two bits are set there are no other restyle / change hints down the tree. We rely on the frame constructor to clean the mess up, though, and it doesn't really do a good work about it. In particular, the case we're hitting on the test-case is:
    When we see we need to reconstruct the body, we call ClearRestyleStateFromSubtree, but that doesn't do much now, since we don't follow the descendant-need-frames bits. Then, when we reconstruct the content, we arrive at[1] when constructing the first child
    . The
    flags have been cleared, but not the children's! Then a text-node is inserted in a
    , breaking all sorts of invariants. This is the easiest fix. Other fixes include clearing the flags on SetAsUndisplayedContent. But that implies not clearing them in ShouldCreateItemsForChild, and doing that somewhere more sensible. I suspect it's not too hard, but that's a slightly more risky change, will do it if you prefer it. [1]: http://searchfox.org/mozilla-central/rev/3dbb47302e114219c53e99ebaf50c5cb727358ab/layout/base/nsCSSFrameConstructor.cpp#6092 MozReview-Commit-ID: 7026wkQLQkz --- layout/base/ServoRestyleManager.cpp | 3 +-- layout/style/crashtests/1403615.html | 24 ++++++++++++++++++++++++ layout/style/crashtests/crashtests.list | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 layout/style/crashtests/1403615.html diff --git a/layout/base/ServoRestyleManager.cpp b/layout/base/ServoRestyleManager.cpp index 84c6ffbf0679..5e664d02d940 100644 --- a/layout/base/ServoRestyleManager.cpp +++ b/layout/base/ServoRestyleManager.cpp @@ -415,8 +415,7 @@ ServoRestyleManager::ClearServoDataFromSubtree(Element* aElement) /* static */ void ServoRestyleManager::ClearRestyleStateFromSubtree(Element* aElement) { - if (aElement->HasDirtyDescendantsForServo() || - aElement->HasAnimationOnlyDirtyDescendantsForServo()) { + if (aElement->HasAnyOfFlags(Element::kAllServoDescendantBits)) { StyleChildrenIterator it(aElement); for (nsIContent* n = it.GetNextChild(); n; n = it.GetNextChild()) { if (n->IsElement()) { diff --git a/layout/style/crashtests/1403615.html b/layout/style/crashtests/1403615.html new file mode 100644 index 000000000000..8dbc30e70e1a --- /dev/null +++ b/layout/style/crashtests/1403615.html @@ -0,0 +1,24 @@ + + + diff --git a/layout/style/crashtests/crashtests.list b/layout/style/crashtests/crashtests.list index a09be9d21d69..277bf76dc9b3 100644 --- a/layout/style/crashtests/crashtests.list +++ b/layout/style/crashtests/crashtests.list @@ -233,3 +233,4 @@ load 1402366.html load 1402419.html load 1402472.html load 1403028.html +load 1403615.html From 4518c3597b7bd6532671683a9a2bfb91087f292c Mon Sep 17 00:00:00 2001 From: Henri Sivonen Date: Thu, 14 Sep 2017 11:39:43 +0300 Subject: [PATCH 008/108] Bug 256180 build config part - Increase the max size for the runtime stack on Windows. r=glandium MozReview-Commit-ID: JhWucajuuFz --HG-- extra : rebase_source : 48a80faae8e378695529bf6acae6526393d83d7b --- config/config.mk | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/config/config.mk b/config/config.mk index beaa86c6f937..ab6456dfbc33 100644 --- a/config/config.mk +++ b/config/config.mk @@ -398,13 +398,21 @@ endif # WINNT ifdef _MSC_VER ifeq ($(CPU_ARCH),x86_64) -ifdef MOZ_ASAN -# ASan could have 3x stack memory usage of normal builds. -WIN32_EXE_LDFLAGS += -STACK:6291456 +# Normal operation on 64-bit Windows needs 2 MB of stack. (Bug 582910) +# ASAN requires 6 MB of stack. +# Setting the stack to 8 MB to match the capability of other systems +# to deal with frame construction for unreasonably deep DOM trees +# with worst-case styling. This uses address space unnecessarily for +# non-main threads, but that should be tolerable on 64-bit systems. +# (Bug 256180) +WIN32_EXE_LDFLAGS += -STACK:8388608 else -# set stack to 2MB on x64 build. See bug 582910 -WIN32_EXE_LDFLAGS += -STACK:2097152 -endif +# Since this setting affects the default stack size for non-main +# threads, too, to avoid burning the address space, increase only +# 192 KB over the default. Just enough to be able to deal with +# reasonable styling applied to DOM trees whose depth is near what +# Blink's HTML parser can output. (Bug 256180) +WIN32_EXE_LDFLAGS += -STACK:1245184 endif endif From ef3dabbc294094e36e7de98c555dd3f2d6806e7b Mon Sep 17 00:00:00 2001 From: Henri Sivonen Date: Thu, 14 Sep 2017 11:01:06 +0300 Subject: [PATCH 009/108] Bug 256180 layout part - Increase MAX_REFLOW_DEPTH to reduce the probability of content going silently missing. r=bz MozReview-Commit-ID: 7Ui0tVlLEQM --HG-- extra : rebase_source : 65657a2542dc8def2e65a1095913839fc32a7dd8 --- layout/generic/nsIFrame.h | 27 +++++++++- layout/reftests/bugs/256180-1-ref.html | 11 +++++ layout/reftests/bugs/256180-1.html | 68 ++++++++++++++++++++++++++ layout/reftests/bugs/256180-2-ref.html | 11 +++++ layout/reftests/bugs/256180-2.html | 68 ++++++++++++++++++++++++++ layout/reftests/bugs/256180-3-ref.html | 12 +++++ layout/reftests/bugs/256180-3.html | 63 ++++++++++++++++++++++++ layout/reftests/bugs/256180-4-ref.html | 12 +++++ layout/reftests/bugs/256180-4.html | 63 ++++++++++++++++++++++++ layout/reftests/bugs/reftest.list | 15 ++++++ layout/tools/reftest/reftest.jsm | 2 + 11 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 layout/reftests/bugs/256180-1-ref.html create mode 100644 layout/reftests/bugs/256180-1.html create mode 100644 layout/reftests/bugs/256180-2-ref.html create mode 100644 layout/reftests/bugs/256180-2.html create mode 100644 layout/reftests/bugs/256180-3-ref.html create mode 100644 layout/reftests/bugs/256180-3.html create mode 100644 layout/reftests/bugs/256180-4-ref.html create mode 100644 layout/reftests/bugs/256180-4.html diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 1025e8e15bfc..3d62a08f47bb 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -13,7 +13,32 @@ #error This header/class should only be used within Mozilla code. It should not be used by extensions. #endif -#define MAX_REFLOW_DEPTH 200 +#if (defined(XP_WIN) && !defined(HAVE_64BIT_BUILD)) || defined(ANDROID) +// Blink's magic depth limit from its HTML parser (513) plus as much as fits in the +// default run-time stack on armv7 Android on Dalvik when using display: block minus +// a bit just to be sure. The Dalvik default stack crashes at 588. ART can do a few +// frames more. Using the same number for 32-bit Windows for consistency. Over there, +// Blink's magic depth of 513 doesn't fit in the default stack of 1 MB, but this magic +// depth fits when the default is grown by mere 192 KB (tested in 64 KB increments). +// +// 32-bit Windows has a different limit compared to 64-bit desktop, because the +// default stack size affects all threads and consumes address space. Fixing that +// is bug 1257522. +// +// 32-bit Android on ARM already happens to have defaults that are close enough to +// what makes sense as a temporary measure on Windows, so adjusting the Android +// stack can be a follow-up. The stack on 64-bit ARM needs adjusting in any case +// before 64-bit ARM can become tier-1. See bug 1400811. +// +// Ideally, we'd get rid of this smaller limit and make 32-bit Windows and Android +// capable of working with the Linux/Mac/Win64 number below. +#define MAX_REFLOW_DEPTH 585 +#else +// Blink's magic depth limit from its HTML parser times two. Also just about fits +// within the system default runtime stack limit of 8 MB on 64-bit Mac and Linux with +// display: table-cell. +#define MAX_REFLOW_DEPTH 1026 +#endif /* nsIFrame is in the process of being deCOMtaminated, i.e., this file is eventually going to be eliminated, and all callers will use nsFrame instead. At the moment diff --git a/layout/reftests/bugs/256180-1-ref.html b/layout/reftests/bugs/256180-1-ref.html new file mode 100644 index 000000000000..c69c53450908 --- /dev/null +++ b/layout/reftests/bugs/256180-1-ref.html @@ -0,0 +1,11 @@ + + + + + 1026-deep display: table-cell + + +

    1026-element-deep display: table-cell

    +

    Actual depth (including text leaves): 1027 + + diff --git a/layout/reftests/bugs/256180-1.html b/layout/reftests/bugs/256180-1.html new file mode 100644 index 000000000000..82c1bf4bb490 --- /dev/null +++ b/layout/reftests/bugs/256180-1.html @@ -0,0 +1,68 @@ + + + + +1026-element-deep display: table-cell + + + + +

    1026-element-deep display: table-cell

    + + diff --git a/layout/reftests/bugs/256180-2-ref.html b/layout/reftests/bugs/256180-2-ref.html new file mode 100644 index 000000000000..544d7ef5c25f --- /dev/null +++ b/layout/reftests/bugs/256180-2-ref.html @@ -0,0 +1,11 @@ + + + + + 585-deep display: table-cell + + +

    585-element-deep display: table-cell

    +

    Actual depth (including text leaves): 586 + + diff --git a/layout/reftests/bugs/256180-2.html b/layout/reftests/bugs/256180-2.html new file mode 100644 index 000000000000..1887379364d1 --- /dev/null +++ b/layout/reftests/bugs/256180-2.html @@ -0,0 +1,68 @@ + + + + +585-element-deep display: table-cell + + + + +

    585-element-deep display: table-cell

    + + diff --git a/layout/reftests/bugs/256180-3-ref.html b/layout/reftests/bugs/256180-3-ref.html new file mode 100644 index 000000000000..d5bec521175c --- /dev/null +++ b/layout/reftests/bugs/256180-3-ref.html @@ -0,0 +1,12 @@ + + + + + 1026-deep display: block + + +

    1026-element-deep display: block

    +

    Actual depth (including text leaves): 1027 +

    PASS
    + + diff --git a/layout/reftests/bugs/256180-3.html b/layout/reftests/bugs/256180-3.html new file mode 100644 index 000000000000..8b0d6e8c65d6 --- /dev/null +++ b/layout/reftests/bugs/256180-3.html @@ -0,0 +1,63 @@ + + + + +1026-element-deep display: block + + + +

    1026-element-deep display: block

    + + diff --git a/layout/reftests/bugs/256180-4-ref.html b/layout/reftests/bugs/256180-4-ref.html new file mode 100644 index 000000000000..5b957e3e614b --- /dev/null +++ b/layout/reftests/bugs/256180-4-ref.html @@ -0,0 +1,12 @@ + + + + + 585-deep display: block + + +

    585-element-deep display: block

    +

    Actual depth (including text leaves): 586 +

    PASS
    + + diff --git a/layout/reftests/bugs/256180-4.html b/layout/reftests/bugs/256180-4.html new file mode 100644 index 000000000000..eabe43ada638 --- /dev/null +++ b/layout/reftests/bugs/256180-4.html @@ -0,0 +1,63 @@ + + + + +585-element-deep display: block + + + +

    585-element-deep display: block

    + + diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 89ac62e14ddf..60a879ba1534 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -38,6 +38,21 @@ HTTP(..) == 10209-3.html 10209-3-ref.html == 23604-1.html 23604-1-ref.html == 23604-2.html 23604-2-ref.html != 24998-1.html 24998-1-ref.html +# Debug builds and ASAN builds have larger stack frames, so skipped. +# Android and 32-bit Windows don't have enough run-time stack to deal +# with the test, so skipped. +skip-if(isDebugBuild||Android||AddressSanitizer||(winWidget&&(!is64Bit))) == 256180-1.html 256180-1-ref.html +# Debug builds have larger stack frames, so skipped. +# Android and 32-bit Windows don't have enough run-time stack to deal +# with the test, so skipped. +skip-if(isDebugBuild||Android||(winWidget&&(!is64Bit))) == 256180-2.html 256180-2-ref.html +# Debug builds and ASAN builds have larger stack frames, so skipped. +# Android and 32-bit Windows don't have enough run-time stack to deal +# with the test, so skipped. +skip-if(isDebugBuild||Android||AddressSanitizer||(winWidget&&(!is64Bit))) == 256180-3.html 256180-3-ref.html +# Debug builds have larger stack frames, so skipped. +# Making Android on aarch64 not crash is bug 1400811. +skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-4.html 256180-4-ref.html == 25888-1l.html 25888-1l-ref.html != 25888-1l.html 25888-1l-notref.html == 25888-1r.html 25888-1r-ref.html diff --git a/layout/tools/reftest/reftest.jsm b/layout/tools/reftest/reftest.jsm index 86d922ed6486..9d95aba08879 100644 --- a/layout/tools/reftest/reftest.jsm +++ b/layout/tools/reftest/reftest.jsm @@ -737,6 +737,8 @@ function BuildConditionSandbox(aURL) { sandbox.qtWidget = xr.widgetToolkit == "qt"; sandbox.winWidget = xr.widgetToolkit == "windows"; + sandbox.is64Bit = xr.is64Bit; + // Scrollbars that are semi-transparent. See bug 1169666. sandbox.transparentScrollbars = xr.widgetToolkit == "gtk3"; From b245e01efeaa66d396a88292d8514a15f9e580ca Mon Sep 17 00:00:00 2001 From: Henri Sivonen Date: Tue, 12 Sep 2017 16:57:05 +0300 Subject: [PATCH 010/108] Bug 256180 parser part - Insert elements as siblings instead of children at the Blink-defined magic depth for compatibility. r=smaug MozReview-Commit-ID: K8fgv3rgklt --HG-- extra : rebase_source : 3ad91a01805afcd1aeac89a5f2d5ac38dac1797b --- .../en-US/chrome/layout/htmlparser.properties | 1 + layout/reftests/bugs/256180-5-ref.html | 2004 ++++++++++++++++ layout/reftests/bugs/256180-5.html | 2042 +++++++++++++++++ layout/reftests/bugs/256180-6-ref.html | 2004 ++++++++++++++++ layout/reftests/bugs/256180-6.html | 48 + layout/reftests/bugs/reftest.list | 2 + parser/html/javasrc/StateSnapshot.java | 57 +- parser/html/javasrc/TreeBuilder.java | 136 +- parser/html/nsAHtml5TreeBuilderState.h | 2 - parser/html/nsHtml5StateSnapshot.cpp | 64 +- parser/html/nsHtml5StateSnapshot.h | 38 +- parser/html/nsHtml5TreeBuilder.cpp | 119 +- parser/html/nsHtml5TreeBuilder.h | 3 +- parser/html/nsHtml5TreeBuilderCppSupplement.h | 46 +- parser/html/nsHtml5TreeBuilderHSupplement.h | 3 + parser/html/nsHtml5TreeOpExecutor.cpp | 22 +- parser/html/nsHtml5TreeOpExecutor.h | 8 + parser/html/nsHtml5TreeOperation.cpp | 5 + parser/html/nsHtml5TreeOperation.h | 9 + 19 files changed, 6405 insertions(+), 208 deletions(-) create mode 100644 layout/reftests/bugs/256180-5-ref.html create mode 100644 layout/reftests/bugs/256180-5.html create mode 100644 layout/reftests/bugs/256180-6-ref.html create mode 100644 layout/reftests/bugs/256180-6.html diff --git a/dom/locales/en-US/chrome/layout/htmlparser.properties b/dom/locales/en-US/chrome/layout/htmlparser.properties index 66987846c755..5f9557584490 100644 --- a/dom/locales/en-US/chrome/layout/htmlparser.properties +++ b/dom/locales/en-US/chrome/layout/htmlparser.properties @@ -83,6 +83,7 @@ errNoSpaceBetweenPublicAndSystemIds=No space between the doctype public and syst errNoSpaceBetweenDoctypePublicKeywordAndQuote=No space between the doctype “PUBLIC” keyword and the quote. # Tree builder errors +errDeepTree=The document tree is too deep. The tree will be flattened to be 513 elements deep. errStrayStartTag2=Stray start tag “%1$S”. errStrayEndTag=Stray end tag “%1$S”. errUnclosedElements=End tag “%1$S” seen, but there were open elements. diff --git a/layout/reftests/bugs/256180-5-ref.html b/layout/reftests/bugs/256180-5-ref.html new file mode 100644 index 000000000000..7227bce3ed0a --- /dev/null +++ b/layout/reftests/bugs/256180-5-ref.html @@ -0,0 +1,2004 @@ +<font> with alternating attributes and a character between each tag 4000 +

    <font> with alternating attributes and a character between each tag 4000

    +

    Actual depth (including text leaves): 514

    +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +PASS diff --git a/layout/reftests/bugs/256180-5.html b/layout/reftests/bugs/256180-5.html new file mode 100644 index 000000000000..9fffc05dcfcd --- /dev/null +++ b/layout/reftests/bugs/256180-5.html @@ -0,0 +1,2042 @@ +<font> with alternating attributes and a character between each tag 4000 + +

    <font> with alternating attributes and a character between each tag 4000

    zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +PASS diff --git a/layout/reftests/bugs/256180-6-ref.html b/layout/reftests/bugs/256180-6-ref.html new file mode 100644 index 000000000000..e7c01b3e7270 --- /dev/null +++ b/layout/reftests/bugs/256180-6-ref.html @@ -0,0 +1,2004 @@ +<font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs +

    <font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs

    +

    Actual depth (including text leaves): 535

    +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +zx +PASS diff --git a/layout/reftests/bugs/256180-6.html b/layout/reftests/bugs/256180-6.html new file mode 100644 index 000000000000..b8d67316d212 --- /dev/null +++ b/layout/reftests/bugs/256180-6.html @@ -0,0 +1,48 @@ +<font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs + +

    <font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs

    +
    diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 60a879ba1534..975318606857 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -53,6 +53,8 @@ skip-if(isDebugBuild||Android||AddressSanitizer||(winWidget&&(!is64Bit))) == 256 # Debug builds have larger stack frames, so skipped. # Making Android on aarch64 not crash is bug 1400811. skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-4.html 256180-4-ref.html +skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-5.html 256180-5-ref.html +skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-6.html 256180-6-ref.html == 25888-1l.html 25888-1l-ref.html != 25888-1l.html 25888-1l-notref.html == 25888-1r.html 25888-1r-ref.html diff --git a/parser/html/javasrc/StateSnapshot.java b/parser/html/javasrc/StateSnapshot.java index 169727021c4c..5d03e53039d9 100644 --- a/parser/html/javasrc/StateSnapshot.java +++ b/parser/html/javasrc/StateSnapshot.java @@ -1,22 +1,22 @@ /* * Copyright (c) 2009-2010 Mozilla Foundation * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in + * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ @@ -37,12 +37,10 @@ public class StateSnapshot implements TreeBuilderState { private final T headPointer; - private final T deepTreeSurrogateParent; - private final int mode; private final int originalMode; - + private final boolean framesetOk; private final boolean needToDropLF; @@ -55,7 +53,6 @@ public class StateSnapshot implements TreeBuilderState { * @param templateModeStack * @param formPointer * @param headPointer - * @param deepTreeSurrogateParent * @param mode * @param originalMode * @param framesetOk @@ -64,21 +61,20 @@ public class StateSnapshot implements TreeBuilderState { */ StateSnapshot(StackNode[] stack, StackNode[] listOfActiveFormattingElements, int[] templateModeStack, T formPointer, - T headPointer, T deepTreeSurrogateParent, int mode, int originalMode, + T headPointer, int mode, int originalMode, boolean framesetOk, boolean needToDropLF, boolean quirks) { this.stack = stack; this.listOfActiveFormattingElements = listOfActiveFormattingElements; this.templateModeStack = templateModeStack; this.formPointer = formPointer; this.headPointer = headPointer; - this.deepTreeSurrogateParent = deepTreeSurrogateParent; this.mode = mode; this.originalMode = originalMode; this.framesetOk = framesetOk; this.needToDropLF = needToDropLF; this.quirks = quirks; } - + /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getStack() */ @@ -109,25 +105,16 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the headPointer. - * + * * @return the headPointer */ public T getHeadPointer() { return headPointer; } - /** - * Returns the deepTreeSurrogateParent. - * - * @return the deepTreeSurrogateParent - */ - public T getDeepTreeSurrogateParent() { - return deepTreeSurrogateParent; - } - /** * Returns the mode. - * + * * @return the mode */ public int getMode() { @@ -136,7 +123,7 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the originalMode. - * + * * @return the originalMode */ public int getOriginalMode() { @@ -145,7 +132,7 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the framesetOk. - * + * * @return the framesetOk */ public boolean isFramesetOk() { @@ -154,7 +141,7 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the needToDropLF. - * + * * @return the needToDropLF */ public boolean isNeedToDropLF() { @@ -163,13 +150,13 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the quirks. - * + * * @return the quirks */ public boolean isQuirks() { return quirks; } - + /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElementsLength() */ diff --git a/parser/html/javasrc/TreeBuilder.java b/parser/html/javasrc/TreeBuilder.java index 1338b0b1b7d0..a35d1521b3e9 100644 --- a/parser/html/javasrc/TreeBuilder.java +++ b/parser/html/javasrc/TreeBuilder.java @@ -444,11 +444,6 @@ public abstract class TreeBuilder implements TokenHandler, private T headPointer; - /** - * Used to work around Gecko limitations. Not used in Java. - */ - private T deepTreeSurrogateParent; - protected @Auto char[] charBuffer; protected int charBufferLen = 0; @@ -615,7 +610,6 @@ public abstract class TreeBuilder implements TokenHandler, listPtr = -1; formPointer = null; headPointer = null; - deepTreeSurrogateParent = null; // [NOCPP[ html4 = false; idLocations.clear(); @@ -1642,7 +1636,6 @@ public abstract class TreeBuilder implements TokenHandler, public final void endTokenization() throws SAXException { formPointer = null; headPointer = null; - deepTreeSurrogateParent = null; templateModeStack = null; if (stack != null) { while (currentPtr > -1) { @@ -4718,7 +4711,11 @@ public abstract class TreeBuilder implements TokenHandler, removeFromListOfActiveFormattingElements(formattingEltListPos); return true; } + // commonAncestor is used for running the algorithm and + // insertionCommonAncestor is used for the actual insertions to + // keep them depth-limited. StackNode commonAncestor = stack[formattingEltStackPos - 1]; // weak ref + T insertionCommonAncestor = nodeFromStackWithBlinkCompat(formattingEltStackPos - 1); // weak ref StackNode furthestBlock = stack[furthestBlockPos]; // weak ref // detachFromParent(furthestBlock.node); XXX AAA CHANGE int bookmark = formattingEltListPos; @@ -4766,7 +4763,7 @@ public abstract class TreeBuilder implements TokenHandler, assert node == listOfActiveFormattingElements[nodeListPos]; assert node == stack[nodePos]; T clone = createElement("http://www.w3.org/1999/xhtml", - node.name, node.attributes.cloneAttributes(null), commonAncestor.node + node.name, node.attributes.cloneAttributes(null), insertionCommonAncestor // CPPONLY: , htmlCreator(node.getHtmlCreator()) ); StackNode newNode = createStackNode(node.getFlags(), node.ns, @@ -4785,16 +4782,18 @@ public abstract class TreeBuilder implements TokenHandler, node = newNode; // } XXX AAA CHANGE detachFromParent(lastNode.node); - appendElement(lastNode.node, node.node); + appendElement(lastNode.node, nodeFromStackWithBlinkCompat(nodePos)); lastNode = node; } + // If we insert into a foster parent, for simplicity, we insert + // accoding to the spec without Blink's depth limit. if (commonAncestor.isFosterParenting()) { fatal(); detachFromParent(lastNode.node); insertIntoFosterParent(lastNode.node); } else { detachFromParent(lastNode.node); - appendElement(lastNode.node, commonAncestor.node); + appendElement(lastNode.node, insertionCommonAncestor); } T clone = createElement("http://www.w3.org/1999/xhtml", formattingElt.name, @@ -4980,20 +4979,21 @@ public abstract class TreeBuilder implements TokenHandler, while (entryPos < listPtr) { entryPos++; StackNode entry = listOfActiveFormattingElements[entryPos]; - StackNode currentNode = stack[currentPtr]; + StackNode current = stack[currentPtr]; T clone; - if (currentNode.isFosterParenting()) { + if (current.isFosterParenting()) { clone = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", entry.name, entry.attributes.cloneAttributes(null) // CPPONLY: , htmlCreator(entry.getHtmlCreator()) ); } else { + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); clone = createElement("http://www.w3.org/1999/xhtml", entry.name, - entry.attributes.cloneAttributes(null), currentNode.node + entry.attributes.cloneAttributes(null), currentNode // CPPONLY: , htmlCreator(entry.getHtmlCreator()) ); - appendElement(clone, currentNode.node); + appendElement(clone, currentNode); } StackNode entryClone = createStackNode(entry.getFlags(), @@ -5336,7 +5336,7 @@ public abstract class TreeBuilder implements TokenHandler, // [NOCPP[ checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] - T currentNode = stack[currentPtr].node; + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); T elt = createElement("http://www.w3.org/1999/xhtml", "head", attributes, currentNode /* * head uses NS_NewHTMLSharedElement creator @@ -5378,10 +5378,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(NS_NewHTMLFormElement) ); } else { - elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, currentNode // CPPONLY: , htmlCreator(NS_NewHTMLFormElement) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } if (!isTemplateContents()) { @@ -5415,10 +5416,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } StackNode node = createStackNode(elementName, elt, clone // [NOCPP[ @@ -5437,7 +5439,7 @@ public abstract class TreeBuilder implements TokenHandler, checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] // This method can't be called for custom elements - T currentNode = stack[currentPtr].node; + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); T elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); @@ -5471,10 +5473,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } StackNode node = createStackNode(elementName, elt, popName // [NOCPP[ @@ -5509,10 +5512,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(null) ); } else { - elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, currentNode // CPPONLY: , htmlCreator(null) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } StackNode node = createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint @@ -5562,10 +5566,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); } else { - elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/2000/svg", popName, attributes, currentNode // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } StackNode node = createStackNode(elementName, popName, elt // [NOCPP[ @@ -5592,11 +5597,12 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), - attributes, formOwner, current.node + attributes, formOwner, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } StackNode node = createStackNode(elementName, elt // [NOCPP[ @@ -5623,11 +5629,12 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement("http://www.w3.org/1999/xhtml", name, - attributes, formOwner, current.node + attributes, formOwner, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } elementPushed("http://www.w3.org/1999/xhtml", name, elt); elementPopped("http://www.w3.org/1999/xhtml", name, elt); @@ -5651,10 +5658,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } elementPushed("http://www.w3.org/1999/xhtml", popName, elt); elementPopped("http://www.w3.org/1999/xhtml", popName, elt); @@ -5678,10 +5686,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); } else { - elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/2000/svg", popName, attributes, currentNode // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } elementPushed("http://www.w3.org/2000/svg", popName, elt); elementPopped("http://www.w3.org/2000/svg", popName, elt); @@ -5705,10 +5714,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(null) ); } else { - elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, currentNode // CPPONLY: , htmlCreator(null) ); - appendElement(elt, current.node); + appendElement(elt, currentNode); } elementPushed("http://www.w3.org/1998/Math/MathML", popName, elt); elementPopped("http://www.w3.org/1998/Math/MathML", popName, elt); @@ -5719,7 +5729,7 @@ public abstract class TreeBuilder implements TokenHandler, checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] // Can't be called for custom elements - T currentNode = stack[currentPtr].node; + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); T elt = createElement("http://www.w3.org/1999/xhtml", "input", attributes, form == null || fragment || isTemplateContents() ? null : form, currentNode // CPPONLY: , htmlCreator(NS_NewHTMLInputElement) @@ -5733,7 +5743,7 @@ public abstract class TreeBuilder implements TokenHandler, // [NOCPP[ checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] - T currentNode = stack[currentPtr].node; + T currentNode = nodeFromStackWithBlinkCompat(currentPtr); T elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, currentNode // CPPONLY: , htmlCreator(NS_NewHTMLFormElement) @@ -6145,7 +6155,7 @@ public abstract class TreeBuilder implements TokenHandler, System.arraycopy(templateModeStack, 0, templateModeStackCopy, 0, templateModeStackCopy.length); return new StateSnapshot(stackCopy, listCopy, templateModeStackCopy, formPointer, - headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, + headPointer, mode, originalMode, framesetOk, needToDropLF, quirks); } @@ -6162,7 +6172,6 @@ public abstract class TreeBuilder implements TokenHandler, || templateModeStackLen != templateModePtr + 1 || formPointer != snapshot.getFormPointer() || headPointer != snapshot.getHeadPointer() - || deepTreeSurrogateParent != snapshot.getDeepTreeSurrogateParent() || mode != snapshot.getMode() || originalMode != snapshot.getOriginalMode() || framesetOk != snapshot.isFramesetOk() @@ -6268,7 +6277,6 @@ public abstract class TreeBuilder implements TokenHandler, System.arraycopy(templateModeStackCopy, 0, templateModeStack, 0, templateModeStackLen); formPointer = snapshot.getFormPointer(); headPointer = snapshot.getHeadPointer(); - deepTreeSurrogateParent = snapshot.getDeepTreeSurrogateParent(); mode = snapshot.getMode(); originalMode = snapshot.getOriginalMode(); framesetOk = snapshot.isFramesetOk(); @@ -6285,6 +6293,33 @@ public abstract class TreeBuilder implements TokenHandler, return -1; } + /** + * Returns stack[stackPos].node if stackPos is + * smaller than Blink's magic limit or the node at Blink's magic limit + * otherwise. + * + * In order to get Blink-compatible handling of excessive deeply-nested + * markup, this method must be used to obtain the node that is used as the + * parent node of an insertion. + * + * Blink's magic number is 512, but our counting is off by one compared to + * Blink's way of counting, so in order to get the same + * externally-observable outcome, we use 511 as our magic number. + * + * @param stackPos the stack position to attempt to read + * @return node at the position capped to Blink's magic number + * @throws SAXException + */ + private T nodeFromStackWithBlinkCompat(int stackPos) throws SAXException { + // Magic number if off by one relative to Blink's magic number, but the + // outcome is the same, because the counting is different by one. + if (stackPos > 511) { + errDeepTree(); + return stack[511].node; + } + return stack[stackPos].node; + } + /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getFormPointer() */ @@ -6301,15 +6336,6 @@ public abstract class TreeBuilder implements TokenHandler, return headPointer; } - /** - * Returns the deepTreeSurrogateParent. - * - * @return the deepTreeSurrogateParent - */ - public T getDeepTreeSurrogateParent() { - return deepTreeSurrogateParent; - } - /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElements() */ @@ -6397,6 +6423,16 @@ public abstract class TreeBuilder implements TokenHandler, return templateModePtr + 1; } + /** + * Complains about an over-deep tree. Theoretically this should just be + * a warning, but in practice authors should take this as an error. + * + * @throws SAXException + */ + private void errDeepTree() throws SAXException { + err("The document tree is more than 513 elements deep, which causes Firefox and Chrome flatten the tree."); + } + /** * Reports a stray start tag. * @param name the name of the stray tag diff --git a/parser/html/nsAHtml5TreeBuilderState.h b/parser/html/nsAHtml5TreeBuilderState.h index c06e53b4da82..2edef8279983 100644 --- a/parser/html/nsAHtml5TreeBuilderState.h +++ b/parser/html/nsAHtml5TreeBuilderState.h @@ -31,8 +31,6 @@ class nsAHtml5TreeBuilderState { virtual nsIContentHandle* getHeadPointer() = 0; - virtual nsIContentHandle* getDeepTreeSurrogateParent() = 0; - virtual int32_t getMode() = 0; virtual int32_t getOriginalMode() = 0; diff --git a/parser/html/nsHtml5StateSnapshot.cpp b/parser/html/nsHtml5StateSnapshot.cpp index 4d7e6489b08d..6b1aa67543df 100644 --- a/parser/html/nsHtml5StateSnapshot.cpp +++ b/parser/html/nsHtml5StateSnapshot.cpp @@ -1,22 +1,22 @@ /* * Copyright (c) 2009-2010 Mozilla Foundation * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in + * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ @@ -54,19 +54,27 @@ #include "nsHtml5StateSnapshot.h" - -nsHtml5StateSnapshot::nsHtml5StateSnapshot(jArray stack, jArray listOfActiveFormattingElements, jArray templateModeStack, nsIContentHandle* formPointer, nsIContentHandle* headPointer, nsIContentHandle* deepTreeSurrogateParent, int32_t mode, int32_t originalMode, bool framesetOk, bool needToDropLF, bool quirks) - : stack(stack), - listOfActiveFormattingElements(listOfActiveFormattingElements), - templateModeStack(templateModeStack), - formPointer(formPointer), - headPointer(headPointer), - deepTreeSurrogateParent(deepTreeSurrogateParent), - mode(mode), - originalMode(originalMode), - framesetOk(framesetOk), - needToDropLF(needToDropLF), - quirks(quirks) +nsHtml5StateSnapshot::nsHtml5StateSnapshot( + jArray stack, + jArray listOfActiveFormattingElements, + jArray templateModeStack, + nsIContentHandle* formPointer, + nsIContentHandle* headPointer, + int32_t mode, + int32_t originalMode, + bool framesetOk, + bool needToDropLF, + bool quirks) + : stack(stack) + , listOfActiveFormattingElements(listOfActiveFormattingElements) + , templateModeStack(templateModeStack) + , formPointer(formPointer) + , headPointer(headPointer) + , mode(mode) + , originalMode(originalMode) + , framesetOk(framesetOk) + , needToDropLF(needToDropLF) + , quirks(quirks) { MOZ_COUNT_CTOR(nsHtml5StateSnapshot); } @@ -101,12 +109,6 @@ nsHtml5StateSnapshot::getHeadPointer() return headPointer; } -nsIContentHandle* -nsHtml5StateSnapshot::getDeepTreeSurrogateParent() -{ - return deepTreeSurrogateParent; -} - int32_t nsHtml5StateSnapshot::getMode() { diff --git a/parser/html/nsHtml5StateSnapshot.h b/parser/html/nsHtml5StateSnapshot.h index 1f8ecc170a1d..d7d48f093d28 100644 --- a/parser/html/nsHtml5StateSnapshot.h +++ b/parser/html/nsHtml5StateSnapshot.h @@ -1,22 +1,22 @@ /* * Copyright (c) 2009-2010 Mozilla Foundation * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in + * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ @@ -63,20 +63,28 @@ class nsHtml5StateSnapshot : public nsAHtml5TreeBuilderState autoJArray templateModeStack; nsIContentHandle* formPointer; nsIContentHandle* headPointer; - nsIContentHandle* deepTreeSurrogateParent; int32_t mode; int32_t originalMode; bool framesetOk; bool needToDropLF; bool quirks; public: - nsHtml5StateSnapshot(jArray stack, jArray listOfActiveFormattingElements, jArray templateModeStack, nsIContentHandle* formPointer, nsIContentHandle* headPointer, nsIContentHandle* deepTreeSurrogateParent, int32_t mode, int32_t originalMode, bool framesetOk, bool needToDropLF, bool quirks); + nsHtml5StateSnapshot( + jArray stack, + jArray listOfActiveFormattingElements, + jArray templateModeStack, + nsIContentHandle* formPointer, + nsIContentHandle* headPointer, + int32_t mode, + int32_t originalMode, + bool framesetOk, + bool needToDropLF, + bool quirks); jArray getStack(); jArray getTemplateModeStack(); jArray getListOfActiveFormattingElements(); nsIContentHandle* getFormPointer(); nsIContentHandle* getHeadPointer(); - nsIContentHandle* getDeepTreeSurrogateParent(); int32_t getMode(); int32_t getOriginalMode(); bool isFramesetOk(); diff --git a/parser/html/nsHtml5TreeBuilder.cpp b/parser/html/nsHtml5TreeBuilder.cpp index ca3bb8ebdfa8..b35a687d3be3 100644 --- a/parser/html/nsHtml5TreeBuilder.cpp +++ b/parser/html/nsHtml5TreeBuilder.cpp @@ -87,7 +87,6 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) listPtr = -1; formPointer = nullptr; headPointer = nullptr; - deepTreeSurrogateParent = nullptr; start(fragment); charBufferLen = 0; charBuffer = nullptr; @@ -609,7 +608,6 @@ nsHtml5TreeBuilder::endTokenization() { formPointer = nullptr; headPointer = nullptr; - deepTreeSurrogateParent = nullptr; templateModeStack = nullptr; if (stack) { while (currentPtr > -1) { @@ -3675,6 +3673,8 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) return true; } nsHtml5StackNode* commonAncestor = stack[formattingEltStackPos - 1]; + nsIContentHandle* insertionCommonAncestor = + nodeFromStackWithBlinkCompat(formattingEltStackPos - 1); nsHtml5StackNode* furthestBlock = stack[furthestBlockPos]; int32_t bookmark = formattingEltListPos; int32_t nodePos = furthestBlockPos; @@ -3715,7 +3715,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) createElement(kNameSpaceID_XHTML, node->name, node->attributes->cloneAttributes(nullptr), - commonAncestor->node, + insertionCommonAncestor, htmlCreator(node->getHtmlCreator())); nsHtml5StackNode* newNode = createStackNode(node->getFlags(), node->ns, @@ -3732,7 +3732,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) node->release(this); node = newNode; detachFromParent(lastNode->node); - appendElement(lastNode->node, node->node); + appendElement(lastNode->node, nodeFromStackWithBlinkCompat(nodePos)); lastNode = node; } if (commonAncestor->isFosterParenting()) { @@ -3741,7 +3741,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) insertIntoFosterParent(lastNode->node); } else { detachFromParent(lastNode->node); - appendElement(lastNode->node, commonAncestor->node); + appendElement(lastNode->node, insertionCommonAncestor); } nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, @@ -3916,21 +3916,22 @@ nsHtml5TreeBuilder::reconstructTheActiveFormattingElements() while (entryPos < listPtr) { entryPos++; nsHtml5StackNode* entry = listOfActiveFormattingElements[entryPos]; - nsHtml5StackNode* currentNode = stack[currentPtr]; + nsHtml5StackNode* current = stack[currentPtr]; nsIContentHandle* clone; - if (currentNode->isFosterParenting()) { + if (current->isFosterParenting()) { clone = createAndInsertFosterParentedElement( kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), htmlCreator(entry->getHtmlCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); clone = createElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), - currentNode->node, + currentNode, htmlCreator(entry->getHtmlCreator())); - appendElement(clone, currentNode->node); + appendElement(clone, currentNode); } nsHtml5StackNode* entryClone = createStackNode(entry->getFlags(), entry->ns, @@ -4152,7 +4153,7 @@ nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush() void nsHtml5TreeBuilder::appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes) { - nsIContentHandle* currentNode = stack[currentPtr]->node; + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::head, attributes, @@ -4189,12 +4190,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAt attributes, htmlCreator(NS_NewHTMLFormElement)); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, - current->node, + currentNode, htmlCreator(NS_NewHTMLFormElement)); - appendElement(elt, current->node); + appendElement(elt, currentNode); } if (!isTemplateContents()) { formPointer = elt; @@ -4217,12 +4219,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5 attributes, htmlCreator(elementName->getHtmlCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, - current->node, + currentNode, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } nsHtml5StackNode* node = createStackNode(elementName, elt, clone); push(node); @@ -4233,7 +4236,7 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5 void nsHtml5TreeBuilder::appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) { - nsIContentHandle* currentNode = stack[currentPtr]->node; + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, elementName->getName(), @@ -4262,12 +4265,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementNam attributes, htmlCreator(elementName->getHtmlCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, popName, attributes, - current->node, + currentNode, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } nsHtml5StackNode* node = createStackNode(elementName, elt, popName); push(node); @@ -4288,12 +4292,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5Elem elt = createAndInsertFosterParentedElement( kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr)); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_MathML, popName, attributes, - current->node, + currentNode, htmlCreator(nullptr)); - appendElement(elt, current->node); + appendElement(elt, currentNode); } nsHtml5StackNode* node = createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint); @@ -4325,12 +4330,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5Element attributes, svgCreator(elementName->getSvgCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_SVG, popName, attributes, - current->node, + currentNode, svgCreator(elementName->getSvgCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } nsHtml5StackNode* node = createStackNode(elementName, popName, elt); push(node); @@ -4351,13 +4357,14 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementNam formOwner, htmlCreator(elementName->getHtmlCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, formOwner, - current->node, + currentNode, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } nsHtml5StackNode* node = createStackNode(elementName, elt); push(node); @@ -4382,13 +4389,14 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster( formOwner, htmlCreator(elementName->getHtmlCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, name, attributes, formOwner, - current->node, + currentNode, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } elementPushed(kNameSpaceID_XHTML, name, elt); elementPopped(kNameSpaceID_XHTML, name, elt); @@ -4408,12 +4416,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elem attributes, htmlCreator(elementName->getHtmlCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, popName, attributes, - current->node, + currentNode, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } elementPushed(kNameSpaceID_XHTML, popName, elt); elementPopped(kNameSpaceID_XHTML, popName, elt); @@ -4433,12 +4442,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* e attributes, svgCreator(elementName->getSvgCreator())); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_SVG, popName, attributes, - current->node, + currentNode, svgCreator(elementName->getSvgCreator())); - appendElement(elt, current->node); + appendElement(elt, currentNode); } elementPushed(kNameSpaceID_SVG, popName, elt); elementPopped(kNameSpaceID_SVG, popName, elt); @@ -4455,12 +4465,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName elt = createAndInsertFosterParentedElement( kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr)); } else { + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_MathML, popName, attributes, - current->node, + currentNode, htmlCreator(nullptr)); - appendElement(elt, current->node); + appendElement(elt, currentNode); } elementPushed(kNameSpaceID_MathML, popName, elt); elementPopped(kNameSpaceID_MathML, popName, elt); @@ -4470,7 +4481,7 @@ void nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes, nsIContentHandle* form) { - nsIContentHandle* currentNode = stack[currentPtr]->node; + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::input, @@ -4486,7 +4497,7 @@ nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes, void nsHtml5TreeBuilder::appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes) { - nsIContentHandle* currentNode = stack[currentPtr]->node; + nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, @@ -4644,7 +4655,16 @@ nsHtml5TreeBuilder::newSnapshot() } jArray templateModeStackCopy = jArray::newJArray(templateModePtr + 1); nsHtml5ArrayCopy::arraycopy(templateModeStack, templateModeStackCopy, templateModeStackCopy.length); - return new nsHtml5StateSnapshot(stackCopy, listCopy, templateModeStackCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks); + return new nsHtml5StateSnapshot(stackCopy, + listCopy, + templateModeStackCopy, + formPointer, + headPointer, + mode, + originalMode, + framesetOk, + needToDropLF, + quirks); } bool @@ -4656,7 +4676,15 @@ nsHtml5TreeBuilder::snapshotMatches(nsAHtml5TreeBuilderState* snapshot) int32_t listLen = snapshot->getListOfActiveFormattingElementsLength(); jArray templateModeStackCopy = snapshot->getTemplateModeStack(); int32_t templateModeStackLen = snapshot->getTemplateModeStackLength(); - if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || templateModeStackLen != templateModePtr + 1 || formPointer != snapshot->getFormPointer() || headPointer != snapshot->getHeadPointer() || deepTreeSurrogateParent != snapshot->getDeepTreeSurrogateParent() || mode != snapshot->getMode() || originalMode != snapshot->getOriginalMode() || framesetOk != snapshot->isFramesetOk() || needToDropLF != snapshot->isNeedToDropLF() || quirks != snapshot->isQuirks()) { + if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || + templateModeStackLen != templateModePtr + 1 || + formPointer != snapshot->getFormPointer() || + headPointer != snapshot->getHeadPointer() || + mode != snapshot->getMode() || + originalMode != snapshot->getOriginalMode() || + framesetOk != snapshot->isFramesetOk() || + needToDropLF != snapshot->isNeedToDropLF() || + quirks != snapshot->isQuirks()) { return false; } for (int32_t i = listLen - 1; i >= 0; i--) { @@ -4748,7 +4776,6 @@ nsHtml5TreeBuilder::loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTab nsHtml5ArrayCopy::arraycopy(templateModeStackCopy, templateModeStack, templateModeStackLen); formPointer = snapshot->getFormPointer(); headPointer = snapshot->getHeadPointer(); - deepTreeSurrogateParent = snapshot->getDeepTreeSurrogateParent(); mode = snapshot->getMode(); originalMode = snapshot->getOriginalMode(); framesetOk = snapshot->isFramesetOk(); @@ -4767,24 +4794,28 @@ nsHtml5TreeBuilder::findInArray(nsHtml5StackNode* node, jArray 511) { + errDeepTree(); + return stack[511]->node; + } + return stack[stackPos]->node; +} + +nsIContentHandle* nsHtml5TreeBuilder::getFormPointer() { return formPointer; } -nsIContentHandle* +nsIContentHandle* nsHtml5TreeBuilder::getHeadPointer() { return headPointer; } -nsIContentHandle* -nsHtml5TreeBuilder::getDeepTreeSurrogateParent() -{ - return deepTreeSurrogateParent; -} - jArray nsHtml5TreeBuilder::getListOfActiveFormattingElements() { diff --git a/parser/html/nsHtml5TreeBuilder.h b/parser/html/nsHtml5TreeBuilder.h index e5686634f4ef..35ed6742cb3c 100644 --- a/parser/html/nsHtml5TreeBuilder.h +++ b/parser/html/nsHtml5TreeBuilder.h @@ -308,7 +308,6 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState int32_t listPtr; nsIContentHandle* formPointer; nsIContentHandle* headPointer; - nsIContentHandle* deepTreeSurrogateParent; protected: autoJArray charBuffer; int32_t charBufferLen; @@ -551,10 +550,10 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState void loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTable* interner); private: int32_t findInArray(nsHtml5StackNode* node, jArray arr); + nsIContentHandle* nodeFromStackWithBlinkCompat(int32_t stackPos); public: nsIContentHandle* getFormPointer(); nsIContentHandle* getHeadPointer(); - nsIContentHandle* getDeepTreeSurrogateParent(); jArray getListOfActiveFormattingElements(); jArray getStack(); jArray getTemplateModeStack(); diff --git a/parser/html/nsHtml5TreeBuilderCppSupplement.h b/parser/html/nsHtml5TreeBuilderCppSupplement.h index da832a67cf43..bcbfb374cab1 100644 --- a/parser/html/nsHtml5TreeBuilderCppSupplement.h +++ b/parser/html/nsHtml5TreeBuilderCppSupplement.h @@ -7,7 +7,6 @@ #include "nsError.h" #include "nsIPresShell.h" #include "nsNodeUtils.h" -#include "nsIFrame.h" #include "mozilla/Likely.h" #include "mozilla/UniquePtr.h" @@ -484,10 +483,6 @@ nsHtml5TreeBuilder::appendElement(nsIContentHandle* aChild, nsIContentHandle* aP { NS_PRECONDITION(aChild, "Null child"); NS_PRECONDITION(aParent, "Null parent"); - if (deepTreeSurrogateParent) { - return; - } - if (mBuilder) { nsresult rv = nsHtml5TreeOperation::Append(static_cast(aChild), static_cast(aParent), @@ -594,12 +589,11 @@ nsHtml5TreeBuilder::appendCharacters(nsIContentHandle* aParent, char16_t* aBuffe MOZ_ASSERT(!aStart, "aStart must always be zero."); if (mBuilder) { - nsresult rv = nsHtml5TreeOperation::AppendText( - aBuffer, // XXX aStart always ignored??? - aLength, - static_cast(deepTreeSurrogateParent ? - deepTreeSurrogateParent : aParent), - mBuilder); + nsresult rv = + nsHtml5TreeOperation::AppendText(aBuffer, // XXX aStart always ignored??? + aLength, + static_cast(aParent), + mBuilder); if (NS_FAILED(rv)) { MarkAsBrokenAndRequestSuspension(rv); } @@ -619,8 +613,7 @@ nsHtml5TreeBuilder::appendCharacters(nsIContentHandle* aParent, char16_t* aBuffe nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement(); NS_ASSERTION(treeOp, "Tree op allocation failed."); - treeOp->Init(eTreeOpAppendText, bufferCopy, aLength, - deepTreeSurrogateParent ? deepTreeSurrogateParent : aParent); + treeOp->Init(eTreeOpAppendText, bufferCopy, aLength, aParent); } void @@ -630,10 +623,6 @@ nsHtml5TreeBuilder::appendComment(nsIContentHandle* aParent, char16_t* aBuffer, NS_PRECONDITION(aParent, "Null parent"); MOZ_ASSERT(!aStart, "aStart must always be zero."); - if (deepTreeSurrogateParent) { - return; - } - if (mBuilder) { nsresult rv = nsHtml5TreeOperation::AppendComment( static_cast(aParent), @@ -743,7 +732,6 @@ void nsHtml5TreeBuilder::start(bool fragment) { mCurrentHtmlScriptIsAsyncOrDefer = false; - deepTreeSurrogateParent = nullptr; #ifdef DEBUG mActive = true; #endif @@ -810,13 +798,6 @@ nsHtml5TreeBuilder::elementPushed(int32_t aNamespace, nsIAtom* aName, nsIContent * table elements shouldn't be used as surrogate parents for user experience * reasons. */ - if (!deepTreeSurrogateParent && currentPtr >= MAX_REFLOW_DEPTH && - !(aName == nsGkAtoms::script || aName == nsGkAtoms::table || - aName == nsGkAtoms::thead || aName == nsGkAtoms::tfoot || - aName == nsGkAtoms::tbody || aName == nsGkAtoms::tr || - aName == nsGkAtoms::colgroup || aName == nsGkAtoms::style)) { - deepTreeSurrogateParent = aElement; - } if (aNamespace != kNameSpaceID_XHTML) { return; } @@ -862,9 +843,6 @@ nsHtml5TreeBuilder::elementPopped(int32_t aNamespace, nsIAtom* aName, nsIContent NS_ASSERTION(aNamespace == kNameSpaceID_XHTML || aNamespace == kNameSpaceID_SVG || aNamespace == kNameSpaceID_MathML, "Element isn't HTML, SVG or MathML!"); NS_ASSERTION(aName, "Element doesn't have local name!"); NS_ASSERTION(aElement, "No element!"); - if (deepTreeSurrogateParent && currentPtr <= MAX_REFLOW_DEPTH) { - deepTreeSurrogateParent = nullptr; - } if (aNamespace == kNameSpaceID_MathML) { return; } @@ -1312,6 +1290,18 @@ nsHtml5TreeBuilder::EnableViewSource(nsHtml5Highlighter* aHighlighter) mViewSource = aHighlighter; } +void +nsHtml5TreeBuilder::errDeepTree() +{ + if (MOZ_UNLIKELY(mViewSource)) { + mViewSource->AddErrorToCurrentRun("errDeepTree"); + } else if (!mBuilder) { + nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement(); + MOZ_ASSERT(treeOp, "Tree op allocation failed."); + treeOp->InitDeepTree(tokenizer->getLineNumber()); + } +} + void nsHtml5TreeBuilder::errStrayStartTag(nsIAtom* aName) { diff --git a/parser/html/nsHtml5TreeBuilderHSupplement.h b/parser/html/nsHtml5TreeBuilderHSupplement.h index e802e2c2f8d3..357a7dfdc588 100644 --- a/parser/html/nsHtml5TreeBuilderHSupplement.h +++ b/parser/html/nsHtml5TreeBuilderHSupplement.h @@ -145,6 +145,9 @@ void EnableViewSource(nsHtml5Highlighter* aHighlighter); + void + errDeepTree(); + void errStrayStartTag(nsIAtom* aName); void errStrayEndTag(nsIAtom* aName); diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp index 3455c0d91e97..c667477127d2 100644 --- a/parser/html/nsHtml5TreeOpExecutor.cpp +++ b/parser/html/nsHtml5TreeOpExecutor.cpp @@ -65,12 +65,13 @@ nsHtml5TreeOpExecutor::nsHtml5TreeOpExecutor() , mSuppressEOF(false) , mReadingFromStage(false) , mStreamParser(nullptr) - , mPreloadedURLs(23) // Mean # of preloadable resources per page on dmoz + , mPreloadedURLs(23) // Mean # of preloadable resources per page on dmoz , mSpeculationReferrerPolicy(mozilla::net::RP_Unset) , mStarted(false) , mRunFlushLoopOnStack(false) , mCallContinueInterruptedParsingIfEnabled(false) , mAlreadyComplainedAboutCharset(false) + , mAlreadyComplainedAboutDeepTree(false) { } @@ -815,6 +816,25 @@ nsHtml5TreeOpExecutor::ComplainAboutBogusProtocolCharset(nsIDocument* aDoc) "EncProtocolUnsupported"); } +void +nsHtml5TreeOpExecutor::MaybeComplainAboutDeepTree(uint32_t aLineNumber) +{ + if (mAlreadyComplainedAboutDeepTree) { + return; + } + mAlreadyComplainedAboutDeepTree = true; + nsContentUtils::ReportToConsole(nsIScriptError::errorFlag, + NS_LITERAL_CSTRING("HTML parser"), + mDocument, + nsContentUtils::eHTMLPARSER_PROPERTIES, + "errDeepTree", + nullptr, + 0, + nullptr, + EmptyString(), + aLineNumber); +} + nsHtml5Parser* nsHtml5TreeOpExecutor::GetParser() { diff --git a/parser/html/nsHtml5TreeOpExecutor.h b/parser/html/nsHtml5TreeOpExecutor.h index 074b39415e5e..fe2a4e79f054 100644 --- a/parser/html/nsHtml5TreeOpExecutor.h +++ b/parser/html/nsHtml5TreeOpExecutor.h @@ -92,6 +92,12 @@ class nsHtml5TreeOpExecutor final : public nsHtml5DocumentBuilder, */ bool mAlreadyComplainedAboutCharset; + /** + * Whether this executor has already complained about the tree being too + * deep. + */ + bool mAlreadyComplainedAboutDeepTree; + public: nsHtml5TreeOpExecutor(); @@ -196,6 +202,8 @@ class nsHtml5TreeOpExecutor final : public nsHtml5DocumentBuilder, void ComplainAboutBogusProtocolCharset(nsIDocument* aDoc); + void MaybeComplainAboutDeepTree(uint32_t aLineNumber); + bool IsComplete() { return !mParser; diff --git a/parser/html/nsHtml5TreeOperation.cpp b/parser/html/nsHtml5TreeOperation.cpp index 92de3d875c3f..11de6b7fcbb9 100644 --- a/parser/html/nsHtml5TreeOperation.cpp +++ b/parser/html/nsHtml5TreeOperation.cpp @@ -1011,6 +1011,11 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder, aBuilder->MaybeComplainAboutCharset(msgId, error, (uint32_t)lineNumber); return NS_OK; } + case eTreeOpMaybeComplainAboutDeepTree: { + int32_t lineNumber = mOne.integer; + aBuilder->MaybeComplainAboutDeepTree((uint32_t)lineNumber); + return NS_OK; + } case eTreeOpAddClass: { nsIContent* node = *(mOne.node); char16_t* str = mTwo.unicharPtr; diff --git a/parser/html/nsHtml5TreeOperation.h b/parser/html/nsHtml5TreeOperation.h index e06465808ac0..dacab29ea3de 100644 --- a/parser/html/nsHtml5TreeOperation.h +++ b/parser/html/nsHtml5TreeOperation.h @@ -59,6 +59,7 @@ enum eHtml5TreeOperation eTreeOpSetScriptLineNumberAndFreeze, eTreeOpSvgLoad, eTreeOpMaybeComplainAboutCharset, + eTreeOpMaybeComplainAboutDeepTree, eTreeOpAddClass, eTreeOpAddViewSourceHref, eTreeOpAddViewSourceBase, @@ -465,6 +466,14 @@ class nsHtml5TreeOperation final { mThree.integer = aLineNumber; } + inline void InitDeepTree(int32_t aLineNumber) + { + MOZ_ASSERT(mOpCode == eTreeOpUninitialized, + "Op code must be uninitialized when initializing."); + mOpCode = eTreeOpMaybeComplainAboutDeepTree; + mOne.integer = aLineNumber; + } + inline void Init(eHtml5TreeOperation aOpCode, const nsAString& aString) { NS_PRECONDITION(mOpCode == eTreeOpUninitialized, From bb227d88e097acda108f71ab69d0c2cc2b588821 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Thu, 28 Sep 2017 09:36:12 +0200 Subject: [PATCH 011/108] Backed out changeset 8ce27eeef766 (bug 1402094) for bustage on Android: dom/base/nsDocument.cpp:13613: 'bool ShouldUseGeckoBackend(nsIURI*)' defined but not used. r=backout --- dom/base/nsDocument.cpp | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 471b38680181..afa7fac21670 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -13608,27 +13608,6 @@ nsIDocument::ReportHasScrollLinkedEffect() "ScrollLinkedEffectFound2"); } -// URL-based blacklist for stylo. -static bool -ShouldUseGeckoBackend(nsIURI* aDocumentURI) -{ - if (!aDocumentURI) { - return false; - } - bool isScheme = false; - if (NS_SUCCEEDED(aDocumentURI->SchemeIs("about", &isScheme))) { - nsAutoCString path; - aDocumentURI->GetFilePath(path); - // about:reader requires support of :scope pseudo-class so we have - // to use Gecko backend for now. See bug 1402094. - // This should be fixed by bug 1204818. - if (path.EqualsLiteral("reader")) { - return true; - } - } - return false; -} - void nsIDocument::UpdateStyleBackendType() { @@ -13647,7 +13626,7 @@ nsIDocument::UpdateStyleBackendType() // Note that, since tests can have XUL support, we still need to // explicitly exclude XUL documents here. if (!nsContentUtils::IsSystemPrincipal(NodePrincipal()) && - !IsXULDocument() && !ShouldUseGeckoBackend(mDocumentURI)) { + !IsXULDocument()) { mStyleBackendType = StyleBackendType::Servo; } } From c7f99e3c21609df21f37830ed6e4335da2d958fb Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Thu, 28 Sep 2017 16:19:45 +1000 Subject: [PATCH 012/108] Bug 1402094 - Blacklist about:reader from using stylo. r=bholley MozReview-Commit-ID: 6cG1x1tcOwn --HG-- extra : rebase_source : 02525628845d1fa757af5044b3a3f3ddcb7c86a0 --- dom/base/nsDocument.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index afa7fac21670..01ffe61eee26 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -13608,6 +13608,29 @@ nsIDocument::ReportHasScrollLinkedEffect() "ScrollLinkedEffectFound2"); } +#ifdef MOZ_STYLO +// URL-based blacklist for stylo. +static bool +ShouldUseGeckoBackend(nsIURI* aDocumentURI) +{ + if (!aDocumentURI) { + return false; + } + bool isScheme = false; + if (NS_SUCCEEDED(aDocumentURI->SchemeIs("about", &isScheme))) { + nsAutoCString path; + aDocumentURI->GetFilePath(path); + // about:reader requires support of :scope pseudo-class so we have + // to use Gecko backend for now. See bug 1402094. + // This should be fixed by bug 1204818. + if (path.EqualsLiteral("reader")) { + return true; + } + } + return false; +} +#endif // MOZ_STYLO + void nsIDocument::UpdateStyleBackendType() { @@ -13626,7 +13649,7 @@ nsIDocument::UpdateStyleBackendType() // Note that, since tests can have XUL support, we still need to // explicitly exclude XUL documents here. if (!nsContentUtils::IsSystemPrincipal(NodePrincipal()) && - !IsXULDocument()) { + !IsXULDocument() && !ShouldUseGeckoBackend(mDocumentURI)) { mStyleBackendType = StyleBackendType::Servo; } } From 70b668ea83482e6b3d3121e81979d7c68aedd78b Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Thu, 28 Sep 2017 08:26:11 +0200 Subject: [PATCH 013/108] Bug 1403178 - Remove mParent assertion from Performance* as it's triggered in headless mode r=baku MozReview-Commit-ID: BOz7e0oarab --HG-- extra : rebase_source : 4b64987f740e737315b4e5c6858018c1449cec62 --- dom/performance/PerformanceEntry.cpp | 2 -- dom/performance/PerformanceEntry.h | 1 + dom/performance/PerformanceMark.cpp | 2 -- dom/performance/PerformanceMeasure.cpp | 2 -- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/dom/performance/PerformanceEntry.cpp b/dom/performance/PerformanceEntry.cpp index b078f3a24c8d..1111c15a6ada 100644 --- a/dom/performance/PerformanceEntry.cpp +++ b/dom/performance/PerformanceEntry.cpp @@ -28,8 +28,6 @@ PerformanceEntry::PerformanceEntry(nsISupports* aParent, mName(aName), mEntryType(aEntryType) { - // mParent is null in workers. - MOZ_ASSERT(mParent || !NS_IsMainThread()); } PerformanceEntry::~PerformanceEntry() diff --git a/dom/performance/PerformanceEntry.h b/dom/performance/PerformanceEntry.h index cd9f6a75fee5..0c187f455647 100644 --- a/dom/performance/PerformanceEntry.h +++ b/dom/performance/PerformanceEntry.h @@ -89,6 +89,7 @@ public: protected: virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; +private: nsCOMPtr mParent; nsString mName; nsString mEntryType; diff --git a/dom/performance/PerformanceMark.cpp b/dom/performance/PerformanceMark.cpp index 3558acc74342..eb4648ae79f9 100644 --- a/dom/performance/PerformanceMark.cpp +++ b/dom/performance/PerformanceMark.cpp @@ -16,8 +16,6 @@ PerformanceMark::PerformanceMark(nsISupports* aParent, : PerformanceEntry(aParent, aName, NS_LITERAL_STRING("mark")) , mStartTime(aStartTime) { - // mParent is null in workers. - MOZ_ASSERT(mParent || !NS_IsMainThread()); } PerformanceMark::~PerformanceMark() diff --git a/dom/performance/PerformanceMeasure.cpp b/dom/performance/PerformanceMeasure.cpp index 7a7ec2e76c25..6b85e00836dd 100644 --- a/dom/performance/PerformanceMeasure.cpp +++ b/dom/performance/PerformanceMeasure.cpp @@ -18,8 +18,6 @@ PerformanceMeasure::PerformanceMeasure(nsISupports* aParent, mStartTime(aStartTime), mDuration(aEndTime - aStartTime) { - // mParent is null in workers. - MOZ_ASSERT(mParent || !NS_IsMainThread()); } PerformanceMeasure::~PerformanceMeasure() From 53eae03617fd438b4efc03704cedf94b4d0a83ed Mon Sep 17 00:00:00 2001 From: Chris Pearce Date: Mon, 25 Sep 2017 12:20:20 +0200 Subject: [PATCH 014/108] Bug 1402825 - Extend life of VIDEO_CAN_CREATE_*_DECODER telemetry to 68. r=francois The VIDEO_CAN_CREATE_{AAC,H264}_DECODER telemetry expired in 58, but is still useful I think as a gauge of how support for proprietary formats is changing over time, and how ubiquitous support is on Windows N and K/N variants. So I think we should extend its life. MozReview-Commit-ID: FnnLtcVdqaZ --HG-- extra : rebase_source : 7cab61447931af6233a3c4c92662bdc54ebe0564 --- toolkit/components/telemetry/Histograms.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index f3d0065d273a..77437edf496b 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -8555,7 +8555,7 @@ "VIDEO_CAN_CREATE_AAC_DECODER": { "record_in_processes": ["main", "content"], "alert_emails": ["cpearce@mozilla.com"], - "expires_in_version": "58", + "expires_in_version": "68", "kind": "boolean", "description": "Whether at startup we report we can playback MP4 (AAC) audio. This is single value is recorded at every startup.", "releaseChannelCollection": "opt-out" @@ -8563,7 +8563,7 @@ "VIDEO_CAN_CREATE_H264_DECODER": { "record_in_processes": ["main", "content"], "alert_emails": ["cpearce@mozilla.com"], - "expires_in_version": "58", + "expires_in_version": "68", "kind": "boolean", "description": "Whether at startup we report we can playback MP4 (H.264) video. This is single value is recorded at every startup.", "releaseChannelCollection": "opt-out" From d389330c2e7c2bed44026f727cceaf1620c8ab96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 27 Sep 2017 18:09:31 +0200 Subject: [PATCH 015/108] Bug 1403592: Never flush the user font set when getting font metrics from style resolution. r=Manishearth In this case, the caller doesn't go through all the PreTraverseSync stuff (we don't really want it to do so), via GetComputedStyleNoFlush. It makes sense to not flush the user font set that case, we'll schedule a restyle properly if / when needed. Since the set should be flushed otherwise, let's just not flush it from the styling code. MozReview-Commit-ID: LLHfxemJ8QQ --- layout/style/ServoBindings.cpp | 7 ++++--- layout/style/nsRuleNode.cpp | 13 ++++++++----- layout/style/nsRuleNode.h | 8 +++++++- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/layout/style/ServoBindings.cpp b/layout/style/ServoBindings.cpp index 8f21a20798b2..d6d7d939dcc3 100644 --- a/layout/style/ServoBindings.cpp +++ b/layout/style/ServoBindings.cpp @@ -2482,9 +2482,10 @@ Gecko_GetFontMetrics(RawGeckoPresContextBorrowed aPresContext, nsPresContext* presContext = const_cast(aPresContext); presContext->SetUsesExChUnits(true); - RefPtr fm = nsRuleNode::GetMetricsFor(presContext, aIsVertical, - aFont, aFontSize, - aUseUserFontSet); + RefPtr fm = nsRuleNode::GetMetricsFor( + presContext, aIsVertical, aFont, aFontSize, aUseUserFontSet, + nsRuleNode::FlushUserFontSet::No); + ret.mXSize = fm->XHeight(); gfxFloat zeroWidth = fm->GetThebesFontGroup()->GetFirstValidFont()-> GetMetrics(fm->Orientation()).zeroOrAveCharWidth; diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 41fbead4de0d..8f3e142c7dfa 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -377,7 +377,8 @@ nsRuleNode::GetMetricsFor(nsPresContext* aPresContext, bool aIsVertical, const nsStyleFont* aStyleFont, nscoord aFontSize, - bool aUseUserFontSet) + bool aUseUserFontSet, + FlushUserFontSet aFlushUserFontSet) { nsFont font = aStyleFont->mFont; font.size = aFontSize; @@ -387,8 +388,9 @@ nsRuleNode::GetMetricsFor(nsPresContext* aPresContext, params.language = aStyleFont->mLanguage; params.explicitLanguage = aStyleFont->mExplicitLanguage; params.orientation = orientation; - params.userFontSet = - aUseUserFontSet ? aPresContext->GetUserFontSet() : nullptr; + params.userFontSet = aUseUserFontSet + ? aPresContext->GetUserFontSet(aFlushUserFontSet == FlushUserFontSet::Yes) + : nullptr; params.textPerf = aPresContext->GetTextPerfMetrics(); return aPresContext->DeviceContext()->GetMetricsFor(font, params); } @@ -408,8 +410,9 @@ nsRuleNode::GetMetricsFor(nsPresContext* aPresContext, isVertical = true; } } - return nsRuleNode::GetMetricsFor(aPresContext, isVertical, aStyleFont, - aFontSize, aUseUserFontSet); + return nsRuleNode::GetMetricsFor( + aPresContext, isVertical, aStyleFont, aFontSize, aUseUserFontSet, + FlushUserFontSet::Yes); } /* static */ diff --git a/layout/style/nsRuleNode.h b/layout/style/nsRuleNode.h index 423545ffd198..719eb0c51eb0 100644 --- a/layout/style/nsRuleNode.h +++ b/layout/style/nsRuleNode.h @@ -807,11 +807,17 @@ public: bool aConvertListItem = false); static void EnsureInlineDisplay(mozilla::StyleDisplay& display); + enum class FlushUserFontSet { + Yes, + No, + }; + static already_AddRefed GetMetricsFor(nsPresContext* aPresContext, bool aIsVertical, const nsStyleFont* aStyleFont, nscoord aFontSize, - bool aUseUserFontSet); + bool aUseUserFontSet, + FlushUserFontSet aFlushUserFontSet); static already_AddRefed GetMetricsFor(nsPresContext* aPresContext, nsStyleContext* aStyleContext, From 27b80913625ab27d0ac63698294fed909376512b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 27 Sep 2017 18:16:25 +0200 Subject: [PATCH 016/108] Bug 1403592: Crashtest. r=Manishearth I've made it crash at least once, though it's intermittent-y. I guess it's better than no crashtest. MozReview-Commit-ID: 5m2VCrEs8lM --- layout/style/crashtests/1403592.html | 19 +++++++++++++++++++ layout/style/crashtests/crashtests.list | 1 + 2 files changed, 20 insertions(+) create mode 100644 layout/style/crashtests/1403592.html diff --git a/layout/style/crashtests/1403592.html b/layout/style/crashtests/1403592.html new file mode 100644 index 000000000000..fdd810b88603 --- /dev/null +++ b/layout/style/crashtests/1403592.html @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/layout/style/crashtests/crashtests.list b/layout/style/crashtests/crashtests.list index 277bf76dc9b3..1584b6adfdc3 100644 --- a/layout/style/crashtests/crashtests.list +++ b/layout/style/crashtests/crashtests.list @@ -234,3 +234,4 @@ load 1402419.html load 1402472.html load 1403028.html load 1403615.html +load 1403592.html From 5e87d90e2ba2a83693c5640b8bc76d1b835101d0 Mon Sep 17 00:00:00 2001 From: Marco Bonardo Date: Wed, 27 Sep 2017 14:43:17 +0200 Subject: [PATCH 017/108] Bug 1403508 - Tabbrowser is no more storing root favicons in Places for pages not defining an icon. r=Mardak Setting an icon for the tab and storing that icon in Places are now separate actions. Before bug 1401777 setIcon was doing both, but that was error-prone and more expensive. Due to that change, useDefaultIcon stopped storing root domain favicons in Places. MozReview-Commit-ID: Kt5xEXctsnU --HG-- extra : rebase_source : f7fa2b0e818df2570f0078c86c4dfdaba3953f01 --- browser/base/content/browser.js | 10 +----- browser/base/content/tabbrowser.xml | 36 ++++++++++++++++--- .../content/test/general/browser_discovery.js | 27 ++++++++------ 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 4de62d0988c6..c548884ff304 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -3724,16 +3724,8 @@ const DOMEventHandler = { let loadingPrincipal = aLoadingPrincipal || Services.scriptSecurityManager.getSystemPrincipal(); if (aURL) { - try { - if (!(aURL instanceof Ci.nsIURI)) { - aURL = makeURI(aURL); - } - PlacesUIUtils.loadFavicon(aBrowser, loadingPrincipal, aURL, aRequestContextID); - } catch (ex) { - Components.utils.reportError(ex); - } + gBrowser.storeIcon(aBrowser, aURL, loadingPrincipal, aRequestContextID); } - if (aCanUseForTab) { gBrowser.setIcon(tab, aURL, loadingPrincipal, aRequestContextID); } diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 8e629b2146ef..15175493e3cd 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -971,6 +971,25 @@ null + + + + + + + + + + @@ -1047,15 +1066,19 @@ diff --git a/browser/base/content/test/general/browser_discovery.js b/browser/base/content/test/general/browser_discovery.js index 19fa02803674..be2f16d94c60 100644 --- a/browser/base/content/test/general/browser_discovery.js +++ b/browser/base/content/test/general/browser_discovery.js @@ -1,9 +1,11 @@ /* eslint-disable mozilla/no-arbitrary-setTimeout */ add_task(async function() { - let rootDir = getRootDirectory(gTestPath); - let url = rootDir + "discovery.html"; + let url = "http://mochi.test:8888/browser/browser/base/content/test/general/discovery.html"; info("Test icons discovery"); + // Tirst we need to clear the failed favicons cache, since previous tests + // likely added this non-existing icon, and useDefaultIcon would skip it. + PlacesUtils.favicons.removeFailedFavicon(makeURI("http://mochi.test:8888/favicon.ico")); await BrowserTestUtils.withNewTab(url, iconDiscovery); info("Test search discovery"); await BrowserTestUtils.withNewTab(url, searchDiscovery); @@ -28,6 +30,12 @@ let iconDiscoveryTests = [ ]; async function iconDiscovery() { + // Since the page doesn't have an icon, we should try using the root domain + // icon. + await BrowserTestUtils.waitForCondition(() => { + return gBrowser.getIcon() == "http://mochi.test:8888/favicon.ico"; + }, "wait for default icon load to finish"); + for (let testCase of iconDiscoveryTests) { if (testCase.pass == undefined) testCase.pass = true; @@ -37,8 +45,8 @@ async function iconDiscovery() { gBrowser.setIcon(gBrowser.selectedTab, null); let promiseLinkAdded = - BrowserTestUtils.waitForEvent(gBrowser.selectedBrowser, "DOMLinkAdded", - false, null, true); + BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "DOMLinkAdded", + false, null, true); let promiseMessage = new Promise(resolve => { let mm = window.messageManager; mm.addMessageListener("Link:SetIcon", function listenForIcon(msg) { @@ -66,7 +74,7 @@ async function iconDiscovery() { try { await BrowserTestUtils.waitForCondition(() => { return gBrowser.getIcon() != null; - }, "wait for icon load to finish", 100, 5); + }, "wait for icon load to finish", 100, 20); ok(testCase.pass, testCase.text); } catch (ex) { ok(!testCase.pass, testCase.text); @@ -115,8 +123,8 @@ async function searchDiscovery() { testCase.title = testCase.title || searchDiscoveryTests.indexOf(testCase); let promiseLinkAdded = - BrowserTestUtils.waitForEvent(gBrowser.selectedBrowser, "DOMLinkAdded", - false, null, true); + BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "DOMLinkAdded", + false, null, true); await ContentTask.spawn(gBrowser.selectedBrowser, testCase, test => { let doc = content.document; @@ -146,10 +154,9 @@ async function searchDiscovery() { } info("Test multiple engines with the same title"); - let count = 0; let promiseLinkAdded = - BrowserTestUtils.waitForEvent(gBrowser.selectedBrowser, "DOMLinkAdded", - false, () => ++count == 2, true); + BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "DOMLinkAdded", + false, e => e.target.href == "http://second.mozilla.com/search.xml", true); await ContentTask.spawn(gBrowser.selectedBrowser, null, () => { let doc = content.document; let head = doc.getElementById("linkparent"); From 6b8eff34c3dc69fe2672ad0af91aa4c0ca8b4900 Mon Sep 17 00:00:00 2001 From: "Alfredo.Yang" Date: Thu, 28 Sep 2017 10:19:33 +0800 Subject: [PATCH 018/108] Bug 1388991 - check subtraction underflow. r=kinetik MozReview-Commit-ID: DYsqlXyjZs --HG-- extra : rebase_source : 557265db7fb42fea0b8b9f212c32f854e96a95c7 --- .../binding/mp4parse_capi/src/lib.rs | 22 +++++++++++-------- media/libstagefright/binding/update-rust.sh | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/media/libstagefright/binding/mp4parse_capi/src/lib.rs b/media/libstagefright/binding/mp4parse_capi/src/lib.rs index 1cbbe0a4c65a..2c9099c27408 100644 --- a/media/libstagefright/binding/mp4parse_capi/src/lib.rs +++ b/media/libstagefright/binding/mp4parse_capi/src/lib.rs @@ -107,7 +107,7 @@ impl Default for mp4parse_codec { } #[repr(C)] -#[derive(Default)] +#[derive(Default, Debug)] pub struct mp4parse_track_info { pub track_type: mp4parse_track_type, pub codec: mp4parse_codec, @@ -129,6 +129,7 @@ pub struct mp4parse_indice { } #[repr(C)] +#[derive(Debug)] pub struct mp4parse_byte_data { pub length: u32, // cheddar can't handle generic type, so it needs to be multiple data types here. @@ -164,7 +165,7 @@ pub struct mp4parse_pssh_info { } #[repr(C)] -#[derive(Default)] +#[derive(Default, Debug)] pub struct mp4parse_sinf_info { pub is_encrypted: u32, pub iv_size: u8, @@ -172,7 +173,7 @@ pub struct mp4parse_sinf_info { } #[repr(C)] -#[derive(Default)] +#[derive(Default, Debug)] pub struct mp4parse_track_audio_info { pub channels: u16, pub bit_depth: u16, @@ -184,7 +185,7 @@ pub struct mp4parse_track_audio_info { } #[repr(C)] -#[derive(Default)] +#[derive(Default, Debug)] pub struct mp4parse_track_video_info { pub display_width: u32, pub display_height: u32, @@ -196,7 +197,7 @@ pub struct mp4parse_track_video_info { } #[repr(C)] -#[derive(Default)] +#[derive(Default, Debug)] pub struct mp4parse_fragment_info { pub fragment_duration: u64, // TODO: @@ -832,11 +833,11 @@ impl<'a> Iterator for SampleToChunkIterator<'a> { let has_chunk = self.chunks.next() .or_else(|| { self.chunks = match (self.stsc_peek_iter.next(), self.stsc_peek_iter.peek()) { - (Some(next), Some(peek)) => { + (Some(next), Some(peek)) if next.first_chunk > 0 && peek.first_chunk > 0 => { self.sample_count = next.samples_per_chunk; ((next.first_chunk - 1) .. (peek.first_chunk - 1)) }, - (Some(next), None) => { + (Some(next), None) if next.first_chunk > 0 => { self.sample_count = next.samples_per_chunk; // Total chunk number in 'stsc' could be different to 'stco', // there could be more chunks at the last 'stsc' record. @@ -844,8 +845,11 @@ impl<'a> Iterator for SampleToChunkIterator<'a> { }, _ => (0 .. 0), }; - self.remain_chunk_count -= self.chunks.len() as u32; - self.chunks.next() + + self.remain_chunk_count.checked_sub(self.chunks.len() as u32).and_then(|res| { + self.remain_chunk_count = res; + self.chunks.next() + }) }); has_chunk.map_or(None, |id| { Some((id, self.sample_count)) }) diff --git a/media/libstagefright/binding/update-rust.sh b/media/libstagefright/binding/update-rust.sh index 2511827a5c58..5644a6df885e 100755 --- a/media/libstagefright/binding/update-rust.sh +++ b/media/libstagefright/binding/update-rust.sh @@ -2,7 +2,7 @@ # Script to update mp4parse-rust sources to latest upstream # Default version. -VER=7df7df72865226640de6aed05de2cb42751cd501 +VER=7a10a8349b7dc098210deb0872de801e30f2d65e # Accept version or commit from the command line. if test -n "$1"; then From 99296b3786120b799e17d1e948133121f1a8a05e Mon Sep 17 00:00:00 2001 From: "Alfredo.Yang" Date: Thu, 28 Sep 2017 10:51:18 +0800 Subject: [PATCH 019/108] Bug 1388991 - add test case for subtraction underfolw in SampleToChunkIterator. r=kinetik MozReview-Commit-ID: 8IV0RkDL8r7 --HG-- extra : rebase_source : 196d0af229c3f5181c286999f60c63da5a7ca408 --- media/libstagefright/gtest/TestParser.cpp | 3 ++- media/libstagefright/gtest/moz.build | 1 + .../libstagefright/gtest/test_case_1388991.mp4 | Bin 0 -> 288821 bytes 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 media/libstagefright/gtest/test_case_1388991.mp4 diff --git a/media/libstagefright/gtest/TestParser.cpp b/media/libstagefright/gtest/TestParser.cpp index 398eac5d63b5..c52119b66419 100644 --- a/media/libstagefright/gtest/TestParser.cpp +++ b/media/libstagefright/gtest/TestParser.cpp @@ -266,7 +266,8 @@ static const TestFileData rustTestFiles[] = { { "test_case_1389527.mp4", 1, false, 5005000, 80, 128, 1, 4992000, false, 0, false, false, 2 }, { "test_case_1395244.mp4", 1, true, 416666, - 320, 240, 1,477460, false,0, false, false, 2 } + 320, 240, 1,477460, false,0, false, false, 2 }, + { "test_case_1388991.mp4", 0, false, -1, 0, 0, 1, 30000181, false, 0, false, false, 2 }, }; TEST(stagefright_MPEG4Metadata, test_case_mp4) { diff --git a/media/libstagefright/gtest/moz.build b/media/libstagefright/gtest/moz.build index 6fdfa6fc262d..be0181c00a5b 100644 --- a/media/libstagefright/gtest/moz.build +++ b/media/libstagefright/gtest/moz.build @@ -36,6 +36,7 @@ TEST_HARNESS_FILES.gtest += [ 'test_case_1301065.mp4', 'test_case_1329061.mov', 'test_case_1351094.mp4', + 'test_case_1388991.mp4', 'test_case_1389299.mp4', 'test_case_1389527.mp4', 'test_case_1395244.mp4', diff --git a/media/libstagefright/gtest/test_case_1388991.mp4 b/media/libstagefright/gtest/test_case_1388991.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..deb7aae33a2f6400711768951702380b691c519e GIT binary patch literal 288821 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

    2&>1Mnn&jF7t3G=oH~goSYg~ z)fe~U0lTyD#_!LBb>sCOaue?_rb(j$PY81_omMF4-;5x9jvV3^(Y+GvTQ?thP2VRh z`);;B1WeqfWF*s3@8a96sc$PD6N_#;hoyASsZyOSt4H%$Y$Y<2;9}zYo-`?5Z-b3&f`}0%Gf*8Yq!#3ieW?8*v=wJrejI7d zjIE9LZe{AuZpgtX$A~rQ5|uu>6{WIy(M+kP;rlwAr#9d1;i$0{hQEC^^Y(csVlctk z9kOc(>a#Z+J!xn4ogZE~M9m${EnP0a_gWzvgEA}NO%qHRI99`)dZD7l`r{GrWjtC1J#=egFK>Jc+GuDb6S(^H}jWfO*pt%z++9};#Y9`C*j~A7#US@MagZVtr znNF@OgkS>N%#ErmAXRtht2>;3VS5}~Y&0#zCEw#<6j}A(&gV1MKN>C)g9XDskkfmeAA8a@@z?6h#*=$0I z`^k=SH$K+tACB_12%}_;bN=TBs@3cEU-qw=ybDc295LRM9osPV?=`d&-IvyFWSVY) z8^rdRbAx?c*9&i*c-DRP7970{zgME2^E;U=Y-3gO8+ZS7I(@rWk;T1`tQA0Q>@S?~ zp^(1WhezGwa56zyo-L=*m?=MPUl+$2mi>1~pYZoH(78k^DXDsScS%`V+pN;%(H+aX zq~|Y^N1u^E5ur1`O<+KU7Iz=6Jvv$2+D|#+|BcHC#W(#KUPwF#QC|jHBSQhivgr`= zYx4DpDop;cq#Vo9cPZxh3?(_b%M)eWwfK8mwAI@khKRoFQQwzA=ESRjSkObw3a&^y1y}@`pCs3=&NyawnI$=Tx}Q+Nzu$fv1PH$1H`nTY)^GDtWB1pN>HV zoA0ul3E=(XJ4Vjs=B<#YKY!`oAG%Tha05?B8JfnBSxW2CU6F{8Pa6jtDc*7_+oIG= zFNKkgk-T+p0gbP6V{THOq!?q#wPM+Xkoav8*V|U3^yuOQ#HkKv&$LN*5I4BsN=yRc z@XTv`mX3PJNl2kqGWQ|0Do!>R?>k&D4X#1}Yo}SrE;?t(L{lVl2HGZ}A{zU`(qjFa z;H-)jc~Xv_v?4-(I>z}epP@lfVV0`|X@$a5y3us^rQ)iX*IU_k2IMK_FJOrwa)heZ zDSmsw^X5(HNT}iqN}{hxE&fy=A{89^I|Ab}nefJZH8S`|LbRxijX<AE|u#8FW&$B)9F_Y|} zI5Em5Ke5xu4q3I-#m#>vIL9K zn^u?(`#Gc=>jx)KEPTHk$1=1f`HU?V8~8=CA`Be5Z` zlKk3sZFF{B;`3Xn#D+P-nV3Kga)dpWMaK_u#T)mB3B?nS6nBm!r*0YB!J;u;ywAj)q9E|Yk2yMfY-Wx za&%@wM(I+y@WlRcKnp(l1aNpDwEBPI@IbI9gA72yM*)C8gi8P9Kl(55aU9YF#30y{ zJ^2R${)E7RfAWW5Pxj;wti3)`?foe~SO`@B24@2;?Pi^6^K+=aGUEUc z30t@YWUBzT<;;->m&`UVo0Ix9;006T)*a~32XxTLVFSoR`V4{F1%YpUM?g2$ATK*W zH73(}bLbF!)>4RJV(OlpWyGqT9W1Q2mto_$1e#o`Us2?_$?wTi1(6eTYMqJszk%n& zxeSf;9F~fTUnggrU#U`SpP~oyO45o&eNC4SlA@!?WzUKp4p6e4H|bfg?{+;_D@N9{sD zDVIUEhFkNXp~eddt!Bebfe3><(D4OnP5(P2DXKF0y@Z@q1YcLtx!(7~>?LTr`ii(} z6WR7WshjZfd-x$eu?2B+gz0<9;Pgg7>hefr=*BPgdRe6T?s8;Z&-E<%Vi7dbKKybB z1OjtB_y8JWLtD2QM^1wCZ9esbfXz0M&`h`ZI0v^DrHXw)yq}MVql81^D_uaGp&DWb# zaq+-UK6J62>hl0-wSkU6K7fQ8L`2Nv^15ZS!sap&qWA`A^ek`BPe8+wZGe~GdVKTvQpFw)h#n$`7IMYf+t!|TXP+oT{+u^L%>)m?_#Qg zPrI(^7ODHos?YnEb#KC0y;6lu{ldJj#|5BP3K4dFOP@DQ!{kt>&OD<{-{NyPUl0(( z$N9z3!`U@6q0NZEHYd>EV>Qsi2Zk@LC8yTELEE`j%9_42xQl04{-pYoVsU4Q!{Yas zwOy~4T6#lf&)##-wm>uify;8-x&>5CudNykJm`0)8dSv>#BV0M_0wrz-(=btB7NDT zq`Xkm`qu3Jty`_P%4z#PKmMw1Uzw)cG;fFs_4o5yZ|P=Qh+fe$2cU5T2pmE5=`NZI z-loYl&Y)Fa&Q#!VW{NylwY@2WVcu6o#Z6Ey9D|qHFroV-5{O%W+!aEH^tL_I##EKe z+>lzu^0$4#LD3F2Btt-O@=+QU5CjEcJw+$yC+uX~jrGdOb&H^(Hj5>vq57xuJvu`w z$ToG$>)w0*&;ybhqJj%Fh1+2dKu>Xb3DO<_R-l&uK^e8))lA5#kiT~e49+f_hqzpQ zWIA?r7CBE1T&eylsVNS21zQKV60~@><)D*dd%~EmOcwf$n}=OsKs!Y?zdF={V@8&6 zt-$iCq2=qo_-lV*)mP}HN=e_G#CUs9I}@mw5I%Dv)%dWVI-km@6p+B49o;#vZa1d2 z##HW^h~eLM42ZosRSsb*wFyNvfnN?Go;teiYO#^{0u%pX!7NTmtM_(yL#Lti=r#b6 z@;HbK)voj_zQwwCZ<5C35BZLsxvl!P+tvG53_ozfIHKtpOHN~y+B)W!)Js3bX!^ZF z(1<~HLbn%|<{|~>pd-ezn-bXKaT7l8%2=9cPs#Gm8MJXOYDVmLjHZ`nl=R_mzeRtk zsdUtK<&sRFTihIwXg?C`WJ>bfzf)tahq%WxGQLe^vfADZ&s7!kA2fe_x15ap^) zu%ErviBThi*<@l8EHvbY$3r!l{!qFMb!01K00UOmGju0#re4cKnTbUy+bffnv25cK5Ly&YKD<<@7MVyh7*M$G&49W^r1B*oBz4E1FZ7P% zuGu3N?$yUn6G2MM=!tIzBw78cDl>&b!mN6bK9|V+11Q^^nv(uvN?#BiDAXD{yV+jESzZ8l`)x` z$8g%k6`+Q4d(=iOKc>|8(!uFP?7NGUG@>5S7;V;XY|D3oTZ8QYT>%No1&`0ZL%^ip zU?@=Y;r1wmV4%rq>tj@t)BWYLAEadfWK*LMlPZgm47uwp%S*C_{mYPzOqc-LwQs1T ze=N=7Q;&C?Y_38+Hd3fIx*vL~jA4*S$YfR=uhR8x9vc6oQO^ufkfDzfS^dK2E4prT zeuuzvS`{0b#P!D!i-BrEaFjzLyh-Y-kwt8i6p!Bv!C5OlsU6cFDjhZIMr2;0zBHS_ z&X%7Nvo@W7cE#<)<9|KGfI38lDusFW-mw$j;fk_Vi|zQj2({%Sm1{0FziAr`vo8wF z9V*ou3%(0@FSaZ30qt4ORS?dBS?mmI%z$@&;b@pbhp+2&MMt)J0eKjTS@vW=?lW6q z=^|OT_Zx0A6Ppbx2-R`Ox=z1LqklNcRVR--w}!d$)_xoSCsiL3a5MEs_$EkI+2^dL z=ze47)paV2w05&PkM-ZtsUkTBTeM{LRND3~`y6i)@erstL))_OIaVTq=_2jzRfJiH zGl&Sdj?F;OzFQwh+O`1Io+77_c7Q`7scuLt<`aFViIx}e3SP(ZS^+B_Z!LQ?a=$^A zp!Z8HP@h-t*^}&~psU%BciO#g8C52_?XR4O>i*XDmGS7XE@Jv?0;Pj-e!EN{OEfz> z;6YyxIy+0cR)HBU=rb&WZ??%LWHKnl1id zP}ngLw-4+2yCc?uHhoJ+`f;jCbWh{%&#io`M}@M4f?XN$Xq{tSD~N(|EbxLw1fXsw zB+(8GJyefLP%0{nNuII4D>-j z3Vk&iH#JYDwNN6d-F1|=3iZW2>M!ob zkD*I3ky!Qhwk{SVNtC=ZKN?Yeq@IOW@~>iWI|{`1)1h%=z~nd@*>$pw@v4!a9Tstyh$xsG4dsY)kZZOCxd8j1C=_+r%~eB+~GXX z|E@0B;_qleOFKl~W0!niMW3lNVt;OPAadimIG?OVzGdpn_hsG<3U^j<Z|(sKvbY%MRMfoN1#N8TYAJ`0BKNF_V#%!XQt;9}vE)kqoz{TdEg#sx11zgCXycoWaOw#3~dCo{hJx3?d9l>ad) zDIs~uYD7qfPqT>JxB$Cu5<qKKd;mTKe$4zxyk&?{gdz*dkLeXkX#et`_l=C=8&p_}{M zClwOw8wHx{_8Qa$-wYP9)|) z{olr1c4gX(JW9TqxGp|^l>%^>)g_Wc9W`4-^ekrpe85Ct+q~#>>{d5bM1qEQi2E6}bR5GA(!Z7smIL zJH8}2bvp+*Fe@RUQ!0Z2G-whZae|TRihGw3#D)%<`Yb7hRtH=Q8^7bwbvmYxh^+Ve zUzhPJBj+`-y4Q!{A*(sNpuXFmFPZD^3Z%J7|4~^uh$OBOR%|r5X7_bFpC}Ms)Li*Y z4?AO`Q0dBNgbvPDc)OmmqjNjWM*fmx^d4MB*YBd*VMSFi z;Ig$ujlRHp8DSlh<0o@i>TtrQ0Dm6*ZyKPr2SSRwWq6)LO=$M)w{sVhaNH| zGtt)-+L>F_#_L2Z{2QLkVu=UMqmEmb{~MA96jK*BR$|9c^a^A7@l7LW2%4I&Y(jlP zj^_@HBzj{MyU%Pt@G)*@pEYmTFNCcP7>qpj252T9Zl&uXV>?s6y5(g@Kx46Is1DNU zhj2fnLLPhqMS?mL#ni#_mc4!I4p!)FT*T;k-l~n6tj0~Sdv(hMIoEo$U{FZmdIB(x z_xsvbISej-y}*7&$m>oJu^o9w8F)LrG1`~O8>((8s~`T32WgVKm8e`1v9xD044ZKk zOYbE%UkEbqXblx8QuepcgWj^=Pu~a~i^^LxV$I+xg6t2&8T_b7^xIxlzZWLOotX72 z*)L4S#%7Z4wo)Hx!hLS3{ra>ezHaVt;-?WAn{t(UAS!C5j&3BsT1?SI5T=Y{95I-@ z+-R#6F2aHp9C34opfU!EfDv9R8*VGul45-@D$3 z^2Ys=G`}k=KEgMf+Uh{7^TrDk4*u?x7`c++y;7t7 zdorTuBQ?||%aPUl7ot@Og2HKhu~e3~ld>MU1B`0lG`p!!@j5d=F7Y~R8!o4f8J5e+ z9_tB5d;#aIRT;r*lvAaKNnd`*S2k{HG#R9oe=ob+{JATCSBpA*SQS3o1pI8 zuj&!z!-E2nk;F#);X)b@t{FjXVqB2WGN4cm=lY`&q&@wEI%e)1G4vJBEkqi(|ENNsUc*FS+Np%$>krhG&`&zYJ%5aC)3GKIwyR&%2EX-DWc;n3g-y6#I!$dkPx_G9tEkE$4x74@bG^|xBGrrA$64)l+wzeF zt8vR{)C&bC4(7J5zKr3Mt+_a0t)~0|96G;O+ona^0T*8^zLSv6^=_B(=$`r>T6VZ54g{hm&|a%x#mSx zYud^u^{EZ?H`fOm8jQGR2`+u#OG}elGI)Y`+Gz=eat&Oo`ER{>V-c=XJ(ga$3u#6% z)bF!(Xj~zXGvDEqF%x)Gx8L6`XGSq+dfPDA6)7;PWDTK6*Lqh}|1^X%@8~|+dq|>M zV4}v8`@N3!H94o>AaorOZz8!e9F^?O4s#eBTD9*ZX>m?@N7G0osqg;Q%d<^zQRKMI z*XgeH+HZ%J@^qW1m;0KQq_{98Rzjf>_%LkQRo(n;T>q@&RPvoIQv7LXx>?;$x|6W< zg20AN^QrKnuTASh&9Yy2ro}esNSWiP(J9^YCu%>j;WOBDkDxzctPjB=Q8q<%tKH04y^Nlz^S0$z-kF(9q3>u9U??d0Ge-W zhxA`WVg%FT3LR`@R=-X?*}#=5w#hE=owL-RO@zheA3eWqvD-3YD3`m55KH)kzz zv^uHg&&h%tLZjw;!u4kSilnDeb+ z3dYgYaTC~-t!F@e!PW1WFn&O1;Z^zd=z0V+BG5B@N!z7`sws@QBt@&xI!|TiIF*cNYQ3KW2U`9Y!EPy%Uh%Uwp06kgOTs<`ew9XA9W9O* z@peY#nDE%B=tM#{#mIwg*LPK$&1+y)&y&{W?F{h9Ri|xS*-ql+#oW3n!FemoSzjrp zfu&j=sJ%%>S#{8coyU)q_q0>?Lixqd1wgj`2sC!tTMf?e0TCBUXNWB8+&FTPj<=mF zA1r_Ub(qO-8kwQ1w($A-*Y?89*7CHeP5XoX9{=DTK)PA-0IQj6+ckOIv$%f=#H@Zk z^`?nBRdez=zm%72T#>HEo?6mI1|#nz%A0*(INj`L9+BMG!!`jBi`m*4mmCcUWM@~N8u`n@H)#+C;qri+D9`_!+a_mwY$>~-@_ zps)HpB<=`qQC{yAkU4y|WtoPQy=`_peOBSNirP1P@T|A^NP4DP z7FzM)RRVlE6}pY}K=W!}ENmp}!A)5XQ2u;epaybh;xyAQ6{kMP7YkJTKJ5IelkNmN z^;7Vy-=SDZ=$D+@pz-eE_3fDNL#G7gKGx*X*V4ov-vxhdIC8QR=ou6l3Q-Xn`Y33} zESQ}*J7Z_)?tDws!9jjEBY&u&c7JiUO6nOM^MI$mFy6z6!iAVmc=cO%Ok)v;$cSt1=g>d$ zGbE17r=khYemkO;gJlyYKKnk;oj!R(&ZRmd6kQYU+mFeUBf0r&k^R+bW24|Tn?#|l z)pEx2em1$E%VjH#{=q^_6Tj@H?a88ii@6p5q0Ri=#BE_Fu=v|P=W#!xn0&AYI$q|u z2L}cY&|U3Kjo9M7If}Yb11&9%8S0l^Qk+C8?`QUEZcY@m{o4Km-d1)&P*h5-kD5A| zV8$Li+BWoY@)%j$9zXPIb_;klz36fH=Mw@|0$#<4aD?8{ULT5rAV}CcCz@ebvVP_B zYIk2KwOL+hY?1SDOwu~@S!c6cogAyCU4Eh7&L0&QdS>NaC6`ZcJnS&TXEzTCI(vVg`Dn)F^Psbykx5$IKDEG&EK0jtVGz%uZIDN(uy z0+vy?A)nnTAJf^xsmqqv46UU9>|GTjPIW-ohNr<+=b19k%GqZ+`~=EG^rpGX%+m!- z`ATe0KELtTI5Q3zJ60bJaR_gG6|UP0X%A9vY7rB&H5G4L4=9BuHpVfQ*k3$s;-6Fx zD|PZRdTK>aeLL?*&o#cdo;*-7j!w$z8?HE%UiKM_IpqhZ^RyA=eqF_03`*MGxU>Uf zzA)_+J|m92n+HETY29NnZ%U+4SIqPItfc>v@(1nxL|IJ?I=jtP&}L(6JMg+DV_rMs z`hq0g>N~uvuPT4U$ntvg&+`G-3T)q_?`q1ur_RhQ6Bfa(DO%}onSdtU#aY%PH^??L?aJk6d#te)t)#6Aypns=9; z$ESxWhfGKUb{+}kde{Zgc#<1-%nOBw>29Ts1$%LB-8Q`U*LC;F1Gs_*mugiw4Z91O zEkuRQ8cA)MWaM{XQw^D2{M=oM?_wMy^kfcX11;+{o|0Mu!q&;I=I3s2?&%B-((c*D z5RViN@wAtm$ZmWyhjlLmG!0wyXLoH4q`fjiX!(Z^XCO@ppx{rN(4{Kr#u0$K?J~g4 zN!2&3u&%~VVh()06iiW3=6)>Ks(cskisz`_ETlvg-FRi9#FWSok+i+{(I07fm^*87 zNV|7=Shnqp5~cC0e{lds-+}RJnZ8$v{YZerabdM)#G}sFFdKj``rc&NU=e+t>ML?MbIBH6R=M3(Gpwj{KTAv;+@wyfE* z&7_5jD9U6Hg=|w1vJF`#>tHZ3!~D-3zR&af{-4+Hyk6tnbKalNx%ZxXoO{k^y9?)R zf}eX;scw4lKVl_c;HznMyw=`t-4Tpjb$Ge5e6;gONkP8T8i|BT5f{7Nj>6_gkbz3E zhN=o~oN%iye;~3w+}#U#u}#xz&b=z;?1P1Hghd~|*O{Dumwaw>?A{zoU33n7ldo<{ zzv&(Zj{myZb-38QMEN1Y!f(niEfin=-oncp?fv7lHOmaXw|wW%)5iITmS=@^r(`?T z#N$Y1zj(aeu=Nc!z7=S4@8baHR4$d>s}2`Bq{YKVL{mS|tidtMo{g3ruL44ZYOYF_kv6L^F?3Qr_pk~T0h?@?>ak5mj>%=;TKyuP znOu!kTupD^>KtCxc*y9;4m5m#J#)X{`<9$xPdph34~L<~MqOMnSLBLU)q2v#q;dlLKymWoqwraOViOO|deS@%vO4o7#8wpaX)ycvd zdwpCiO3WX)EUFECpT@|-;TXb)iw)Z$P3;w8c^~E3zLMX&t6MZ^C>XP~;jg}VfqWkD zG^51Sq3?4p*V<^r0%>FysIc1Gf=SQq$eZ}5=^mGKme4nTm{ypl-^DhOoKJXW6K;PI zXuWzl=jXAc@{O)QT3cI@%FZ6YJEuP!|Fdo(Tq*Q^E|D~9Mc@*AJ&10?=6v+p%`jW^ zZ_55FefQ(ZMZc*fwXGVjj;?xa)@DWL7+zx3&g^+ft!hcPT>L}Nyb$xmd+L7Aa4i=m zNAA{a5t27cdY=rn8LCX5k#9LNQ*QQyEb(}KvIl;t2?ck#N$enEn5^yM_>JhX7P>rr zO1$L9i$j+>W@ffk(IjIR|B+Qs$7ia!#`7e&`iDtRUH5lg#7Bbd_R|ZQXG7Vn2LpT3 zy9E{)SBd6|4g(P&w z(CqP&4;}`*wtG0Bq@sjC1Q}#E!ge0i*nvanyb~ao0zW9<=cOG3y!N03wS5@m(hvkC zGWqBeKnY&m|A|p(_IVFOp$#4OaH?65%YYvxk;%L;!0QMK(0Q>Shp<^H0bJP-s2~F| zIN){K$G1T)3x1SDCJTrIUT08%c!5%mfh4=zW+z#lSMSQzkL-N#5E zhcKv(eclrx0Cfc==zhVpN(s#fp@3IB0q|Y}hyQ_5X!d!9&H`SyeOw9T^592FWU_n& z;JpqC5U(=G0Y(kc?DI$cltd&1+l+K}U5ZA~ubS3Pil` z#3+1NeX{sVBR#LQllJf%U}M_qkZP529X-2%t*R9!ZhnKSUkq`4*zbF1k|!q=X6^D$ zS}gAyiuu5R&~)(Tn}r5@FNN_r-MaB-X}P;kU0=lKROWtb(n;|h5mI~XKarL}U{-M8 zx}+LPrLh>|^P^;k3ZA2=qr6rK+j(>b#krUB)KC!;db&`eJjIC_Riv4hDt4#W%mdf+l zEm}`z4NaL}9{7`!zg^1x^Pu#f#j6j=UTf)cwgIDg4;7`p;Pid^rHMugO!YrZFN`km zxE+7Fv`||H%PRPC*3bSAZf)wMiOjw0**+ZWH=?4JKCfk*dNJOxasPBdtdW-E>4``x zAv%tqdRq%jGYzi=8;8B9Ov)nZZFXui6+Vut$n}&;W!wMpe$Vvc-FL({cH?BKRs-H| zR5vQ*9<^_$;dQ3nc^#<^QJWkoOVd548AYwd!+sc5VB=%`CFnPgXz{W;waLXqJcrYT z;q-g0&vXYWx8!ce;%|zo|Gcl*I~qU)2Pvuq5>v@rDJ>F*Cz@HZa}EXQ6Lqq#4%%v$M(6!f`l;+*2W z`si59R-VD5mzZ}!THMQDgPtkr|4zYQpE6&p8yq@+AhP=ziLNgVCUWr6nkvmzftVX^ z1D5V8Md_IrL}$H6p6>XCU3e2I(p(pucZXB>8FftCts7!K_6v_H)xz1WJOf<%u9|;; zc#>T$T_OB1Rh{pBH(x(49clL)XTra5ZI0KlYd%RDV@y#_#5IMcvF-O`pL375NDf=1T;O2H=7?(j^Rel( zNHe|h)64{>+y}U>uR45j*HHu0CK%p*z|!|^=QXuf`oe)PLwYu$L)_lx3(oq2{&MINFy z<`BIT#mm4bsKs;SmC#p<{M#Ak_F`?0V{di4w9BngZ0n^ePA?KX9?=Ls(w3@QLNm?`a*ei`_%k!o0Cq)$Y|MWc^`IO6DgZPuy)5un#V1P;C;ECxQ zD|IhaaAo2Q*du(O=p_FL`BpGpC4}Xo|JdtRzVm^lzIdVZnbl%ebS-9{N?@is$NsYf ziB0T9XfbbRi<)8g^~mFYr8m_)4yhtp#xZWgel!X!agUsS+tE#ke4;ktIAz6of+7C& zHTpD7&a*U8?{gh%VJ6AHKM2h{O}x+Xr9m8teE+ypF87+j44vka>f7&@Jzn)ONyTuT zT+_b2fn?4KAnUN8BqX=dp56z`aB%{5zJV^;zA?{EI#oyHsDw$+vvC;0uL~^19yvEg z&r)xld>B?L7s>sFrAFw_ZJ8rmsU!1;rd#l0*XJX6ADmv6ciEUv?zDN~b+ zQpJTk%H9ZjO~}g`zDo{68!3|p77I!h8?Ng($Yi(j=}>uV3M{YbSew`_ELOFHtUx$ztu1hUEh1;e_xHmH5s{jiNkP3fJ9#cn^2hPjI~#;Jwphk) zpHENkGnu3fBp+rtB4ia&BKJJ)`C5mSPn+Q3(PX{gu!5DE<<w-rtWw!EjoT4T?acLf~nC$LOv1cwl|m%xe= z*lHI8dO=X}-)xZ~Y%lH6KLzwcpyI#LL)c#0qelRGXsz|%==auP5XT;U9-xQToO|?t zAz&|o>j(M;3bt3VM_&!-ML-3Gp6-8Eo1lVOKZlP*HV* z48ryjg?{Bapobg^_vpF*0V(vYpafxiX^$R?zX`1a|J(II*k0PBp8)jG+Hj8^+VSis za6N6{5W@Bng??2K&_m9Gd-Rw70V&t>6_g-sKT&M8A=#7h2(WPma!6o>yS$_-HgY22 z!numGAIenix$g?a@$Aj%V#3eu8)K%npM$z@y zWY=fYSFF!b3My;ihLeOt1 znjbfqo?Wr6$qOd7V3*$mK}7Nqo?V;aJewJO52P9@z`f~hjF9$_X8O{L6bNw7?mtwW zc&0@jXbMSquPy9oO*LjXzly#$tLn0f*JVK+o!(XqA_Sfvv1_}o9M%?d^W#Uq5OflX zzW<4^x=&z5><3oPn0rG_le4vU1pT`?6Zm_ZPL(L0;>$Bdum~1@F?%&_XQ^X5?lJ))5#R_vj9a z#2vnbEI#WYERSh?=iy~as@#y?5%Qq3#uZnLxLg>stW=U^H8I*!W;nBy-mx)Ty8QdC zL6+UOfO}8R91FZ_KYP2WHRD`AU*e26;YIW5+#&CO_pdXZ+YB+tulu%|>NHf6Vwap|A(C`O(*gWe_dK`w4@h`urk)#Behhw53=axgk}G(yE- zeUgtD6aO$uFJ#3#*edHSsqnAwt<{-3Q%T4N@t@e@QEJb>c<3{S>$xIVeix28W%Zs> z6IYb7345mat&priUQ|aEe(z=Q<`(xba5^U~EGJu#Gs>5uWcig}M(~T1YX3d8*W%0! zVzWp~PTe2e_Z}q7h4BZdzQHDG9pM*j^yRSebi$$4u=%jfYWTWu&=j$D%sl>n2d2!N zQ`euDEYV-Y-}bN|`^>G7rUK@+zWqQH-g5I)kk(i8=N{d3U_1h{yL?FYgUIc&<9@{z$`*#&M^h%Bc9DA9vze{&mg`?uOg_Xh7@1fnllwXChBzj8r$MY z+4-Pnc6QU~X?f2p!tRX^I_ic|y+kWV&Bsw!k<0V3pqO;p6PqW zZT<|W1t(5XuU%Pb{q6jMPU-@3I;C^yvO$-$d;9UtXpuJVv4D>uK5hJ0zhYN9^}i<# zCH-l3l{V{9IhH(g>eAMXe#WnoJ1>V@=jRs=gy~fT?fAL`$jUC&V5=g85(qBHz&o4p z{H*Fx`$wZwU6yY$@qF#V0cX!k;lYR2@uBQA=}{svjn^C2l`?o$7vnlhB&W~o#pm*u zT}9YUozLYFksry}6A&(e=>nGz%lC!VCyfIcWmD`Fd$W;cRoFX@q@5{R$yFpY_Kx^) zqv?#Tl~ZZ5^DV#AJQ&3#Ug}Rk$o-&6T$p^i@NJ{;qGDcZM4bB1a;Jp>n68ie_|9wZ zN*QUF$7vQW>4UFah;hcHCabNDdC@LbOge|^cwbkbuMh7OKNdQDk;eA#=_nygw?R{! zr)dc7KwXQ(-%Sfzr#TB7XVKYV2B$zu^xq4Do){yJAUS zv!ZF|1&qIOKT^nwyVEb})6U~7k-L-Fr7J-LBPrf z;pOgDANHibTCpP*pO!c=i&8*fpMJO26%pdf%I(m*7FRCO^5+YUIXNHa60qqP_jhX` z(N6a*ldxuEtBm}#)@j4~9?PX3@@d_~6CqpIFW=Jpa6^%Cu|EE!`P=ADYhUKzh0IFY zQWoXpFSGhG%`aFCgRt!?bLgAI>q;&jmO5zJU^&$D`ike?(NvGxPa0K);W;#_ zz*Mh1ytJcxG?ysLE`c{n-jz$1j`8^Ff~g4}ey=%G_TB87Y~<(LvKzc5@*h^)b7MPY z?2n{m3I;1;9biMmkis_=v{>PYGq@uD*L+o zsFxNQ2dhqsKm0k4^w{w;DHRtm6L+@rYHhbtW1S_3%#OfjM?ABDkpkp?f}TvK?Ge#> z<}9=Q0J|C?+ju6X1+9Q&IFou*`?%e^DOQ|KU}=G|rgEkAhTA~?Idd5T^xoPNT7xmU z1>9Z2P($4;8-dpn{B@n9g0Bp+f1J$eI*07hUH7|^?R;ABbjt$ivIpwn4}O*RW{dw~ z-)kv%XY?Yxo+v zjGSdV92VHXH!qE$ZF2m+9JaA$c|!9@frjE{E@^3yB%*s)e=}E*-`LZr;+EO4`rVUx zgan0`Rs7eeONxk&+cV`}0)L)NV9odzGphwdettZyWW2+4EH}22tet&XNU-6+tKYXP zmCmq89=aEi#d;>;U6iP)8fL2K?KP#6qb-+G52x3j*Zevy<3p~A2^}c8dl|=fWpeU` zNQb}l8F%&aMJX9))H{ctaYb;!>OKwqeht&~%VBqdl3e8RS5gShs~hSIEn=bWoL}r)x(~8)ow^|W z!ex5yXxl5LlI)szSD08y(Stuv-_W{t&FxsSn#k1!b`m%G%rfogg9BGDO~z+rs&Lj5 zVO>2~vckyn)(yJgPZdepyIT?V&lR3V&0{P!X5P22s~yYSJR4WqJj(fefmJwEMYgw| z=zG$0qU-CYvR0Ljy5(GtpQoCOYBFP9Ml5Lu<#Nw`50$9O8YJ@NNf(2a2Uwuw!`2iq z%O1|KTW8a}ggstVZnTO^vRv)^9bkB;v_@%mJVN`Jeoh&8=6SVs9yXRIy0ydGnUclE z{8Ei+Fvx7CX$ys%9l3{|C7xh*D5QOSy)tUZT*=la9oy8XE4OHHEg%;e^Sr};-U4+z zvkX_i`7PT_DY$5%0TwpW5Z*utlpjHaq3%IioTeT^4R{~PKZ_8+)jPEeJlcR=$rmVk zI^1D1Vb4Kix6M9pkxYuOf`?%|t3!da*X+o?6&O&kK~7HKZpg>*5~1?vwNpBsH0}Fj zN>oOZuN=734i?zd)tv6!U3xh&QVhbbEn2SaeXj0}%A5CA-ezKsX%tdP^h(daPvEdh zJ|Z0IQDX8QhY~x1#Ob*$Z>S-Ym*hPwoYI0wSG=(BhV;JWmrsPSFWX{w7|ab2p}p1~ zb84f1m*A&sl0x|{F8o!hdiSTLBH(G+&9!DmI!GpVeTM z==doZ-ML*Ty7=faPu@QTCVG1+sE;bA_Hgk_rfv0tT@p&U#^su1MDC zn1{abUq#eHl7XIz^9v0lg;N|CpS{JnAyNc5>b77M{m+jqyjx zFJ(PnQI&INdCor;bc)D~)SJ@bkL8h8gJ$8Erp}<~_|MiJk@rX3h%r3tNWKdbG-%L}sbC80 zO};ErLq7UD6sE0L!2_;9e1GLiT4kg3 zYA*&qM$VklIRC9E%jT88Fr8Y@CYX};-?`8r@a@^$OnFWhCHdcyPejPi)pt(0Edi_fNs zf7}ZZBW==wCO$3*xIwqc2Yg9!o`2VA`?+{Yv-8s5jhs;Iu2a5CjUL1RFzSJ63alCq z{)S;kM{v1V0zmXe++uXLmcUF84C25I)g=UNI<(|3np=HjID0m#lGXUjdXvEG+e<6B zNmE0-J8ET?OS`1PJd3p|!Uy%tvldrVJ(^1bTO}3Wu%?;mdsb^{+%)HLPR@qxJFJ&- zf*+p2t`s^Dm@{w{qHBMd4;<-gpRdY^e`I(|;fyk4n#l8;T#d`)>G#UhD;NKYUl0xh zu8#2B%~8-z>y>`-#UI;n#-fsU{A53L$;RBQ?~SYXagO^iw4L0wRUs8@Q|yyrSc{0ikV#dAZOI@eAJ#=I&s!2T zdbE|_E^%VxN166mqTH0rKQBLEQKw1-%G=yVjBih4D7X6R;79y;(U$W8xZ5535>

    @S-Jq42CE60+>#q0fA})<`~dn18_v0ayvE{%_C-W`o`lcGD1H>AKqFyS1l}b zE??gN>o0TRpWa7U7!gt)I{H_17u{T!p?w~)cMIG$9M`i;1}3CLOnTLuuBrNGNIQlW zTx;jU%b`Z+>d0N+l3lEojm<-_3?{!s1GI#CmV61&C^=@&-3!@;QSSF&Z{j^`Rf)SX+^;K7j5 zsEWqkN0-HknpN4ISEdw( zv)iV=pYT9%e84aCCZ2yEOzo7ieR(zd4#&yK1;O5ee_oJ#%(77LO~<|*f&?69!udwvt@%sq5R3W$ij)>OcJf< zMoR*_;uqE&I$jp7$UrSAQ>TgGtoh3|BhL(Cd*n+sh7+dhlx{y9Ebid?Zs_tUUj6mT zS4|@+_}3r?F>GX^)HS)1r|IwXFW3D%9-l^ZHGDmc&~z=cja@3AZEw4AdktdS)62uC($Q*DI4+JygHK%TK9Zv^l#TEv?u$&{_2* z@lp9R-7o!`nvAEBA7%0V2h7eYuguEfKJ0S0O$BDh=^Bq@Eyb#jJoerBSk&z`PU&E~ z%Y0^W(p9kM`+ZANN=61mu!NzcfEO|7WXRcQR0)RxE-J(cU*7OV78nHKK{nY92k^*U z=uxo1Q5t06tRfG(9`rYiFxl-5f#clCU*~S{=iC_-mbW-qdoVTexyGl@)xibLN?SVM ze`Rv4DDqmv$GT@!TL!0GOaunaBxul_8SyQ}!)xD~za>Z8eW5!(kCPZZw|LR^w2|Cv zt(VQGo*8tWRr4o}H@fz>vv!u>cJ1~eH2vCD+frXr2`#DO0ROUiuFq8VbUEVp)yB0iqFuE{~;co^-FTsMEm_kN^qTnz@e z{=mm}psTr}#b*XZN`{832FM*$c5Pgnz2D}wE;93nzgVPas8>qf4BQ2#jHhUkrl%(J zTNzz!mRQ^Z){%{5%GwNk37*nKoOCN30j{+PG(#?vP8U67kslLx@bMTfVq1$A!90Gl z^E}I|6GCt>3dSNfQL#tbcjSoBMF7jjayR`3@K)HLCB2|Y4Fi=F#z`X)(BU#PMS__W z%!}1P^Z}-mttPN~jmQt{%8&5fBZJjYDnLkpt^F19ZWyi`1Fu0r?=EyWS)K^QJit_z zG9&Ca2%WSE;s=uxdEY(0VGD$SfZP|r1kz26zy~*hrHaBx&fX z%i^oRbiKsK%3S***y+5(mC2tEQ>IUwV)k{m*-Z}vP8$xI9D+rfm^{>H#-~#u0>cQJ*&&3|x9|C?a>@tzT zcLR2h=w%Efk<}Q=V*oaNZJwh|XnD$gd2KBduyq(jM0glZ72H}_<1C&8^#G+4K{yKx zwDt(bZY@JgjC>qkotUFepmYLQ%QvZ$b5zG?{p5a&(Z_+%0!wM)Q3?sh_-2^5Sn}4qd)dXJSpcD)QykR|F z>v;GaHlNT_Px)6kd5*i+V^ke9@=ys{dbL-PC~xCN$~zY9S%8zEFJ^DA0&SkiCXVBw z_^>)zv<7$`L%~D94MOfu`!`R(=8vMQv52tU2n7%V3QGhF7cvx&0}Qk+EE0nlBY+n; z7{}nkLI1&_+rWebL$?tIC@E{DQ7B{ubYJ;>i#^8Mqnq2Syq=`DH9HvWIQd}%YC~7$ z(kvp`xgcBQmc5gWC!*YAa}d2mRv<3JQL02Q$MN2+1|;a?NlQ_)HMM14Un8zAxyaU_ z2b~u#_3bEj@f7Bbf)TjY)Uybf_6Im+L&j^3+jup`h!!nLQ&Sxo2Lf;K?0RazKisbZ z;BJG40(?MjO62x#PhN28cyum`;6kzFBKxlc3ltw9@`tQUAkB%|Kk|PvIZlFVg6i%* z25CY7_Mg@|_YVPH-+f#i04@CNVW`XJY$ zFoHj1^5-DH8?uitG z$`DQu@{1G<`a{7#K_NfyLnY9D3dr>!h>|Gy+gX4|fii?c=hoi?p&ID?g>C?k-p92; z{=a%73ZC#C;4ynRHFRzR@Y_oi`~eis@&TxTu1^c(hWqG#`;lD$kKM;1Ug)_|5~QwY zekFU9k(&Jl!Nut}{!H8Y=u{X{;ie|zyL9+mS;Ho86?`OHOW>RBS7BkEil@7tyQ8pk zzY~w8u!#6Q4XUtlPIZ&ceH?#~ZW%XGdfIfys4j80E!5Jv@~4Foy0-SDu-B(!&4qMj*{Efrub+bt42I<1zaOtVvpZ35_8MlYZYG8rAy=8#ilgz-$rnTZCJFVIK36_dFwQ4##yb6F zq{n<@5jx%s-S()hv zGLIM8vjj~o&PZK04_u#ONKF45e)Q0bfSJu1E@~@|v)}sp4%0lpWH=`Dx)QqfjYkakZkiAqA{`9-2q8-Pz>oqyyC5bERcU!tXQE8LW_br-YS_`m> zG0)TFPbLS8NB%x9_|dRVdsKiLqa@(XC%?LL+Jx;%=MQs7AIq;3&jTFpCf_#~*GO zAFjT<`d$wh3-owR&#UEs$xT(No8qE|Im2=SKC+QRFBi*H916KRvPAw%;^xSF+|QCJ zVqUdUd|XC-X~bSnxUw6^z0-tS(!BE1mP0^d_2;(iFT~%u$FFTMn_sBdk+Cb1w|a0I zIqvLKjA1JHrY%F%h3DG=%_^q{IBZ4C6CNK)7yGljdqIw&K&5VDt=M?>KE1#}(HlAE z43lncY=k^D{`GYrI?3K_kXn;N-0J$#2Q;m|->kfkaxl>pO;jU)ndSe!h(bQ{SB1|Y(?7aRHwPruD@Rmah?}mPBN14pxQq7T_8Nz zGw{|kfyk4r)_kXH%nejq?yeeW3sJLGnsy7pYCq8#>VyPcp?5d{LS<8Wn`vH=N{|6UK)ElwkUU_yLn*B&m{WpDIBb;JUUK(lYv z0hL!4Du*J+evS@F9ZD%8n^NOlxXfb<^5!~fIa#}-f{)v=Eg6)D?_SjJ<`be;T`?0A zQM@nq!{*nmp8}A7oOJ2HGR!~$9?trmBN6cgAa9U+FDd<<1%q=E_GOJe1#7bOG`NK4Fovpvs%!gqW@AM!_S z{|skUogE)0&RMvEgG;>qmZeZ1Q|C|%jfpgR(wbYBh3!^>!w0XimIpcgehVkB1Qa7w}B-=X`oNbxS z<{MXLG|&FJ7j-p-iNWQ;oA{^c_Y<)^Xe!}!L}pC?1+3{9mwUeaVRsFTH zM$70P+`1-FE>7i7=0F_{s3id_WxXx>V$F4U-=X6EO{FqOTbIE9EQ)qUiuc&_h^_yPb z*l}}xbQrDk%i`;uLQKg_M7woQ{|$3-`+&Is=1%sH6JJhbQa|~2;=obg*!UY~3K_`3 zQB-!Ds*F*!;uo5N188KQlo1i{p6E5ce}qx$H5Pq*CF-e-*DA`&tkxpyaj)OVlUlZ4 zw>wtJ{8KT{r7A}izRC6Y@EW<4Y$~77sD^KmBxes#`2^&JwOpm9nhW|gL9NFje#eM8 zJMOFvm9Aj^d!D>RT#kjz8^$khZ&she4CcFx?rsb^9p=I`y1V0PrC(#yXk}l&j6|v_ z;+_V%y%Dk)kaJ}(6>6Fd08 z`LNXZ&1T#3A)a>OLxIfC+s=y3NB|c?vP%ExTa zGQO>;<#qfa+huVsq$m`(+?k7Mp_9$CPZDM{@c-L=x&NR>B+K5SXf+U+(m*k=|C{Lz zgzY8DB51V^&_iw#d-VU;6zG3kDE8Z52K11b`yT!OHBExBy+mn$O##qD20;If{(p^w z_UI!4J>&whM}K3#EvSNust08M;~uehJ!|uT9&&BiqyOL5AbQBu=zm-y_UQ5F0X<}5 z|KI5M%UevaF!5(1W^>B9WNGz@I>B)RD$w2ux$nVS=9C@2FNFX zTm+K2gkra5F|tdISma#~;O5w~8+x=8qwVo7l87kf7)yhDCP zlfrp|LKO+p3)akz2kuE^f*Y>Sf2WfbT{c9t4iqZa1#hkcF%A|Hh;E!gYgFV%ghSW1 zfk%^5M|`GiEoc4lq!A27p$$xgzP?_*k?t=23x%11Ve#@Kc;i{(S`%*^!Na$)6oIp+ z1f*Q{$95HjgQ$xUV4vGbeyV|PV%+KtDTfobs@H2~$xychlGQ=G5kLr)jBQfgoDE*; z##d}@heA7J5XlgPP5{K1SqvsW3@s0&Dd?JIj4UM72i7FJ5xXd8haZZMm;*ur=sAGc zh)Vj}nC1 zsv9}uwyga1;HF*u{Ac))aO}trkK&E3@xIX=lm`qa3~Q3S6s0Yu{vi2`tm}x8DSvP5Q!s%!mxm4F`IfkgW!l zT(!GuTRTYXCM4iNdewmkq)@jEDa6L`Ij=mz-8R)E!E*#spKcJ{6t?Ay3x{MRI3q9+ z;K5bOJ-g6@Ap64RWP!Y}L8J0LE;vr6Cow-E)jgiP@N5F9QQB=(9*|SA@|LMj{^fY!TYh*^RVG(!R`?vTNkX2lQ5k`gQB)Z2SabRPv%ypaa!nM~# z&9x7{xQ#nwYWK!-Y~?Ye1vsw;c${cRW;1>-)iS^{WW$jhS_7n7qeKugsD$??S(2#o zuB%u6?o1_?fJ7@;U>$CF1uu3XLWiJ^1?CrBAGqP-7as zEd(wQ2tF%n0%ym1@S(R`O8%01c_R=&GzP>^wK;n|3&cCHMo&pwS-iUAh!=>Uy4BDG zNz)Sm=~}Nq+it-U)&rdt3weJwB_BiVKTpYjCbrt;ATSXZNBQt(iqkpF|^t1mqr4y5`qWO)9L3cIPoXsN!3Ith!rE*xHZKK1eY&ZJ!KNc7Jh)-KW~tB-2%q|b9aPDU!F{t4YT(R*I29~@!*>fv03))d zi8!vnzvQk9t6bRKuwKW;b`=$wunvsWNCAQ5wIG_iRDvHd5`;PzvLZ+{zFUAQSOju4 zEHW)Lb;)yU>R13C*M`SbDIiGWm|R?wZ0IhKuI2YUHi7M^j^KWWjZb-Of={_9W5pD< z2)s32@Z8?sZt!Hl+=Re6d1!a!J^ZcO5c zT7eM~_7ikjK2U8z{l6Rr%!0s7*EowI=ND`-c6i-V_aR>IK>=wq7~R2GWHZJoMc>)J z9xH$HVt0)T3_~+VBIe{|$reh6HQqmCYm|*JEU2K_+OEBP_X}J%>@g-{XDcu~B9%0D z(*~W7Tb=G+sNzS3zv1sIL+ku>dvUwebL5rVU{Q`dW;Tpa?OW)g@dB?5H_8uhf<~|c zuRIX^zS#9emV(Ji9zP(Qt5(*7a-4mYoZ2Zkzjdw(T|-cDtZEFiORh=`cfxXzU`_lg zeJ^_by3RqJZ0*8*wSFk<1Rox)DvLwW7X0->gP$9!&kJ=ZN3|M-5TiAC)m@Nr2tw?ue|gudGR!DO8F0tlYg^zwcrc1FRS zFf!!e8#)rLK0bjRnMU+t)k)HVXeW1MkP&Zoa<`{z2jTRiRLju4keEQ}cypeg z+8{j7tOAN&k?0+#Q1g;EVEY*Mkc@9$y;8=nH{Nz^joTxr0UC~8`cvHxL!1b63W_s? z)?BqU?tx8(*2fJf^76@c{zd&btC=V4tnYa9(5mNO8V#jHq%v!pq`vnr^0ewb9(08Z zkBzf$O~Nuu7wGiF-kxCFe5#Du3E^W=T7ci87bS*{j1TaXGAb`Q;ou=7(a3^M?l`%H zyRpZ|+x#2mz2pxqoCq1A^efQjDb`=IEJ;oJ=+62VpO^mPS&;8(ynfKxaqLJ`1&hqe z-pgiSM`+%EXTN`aGt|T zx{ZfRI@OPJ`bP$5Iu#)o&_%k~lu5*Dw&0U?=hXr;?q8_--~426;&60(Nsx(439DLD z1w8H%e2Wk#RKI(v)nR!2LBpa~6N^1MJ@dBxKvi?9{C4qFQLmbh&y(3_VNR1n<9s9C zj_%3bell)~4+GIP(7*y}Jn@w2y9GAAtqI}v3!{f(4W&0z*DFO_?3r_)P&(~hm6TL2H0u@2^VmwPc6Tv zTfV{0fTjy`ioW7M(MY@(!E&v5)Z+<`*B{NJjf+j_#WfZaM2&9uyKo$2AKVf2zEuJC}D8P?ypy-aN?+Upxg+^xy|DqN&^gt)op$nA_SkQ1Txm?R|pj$}7&sF_M%R`mJw z>68xbr>SnCae}z(Mk^PqqKyB|)<0L@YBOAPmI_O(Ir{E-oN}?>!qq3^7f9PrrhaJozLoLb!KHL_1h1B`)-<=BLMcr}J210h z?-%v6sr`9Ui#=hI6sD9y7@zojq&79THOa^XFPEl=4eN$aHQ;oZndsm=ar~I#S9p={ zQ-3z}5zpaaPB_N&{NsufN7a=~cSHPcsG_bY5>9nbXRA$2r-d_VE9W5kOYWHXu=%LF z6mIM?9Y{H^cBql#?1>gjj|?UnEBtQ7m({9d(E(%Xi>yhD;jnreC6+;FIFyk?n1JSaQCCYv>PqU*M2TU0dpTe9gnJh<=si&UwU^9B}a#$7$8A&KU{v8@AI+^_nVoon zY$#h5Gi{V0flZK6kyq7kYV@r)YQ!zfHnd%k=1@w#-qqNq6PMFZ@*SAK^u-Nhbb587 z;&(JeGoBfZ`(Jov>S@WIcTMSSG91i!&H{9@=TBgKlaLmd;;tK3Cu*6Pfe+fn2@oph zsFK5|UUqa?G^3Wy?-xYbShXG;4&(3JO|&w;UU(55U@drx_qrp=ytz+4-Ni=Svtm2l ze3D!7oo&N`RczIm$lL~(s7l|XICyi)$rv})z&G_v!~%bFy4MDNE9eBex*1tzBPwB} zV%j203Q``4)s{^$?{fJW z?XqNgCz@Gva9BBrwy#xHR-O84yEB?^_0!e#(AZ{30RHDlC;gy+G{*eQlXfAkk}7ByMz~=9Qzr>cbyKDT;+5+QIMo34BUF*@AU?nFXFa z&`+%qS87*#NeWJznPG`bUsioS_T;K({c&Ovn>^zQ2z2DHh$FqxN7Ue{pN)@vx7Bzd)VSZpTQjD3T?8RGBwBEvE z@{^^-}zdXHyp&{ux=+>AiTvbe0^wNk!s1-w3pFwavt zz1@U7(a@@x<+^cH?_^x0=vU=?-#yTb<~PNFzSl z_5MR<72@qnP#*I=Nx~5OR`gjO*n7kGnOg65V$fvs!!R{GT9xDZs5)G$w}NtNsl8ukym{96oYYWzQ>l*zJNGv&yR$D zD;f<;Z69J~Mta+Eg|BF?GH(;U>s^RW-H=EW^z zrrI9&mb>5vy?bZelfTHFJmn{XHJZyw~{eKH4v}oxeA~Ok<(D`x>8c z*25Z>yiUY!^@hDHK(g|cAaa6RVF#qpF2Vhpu{?;aS=l6? zMeIsnXy(*UeiqoGI287w+F6wEY=fE%V=telpK|Y?VB{xuR#{IL^?}Lf9E#o(znS=a zzit+pcrhwXR5c%T$YKq}gk7CPUogGHCq0mzc(#AiXa&|}x?z``2?5B=lov!0;_1ovm}cz}!;I1Shf;%aX6hkisAL`aywoE|N|W|8S%^n&rwn_sXex4ZWgC~xC{APiFOLdsv`f23l2c#s;v zaj#=8$r{7UY)y#6GFdK->MB(_sDSzp)KJ3TP;fF?ryTG;+Q$y=VH6sQ(2`76xea(T{sXtA zFoHj1vLW{<;2IK&vhT7QY)xHjRvp@-I@H@!uAP7nz)XFo!n+*>C6N6|#4TS65 z1$fRLP7O(pq35=jD7Y5%4bjJ-0`OC_f&9uoN=2>5d7jyhhwgKXFO`|*QF_`aYN^Oe zqFN0LjnBWPY(KcfSkH1UQYdZW<1fXKF-cvw*k!l0k`FN~dOOwg`TX(ySpwdhjBGbd zU$%&9CHUe)+=R>`Ei^M00!+E}8Dp+0&W#nz<{0Q?Gc_17Ih>^uaMs#H!Os40dvy!;gNoFbIK{259i@4oJ{8->gI)y#-*Qvc{SgvJj^F>h2CLWa%j?o?+9P8=`8LoV-rl26IJQZL) zpbcbZgUHg<-zPXS@{g09pIghxN^$<&*2%rg$uE%?$$bDT#YuM|;Zb*66?y&(ZM0Id zfhPM~m}59vBH4u)F#IRuXpz9d<70QsK4)_eG9As;ER@KFJ>UuSdZ@g-W4TH`K7amH zl4N#urYtGdU}49=Qu2A`>oIyG57?#v74`q4>pj5X_` zoafxnyXYqTU|e-T<>3t(n@W^Lu&#;%DWPaon(yN$wl8a_K7R-cX)5{UzVQve`KTpO zZR1ULEe{S}W&~+;B)M$zYa$YH$h6Z-`vT9_8m5mS3XGM{6O#2ao4@5h29qQy2t+N| z!M0k7MsaqI5cp)mkU75|%1R3Bm}&-hR-UbvvYWun&}qJOv1T&U$5I*}=RX7Ue|ypK zj~uEGjsx1d-oG+%ZI~V%u~V~X-#SXxN$Y#KUke}imos^95kfAVIz~MPoL+&z3@o1} zNIWL$EoZR$NAzEm(Nm~4Ei&LPuI|H-zKlu2%ts?r42o|yq&P(DYZsiGwB)Xv5J8eY zMBXF)cKgWltM=1JM&ARy+ka}B)Qt@$v>bOMR49{Td5qVIgXERIZ{GexFp8lpgvn(V zzIP4vr z!oq&EU*;H_w)yh*VEB)=zh7{#a_*cY@daFu-%qcTA4XzzHliI#h{(8uKXwg&PpUU* zyD{tUathFZ zm#ts0>EI~1hpL+{Rqdk;53i$=Ja0GO zKW}}{fa+028CQQQyy@6b@5OMq7+85Rt%oygZS*EHDkhXvq%tk4R!?p3A!3}wv##T8 z_h=ADE7l91a$-LtA25Bm7eDY5r%fFOOjMQ}F$jGf#-sXlr-m_0tfb~!_ZI%}r-K!C zBOha?LR);vg~8p;+T=hvxv2wId~wufx)c(#{ETtHn9AhgjBm;4AZ%hB0 z2jSA#^? zEpAm#5in!TB&&tWyXLbd4q*}RP7m{{o;P_$5sd_uN8w}%RnFWh7M!$SFuI_3!_}a< zLvBP%X!rsrUV(?Uztgqu5o&n-1O?;FKR)crQ=cT9X>Fmrc#RH=PxL7|)SgD1#m#VqNXdiFeKt4^k=Evbj6UMM1MCM1qao9Ie}$l@=+-Bgk~>iTJ^#O z0}gO0##J*9yAdOap6we5LsRxNr8CldaS&>D=`|&EKeOT{+$&4qFidc<`J@%tW_~_` z$-pc-&fdq(Kux$6-%q|7bEkFFGEUe<&TQA6f4+@$}8?%!XkhicMxIx!&||%${$LzFzZ2 zQxV6($NmMHkoiy_+#c?_Lyh2)=jF@iXW7FYa{e&V!kU_n^0*8Wyyk%ESosDsHfS zs~G(@M546mx9G&9VQFQnHx>tva|1$c%9BdC%6oXhFMg_oz7deTKR=tnb5rVbZ=dA* zD6QALR3Y=n$n)AQR?9!;6rQPdPhT>$biXbYq5gYoIlh#SC_+S^`X*z^$+OW|g2m{l zr<`;!?Xh8-NDc;{hcVDw)pTSt?NA* zvUjwZwW}j<8YnF6Sn*0XH!TKG?f;o!;#FEHhA zod91NXt>(`|I5c>S9Zn6&X{8b-LCk2|ACj=$IdwakJ#JQ|9iv-@Uh{ymwZC(`01Yk zeNYFy#bQ@>x&0%2fR7EWz2alXnEwpm*8*>`*p*%F&o6)vJlp%n|N0NZHsIhi0Ry)Avb_KE&|q(AG;kH(s6A&PfIu;&>Vev zmQz@h0QnM$n<-5IdX{RzE3|_bI&z1AD6c;?>7 z`7qHs>U<5BW6x#tI7jM}j!{)rfEheXj`7Yue6(9lHKcRqdUL8MGRoN2eOqbP&0%~_ zR!4$dWGL7H*`w9Vh9nGegx55a$gJf>e1XFa9~)9e`svqY z8jNcO^O#~bqyN5)45Ju$%N*KY9Rv7IgH56<%osa#6NEx-9_S5T__>7JYQU7SxH3^6U{lnpGcAbVTV zNbjgHDWAou70Cv+qq>D5)8pJ#IIa~WGll#s&xU2^?9ToBBQox-sE^dX;T)xtgykEE z9idaIM!CPEbpy(ot{$?zH?zz^Xd+UeSAAqhupI=XG31+0`y?evQI!FEf{$*d1Tk{j zu~e=)=s7L4MiCHg&XP(mvpVnt&j%fo~=tS}a zt_f7g++s{9koR4_M|&>w0ZcCctW~<`SNLC91x>l#vHM=|@M6MMf-mL{-MAJ8p{5?e z)m}WY`0u*e6G?ia5^)zekK&$?2fJ2| zEo;wXg5gY%ATB3jVUPwo`^!QJ9l8pI-xvSbNj|Qux#|0plfno(IzIw+3xIC91Vni^ zHoKWnHv2CZC)$Ncw*6wIp2YSRkTj5A5~H3re2~yy#X6fUF*@0#MT=PW22%yh$}I2n zi5WqXhlxdHodrb&hns|{n<`%#$^Grl47iPy`gw|K>$-<(`N|L{u}$ zU#EL4-3JmnULnT)QESyfaS}iG^H)#E!k?!?u~FZDh8O%IT>5m-0mpgtHUpY*jdnkL zD&8Bmv#4vvl{43HbRB#vi2qOJNrNN#vY*xPh2Uwdtk62h6K__HGV+*Vt*y17_uWc+ zm*@Cc=ZhYl;~hVkzbZogtM1p$IB52-;C7T+7ASx+DDEwvV|s*QEN`UUth?zxkdx?l zz*2{A=8s-;R}Z$O*Yawz!`E4#njPkP1i*)Tkk~#1((Ccm>nNq6dD+;Cud}LAr(`iG z{u*7&yX`eX*waI5ij=gScD zG-NQ*M@8kI!1Z@@+20t@SaRt~#z?q1RvA$3C!P5W(orkGFm%Uv1ae|Q`^(tMF02yks{6LJ`FavzrTFD|K#hdcicnC}e}si9PsY#xpz zQI=Uuwe#u^AC}934eZ?OHJObdP*Z2-aDwW_$tZ@Rv)n2XhiASk`;Lm%F@Z9op|fm7 zv+lWyGSV=q-6*QrouTz@h&6%e<-8}5_l~FVJlr<((RKD5shh#a-m>3TVs6c%KMc#R ze(*d^t*dHOjkMgBKuY^4yM@KzF0eR4QEfZ#ErkP54}Ud$#$o?~1XRGDYZ$rpJ`A9$~MaqrZp)0_DL?a>}bM zU%NyJhU1!k=AzWvrdMro(6DC|r%SXtQp79$PgtaqKoj>ZRdI|cZ(X}b3tKk?Q;Lzc zd!F|3nJ%!{^j8ao#E&i<4}8myv$k=Cr4c?H`s8m*r1q`JPFw#kIuBPghy1&aDX!f( zL1H*+cGDuKH?H8?^@NUu?oP#*`)kON);@IhMlx|TnLJw?ip`Yi*th!GK^j6{ON=dG z3sY$>=N|toP@!K)8wOnDb9}_0BbL=e{^HQCN~9#=)%ORGNsc3G2}~*7YexIU%gqK& zsP4+X+t^G+7~aM%^(j`+b3cWUG#eyQ;%A*H0q6L}#)Q|yNTir}0v}Q`{c>yA=XMD( z5mU3p4M>Q>R!DH&TRaY}5yD>OYoLXAh45XpG72Wj>!J$;9=VaWiEexAfNANa&E{8l zohz(8rX#D(*dY}zZsb5pI?ZV#3fI9ac- zsa(CF5!)OyjH|$Z?Ed-$&1XTC^^p6R%r)P05jG+Fm6o=;icNx17M_{9pZyY#Ia8dR z^ih1D&BvbK;)fcQpdA`T$$YuUFQUvy0j?|5@+gD!C(t{bv-V;>Hu4bZktUyS#ERCv!&wv#&n+!`!v!Nqvmw7H7tzH~TZA@lZp-)Sb@OQbCPHWJ)1Xn+

    p(BHO(wT;)X?SV#;`5iDJ;^=>O`&B_@c16k&R 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

    ;6h(RoNl=XYeP? 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 Date: Mon, 25 Sep 2017 17:40:22 +0800 Subject: [PATCH 020/108] Bug 1396493 - Part1 - Convert gmp-fake to use Chromium ContentDecryptionModule8 interface. r=cpearce MozReview-Commit-ID: JAGAnVuEGSE --HG-- extra : rebase_source : bc5e1e721478fc708affaa077ff73388fd312478 --- dom/media/gmp-plugin/fake.info | 5 - dom/media/gmp-plugin/fake.voucher | 1 - dom/media/gmp-plugin/gmp-fake.cpp | 71 ++-- dom/media/gmp-plugin/gmp-test-decryptor.cpp | 265 ++++++------- dom/media/gmp-plugin/gmp-test-decryptor.h | 108 ++++-- dom/media/gmp-plugin/gmp-test-storage.cpp | 406 +++++++++++--------- dom/media/gmp-plugin/gmp-test-storage.h | 65 ++-- dom/media/gmp-plugin/manifest.json | 9 + dom/media/gmp-plugin/moz.build | 5 +- dom/media/gmp/GMPParent.cpp | 5 + 10 files changed, 476 insertions(+), 464 deletions(-) delete mode 100644 dom/media/gmp-plugin/fake.info delete mode 100644 dom/media/gmp-plugin/fake.voucher create mode 100644 dom/media/gmp-plugin/manifest.json diff --git a/dom/media/gmp-plugin/fake.info b/dom/media/gmp-plugin/fake.info deleted file mode 100644 index 4f1da8abf7e3..000000000000 --- a/dom/media/gmp-plugin/fake.info +++ /dev/null @@ -1,5 +0,0 @@ -Name: fake -Description: Fake GMP Plugin. -Version: 1.0 -APIs: decode-video[h264:broken], eme-decrypt-v9[fake] -Libraries: dxva2.dll diff --git a/dom/media/gmp-plugin/fake.voucher b/dom/media/gmp-plugin/fake.voucher deleted file mode 100644 index bb133701c994..000000000000 --- a/dom/media/gmp-plugin/fake.voucher +++ /dev/null @@ -1 +0,0 @@ -gmp-fake placeholder voucher \ No newline at end of file diff --git a/dom/media/gmp-plugin/gmp-fake.cpp b/dom/media/gmp-plugin/gmp-fake.cpp index 4854364af9a6..f501da189fe7 100644 --- a/dom/media/gmp-plugin/gmp-fake.cpp +++ b/dom/media/gmp-plugin/gmp-fake.cpp @@ -33,57 +33,36 @@ ************************************************************************************* */ -#include -#include -#include -#include -#include - -#include "gmp-platform.h" -#include "gmp-video-decode.h" - -#if defined(GMP_FAKE_SUPPORT_DECRYPT) -#include "gmp-decryption.h" +#include "stddef.h" +#include "content_decryption_module.h" +#include "content_decryption_module_ext.h" #include "gmp-test-decryptor.h" -#include "gmp-test-storage.h" -#endif - -#if defined(_MSC_VER) -#define PUBLIC_FUNC __declspec(dllexport) -#else -#define PUBLIC_FUNC -#endif - -GMPPlatformAPI* g_platform_api = nullptr; extern "C" { - PUBLIC_FUNC GMPErr - GMPInit (GMPPlatformAPI* aPlatformAPI) { - g_platform_api = aPlatformAPI; - return GMPNoErr; - } +CDM_API +void INITIALIZE_CDM_MODULE() { - PUBLIC_FUNC GMPErr - GMPGetAPI (const char* aApiName, void* aHostAPI, void** aPluginApi) { - if (!strcmp (aApiName, GMP_API_VIDEO_DECODER)) { - // Note: Deliberately advertise in our .info file that we support - // video-decode, but we fail the "get" call here to simulate what - // happens when decoder init fails. - return GMPGenericErr; -#if defined(GMP_FAKE_SUPPORT_DECRYPT) - } - if (!strcmp (aApiName, GMP_API_DECRYPTOR)) { - *aPluginApi = new FakeDecryptor(); - return GMPNoErr; -#endif - } - return GMPGenericErr; - } +} - PUBLIC_FUNC void - GMPShutdown (void) { - g_platform_api = nullptr; - } +CDM_API +void* CreateCdmInstance(int cdm_interface_version, + const char* key_system, + uint32_t key_system_size, + GetCdmHostFunc get_cdm_host_func, + void* user_data) +{ + cdm::Host_8* host = static_cast( + get_cdm_host_func(cdm_interface_version, user_data)); + return new FakeDecryptor(host); +} + + +CDM_API +bool +VerifyCdmHost_0(const cdm::HostFile* aHostFiles, uint32_t aNumFiles) +{ + return true; +} } // extern "C" diff --git a/dom/media/gmp-plugin/gmp-test-decryptor.cpp b/dom/media/gmp-plugin/gmp-test-decryptor.cpp index ec15f12feb0c..5a71e19066f2 100644 --- a/dom/media/gmp-plugin/gmp-test-decryptor.cpp +++ b/dom/media/gmp-plugin/gmp-test-decryptor.cpp @@ -7,6 +7,7 @@ #include "gmp-test-storage.h" #include "gmp-test-output-protection.h" +#include #include #include #include @@ -14,6 +15,7 @@ #include #include #include +#include #include "mozilla/Assertions.h" #include "mozilla/Attributes.h" @@ -21,28 +23,14 @@ using namespace std; FakeDecryptor* FakeDecryptor::sInstance = nullptr; -extern GMPPlatformAPI* g_platform_api; // Defined in gmp-fake.cpp - -class GMPMutexAutoLock -{ -public: - explicit GMPMutexAutoLock(GMPMutex* aMutex) : mMutex(aMutex) { - mMutex->Acquire(); - } - ~GMPMutexAutoLock() { - mMutex->Release(); - } -private: - GMPMutex* const mMutex; -}; class TestManager { public: - TestManager() : mMutex(CreateMutex()) {} + TestManager() = default; // Register a test with the test manager. void BeginTest(const string& aTestID) { - GMPMutexAutoLock lock(mMutex); + std::lock_guard lock(mMutex); auto found = mTestIDs.find(aTestID); if (found == mTestIDs.end()) { mTestIDs.insert(aTestID); @@ -57,7 +45,7 @@ public: void EndTest(const string& aTestID) { bool isEmpty = false; { - GMPMutexAutoLock lock(mMutex); + std::lock_guard lock(mMutex); auto found = mTestIDs.find(aTestID); if (found != mTestIDs.end()) { mTestIDs.erase(aTestID); @@ -74,9 +62,7 @@ public: } private: - ~TestManager() { - mMutex->Destroy(); - } + ~TestManager() = default; static void Error(const string& msg) { FakeDecryptor::Message(msg); @@ -86,37 +72,29 @@ private: FakeDecryptor::Message("test-storage complete"); } - static GMPMutex* CreateMutex() { - GMPMutex* mutex = nullptr; - g_platform_api->createmutex(&mutex); - return mutex; - } - - GMPMutex* const mMutex; + std::mutex mMutex; set mTestIDs; }; -FakeDecryptor::FakeDecryptor() - : mCallback(nullptr) +FakeDecryptor::FakeDecryptor(cdm::Host_8* aHost) + : mHost(aHost) { MOZ_ASSERT(!sInstance); sInstance = this; } -void FakeDecryptor::DecryptingComplete() -{ - sInstance = nullptr; - delete this; -} - void FakeDecryptor::Message(const std::string& aMessage) { MOZ_ASSERT(sInstance); const static std::string sid("fake-session-id"); - sInstance->mCallback->SessionMessage(sid.c_str(), sid.size(), - kGMPLicenseRequest, - (const uint8_t*)aMessage.c_str(), aMessage.size()); + sInstance->mHost->OnSessionMessage(sid.c_str(), + sid.size(), + cdm::MessageType::kLicenseRequest, + aMessage.c_str(), + aMessage.size(), + nullptr, + 0); } std::vector @@ -130,40 +108,38 @@ Tokenize(const std::string& aString) static const string TruncateRecordId = "truncate-record-id"; static const string TruncateRecordData = "I will soon be truncated"; -class ReadThenTask : public GMPTask { +template +class WriteRecordSuccessTask { public: - ReadThenTask(string aId, ReadContinuation* aThen) + WriteRecordSuccessTask(string aId, Continuation aThen) : mId(aId) - , mThen(aThen) + , mThen(move(aThen)) {} - void Run() override { - ReadRecord(mId, mThen); - } - void Destroy() override { - delete this; + + void operator()() + { + ReadRecord(FakeDecryptor::sInstance->mHost, mId, mThen); } + string mId; - ReadContinuation* mThen; + Continuation mThen; }; -class SendMessageTask : public GMPTask { +class WriteRecordFailureTask { public: - explicit SendMessageTask(const string& aMessage, - TestManager* aTestManager = nullptr, - const string& aTestID = "") + explicit WriteRecordFailureTask(const string& aMessage, + TestManager* aTestManager = nullptr, + const string& aTestID = "") : mMessage(aMessage), mTestmanager(aTestManager), mTestID(aTestID) {} - void Run() override { + void operator()() + { FakeDecryptor::Message(mMessage); if (mTestmanager) { mTestmanager->EndTest(mTestID); } } - void Destroy() override { - delete this; - } - private: string mMessage; TestManager* const mTestmanager; @@ -175,12 +151,14 @@ public: TestEmptyContinuation(TestManager* aTestManager, const string& aTestID) : mTestmanager(aTestManager), mTestID(aTestID) {} - void ReadComplete(GMPErr aErr, const std::string& aData) override { - if (!aData.empty()) { + virtual void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) override + { + if (aDataSize) { FakeDecryptor::Message("FAIL TestEmptyContinuation record was not truncated"); } mTestmanager->EndTest(mTestID); - delete this; } private: @@ -195,15 +173,18 @@ public: const string& aTestID) : mID(aID), mTestmanager(aTestManager), mTestID(aTestID) {} - void ReadComplete(GMPErr aErr, const std::string& aData) override { - if (aData != TruncateRecordData) { + virtual void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) override + { + if (string(reinterpret_cast(aData), aDataSize) != TruncateRecordData) { FakeDecryptor::Message("FAIL TruncateContinuation read data doesn't match written data"); } - auto cont = new TestEmptyContinuation(mTestmanager, mTestID); + auto cont = TestEmptyContinuation(mTestmanager, mTestID); auto msg = "FAIL in TruncateContinuation write."; - auto failTask = new SendMessageTask(msg, mTestmanager, mTestID); - WriteRecord(mID, nullptr, 0, new ReadThenTask(mID, cont), failTask); - delete this; + WriteRecord(FakeDecryptor::sInstance->mHost, mID, nullptr, 0, + WriteRecordSuccessTask(mID, cont), + WriteRecordFailureTask(msg, mTestmanager, mTestID)); } private: @@ -219,12 +200,14 @@ public: const string& aTestID) : mValue(aValue), mTestmanager(aTestManager), mTestID(aTestID) {} - void ReadComplete(GMPErr aErr, const std::string& aData) override { - if (aData != mValue) { + virtual void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) override + { + if (string(reinterpret_cast(aData), aDataSize) != mValue) { FakeDecryptor::Message("FAIL VerifyAndFinishContinuation read data doesn't match expected data"); } mTestmanager->EndTest(mTestID); - delete this; } private: @@ -244,15 +227,18 @@ public: , mTestID(aTestID) {} - void ReadComplete(GMPErr aErr, const std::string& aData) override { - if (aData != mValue) { + virtual void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) override + { + if (string(reinterpret_cast(aData), aDataSize) != mValue) { FakeDecryptor::Message("FAIL VerifyAndOverwriteContinuation read data doesn't match expected data"); } - auto cont = new VerifyAndFinishContinuation(mOverwrite, mTestmanager, mTestID); + auto cont = VerifyAndFinishContinuation(mOverwrite, mTestmanager, mTestID); auto msg = "FAIL in VerifyAndOverwriteContinuation write."; - auto failTask = new SendMessageTask(msg, mTestmanager, mTestID); - WriteRecord(mId, mOverwrite, new ReadThenTask(mId, cont), failTask); - delete this; + WriteRecord(FakeDecryptor::sInstance->mHost, mId, mOverwrite, + WriteRecordSuccessTask(mId, cont), + WriteRecordFailureTask(msg, mTestmanager, mTestID)); } private: @@ -267,27 +253,21 @@ static const string OpenAgainRecordId = "open-again-record-id"; class OpenedSecondTimeContinuation : public OpenContinuation { public: - explicit OpenedSecondTimeContinuation(GMPRecord* aRecord, - TestManager* aTestManager, + explicit OpenedSecondTimeContinuation(TestManager* aTestManager, const string& aTestID) - : mRecord(aRecord), mTestmanager(aTestManager), mTestID(aTestID) { - MOZ_ASSERT(aRecord); + : mTestmanager(aTestManager), mTestID(aTestID) + { } - void OpenComplete(GMPErr aStatus, GMPRecord* aRecord) override { - if (GMP_SUCCEEDED(aStatus)) { + void operator()(bool aSuccess) override { + if (!aSuccess) { FakeDecryptor::Message("FAIL OpenSecondTimeContinuation should not be able to re-open record."); } - if (aRecord) { - aRecord->Close(); - } // Succeeded, open should have failed. mTestmanager->EndTest(mTestID); - mRecord->Close(); } private: - GMPRecord* mRecord; TestManager* const mTestmanager; const string mTestID; }; @@ -299,18 +279,15 @@ public: const string& aTestID) : mID(aID), mTestmanager(aTestManager), mTestID(aTestID) {} - void OpenComplete(GMPErr aStatus, GMPRecord* aRecord) override { - if (GMP_FAILED(aStatus)) { + void operator()(bool aSuccess) override { + if (!aSuccess) { FakeDecryptor::Message("FAIL OpenAgainContinuation to open record initially."); mTestmanager->EndTest(mTestID); - if (aRecord) { - aRecord->Close(); - } return; } - auto cont = new OpenedSecondTimeContinuation(aRecord, mTestmanager, mTestID); - GMPOpenRecord(mID, cont); + auto cont = OpenedSecondTimeContinuation(mTestmanager, mTestID); + OpenRecord(FakeDecryptor::sInstance->mHost, mID, cont); } private: @@ -322,6 +299,7 @@ private: static void DoTestStorage(const string& aPrefix, TestManager* aTestManager) { + MOZ_ASSERT(FakeDecryptor::sInstance->mHost, "FakeDecryptor::sInstance->mHost should not be null"); // Basic I/O tests. We run three cases concurrently. The tests, like // GMPStorage run asynchronously. When they've all passed, we send // a message back to the parent process, or a failure message if not. @@ -336,11 +314,11 @@ DoTestStorage(const string& aPrefix, TestManager* aTestManager) const string id1 = aPrefix + TruncateRecordId; const string testID1 = aPrefix + "write-test-1"; aTestManager->BeginTest(testID1); - auto cont1 = new TruncateContinuation(id1, aTestManager, testID1); + auto cont1 = TruncateContinuation(id1, aTestManager, testID1); auto msg1 = "FAIL in TestStorage writing TruncateRecord."; - auto failTask1 = new SendMessageTask(msg1, aTestManager, testID1); - WriteRecord(id1, TruncateRecordData, - new ReadThenTask(id1, cont1), failTask1); + WriteRecord(FakeDecryptor::sInstance->mHost, id1, TruncateRecordData, + WriteRecordSuccessTask(id1, cont1), + WriteRecordFailureTask(msg1, aTestManager, testID1)); // Test 2: Test that overwriting a record with a shorter record truncates // the record to the shorter record. @@ -354,11 +332,12 @@ DoTestStorage(const string& aPrefix, TestManager* aTestManager) string overwrite = "A shorter record"; const string testID2 = aPrefix + "write-test-2"; aTestManager->BeginTest(testID2); - auto task2 = new VerifyAndOverwriteContinuation(id2, record1, overwrite, - aTestManager, testID2); + auto task2 = VerifyAndOverwriteContinuation(id2, record1, overwrite, + aTestManager, testID2); auto msg2 = "FAIL in TestStorage writing record1."; - auto failTask2 = new SendMessageTask(msg2, aTestManager, testID2); - WriteRecord(id2, record1, new ReadThenTask(id2, task2), failTask2); + WriteRecord(FakeDecryptor::sInstance->mHost, id2, record1, + WriteRecordSuccessTask(id2, task2), + WriteRecordFailureTask(msg2, aTestManager, testID2)); // Test 3: Test that opening a record while it's already open fails. // @@ -368,71 +347,33 @@ DoTestStorage(const string& aPrefix, TestManager* aTestManager) const string id3 = aPrefix + OpenAgainRecordId; const string testID3 = aPrefix + "open-test-1"; aTestManager->BeginTest(testID3); - auto task3 = new OpenedFirstTimeContinuation(id3, aTestManager, testID3); - GMPOpenRecord(id3, task3); + auto task3 = OpenedFirstTimeContinuation(id3, aTestManager, testID3); + OpenRecord(FakeDecryptor::sInstance->mHost, id3, task3); } -class TestStorageTask : public GMPTask { -public: - TestStorageTask(const string& aPrefix, TestManager* aTestManager) - : mPrefix(aPrefix), mTestManager(aTestManager) {} - void Destroy() override { delete this; } - void Run() override { - DoTestStorage(mPrefix, mTestManager); - } -private: - const string mPrefix; - TestManager* const mTestManager; -}; - void FakeDecryptor::TestStorage() { auto* testManager = new TestManager(); - GMPThread* thread1 = nullptr; - GMPThread* thread2 = nullptr; - // Main thread tests. DoTestStorage("mt1-", testManager); DoTestStorage("mt2-", testManager); - // Off-main-thread tests. - if (GMP_SUCCEEDED(g_platform_api->createthread(&thread1))) { - thread1->Post(new TestStorageTask("thread1-", testManager)); - } else { - FakeDecryptor::Message("FAIL to create thread1 for storage tests"); - } - - if (GMP_SUCCEEDED(g_platform_api->createthread(&thread2))) { - thread2->Post(new TestStorageTask("thread2-", testManager)); - } else { - FakeDecryptor::Message("FAIL to create thread2 for storage tests"); - } - - if (thread1) { - thread1->Join(); - } - - if (thread2) { - thread2->Join(); - } - // Note: Once all tests finish, TestManager will dispatch "test-pass" message, // which ends the test for the parent. } -class ReportWritten : public GMPTask { +class ReportWritten +{ public: ReportWritten(const string& aRecordId, const string& aValue) : mRecordId(aRecordId) , mValue(aValue) {} - void Run() override { + void operator()() { FakeDecryptor::Message("stored " + mRecordId + " " + mValue); } - void Destroy() override { - delete this; - } + const string mRecordId; const string mValue; }; @@ -442,18 +383,20 @@ public: explicit ReportReadStatusContinuation(const string& aRecordId) : mRecordId(aRecordId) {} - void ReadComplete(GMPErr aErr, const std::string& aData) override { - if (GMP_FAILED(aErr)) { + void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) override + { + if (!aSuccess) { FakeDecryptor::Message("retrieve " + mRecordId + " failed"); } else { stringstream ss; - ss << aData.size(); + ss << aDataSize; string len; ss >> len; FakeDecryptor::Message("retrieve " + mRecordId + " succeeded (length " + len + " bytes)"); } - delete this; } string mRecordId; }; @@ -463,13 +406,17 @@ public: explicit ReportReadRecordContinuation(const string& aRecordId) : mRecordId(aRecordId) {} - void ReadComplete(GMPErr aErr, const std::string& aData) override { - if (GMP_FAILED(aErr)) { + void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) override + { + if (!aSuccess) { FakeDecryptor::Message("retrieved " + mRecordId + " failed"); } else { - FakeDecryptor::Message("retrieved " + mRecordId + " " + aData); + FakeDecryptor::Message("retrieved " + mRecordId + " " + + string(reinterpret_cast(aData), + aDataSize)); } - delete this; } string mRecordId; }; @@ -490,6 +437,7 @@ FakeDecryptor::UpdateSession(uint32_t aPromiseId, const uint8_t* aResponse, uint32_t aResponseSize) { + MOZ_ASSERT(FakeDecryptor::sInstance->mHost, "FakeDecryptor::sInstance->mHost should not be null"); std::string response((const char*)aResponse, (const char*)(aResponse)+aResponseSize); std::vector tokens = Tokenize(response); const string& task = tokens[0]; @@ -499,13 +447,14 @@ FakeDecryptor::UpdateSession(uint32_t aPromiseId, // send "stored record" message on complete. const string& id = tokens[1]; const string& value = tokens[2]; - WriteRecord(id, + WriteRecord(FakeDecryptor::sInstance->mHost, + id, value, - new ReportWritten(id, value), - new SendMessageTask("FAIL in writing record.")); + ReportWritten(id, value), + WriteRecordFailureTask("FAIL in writing record.")); } else if (task == "retrieve") { const string& id = tokens[1]; - ReadRecord(id, new ReportReadStatusContinuation(id)); + ReadRecord(FakeDecryptor::sInstance->mHost, id, ReportReadStatusContinuation(id)); } else if (task == "shutdown-mode") { const string& mode = tokens[1]; if (mode == "timeout") { @@ -516,7 +465,9 @@ FakeDecryptor::UpdateSession(uint32_t aPromiseId, Message("shutdown-token received " + sShutdownToken); } } else if (task == "retrieve-shutdown-token") { - ReadRecord("shutdown-token", new ReportReadRecordContinuation("shutdown-token")); + ReadRecord(FakeDecryptor::sInstance->mHost, + "shutdown-token", + ReportReadRecordContinuation("shutdown-token")); } else if (task == "test-op-apis") { mozilla::gmptest::TestOuputProtectionAPIs(); } diff --git a/dom/media/gmp-plugin/gmp-test-decryptor.h b/dom/media/gmp-plugin/gmp-test-decryptor.h index f9b76e2c4a99..01c6c4b2a0cc 100644 --- a/dom/media/gmp-plugin/gmp-test-decryptor.h +++ b/dom/media/gmp-plugin/gmp-test-decryptor.h @@ -6,79 +6,133 @@ #ifndef FAKE_DECRYPTOR_H__ #define FAKE_DECRYPTOR_H__ -#include "gmp-decryption.h" +#include "content_decryption_module.h" #include #include "mozilla/Attributes.h" -class FakeDecryptor : public GMPDecryptor { +class FakeDecryptor : public cdm::ContentDecryptionModule_8 { public: + explicit FakeDecryptor(cdm::Host_8* aHost); - explicit FakeDecryptor(); - - void Init(GMPDecryptorCallback* aCallback, - bool aDistinctiveIdentifierRequired, - bool aPersistentStateRequired) override + void Initialize(bool aAllowDistinctiveIdentifier, + bool aAllowPersistentState) override { - mCallback = aCallback; } - void CreateSession(uint32_t aCreateSessionToken, - uint32_t aPromiseId, - const char* aInitDataType, - uint32_t aInitDataTypeSize, - const uint8_t* aInitData, - uint32_t aInitDataSize, - GMPSessionType aSessionType) override + void SetServerCertificate(uint32_t aPromiseId, + const uint8_t* aServerCertificateData, + uint32_t aServerCertificateDataSize) + override + { + } + + void CreateSessionAndGenerateRequest(uint32_t aPromiseId, + cdm::SessionType aSessionType, + cdm::InitDataType aInitDataType, + const uint8_t* aInitData, + uint32_t aInitDataSize) + override { } void LoadSession(uint32_t aPromiseId, + cdm::SessionType aSessionType, const char* aSessionId, - uint32_t aSessionIdLength) override + uint32_t aSessionIdSize) override { } void UpdateSession(uint32_t aPromiseId, const char* aSessionId, - uint32_t aSessionIdLength, + uint32_t aSessionIdSize, const uint8_t* aResponse, uint32_t aResponseSize) override; void CloseSession(uint32_t aPromiseId, const char* aSessionId, - uint32_t aSessionIdLength) override + uint32_t aSessionIdSize) override { } void RemoveSession(uint32_t aPromiseId, const char* aSessionId, - uint32_t aSessionIdLength) override + uint32_t aSessionIdSize) override { } - void SetServerCertificate(uint32_t aPromiseId, - const uint8_t* aServerCert, - uint32_t aServerCertSize) override + void TimerExpired(void* aContext) override { } - void Decrypt(GMPBuffer* aBuffer, - GMPEncryptedBufferMetadata* aMetadata) override + cdm::Status Decrypt(const cdm::InputBuffer& aEncryptedBuffer, + cdm::DecryptedBlock* aDecryptedBuffer) override + { + return cdm::Status::kDecodeError; + } + + cdm::Status InitializeAudioDecoder( + const cdm::AudioDecoderConfig& aAudioDecoderConfig) override + { + return cdm::Status::kDecodeError; + } + + cdm::Status InitializeVideoDecoder( + const cdm::VideoDecoderConfig& aVideoDecoderConfig) override + { + return cdm::Status::kDecodeError; + } + + void DeinitializeDecoder(cdm::StreamType aDecoderType) override { } - void DecryptingComplete() override; + void ResetDecoder(cdm::StreamType aDecoderType) override + { + } + + cdm::Status DecryptAndDecodeFrame( + const cdm::InputBuffer& aEncryptedBuffer, + cdm::VideoFrame* aVideoFrame) override + { + return cdm::Status::kDecodeError; + } + + cdm::Status DecryptAndDecodeSamples( + const cdm::InputBuffer& aEncryptedBuffer, + cdm::AudioFrames* aAudioFrame) override + { + return cdm::Status::kDecodeError; + } + + void OnPlatformChallengeResponse( + const cdm::PlatformChallengeResponse& aResponse) override + { + } + + void OnQueryOutputProtectionStatus(cdm::QueryResult aResult, + uint32_t aLinkMask, + uint32_t aOutputProtectionMask) override + { + } + + void Destroy() override + { + delete this; + sInstance = nullptr; + } static void Message(const std::string& aMessage); + cdm::Host_8* mHost; + + static FakeDecryptor* sInstance; + private: virtual ~FakeDecryptor() {} - static FakeDecryptor* sInstance; void TestStorage(); - GMPDecryptorCallback* mCallback; }; #endif diff --git a/dom/media/gmp-plugin/gmp-test-storage.cpp b/dom/media/gmp-plugin/gmp-test-storage.cpp index 3a9958dc6f71..066cac065bc9 100644 --- a/dom/media/gmp-plugin/gmp-test-storage.cpp +++ b/dom/media/gmp-plugin/gmp-test-storage.cpp @@ -9,218 +9,244 @@ #include "mozilla/Assertions.h" #include "mozilla/Attributes.h" -class WriteRecordClient : public GMPRecordClient { +using namespace cdm; +using namespace std; + +class WriteRecordClient : public FileIOClient +{ public: - GMPErr Init(GMPRecord* aRecord, - GMPTask* aOnSuccess, - GMPTask* aOnFailure, - const uint8_t* aData, - uint32_t aDataSize) { - mRecord = aRecord; - mOnSuccess = aOnSuccess; - mOnFailure = aOnFailure; + WriteRecordClient(function&& aOnSuccess, + function&& aOnFailure, + const uint8_t* aData, + uint32_t aDataSize) + : mOnSuccess(move(aOnSuccess)) + , mOnFailure(move(aOnFailure)) + { mData.insert(mData.end(), aData, aData + aDataSize); - return mRecord->Open(); } - void OpenComplete(GMPErr aStatus) override { - if (GMP_SUCCEEDED(aStatus)) { - mRecord->Write(mData.empty() ? nullptr : &mData.front(), mData.size()); - } else { - GMPRunOnMainThread(mOnFailure); - mOnSuccess->Destroy(); + void OnOpenComplete(Status aStatus) override + { + // If we hit an error, fail. + if (aStatus != Status::kSuccess) { + Done(aStatus); + } else if (mFileIO) { // Otherwise, write our data to the file. + mFileIO->Write(mData.empty() ? nullptr : &mData.front(), mData.size()); } } - void ReadComplete(GMPErr aStatus, - const uint8_t* aData, - uint32_t aDataSize) override {} - - void WriteComplete(GMPErr aStatus) override { - // Note: Call Close() before running continuation, in case the - // continuation tries to open the same record; if we call Close() - // after running the continuation, the Close() call will arrive - // just after the Open() call succeeds, immediately closing the - // record we just opened. - mRecord->Close(); - if (GMP_SUCCEEDED(aStatus)) { - GMPRunOnMainThread(mOnSuccess); - mOnFailure->Destroy(); - } else { - GMPRunOnMainThread(mOnFailure); - mOnSuccess->Destroy(); - } - delete this; + void OnReadComplete(Status aStatus, + const uint8_t* aData, + uint32_t aDataSize) override + { } -private: - GMPRecord* mRecord; - GMPTask* mOnSuccess; - GMPTask* mOnFailure; - std::vector mData; -}; - -GMPErr -WriteRecord(const std::string& aRecordName, - const uint8_t* aData, - uint32_t aNumBytes, - GMPTask* aOnSuccess, - GMPTask* aOnFailure) -{ - GMPRecord* record; - auto* client = new WriteRecordClient(); - auto err = GMPOpenRecord(aRecordName.c_str(), - aRecordName.size(), - &record, - client); - if (GMP_FAILED(err)) { - GMPRunOnMainThread(aOnFailure); - aOnSuccess->Destroy(); - return err; - } - return client->Init(record, aOnSuccess, aOnFailure, aData, aNumBytes); -} - -GMPErr -WriteRecord(const std::string& aRecordName, - const std::string& aData, - GMPTask* aOnSuccess, - GMPTask* aOnFailure) -{ - return WriteRecord(aRecordName, - (const uint8_t*)aData.c_str(), - aData.size(), - aOnSuccess, - aOnFailure); -} - -class ReadRecordClient : public GMPRecordClient { -public: - GMPErr Init(GMPRecord* aRecord, - ReadContinuation* aContinuation) { - mRecord = aRecord; - mContinuation = aContinuation; - return mRecord->Open(); - } - - void OpenComplete(GMPErr aStatus) override { - auto err = mRecord->Read(); - if (GMP_FAILED(err)) { - mContinuation->ReadComplete(err, ""); - delete this; - } - } - - void ReadComplete(GMPErr aStatus, - const uint8_t* aData, - uint32_t aDataSize) override { - // Note: Call Close() before running continuation, in case the - // continuation tries to open the same record; if we call Close() - // after running the continuation, the Close() call will arrive - // just after the Open() call succeeds, immediately closing the - // record we just opened. - mRecord->Close(); - std::string data((const char*)aData, aDataSize); - mContinuation->ReadComplete(GMPNoErr, data); - delete this; - } - - void WriteComplete(GMPErr aStatus) override { - } - -private: - GMPRecord* mRecord; - ReadContinuation* mContinuation; -}; - -GMPErr -ReadRecord(const std::string& aRecordName, - ReadContinuation* aContinuation) -{ - MOZ_ASSERT(aContinuation); - GMPRecord* record; - auto* client = new ReadRecordClient(); - auto err = GMPOpenRecord(aRecordName.c_str(), - aRecordName.size(), - &record, - client); - if (GMP_FAILED(err)) { - return err; - } - return client->Init(record, aContinuation); -} - -extern GMPPlatformAPI* g_platform_api; // Defined in gmp-fake.cpp - -GMPErr -GMPOpenRecord(const char* aName, - uint32_t aNameLength, - GMPRecord** aOutRecord, - GMPRecordClient* aClient) -{ - MOZ_ASSERT(g_platform_api); - return g_platform_api->createrecord(aName, aNameLength, aOutRecord, aClient); -} - -GMPErr -GMPRunOnMainThread(GMPTask* aTask) -{ - MOZ_ASSERT(g_platform_api); - return g_platform_api->runonmainthread(aTask); -} - -class OpenRecordClient : public GMPRecordClient { -public: - /* - * This function will take the memory ownership of the parameters and - * delete them when done. - */ - static void Open(const std::string& aRecordName, - OpenContinuation* aContinuation) { - MOZ_ASSERT(aContinuation); - (new OpenRecordClient(aContinuation))->Do(aRecordName); - } - - void OpenComplete(GMPErr aStatus) override { + void OnWriteComplete(Status aStatus) override + { Done(aStatus); } - void ReadComplete(GMPErr aStatus, - const uint8_t* aData, - uint32_t aDataSize) override { - MOZ_CRASH("Should not reach here."); - } - - void WriteComplete(GMPErr aStatus) override { - MOZ_CRASH("Should not reach here."); + void Do(const string& aName, Host_8* aHost) + { + // Initialize the FileIO. + mFileIO = aHost->CreateFileIO(this); + mFileIO->Open(aName.c_str(), aName.size()); } private: - explicit OpenRecordClient(OpenContinuation* aContinuation) - : mRecord(nullptr), mContinuation(aContinuation) {} - - void Do(const std::string& aName) { - auto err = GMPOpenRecord(aName.c_str(), aName.size(), &mRecord, this); - if (GMP_FAILED(err) || - GMP_FAILED(err = mRecord->Open())) { - Done(err); + void Done(cdm::FileIOClient::Status aStatus) + { + // Note: Call Close() before running continuation, in case the + // continuation tries to open the same record; if we call Close() + // after running the continuation, the Close() call will arrive + // just after the Open() call succeeds, immediately closing the + // record we just opened. + if (mFileIO) { + // will delete mFileIO inside Close. + mFileIO->Close(); + } + + if (IO_SUCCEEDED(aStatus)) { + mOnSuccess(); + } else { + mOnFailure(); } - } - void Done(GMPErr err) { - // mContinuation is responsible for closing mRecord. - mContinuation->OpenComplete(err, mRecord); - delete mContinuation; delete this; } - GMPRecord* mRecord; - OpenContinuation* mContinuation; + FileIO* mFileIO = nullptr; + function mOnSuccess; + function mOnFailure; + std::vector mData; }; void -GMPOpenRecord(const std::string& aRecordName, - OpenContinuation* aContinuation) +WriteRecord(Host_8* aHost, + const std::string& aRecordName, + const uint8_t* aData, + uint32_t aNumBytes, + function&& aOnSuccess, + function&& aOnFailure) { - OpenRecordClient::Open(aRecordName, aContinuation); + // client will be delete in WriteRecordClient::Done + WriteRecordClient* client = new WriteRecordClient(move(aOnSuccess), + move(aOnFailure), + aData, + aNumBytes); + client->Do(aRecordName, aHost); +} + +void +WriteRecord(Host_8* aHost, + const std::string& aRecordName, + const std::string& aData, + function &&aOnSuccess, + function&& aOnFailure) +{ + return WriteRecord(aHost, + aRecordName, + (const uint8_t*)aData.c_str(), + aData.size(), + move(aOnSuccess), + move(aOnFailure)); +} + +class ReadRecordClient : public FileIOClient +{ +public: + explicit ReadRecordClient(function&& aOnReadComplete) + : mOnReadComplete(move(aOnReadComplete)) + { + } + + void OnOpenComplete(Status aStatus) override + { + auto err = aStatus; + if (aStatus != Status::kSuccess) { + Done(err, reinterpret_cast(""), 0); + } else { + mFileIO->Read(); + } + } + + void OnReadComplete(Status aStatus, + const uint8_t* aData, + uint32_t aDataSize) override + { + Done(aStatus, aData, aDataSize); + } + + void OnWriteComplete(Status aStatus) override + { + } + + void Do(const string& aName, Host_8* aHost) + { + mFileIO = aHost->CreateFileIO(this); + mFileIO->Open(aName.c_str(), aName.size()); + } + +private: + void Done(cdm::FileIOClient::Status aStatus, + const uint8_t* aData, + uint32_t aDataSize) + { + // Note: Call Close() before running continuation, in case the + // continuation tries to open the same record; if we call Close() + // after running the continuation, the Close() call will arrive + // just after the Open() call succeeds, immediately closing the + // record we just opened. + if (mFileIO) { + // will delete mFileIO inside Close. + mFileIO->Close(); + } + + if (IO_SUCCEEDED(aStatus)) { + mOnReadComplete(true, aData, aDataSize); + } else { + mOnReadComplete(false, reinterpret_cast(""), 0); + } + + delete this; + } + + FileIO* mFileIO = nullptr; + function mOnReadComplete; +}; + +void +ReadRecord(Host_8* aHost, + const std::string& aRecordName, + function&& aOnReadComplete) +{ + // client will be delete in ReadRecordClient::Done + ReadRecordClient* client = new ReadRecordClient(move(aOnReadComplete)); + client->Do(aRecordName, aHost); +} + +class OpenRecordClient : public FileIOClient +{ +public: + explicit OpenRecordClient(function&& aOpenComplete) + : mOpenComplete(move(aOpenComplete)) + { + } + + void OnOpenComplete(Status aStatus) override + { + Done(aStatus); + } + + void OnReadComplete(Status aStatus, + const uint8_t* aData, + uint32_t aDataSize) override + { + } + + void OnWriteComplete(Status aStatus) override + { + } + + void Do(const string& aName, Host_8* aHost) + { + // Initialize the FileIO. + mFileIO = aHost->CreateFileIO(this); + mFileIO->Open(aName.c_str(), aName.size()); + } + +private: + void Done(cdm::FileIOClient::Status aStatus) + { + // Note: Call Close() before running continuation, in case the + // continuation tries to open the same record; if we call Close() + // after running the continuation, the Close() call will arrive + // just after the Open() call succeeds, immediately closing the + // record we just opened. + if (mFileIO) { + // will delete mFileIO inside Close. + mFileIO->Close(); + } + + if (IO_SUCCEEDED(aStatus)) { + mOpenComplete(true); + } else { + mOpenComplete(false); + } + + delete this; + } + + FileIO* mFileIO = nullptr; + function mOpenComplete;; +}; + +void +OpenRecord(Host_8* aHost, + const std::string& aRecordName, + function&& aOpenComplete) +{ + // client will be delete in OpenRecordClient::Done + OpenRecordClient* client = new OpenRecordClient(move(aOpenComplete)); + client->Do(aRecordName, aHost); } diff --git a/dom/media/gmp-plugin/gmp-test-storage.h b/dom/media/gmp-plugin/gmp-test-storage.h index 801e379eb425..3a2a6d6f6d14 100644 --- a/dom/media/gmp-plugin/gmp-test-storage.h +++ b/dom/media/gmp-plugin/gmp-test-storage.h @@ -6,54 +6,49 @@ #ifndef TEST_GMP_STORAGE_H__ #define TEST_GMP_STORAGE_H__ -#include "gmp-errors.h" -#include "gmp-platform.h" +#include #include +#include +// This include is required in order for content_decryption_module to work +// on Unix systems. +#include "stddef.h" +#include "content_decryption_module.h" + +#define IO_SUCCEEDED(x) ((x) == cdm::FileIOClient::Status::kSuccess) +#define IO_FAILED(x) ((x) != cdm::FileIOClient::Status::kSuccess) class ReadContinuation { public: virtual ~ReadContinuation() {} - virtual void ReadComplete(GMPErr aErr, const std::string& aData) = 0; + virtual void operator()(bool aSuccess, + const uint8_t* aData, + uint32_t aDataSize) = 0; }; -// Reads a record to storage using GMPRecord. -// Calls ReadContinuation with read data. -GMPErr -ReadRecord(const std::string& aRecordName, - ReadContinuation* aContinuation); +void WriteRecord(cdm::Host_8* aHost, + const std::string& aRecordName, + const std::string& aData, + std::function&& aOnSuccess, + std::function&& aOnFailure); -// Writes a record to storage using GMPRecord. -// Runs continuation when data is written. -GMPErr -WriteRecord(const std::string& aRecordName, - const std::string& aData, - GMPTask* aOnSuccess, - GMPTask* aOnFailure); +void WriteRecord(cdm::Host_8* aHost, + const std::string& aRecordName, + const uint8_t* aData, + uint32_t aNumBytes, + std::function&& aOnSuccess, + std::function&& aOnFailure); -GMPErr -WriteRecord(const std::string& aRecordName, - const uint8_t* aData, - uint32_t aNumBytes, - GMPTask* aOnSuccess, - GMPTask* aOnFailure); - -GMPErr -GMPOpenRecord(const char* aName, - uint32_t aNameLength, - GMPRecord** aOutRecord, - GMPRecordClient* aClient); - -GMPErr -GMPRunOnMainThread(GMPTask* aTask); +void ReadRecord(cdm::Host_8* aHost, + const std::string& aRecordName, + std::function&& aOnReadComplete); class OpenContinuation { public: virtual ~OpenContinuation() {} - virtual void OpenComplete(GMPErr aStatus, GMPRecord* aRecord) = 0; + virtual void operator()(bool aSuccess) = 0; }; -void -GMPOpenRecord(const std::string& aRecordName, - OpenContinuation* aContinuation); - +void OpenRecord(cdm::Host_8* aHost, + const std::string& aRecordName, + std::function&& aOpenComplete); #endif // TEST_GMP_STORAGE_H__ diff --git a/dom/media/gmp-plugin/manifest.json b/dom/media/gmp-plugin/manifest.json new file mode 100644 index 000000000000..9bee6d8e1e9a --- /dev/null +++ b/dom/media/gmp-plugin/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "fake", + "description": "Fake GMP Plugin", + "version": "1", + "x-cdm-module-versions": "4", + "x-cdm-interface-versions": "8", + "x-cdm-host-versions": "8", + "x-cdm-codecs": "" +} \ No newline at end of file diff --git a/dom/media/gmp-plugin/moz.build b/dom/media/gmp-plugin/moz.build index 3a3d03df3ada..ebc522c62c5d 100644 --- a/dom/media/gmp-plugin/moz.build +++ b/dom/media/gmp-plugin/moz.build @@ -7,8 +7,7 @@ FINAL_TARGET = 'dist/bin/gmp-fake/1.0' FINAL_TARGET_FILES += [ - 'fake.info', - 'fake.voucher', + 'manifest.json', ] SOURCES += [ @@ -17,7 +16,7 @@ SOURCES += [ 'gmp-test-storage.cpp', ] -DEFINES['GMP_FAKE_SUPPORT_DECRYPT'] = True +DEFINES['CDM_IMPLEMENTATION'] = True SharedLibrary("fake") diff --git a/dom/media/gmp/GMPParent.cpp b/dom/media/gmp/GMPParent.cpp index 8ea9adaff666..ca5b788cf18b 100644 --- a/dom/media/gmp/GMPParent.cpp +++ b/dom/media/gmp/GMPParent.cpp @@ -789,6 +789,11 @@ GMPParent::ParseChromiumManifest(const nsAString& aJSON) // psapi.dll added for GetMappedFileNameW, which could possibly be avoided // in future versions, see bug 1383611 for details. mLibs = NS_LITERAL_CSTRING("dxva2.dll, psapi.dll"); +#endif + } else if (mDisplayName.EqualsASCII("fake")) { + kEMEKeySystem = NS_LITERAL_CSTRING("fake"); +#if XP_WIN + mLibs = NS_LITERAL_CSTRING("dxva2.dll"); #endif } else { return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__); From 3bdcb38e14a3e635b43099a8a1b691d42630265c Mon Sep 17 00:00:00 2001 From: James Cheng Date: Mon, 25 Sep 2017 17:40:01 +0800 Subject: [PATCH 021/108] Bug 1396493 - Part2 - Modify the gtest to adapt to the interface change. r=cpearce MozReview-Commit-ID: FyuXeSipeRV --HG-- extra : rebase_source : 69adc1656e6d9d15387b03e530c970981854fe09 --- dom/media/gtest/TestGMPCrossOrigin.cpp | 239 +++++++++++++------------ 1 file changed, 120 insertions(+), 119 deletions(-) diff --git a/dom/media/gtest/TestGMPCrossOrigin.cpp b/dom/media/gtest/TestGMPCrossOrigin.cpp index 78823015286d..0e10b595dc9b 100644 --- a/dom/media/gtest/TestGMPCrossOrigin.cpp +++ b/dom/media/gtest/TestGMPCrossOrigin.cpp @@ -8,6 +8,7 @@ #include "nsIObserverService.h" #include "mozilla/Services.h" #include "mozilla/StaticPtr.h" +#include "ChromiumCDMCallback.h" #include "GMPTestMonitor.h" #include "GMPVideoDecoderProxy.h" #include "GMPVideoEncoderProxy.h" @@ -22,6 +23,7 @@ #include "mozilla/DebugOnly.h" #include "mozilla/dom/MediaKeyStatusMapBinding.h" // For MediaKeyStatus #include "mozilla/dom/MediaKeyMessageEventBinding.h" // For MediaKeyMessageType +#include "nsThreadUtils.h" using namespace std; @@ -237,6 +239,13 @@ GetGMPThread() return thread.forget(); } +static RefPtr +GetAbstractGMPThread() +{ + RefPtr service = + GeckoMediaPluginService::GetGeckoMediaPluginService(); + return service->GetAbstractGMPThread(); +} /** * Enumerate files under |aPath| (non-recursive). */ @@ -458,6 +467,28 @@ private: nsresult& mResult; }; +static NodeId +GetNodeId(const nsAString& aOrigin, + const nsAString& aTopLevelOrigin, + const nsAString & aGmpName, + bool aInPBMode) +{ + OriginAttributes attrs; + attrs.mPrivateBrowsingId = aInPBMode ? 1 : 0; + + nsAutoCString suffix; + attrs.CreateSuffix(suffix); + + nsAutoString origin; + origin.Assign(aOrigin); + origin.Append(NS_ConvertUTF8toUTF16(suffix)); + + nsAutoString topLevelOrigin; + topLevelOrigin.Assign(aTopLevelOrigin); + topLevelOrigin.Append(NS_ConvertUTF8toUTF16(suffix)); + return NodeId(origin, topLevelOrigin, aGmpName); +} + static nsCString GetNodeId(const nsAString& aOrigin, const nsAString& aTopLevelOrigin, @@ -526,7 +557,7 @@ AssertIsOnGMPThread() MOZ_ASSERT(currentThread == thread); } -class GMPStorageTest : public GMPDecryptorProxyCallback +class GMPStorageTest { NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPStorageTest) @@ -539,8 +570,7 @@ class GMPStorageTest : public GMPDecryptorProxyCallback } GMPStorageTest() - : mDecryptor(nullptr) - , mMonitor("GMPStorageTest") + : mMonitor("GMPStorageTest") , mFinished(false) { } @@ -550,7 +580,7 @@ class GMPStorageTest : public GMPDecryptorProxyCallback { nsTArray msg; msg.AppendElements(aMessage.get(), aMessage.Length()); - mDecryptor->UpdateSession(1, NS_LITERAL_CSTRING("fake-session-id"), msg); + mCDM->UpdateSession(NS_LITERAL_CSTRING("fake-session-id"), 1, msg); } void TestGetNodeId() @@ -608,37 +638,6 @@ class GMPStorageTest : public GMPDecryptorProxyCallback SetFinished(); } - class CreateDecryptorDone : public GetGMPDecryptorCallback - { - public: - explicit CreateDecryptorDone(GMPStorageTest* aRunner) - : mRunner(aRunner) - { - } - - void Done(GMPDecryptorProxy* aDecryptor) override - { - mRunner->mDecryptor = aDecryptor; - EXPECT_TRUE(!!mRunner->mDecryptor); - - if (mRunner->mDecryptor) { - mRunner->mDecryptor->Init(mRunner, false, true); - } - } - - private: - RefPtr mRunner; - }; - - void CreateDecryptor(const nsCString& aNodeId, - const nsCString& aUpdate) - { - nsTArray updates; - updates.AppendElement(aUpdate); - nsCOMPtr continuation(new Updates(this, Move(updates))); - CreateDecryptor(aNodeId, continuation); - } - void CreateDecryptor(const nsAString& aOrigin, const nsAString& aTopLevelOrigin, bool aInPBMode, @@ -648,59 +647,40 @@ class GMPStorageTest : public GMPDecryptorProxyCallback updates.AppendElement(aUpdate); CreateDecryptor(aOrigin, aTopLevelOrigin, aInPBMode, Move(updates)); } - class Updates : public Runnable - { - public: - Updates(GMPStorageTest* aRunner, nsTArray&& aUpdates) - : mozilla::Runnable("GMPStorageTest::Updates") - , mRunner(aRunner) - , mUpdates(Move(aUpdates)) - { - } - NS_IMETHOD Run() override - { - for (auto& update : mUpdates) { - mRunner->Update(update); - } - return NS_OK; - } - - private: - RefPtr mRunner; - nsTArray mUpdates; - }; void CreateDecryptor(const nsAString& aOrigin, const nsAString& aTopLevelOrigin, bool aInPBMode, nsTArray&& aUpdates) { - nsCOMPtr updates(new Updates(this, Move(aUpdates))); - CreateDecryptor(GetNodeId(aOrigin, aTopLevelOrigin, aInPBMode), updates); + CreateDecryptor(GetNodeId(aOrigin, aTopLevelOrigin, NS_LITERAL_STRING("gmp-fake"), aInPBMode), Move(aUpdates)); } - void CreateDecryptor(const nsCString& aNodeId, - nsIRunnable* aContinuation) { + void CreateDecryptor(const NodeId& aNodeId, + nsTArray&& aUpdates) { RefPtr service = GeckoMediaPluginService::GetGeckoMediaPluginService(); EXPECT_TRUE(service); - mNodeId = aNodeId; - EXPECT_TRUE(!mNodeId.IsEmpty()); - nsTArray tags; tags.AppendElement(NS_LITERAL_CSTRING("fake")); - UniquePtr callback( - new CreateDecryptorDone(this)); + RefPtr self = this; + RefPtr promise = + service->GetCDM(aNodeId, Move(tags), nullptr); + auto thread = GetAbstractGMPThread(); + promise->Then(thread, + __func__, + [self, aUpdates](RefPtr cdm) { + self->mCDM = cdm; + EXPECT_TRUE(!!self->mCDM); + self->mCallback.reset(new CallbackProxy(self)); + self->mCDM->Init(self->mCallback.get(), false, true, GetMainThreadEventTarget()); - // Continue after the OnSetDecryptorId message, so that we don't - // get warnings in the async shutdown tests due to receiving the - // SetDecryptorId message after we've started shutdown. - mSetDecryptorIdContinuation = aContinuation; - - nsresult rv = - service->GetGMPDecryptor(nullptr, &tags, mNodeId, Move(callback)); - EXPECT_TRUE(NS_SUCCEEDED(rv)); + for (auto& update : aUpdates) { + self->Update(update); + } + }, + [](nsresult rv) { EXPECT_TRUE(false); }); } void TestBasicStorage() { @@ -1048,7 +1028,7 @@ class GMPStorageTest : public GMPDecryptorProxyCallback } void TestCrossOriginStorage() { - EXPECT_TRUE(!mDecryptor); + EXPECT_TRUE(!mCDM); // Send the decryptor the message "store recordid $time" // Wait for the decrytor to send us "stored recordid $time" @@ -1208,8 +1188,8 @@ class GMPStorageTest : public GMPDecryptorProxyCallback } void ShutdownThen(already_AddRefed aContinuation) { - EXPECT_TRUE(!!mDecryptor); - if (!mDecryptor) { + EXPECT_TRUE(!!mCDM); + if (!mCDM) { return; } EXPECT_FALSE(mNodeId.IsEmpty()); @@ -1222,9 +1202,9 @@ class GMPStorageTest : public GMPDecryptorProxyCallback } void Shutdown() { - if (mDecryptor) { - mDecryptor->Close(); - mDecryptor = nullptr; + if (mCDM) { + mCDM->Shutdown(); + mCDM = nullptr; mNodeId = EmptyCString(); } } @@ -1240,9 +1220,9 @@ class GMPStorageTest : public GMPDecryptorProxyCallback SystemGroup::Dispatch(TaskCategory::Other, task.forget()); } - void SessionMessage(const nsCString& aSessionId, - mozilla::dom::MediaKeyMessageType aMessageType, - const nsTArray& aMessage) override + void SessionMessage(const nsACString& aSessionId, + uint32_t aMessageType, + const nsTArray& aMessage) { MonitorAutoLock mon(mMonitor); @@ -1259,42 +1239,10 @@ class GMPStorageTest : public GMPDecryptorProxyCallback } } - void SetDecryptorId(uint32_t aId) override - { - if (!mSetDecryptorIdContinuation) { - return; - } - nsCOMPtr thread(GetGMPThread()); - thread->Dispatch(mSetDecryptorIdContinuation, NS_DISPATCH_NORMAL); - mSetDecryptorIdContinuation = nullptr; - } - - void SetSessionId(uint32_t aCreateSessionToken, - const nsCString& aSessionId) override { } - void ResolveLoadSessionPromise(uint32_t aPromiseId, - bool aSuccess) override {} - void ResolvePromise(uint32_t aPromiseId) override {} - void RejectPromise(uint32_t aPromiseId, - nsresult aException, - const nsCString& aSessionId) override { } - void ExpirationChange(const nsCString& aSessionId, - UnixTime aExpiryTime) override {} - void SessionClosed(const nsCString& aSessionId) override {} - void SessionError(const nsCString& aSessionId, - nsresult aException, - uint32_t aSystemCode, - const nsCString& aMessage) override {} - void Decrypted(uint32_t aId, - mozilla::DecryptStatus aResult, - const nsTArray& aDecryptedData) override { } - - void BatchedKeyStatusChanged(const nsCString& aSessionId, - const nsTArray& aKeyInfos) override { } - - void Terminated() override { - if (mDecryptor) { - mDecryptor->Close(); - mDecryptor = nullptr; + void Terminated() { + if (mCDM) { + mCDM->Shutdown(); + mCDM = nullptr; } } @@ -1315,10 +1263,63 @@ private: RefPtr mSetDecryptorIdContinuation; GMPDecryptorProxy* mDecryptor; + RefPtr mCDM; Monitor mMonitor; Atomic mFinished; nsCString mNodeId; -}; + + class CallbackProxy : public ChromiumCDMCallback { + public: + + CallbackProxy(GMPStorageTest* aRunner) + : mRunner(aRunner) + { + } + + void SetSessionId(uint32_t aPromiseId, + const nsCString& aSessionId) override { } + + void ResolveLoadSessionPromise(uint32_t aPromiseId, + bool aSuccessful) override { } + + void ResolvePromise(uint32_t aPromiseId) override { } + + void RejectPromise(uint32_t aPromiseId, + nsresult aError, + const nsCString& aErrorMessage) override { } + + void SessionMessage(const nsACString& aSessionId, + uint32_t aMessageType, + nsTArray&& aMessage) override + { + mRunner->SessionMessage(aSessionId, aMessageType, Move(aMessage)); + } + + void SessionKeysChange(const nsCString& aSessionId, + nsTArray&& aKeysInfo) override { } + + void ExpirationChange(const nsCString& aSessionId, + double aSecondsSinceEpoch) override { } + + void SessionClosed(const nsCString& aSessionId) override { } + + void LegacySessionError(const nsCString& aSessionId, + nsresult aError, + uint32_t aSystemCode, + const nsCString& aMessage) override { } + + void Terminated() override { mRunner->Terminated(); } + + void Shutdown() override { mRunner->Shutdown(); } + + private: + + // Warning: Weak ref. + GMPStorageTest* mRunner; + }; + + UniquePtr mCallback; +}; // class GMPStorageTest void GMPTestRunner::DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&)) From b394995f8f6fc1f3f6f90f4b690a1522d6319488 Mon Sep 17 00:00:00 2001 From: James Cheng Date: Wed, 27 Sep 2017 21:06:56 +0800 Subject: [PATCH 022/108] Bug 1396493 - Part3 - Rename only the file names from gmp-* to cdm-* a. r=cpearce MozReview-Commit-ID: AbEYahxfp4b --HG-- rename : dom/media/gmp-plugin/gmp-fake.cpp => dom/media/gmp-plugin/cdm-fake.cpp rename : dom/media/gmp-plugin/gmp-test-decryptor.cpp => dom/media/gmp-plugin/cdm-test-decryptor.cpp rename : dom/media/gmp-plugin/gmp-test-decryptor.h => dom/media/gmp-plugin/cdm-test-decryptor.h rename : dom/media/gmp-plugin/gmp-test-output-protection.h => dom/media/gmp-plugin/cdm-test-output-protection.h rename : dom/media/gmp-plugin/gmp-test-storage.cpp => dom/media/gmp-plugin/cdm-test-storage.cpp rename : dom/media/gmp-plugin/gmp-test-storage.h => dom/media/gmp-plugin/cdm-test-storage.h extra : rebase_source : bb5abd64591c62d53b7aecdac960dc3f3f48f619 --- dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp | 12 ------------ dom/media/gmp-plugin/{gmp-fake.cpp => cdm-fake.cpp} | 0 ...gmp-test-decryptor.cpp => cdm-test-decryptor.cpp} | 0 .../{gmp-test-decryptor.h => cdm-test-decryptor.h} | 0 ...put-protection.h => cdm-test-output-protection.h} | 0 .../{gmp-test-storage.cpp => cdm-test-storage.cpp} | 0 .../{gmp-test-storage.h => cdm-test-storage.h} | 0 dom/media/gmp-plugin/manifest.json | 2 +- dom/media/gmp-plugin/moz.build | 6 +++--- 9 files changed, 4 insertions(+), 16 deletions(-) rename dom/media/gmp-plugin/{gmp-fake.cpp => cdm-fake.cpp} (100%) rename dom/media/gmp-plugin/{gmp-test-decryptor.cpp => cdm-test-decryptor.cpp} (100%) rename dom/media/gmp-plugin/{gmp-test-decryptor.h => cdm-test-decryptor.h} (100%) rename dom/media/gmp-plugin/{gmp-test-output-protection.h => cdm-test-output-protection.h} (100%) rename dom/media/gmp-plugin/{gmp-test-storage.cpp => cdm-test-storage.cpp} (100%) rename dom/media/gmp-plugin/{gmp-test-storage.h => cdm-test-storage.h} (100%) diff --git a/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp b/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp index 90fecd05000a..06a12675dbe2 100644 --- a/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp +++ b/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp @@ -50,12 +50,6 @@ #include "gmp-video-frame-i420.h" #include "gmp-video-frame-encoded.h" -#if defined(GMP_FAKE_SUPPORT_DECRYPT) -#include "gmp-decryption.h" -#include "gmp-test-decryptor.h" -#include "gmp-test-storage.h" -#endif - #include "mozilla/PodOperations.h" #if defined(_MSC_VER) @@ -476,12 +470,6 @@ extern "C" { if (!strcmp (aApiName, GMP_API_VIDEO_ENCODER)) { *aPluginApi = new FakeVideoEncoder (static_cast (aHostAPI)); return GMPNoErr; -#if defined(GMP_FAKE_SUPPORT_DECRYPT) - } - if (!strcmp (aApiName, GMP_API_DECRYPTOR)) { - *aPluginApi = new FakeDecryptor(); - return GMPNoErr; -#endif } return GMPGenericErr; } diff --git a/dom/media/gmp-plugin/gmp-fake.cpp b/dom/media/gmp-plugin/cdm-fake.cpp similarity index 100% rename from dom/media/gmp-plugin/gmp-fake.cpp rename to dom/media/gmp-plugin/cdm-fake.cpp diff --git a/dom/media/gmp-plugin/gmp-test-decryptor.cpp b/dom/media/gmp-plugin/cdm-test-decryptor.cpp similarity index 100% rename from dom/media/gmp-plugin/gmp-test-decryptor.cpp rename to dom/media/gmp-plugin/cdm-test-decryptor.cpp diff --git a/dom/media/gmp-plugin/gmp-test-decryptor.h b/dom/media/gmp-plugin/cdm-test-decryptor.h similarity index 100% rename from dom/media/gmp-plugin/gmp-test-decryptor.h rename to dom/media/gmp-plugin/cdm-test-decryptor.h diff --git a/dom/media/gmp-plugin/gmp-test-output-protection.h b/dom/media/gmp-plugin/cdm-test-output-protection.h similarity index 100% rename from dom/media/gmp-plugin/gmp-test-output-protection.h rename to dom/media/gmp-plugin/cdm-test-output-protection.h diff --git a/dom/media/gmp-plugin/gmp-test-storage.cpp b/dom/media/gmp-plugin/cdm-test-storage.cpp similarity index 100% rename from dom/media/gmp-plugin/gmp-test-storage.cpp rename to dom/media/gmp-plugin/cdm-test-storage.cpp diff --git a/dom/media/gmp-plugin/gmp-test-storage.h b/dom/media/gmp-plugin/cdm-test-storage.h similarity index 100% rename from dom/media/gmp-plugin/gmp-test-storage.h rename to dom/media/gmp-plugin/cdm-test-storage.h diff --git a/dom/media/gmp-plugin/manifest.json b/dom/media/gmp-plugin/manifest.json index 9bee6d8e1e9a..1c3218bbfdcb 100644 --- a/dom/media/gmp-plugin/manifest.json +++ b/dom/media/gmp-plugin/manifest.json @@ -1,6 +1,6 @@ { "name": "fake", - "description": "Fake GMP Plugin", + "description": "Fake CDM Plugin", "version": "1", "x-cdm-module-versions": "4", "x-cdm-interface-versions": "8", diff --git a/dom/media/gmp-plugin/moz.build b/dom/media/gmp-plugin/moz.build index ebc522c62c5d..ef54e912958f 100644 --- a/dom/media/gmp-plugin/moz.build +++ b/dom/media/gmp-plugin/moz.build @@ -11,9 +11,9 @@ FINAL_TARGET_FILES += [ ] SOURCES += [ - 'gmp-fake.cpp', - 'gmp-test-decryptor.cpp', - 'gmp-test-storage.cpp', + 'cdm-fake.cpp', + 'cdm-test-decryptor.cpp', + 'cdm-test-storage.cpp', ] DEFINES['CDM_IMPLEMENTATION'] = True From 19984a5dd390e8482db5580f483ff1b272714cdf Mon Sep 17 00:00:00 2001 From: James Cheng Date: Wed, 27 Sep 2017 21:12:39 +0800 Subject: [PATCH 023/108] Bug 1396493 - Part4 - Fix the include header name after renaming by Part3. r=cpearce MozReview-Commit-ID: 3dPKXXRqnUF --HG-- extra : rebase_source : 010c6073ec49149b4e1db0d20d5cc6beeb9cffea --- dom/media/gmp-plugin/cdm-fake.cpp | 2 +- dom/media/gmp-plugin/cdm-test-decryptor.cpp | 10 +++++----- dom/media/gmp-plugin/cdm-test-output-protection.h | 4 ++-- dom/media/gmp-plugin/cdm-test-storage.cpp | 2 +- dom/media/gmp-plugin/cdm-test-storage.h | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dom/media/gmp-plugin/cdm-fake.cpp b/dom/media/gmp-plugin/cdm-fake.cpp index f501da189fe7..9b5f6579fd97 100644 --- a/dom/media/gmp-plugin/cdm-fake.cpp +++ b/dom/media/gmp-plugin/cdm-fake.cpp @@ -34,9 +34,9 @@ */ #include "stddef.h" +#include "cdm-test-decryptor.h" #include "content_decryption_module.h" #include "content_decryption_module_ext.h" -#include "gmp-test-decryptor.h" extern "C" { diff --git a/dom/media/gmp-plugin/cdm-test-decryptor.cpp b/dom/media/gmp-plugin/cdm-test-decryptor.cpp index 5a71e19066f2..a295db2ff4a1 100644 --- a/dom/media/gmp-plugin/cdm-test-decryptor.cpp +++ b/dom/media/gmp-plugin/cdm-test-decryptor.cpp @@ -3,9 +3,9 @@ * 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 "gmp-test-decryptor.h" -#include "gmp-test-storage.h" -#include "gmp-test-output-protection.h" +#include "cdm-test-decryptor.h" +#include "cdm-test-storage.h" +#include "cdm-test-output-protection.h" #include #include @@ -301,7 +301,7 @@ DoTestStorage(const string& aPrefix, TestManager* aTestManager) { MOZ_ASSERT(FakeDecryptor::sInstance->mHost, "FakeDecryptor::sInstance->mHost should not be null"); // Basic I/O tests. We run three cases concurrently. The tests, like - // GMPStorage run asynchronously. When they've all passed, we send + // CDMStorage run asynchronously. When they've all passed, we send // a message back to the parent process, or a failure message if not. // Test 1: Basic I/O test, and test that writing 0 bytes in a record @@ -469,6 +469,6 @@ FakeDecryptor::UpdateSession(uint32_t aPromiseId, "shutdown-token", ReportReadRecordContinuation("shutdown-token")); } else if (task == "test-op-apis") { - mozilla::gmptest::TestOuputProtectionAPIs(); + mozilla::cdmtest::TestOuputProtectionAPIs(); } } diff --git a/dom/media/gmp-plugin/cdm-test-output-protection.h b/dom/media/gmp-plugin/cdm-test-output-protection.h index ee773eda82ae..8b92e8d11404 100644 --- a/dom/media/gmp-plugin/cdm-test-output-protection.h +++ b/dom/media/gmp-plugin/cdm-test-output-protection.h @@ -15,7 +15,7 @@ #endif namespace mozilla { -namespace gmptest { +namespace cdmtest { #if defined(XP_WIN) typedef HRESULT(STDAPICALLTYPE * OPMGetVideoOutputsFromHMONITORProc) @@ -125,5 +125,5 @@ TestOuputProtectionAPIs() FakeDecryptor::Message("OP tests completed"); } -} // namespace gmptest +} // namespace cdmtest } // namespace mozilla diff --git a/dom/media/gmp-plugin/cdm-test-storage.cpp b/dom/media/gmp-plugin/cdm-test-storage.cpp index 066cac065bc9..93a0512c0b42 100644 --- a/dom/media/gmp-plugin/cdm-test-storage.cpp +++ b/dom/media/gmp-plugin/cdm-test-storage.cpp @@ -3,7 +3,7 @@ * 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 "gmp-test-storage.h" +#include "cdm-test-storage.h" #include #include "mozilla/Assertions.h" diff --git a/dom/media/gmp-plugin/cdm-test-storage.h b/dom/media/gmp-plugin/cdm-test-storage.h index 3a2a6d6f6d14..b34189139256 100644 --- a/dom/media/gmp-plugin/cdm-test-storage.h +++ b/dom/media/gmp-plugin/cdm-test-storage.h @@ -3,8 +3,8 @@ * 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 TEST_GMP_STORAGE_H__ -#define TEST_GMP_STORAGE_H__ +#ifndef TEST_CDM_STORAGE_H__ +#define TEST_CDM_STORAGE_H__ #include #include @@ -51,4 +51,4 @@ public: void OpenRecord(cdm::Host_8* aHost, const std::string& aRecordName, std::function&& aOpenComplete); -#endif // TEST_GMP_STORAGE_H__ +#endif // TEST_CDM_STORAGE_H__ From 7cd96467c1d773c5f0a4b54bbbb2b740ab180c3c Mon Sep 17 00:00:00 2001 From: James Cheng Date: Tue, 26 Sep 2017 17:24:04 +0800 Subject: [PATCH 024/108] Bug 1396493 - Part5 - Split out the CDM testing from TestGMPCrossOrigin.cpp to TestCDMStorage.cpp and rename GMPStorage into CDMStorage. r=cpearce MozReview-Commit-ID: H17Iz67d4i7 --HG-- extra : rebase_source : 462dc6d559bc5d38a7b132103f023c3edfab0a2c --- dom/media/gtest/TestCDMStorage.cpp | 1164 ++++++++++++++++++++++++ dom/media/gtest/TestGMPCrossOrigin.cpp | 1152 +---------------------- dom/media/gtest/moz.build | 1 + 3 files changed, 1167 insertions(+), 1150 deletions(-) create mode 100644 dom/media/gtest/TestCDMStorage.cpp diff --git a/dom/media/gtest/TestCDMStorage.cpp b/dom/media/gtest/TestCDMStorage.cpp new file mode 100644 index 000000000000..94814e5e98e5 --- /dev/null +++ b/dom/media/gtest/TestCDMStorage.cpp @@ -0,0 +1,1164 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 "gtest/gtest.h" + +#include "mozilla/RefPtr.h" + +#include "ChromiumCDMCallback.h" +#include "GMPTestMonitor.h" +#include "GMPServiceParent.h" +#include "nsIFile.h" +#include "nsISimpleEnumerator.h" +#include "nsNSSComponent.h" //For EnsureNSSInitializedChromeOrContent +#include "nsThreadUtils.h" + +using namespace mozilla; +using namespace mozilla::gmp; + +static already_AddRefed +GetGMPThread() +{ + RefPtr service = + GeckoMediaPluginService::GetGeckoMediaPluginService(); + nsCOMPtr thread; + EXPECT_TRUE(NS_SUCCEEDED(service->GetThread(getter_AddRefs(thread)))); + return thread.forget(); +} + +static RefPtr +GetAbstractGMPThread() +{ + RefPtr service = + GeckoMediaPluginService::GetGeckoMediaPluginService(); + return service->GetAbstractGMPThread(); +} +/** + * Enumerate files under |aPath| (non-recursive). + */ +template +static nsresult +EnumerateDir(nsIFile* aPath, T&& aDirIter) +{ + nsCOMPtr iter; + nsresult rv = aPath->GetDirectoryEntries(getter_AddRefs(iter)); + if (NS_FAILED(rv)) { + return rv; + } + + bool hasMore = false; + while (NS_SUCCEEDED(iter->HasMoreElements(&hasMore)) && hasMore) { + nsCOMPtr supports; + rv = iter->GetNext(getter_AddRefs(supports)); + if (NS_FAILED(rv)) { + continue; + } + + nsCOMPtr entry(do_QueryInterface(supports, &rv)); + if (NS_FAILED(rv)) { + continue; + } + + aDirIter(entry); + } + return NS_OK; +} + +/** + * Enumerate files under $profileDir/gmp/$platform/gmp-fake/$aDir/ (non-recursive). + */ +template +static nsresult +EnumerateCDMStorageDir(const nsACString& aDir, T&& aDirIter) +{ + RefPtr service = + GeckoMediaPluginServiceParent::GetSingleton(); + MOZ_ASSERT(service); + + // $profileDir/gmp/$platform/ + nsCOMPtr path; + nsresult rv = service->GetStorageDir(getter_AddRefs(path)); + if (NS_FAILED(rv)) { + return rv; + } + + + // $profileDir/gmp/$platform/gmp-fake/ + rv = path->Append(NS_LITERAL_STRING("gmp-fake")); + if (NS_FAILED(rv)) { + return rv; + } + + // $profileDir/gmp/$platform/gmp-fake/$aDir/ + rv = path->AppendNative(aDir); + if (NS_FAILED(rv)) { + return rv; + } + + return EnumerateDir(path, aDirIter); +} + +class GMPShutdownObserver : public nsIRunnable + , public nsIObserver { +public: + GMPShutdownObserver(already_AddRefed aShutdownTask, + already_AddRefed Continuation, + const nsACString& aNodeId) + : mShutdownTask(aShutdownTask) + , mContinuation(Continuation) + , mNodeId(NS_ConvertUTF8toUTF16(aNodeId)) + {} + + NS_DECL_THREADSAFE_ISUPPORTS + + NS_IMETHOD Run() override { + MOZ_ASSERT(NS_IsMainThread()); + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + EXPECT_TRUE(observerService); + observerService->AddObserver(this, "gmp-shutdown", false); + + nsCOMPtr thread(GetGMPThread()); + thread->Dispatch(mShutdownTask, NS_DISPATCH_NORMAL); + return NS_OK; + } + + NS_IMETHOD Observe(nsISupports* aSubject, + const char* aTopic, + const char16_t* aSomeData) override + { + if (!strcmp(aTopic, "gmp-shutdown") && + mNodeId.Equals(nsDependentString(aSomeData))) { + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + EXPECT_TRUE(observerService); + observerService->RemoveObserver(this, "gmp-shutdown"); + nsCOMPtr thread(GetGMPThread()); + thread->Dispatch(mContinuation, NS_DISPATCH_NORMAL); + } + return NS_OK; + } + +private: + virtual ~GMPShutdownObserver() {} + nsCOMPtr mShutdownTask; + nsCOMPtr mContinuation; + const nsString mNodeId; +}; + +NS_IMPL_ISUPPORTS(GMPShutdownObserver, nsIRunnable, nsIObserver) + +class NotifyObserversTask : public Runnable { +public: + explicit NotifyObserversTask(const char* aTopic) + : mozilla::Runnable("NotifyObserversTask") + , mTopic(aTopic) + {} + NS_IMETHOD Run() override { + MOZ_ASSERT(NS_IsMainThread()); + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + if (observerService) { + observerService->NotifyObservers(nullptr, mTopic, nullptr); + } + return NS_OK; + } + const char* mTopic; +}; + +class ClearCDMStorageTask : public nsIRunnable + , public nsIObserver { +public: + ClearCDMStorageTask(already_AddRefed Continuation, + nsIThread* aTarget, PRTime aSince) + : mContinuation(Continuation) + , mTarget(aTarget) + , mSince(aSince) + {} + + NS_DECL_THREADSAFE_ISUPPORTS + + NS_IMETHOD Run() override { + MOZ_ASSERT(NS_IsMainThread()); + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + EXPECT_TRUE(observerService); + observerService->AddObserver(this, "gmp-clear-storage-complete", false); + if (observerService) { + nsAutoString str; + if (mSince >= 0) { + str.AppendInt(static_cast(mSince)); + } + observerService->NotifyObservers( + nullptr, "browser:purge-session-history", str.Data()); + } + return NS_OK; + } + + NS_IMETHOD Observe(nsISupports* aSubject, + const char* aTopic, + const char16_t* aSomeData) override + { + if (!strcmp(aTopic, "gmp-clear-storage-complete")) { + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + EXPECT_TRUE(observerService); + observerService->RemoveObserver(this, "gmp-clear-storage-complete"); + mTarget->Dispatch(mContinuation, NS_DISPATCH_NORMAL); + } + return NS_OK; + } + +private: + virtual ~ClearCDMStorageTask() {} + nsCOMPtr mContinuation; + nsCOMPtr mTarget; + const PRTime mSince; +}; + +NS_IMPL_ISUPPORTS(ClearCDMStorageTask, nsIRunnable, nsIObserver) + +static void +ClearCDMStorage(already_AddRefed aContinuation, + nsIThread* aTarget, PRTime aSince = -1) +{ + RefPtr task( + new ClearCDMStorageTask(Move(aContinuation), aTarget, aSince)); + SystemGroup::Dispatch(TaskCategory::Other, task.forget()); +} + +static void +SimulatePBModeExit() +{ + // SystemGroup::EventTargetFor() doesn't support NS_DISPATCH_SYNC. + NS_DispatchToMainThread(new NotifyObserversTask("last-pb-context-exited"), NS_DISPATCH_SYNC); +} + +class TestGetNodeIdCallback : public GetNodeIdCallback +{ +public: + TestGetNodeIdCallback(nsCString& aNodeId, nsresult& aResult) + : mNodeId(aNodeId), + mResult(aResult) + { + } + + void Done(nsresult aResult, const nsACString& aNodeId) + { + mResult = aResult; + mNodeId = aNodeId; + } + +private: + nsCString& mNodeId; + nsresult& mResult; +}; + +static NodeId +GetNodeId(const nsAString& aOrigin, + const nsAString& aTopLevelOrigin, + const nsAString & aGmpName, + bool aInPBMode) +{ + OriginAttributes attrs; + attrs.mPrivateBrowsingId = aInPBMode ? 1 : 0; + + nsAutoCString suffix; + attrs.CreateSuffix(suffix); + + nsAutoString origin; + origin.Assign(aOrigin); + origin.Append(NS_ConvertUTF8toUTF16(suffix)); + + nsAutoString topLevelOrigin; + topLevelOrigin.Assign(aTopLevelOrigin); + topLevelOrigin.Append(NS_ConvertUTF8toUTF16(suffix)); + return NodeId(origin, topLevelOrigin, aGmpName); +} + +static nsCString +GetNodeId(const nsAString& aOrigin, + const nsAString& aTopLevelOrigin, + bool aInPBMode) +{ + RefPtr service = + GeckoMediaPluginServiceParent::GetSingleton(); + EXPECT_TRUE(service); + nsCString nodeId; + nsresult result; + UniquePtr callback(new TestGetNodeIdCallback(nodeId, + result)); + + OriginAttributes attrs; + attrs.mPrivateBrowsingId = aInPBMode ? 1 : 0; + + nsAutoCString suffix; + attrs.CreateSuffix(suffix); + + nsAutoString origin; + origin.Assign(aOrigin); + origin.Append(NS_ConvertUTF8toUTF16(suffix)); + + nsAutoString topLevelOrigin; + topLevelOrigin.Assign(aTopLevelOrigin); + topLevelOrigin.Append(NS_ConvertUTF8toUTF16(suffix)); + + // We rely on the fact that the GetNodeId implementation for + // GeckoMediaPluginServiceParent is synchronous. + nsresult rv = service->GetNodeId(origin, + topLevelOrigin, + NS_LITERAL_STRING("gmp-fake"), + Move(callback)); + EXPECT_TRUE(NS_SUCCEEDED(rv) && NS_SUCCEEDED(result)); + return nodeId; +} + +static bool +IsCDMStorageIsEmpty() +{ + RefPtr service = + GeckoMediaPluginServiceParent::GetSingleton(); + MOZ_ASSERT(service); + nsCOMPtr storage; + nsresult rv = service->GetStorageDir(getter_AddRefs(storage)); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + bool exists = false; + if (storage) { + storage->Exists(&exists); + } + return !exists; +} + +static void +AssertIsOnGMPThread() +{ + RefPtr service = + GeckoMediaPluginService::GetGeckoMediaPluginService(); + MOZ_ASSERT(service); + nsCOMPtr thread; + service->GetThread(getter_AddRefs(thread)); + MOZ_ASSERT(thread); + nsCOMPtr currentThread; + DebugOnly rv = NS_GetCurrentThread(getter_AddRefs(currentThread)); + MOZ_ASSERT(NS_SUCCEEDED(rv)); + MOZ_ASSERT(currentThread == thread); +} + +class CDMStorageTest +{ + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CDMStorageTest) + + void DoTest(void (CDMStorageTest::*aTestMethod)()) { + EnsureNSSInitializedChromeOrContent(); + nsCOMPtr thread(GetGMPThread()); + ClearCDMStorage( + NewRunnableMethod("CDMStorageTest::DoTest", this, aTestMethod), thread); + AwaitFinished(); + } + + CDMStorageTest() + : mMonitor("CDMStorageTest") + , mFinished(false) + { + } + + void + Update(const nsCString& aMessage) + { + nsTArray msg; + msg.AppendElements(aMessage.get(), aMessage.Length()); + mCDM->UpdateSession(NS_LITERAL_CSTRING("fake-session-id"), 1, msg); + } + + void TestGetNodeId() + { + AssertIsOnGMPThread(); + + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + const nsString origin1 = NS_LITERAL_STRING("http://example1.com"); + const nsString origin2 = NS_LITERAL_STRING("http://example2.org"); + + nsCString PBnodeId1 = GetNodeId(origin1, origin2, true); + nsCString PBnodeId2 = GetNodeId(origin1, origin2, true); + + // Node ids for the same origins should be the same in PB mode. + EXPECT_TRUE(PBnodeId1.Equals(PBnodeId2)); + + nsCString PBnodeId3 = GetNodeId(origin2, origin1, true); + + // Node ids with origin and top level origin swapped should be different. + EXPECT_TRUE(!PBnodeId3.Equals(PBnodeId1)); + + // Getting node ids in PB mode should not result in the node id being stored. + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + nsCString nodeId1 = GetNodeId(origin1, origin2, false); + nsCString nodeId2 = GetNodeId(origin1, origin2, false); + + // NodeIds for the same origin pair in non-pb mode should be the same. + EXPECT_TRUE(nodeId1.Equals(nodeId2)); + + // Node ids for a given origin pair should be different for the PB origins should be the same in PB mode. + EXPECT_TRUE(!PBnodeId1.Equals(nodeId1)); + EXPECT_TRUE(!PBnodeId2.Equals(nodeId2)); + + nsCOMPtr thread(GetGMPThread()); + ClearCDMStorage( + NewRunnableMethod("CDMStorageTest::TestGetNodeId_Continuation", + this, + &CDMStorageTest::TestGetNodeId_Continuation, + nodeId1), + thread); + } + + void TestGetNodeId_Continuation(nsCString aNodeId1) { + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + // Once we clear storage, the node ids generated for the same origin-pair + // should be different. + const nsString origin1 = NS_LITERAL_STRING("http://example1.com"); + const nsString origin2 = NS_LITERAL_STRING("http://example2.org"); + nsCString nodeId3 = GetNodeId(origin1, origin2, false); + EXPECT_TRUE(!aNodeId1.Equals(nodeId3)); + + SetFinished(); + } + + void CreateDecryptor(const nsAString& aOrigin, + const nsAString& aTopLevelOrigin, + bool aInPBMode, + const nsCString& aUpdate) + { + nsTArray updates; + updates.AppendElement(aUpdate); + CreateDecryptor(aOrigin, aTopLevelOrigin, aInPBMode, Move(updates)); + } + + void CreateDecryptor(const nsAString& aOrigin, + const nsAString& aTopLevelOrigin, + bool aInPBMode, + nsTArray&& aUpdates) { + CreateDecryptor(GetNodeId(aOrigin, aTopLevelOrigin, NS_LITERAL_STRING("gmp-fake"), aInPBMode), Move(aUpdates)); + } + + void CreateDecryptor(const NodeId& aNodeId, + nsTArray&& aUpdates) { + RefPtr service = + GeckoMediaPluginService::GetGeckoMediaPluginService(); + EXPECT_TRUE(service); + + nsTArray tags; + tags.AppendElement(NS_LITERAL_CSTRING("fake")); + + RefPtr self = this; + RefPtr promise = + service->GetCDM(aNodeId, Move(tags), nullptr); + auto thread = GetAbstractGMPThread(); + promise->Then(thread, + __func__, + [self, aUpdates](RefPtr cdm) { + self->mCDM = cdm; + EXPECT_TRUE(!!self->mCDM); + self->mCallback.reset(new CallbackProxy(self)); + self->mCDM->Init(self->mCallback.get(), false, true, GetMainThreadEventTarget()); + + for (auto& update : aUpdates) { + self->Update(update); + } + }, + [](nsresult rv) { EXPECT_TRUE(false); }); + } + + void TestBasicStorage() { + AssertIsOnGMPThread(); + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + RefPtr service = + GeckoMediaPluginService::GetGeckoMediaPluginService(); + + // Send a message to the fake GMP for it to run its own tests internally. + // It sends us a "test-storage complete" message when its passed, or + // some other message if its tests fail. + Expect(NS_LITERAL_CSTRING("test-storage complete"), + NewRunnableMethod("CDMStorageTest::SetFinished", + this, + &CDMStorageTest::SetFinished)); + + CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), + NS_LITERAL_STRING("http://example2.com"), + false, + NS_LITERAL_CSTRING("test-storage")); + } + + /** + * 1. Generate storage data for some sites. + * 2. Forget about one of the sites. + * 3. Check if the storage data for the forgotten site are erased correctly. + * 4. Check if the storage data for other sites remain unchanged. + */ + void TestForgetThisSite() { + AssertIsOnGMPThread(); + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + // Generate storage data for some site. + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestForgetThisSite_AnotherSite", + this, + &CDMStorageTest::TestForgetThisSite_AnotherSite); + Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); + + CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), + NS_LITERAL_STRING("http://example2.com"), + false, + NS_LITERAL_CSTRING("test-storage")); + } + + void TestForgetThisSite_AnotherSite() { + Shutdown(); + + // Generate storage data for another site. + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestForgetThisSite_CollectSiteInfo", + this, + &CDMStorageTest::TestForgetThisSite_CollectSiteInfo); + Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); + + CreateDecryptor(NS_LITERAL_STRING("http://example3.com"), + NS_LITERAL_STRING("http://example4.com"), + false, + NS_LITERAL_CSTRING("test-storage")); + } + + struct NodeInfo { + explicit NodeInfo(const nsACString& aSite, + const mozilla::OriginAttributesPattern& aPattern) + : siteToForget(aSite) + , mPattern(aPattern) + { } + nsCString siteToForget; + mozilla::OriginAttributesPattern mPattern; + nsTArray expectedRemainingNodeIds; + }; + + class NodeIdCollector { + public: + explicit NodeIdCollector(NodeInfo* aInfo) : mNodeInfo(aInfo) {} + void operator()(nsIFile* aFile) { + nsCString salt; + nsresult rv = ReadSalt(aFile, salt); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + if (!MatchOrigin(aFile, mNodeInfo->siteToForget, mNodeInfo->mPattern)) { + mNodeInfo->expectedRemainingNodeIds.AppendElement(salt); + } + } + private: + NodeInfo* mNodeInfo; + }; + + void TestForgetThisSite_CollectSiteInfo() { + mozilla::OriginAttributesPattern pattern; + + UniquePtr siteInfo( + new NodeInfo(NS_LITERAL_CSTRING("http://example1.com"), + pattern)); + // Collect nodeIds that are expected to remain for later comparison. + EnumerateCDMStorageDir(NS_LITERAL_CSTRING("id"), + NodeIdCollector(siteInfo.get())); + // Invoke "Forget this site" on the main thread. + SystemGroup::Dispatch(TaskCategory::Other, + NewRunnableMethod&&>( + "CDMStorageTest::TestForgetThisSite_Forget", + this, + &CDMStorageTest::TestForgetThisSite_Forget, + Move(siteInfo))); + } + + void TestForgetThisSite_Forget(UniquePtr&& aSiteInfo) { + RefPtr service = + GeckoMediaPluginServiceParent::GetSingleton(); + service->ForgetThisSiteNative(NS_ConvertUTF8toUTF16(aSiteInfo->siteToForget), + aSiteInfo->mPattern); + + nsCOMPtr thread; + service->GetThread(getter_AddRefs(thread)); + + nsCOMPtr r = NewRunnableMethod&&>( + "CDMStorageTest::TestForgetThisSite_Verify", + this, + &CDMStorageTest::TestForgetThisSite_Verify, + Move(aSiteInfo)); + thread->Dispatch(r, NS_DISPATCH_NORMAL); + + nsCOMPtr f = NewRunnableMethod( + "CDMStorageTest::SetFinished", this, &CDMStorageTest::SetFinished); + thread->Dispatch(f, NS_DISPATCH_NORMAL); + } + + class NodeIdVerifier { + public: + explicit NodeIdVerifier(const NodeInfo* aInfo) + : mNodeInfo(aInfo) + , mExpectedRemainingNodeIds(aInfo->expectedRemainingNodeIds) {} + void operator()(nsIFile* aFile) { + nsCString salt; + nsresult rv = ReadSalt(aFile, salt); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + // Shouldn't match the origin if we clear correctly. + EXPECT_FALSE(MatchOrigin(aFile, mNodeInfo->siteToForget, mNodeInfo->mPattern)); + // Check if remaining nodeIDs are as expected. + EXPECT_TRUE(mExpectedRemainingNodeIds.RemoveElement(salt)); + } + ~NodeIdVerifier() { + EXPECT_TRUE(mExpectedRemainingNodeIds.IsEmpty()); + } + private: + const NodeInfo* mNodeInfo; + nsTArray mExpectedRemainingNodeIds; + }; + + class StorageVerifier { + public: + explicit StorageVerifier(const NodeInfo* aInfo) + : mExpectedRemainingNodeIds(aInfo->expectedRemainingNodeIds) {} + void operator()(nsIFile* aFile) { + nsCString salt; + nsresult rv = aFile->GetNativeLeafName(salt); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + EXPECT_TRUE(mExpectedRemainingNodeIds.RemoveElement(salt)); + } + ~StorageVerifier() { + EXPECT_TRUE(mExpectedRemainingNodeIds.IsEmpty()); + } + private: + nsTArray mExpectedRemainingNodeIds; + }; + + void TestForgetThisSite_Verify(UniquePtr&& aSiteInfo) { + nsresult rv = EnumerateCDMStorageDir( + NS_LITERAL_CSTRING("id"), NodeIdVerifier(aSiteInfo.get())); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + + rv = EnumerateCDMStorageDir( + NS_LITERAL_CSTRING("storage"), StorageVerifier(aSiteInfo.get())); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + } + + /** + * 1. Generate some storage data. + * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/id/. + * 3. Pass |t| to clear recent history. + * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and + * $profileDir/gmp/$platform/gmp-fake/storage are removed. + */ + void TestClearRecentHistory1() { + AssertIsOnGMPThread(); + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + // Generate storage data for some site. + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestClearRecentHistory1_Clear", + this, + &CDMStorageTest::TestClearRecentHistory1_Clear); + Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); + + CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), + NS_LITERAL_STRING("http://example2.com"), + false, + NS_LITERAL_CSTRING("test-storage")); +} + + /** + * 1. Generate some storage data. + * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/storage/. + * 3. Pass |t| to clear recent history. + * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and + * $profileDir/gmp/$platform/gmp-fake/storage are removed. + */ + void TestClearRecentHistory2() { + AssertIsOnGMPThread(); + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + // Generate storage data for some site. + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestClearRecentHistory2_Clear", + this, + &CDMStorageTest::TestClearRecentHistory2_Clear); + Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); + + CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), + NS_LITERAL_STRING("http://example2.com"), + false, + NS_LITERAL_CSTRING("test-storage")); + } + + /** + * 1. Generate some storage data. + * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/storage/. + * 3. Pass |t+1| to clear recent history. + * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and + * $profileDir/gmp/$platform/gmp-fake/storage remain unchanged. + */ + void TestClearRecentHistory3() { + AssertIsOnGMPThread(); + EXPECT_TRUE(IsCDMStorageIsEmpty()); + + // Generate storage data for some site. + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestClearRecentHistory3_Clear", + this, + &CDMStorageTest::TestClearRecentHistory3_Clear); + Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); + + CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), + NS_LITERAL_STRING("http://example2.com"), + false, + NS_LITERAL_CSTRING("test-storage")); + } + + class MaxMTimeFinder { + public: + MaxMTimeFinder() : mMaxTime(0) {} + void operator()(nsIFile* aFile) { + PRTime lastModified; + nsresult rv = aFile->GetLastModifiedTime(&lastModified); + if (NS_SUCCEEDED(rv) && lastModified > mMaxTime) { + mMaxTime = lastModified; + } + EnumerateDir(aFile, *this); + } + PRTime GetResult() const { return mMaxTime; } + private: + PRTime mMaxTime; + }; + + void TestClearRecentHistory1_Clear() { + MaxMTimeFinder f; + nsresult rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("id"), f); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestClearRecentHistory_CheckEmpty", + this, + &CDMStorageTest::TestClearRecentHistory_CheckEmpty); + nsCOMPtr t(GetGMPThread()); + ClearCDMStorage(r.forget(), t, f.GetResult()); + } + + void TestClearRecentHistory2_Clear() { + MaxMTimeFinder f; + nsresult rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("storage"), f); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestClearRecentHistory_CheckEmpty", + this, + &CDMStorageTest::TestClearRecentHistory_CheckEmpty); + nsCOMPtr t(GetGMPThread()); + ClearCDMStorage(r.forget(), t, f.GetResult()); + } + + void TestClearRecentHistory3_Clear() { + MaxMTimeFinder f; + nsresult rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("storage"), f); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + + nsCOMPtr r = + NewRunnableMethod("CDMStorageTest::TestClearRecentHistory_CheckNonEmpty", + this, + &CDMStorageTest::TestClearRecentHistory_CheckNonEmpty); + nsCOMPtr t(GetGMPThread()); + ClearCDMStorage(r.forget(), t, f.GetResult() + 1); + } + + class FileCounter { + public: + FileCounter() : mCount(0) {} + void operator()(nsIFile* aFile) { + ++mCount; + } + int GetCount() const { return mCount; } + private: + int mCount; + }; + + void TestClearRecentHistory_CheckEmpty() { + FileCounter c1; + nsresult rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("id"), c1); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + // There should be no files under $profileDir/gmp/$platform/gmp-fake/id/ + EXPECT_EQ(c1.GetCount(), 0); + + FileCounter c2; + rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("storage"), c2); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + // There should be no files under $profileDir/gmp/$platform/gmp-fake/storage/ + EXPECT_EQ(c2.GetCount(), 0); + + SetFinished(); + } + + void TestClearRecentHistory_CheckNonEmpty() { + FileCounter c1; + nsresult rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("id"), c1); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + // There should be one directory under $profileDir/gmp/$platform/gmp-fake/id/ + EXPECT_EQ(c1.GetCount(), 1); + + FileCounter c2; + rv = EnumerateCDMStorageDir(NS_LITERAL_CSTRING("storage"), c2); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + // There should be one directory under $profileDir/gmp/$platform/gmp-fake/storage/ + EXPECT_EQ(c2.GetCount(), 1); + + SetFinished(); + } + + void TestCrossOriginStorage() { + EXPECT_TRUE(!mCDM); + + // Send the decryptor the message "store recordid $time" + // Wait for the decrytor to send us "stored recordid $time" + auto t = time(0); + nsCString response("stored crossOriginTestRecordId "); + response.AppendInt((int64_t)t); + Expect(response, + NewRunnableMethod( + "CDMStorageTest::TestCrossOriginStorage_RecordStoredContinuation", + this, + &CDMStorageTest::TestCrossOriginStorage_RecordStoredContinuation)); + + nsCString update("store crossOriginTestRecordId "); + update.AppendInt((int64_t)t); + + // Open decryptor on one, origin, write a record, and test that that + // record can't be read on another origin. + CreateDecryptor(NS_LITERAL_STRING("http://example3.com"), + NS_LITERAL_STRING("http://example4.com"), + false, + update); + } + + void TestCrossOriginStorage_RecordStoredContinuation() { + // Close the old decryptor, and create a new one on a different origin, + // and try to read the record. + Shutdown(); + + Expect(NS_LITERAL_CSTRING( + "retrieve crossOriginTestRecordId succeeded (length 0 bytes)"), + NewRunnableMethod("CDMStorageTest::SetFinished", + this, + &CDMStorageTest::SetFinished)); + + CreateDecryptor(NS_LITERAL_STRING("http://example5.com"), + NS_LITERAL_STRING("http://example6.com"), + false, + NS_LITERAL_CSTRING("retrieve crossOriginTestRecordId")); + } + + void TestPBStorage() { + // Send the decryptor the message "store recordid $time" + // Wait for the decrytor to send us "stored recordid $time" + nsCString response("stored pbdata test-pb-data"); + Expect(response, + NewRunnableMethod( + "CDMStorageTest::TestPBStorage_RecordStoredContinuation", + this, + &CDMStorageTest::TestPBStorage_RecordStoredContinuation)); + + // Open decryptor on one, origin, write a record, close decryptor, + // open another, and test that record can be read, close decryptor, + // then send pb-last-context-closed notification, then open decryptor + // and check that it can't read that data; it should have been purged. + CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"), + NS_LITERAL_STRING("http://pb2.com"), + true, + NS_LITERAL_CSTRING("store pbdata test-pb-data")); + } + + void TestPBStorage_RecordStoredContinuation() { + Shutdown(); + + Expect(NS_LITERAL_CSTRING("retrieve pbdata succeeded (length 12 bytes)"), + NewRunnableMethod( + "CDMStorageTest::TestPBStorage_RecordRetrievedContinuation", + this, + &CDMStorageTest::TestPBStorage_RecordRetrievedContinuation)); + + CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"), + NS_LITERAL_STRING("http://pb2.com"), + true, + NS_LITERAL_CSTRING("retrieve pbdata")); + } + + void TestPBStorage_RecordRetrievedContinuation() { + Shutdown(); + SimulatePBModeExit(); + + Expect(NS_LITERAL_CSTRING("retrieve pbdata succeeded (length 0 bytes)"), + NewRunnableMethod("CDMStorageTest::SetFinished", + this, + &CDMStorageTest::SetFinished)); + + CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"), + NS_LITERAL_STRING("http://pb2.com"), + true, + NS_LITERAL_CSTRING("retrieve pbdata")); + } + +#if defined(XP_WIN) + void TestOutputProtection() { + Shutdown(); + + Expect(NS_LITERAL_CSTRING("OP tests completed"), + NewRunnableMethod("CDMStorageTest::SetFinished", + this, &CDMStorageTest::SetFinished)); + + CreateDecryptor(NS_LITERAL_STRING("http://example15.com"), + NS_LITERAL_STRING("http://example16.com"), + false, + NS_LITERAL_CSTRING("test-op-apis")); + } +#endif + + void TestLongRecordNames() { + NS_NAMED_LITERAL_CSTRING(longRecordName, + "A_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" + "long_record_name"); + + NS_NAMED_LITERAL_CSTRING(data, "Just_some_arbitrary_data."); + + MOZ_ASSERT(longRecordName.Length() < GMP_MAX_RECORD_NAME_SIZE); + MOZ_ASSERT(longRecordName.Length() > 260); // Windows MAX_PATH + + nsCString response("stored "); + response.Append(longRecordName); + response.AppendLiteral(" "); + response.Append(data); + Expect(response, + NewRunnableMethod("CDMStorageTest::SetFinished", + this, + &CDMStorageTest::SetFinished)); + + nsCString update("store "); + update.Append(longRecordName); + update.AppendLiteral(" "); + update.Append(data); + CreateDecryptor(NS_LITERAL_STRING("http://fuz.com"), + NS_LITERAL_STRING("http://baz.com"), + false, + update); + } + + void Expect(const nsCString& aMessage, already_AddRefed aContinuation) { + mExpected.AppendElement(ExpectedMessage(aMessage, Move(aContinuation))); + } + + void AwaitFinished() { + mozilla::SpinEventLoopUntil([&]() -> bool { return mFinished; }); + mFinished = false; + } + + void ShutdownThen(already_AddRefed aContinuation) { + EXPECT_TRUE(!!mCDM); + if (!mCDM) { + return; + } + EXPECT_FALSE(mNodeId.IsEmpty()); + RefPtr task(new GMPShutdownObserver( + NewRunnableMethod( + "CDMStorageTest::Shutdown", this, &CDMStorageTest::Shutdown), + Move(aContinuation), + mNodeId)); + SystemGroup::Dispatch(TaskCategory::Other, task.forget()); + } + + void Shutdown() { + if (mCDM) { + mCDM->Shutdown(); + mCDM = nullptr; + mNodeId = EmptyCString(); + } + } + + void Dummy() { + } + + void SetFinished() { + mFinished = true; + Shutdown(); + nsCOMPtr task = + NewRunnableMethod("CDMStorageTest::Dummy", this, &CDMStorageTest::Dummy); + SystemGroup::Dispatch(TaskCategory::Other, task.forget()); + } + + void SessionMessage(const nsACString& aSessionId, + uint32_t aMessageType, + const nsTArray& aMessage) + { + MonitorAutoLock mon(mMonitor); + + nsCString msg((const char*)aMessage.Elements(), aMessage.Length()); + EXPECT_TRUE(mExpected.Length() > 0); + bool matches = mExpected[0].mMessage.Equals(msg); + EXPECT_STREQ(mExpected[0].mMessage.get(), msg.get()); + if (mExpected.Length() > 0 && matches) { + nsCOMPtr continuation = mExpected[0].mContinuation; + mExpected.RemoveElementAt(0); + if (continuation) { + NS_DispatchToCurrentThread(continuation); + } + } + } + + void Terminated() { + if (mCDM) { + mCDM->Shutdown(); + mCDM = nullptr; + } + } + +private: + ~CDMStorageTest() { } + + struct ExpectedMessage { + ExpectedMessage(const nsCString& aMessage, already_AddRefed aContinuation) + : mMessage(aMessage) + , mContinuation(aContinuation) + {} + nsCString mMessage; + nsCOMPtr mContinuation; + }; + + nsTArray mExpected; + + RefPtr mSetDecryptorIdContinuation; + + RefPtr mCDM; + Monitor mMonitor; + Atomic mFinished; + nsCString mNodeId; + + class CallbackProxy : public ChromiumCDMCallback { + public: + + explicit CallbackProxy(CDMStorageTest* aRunner) + : mRunner(aRunner) + { + } + + void SetSessionId(uint32_t aPromiseId, + const nsCString& aSessionId) override { } + + void ResolveLoadSessionPromise(uint32_t aPromiseId, + bool aSuccessful) override { } + + void ResolvePromise(uint32_t aPromiseId) override { } + + void RejectPromise(uint32_t aPromiseId, + nsresult aError, + const nsCString& aErrorMessage) override { } + + void SessionMessage(const nsACString& aSessionId, + uint32_t aMessageType, + nsTArray&& aMessage) override + { + mRunner->SessionMessage(aSessionId, aMessageType, Move(aMessage)); + } + + void SessionKeysChange(const nsCString& aSessionId, + nsTArray&& aKeysInfo) override { } + + void ExpirationChange(const nsCString& aSessionId, + double aSecondsSinceEpoch) override { } + + void SessionClosed(const nsCString& aSessionId) override { } + + void LegacySessionError(const nsCString& aSessionId, + nsresult aError, + uint32_t aSystemCode, + const nsCString& aMessage) override { } + + void Terminated() override { mRunner->Terminated(); } + + void Shutdown() override { mRunner->Shutdown(); } + + private: + + // Warning: Weak ref. + CDMStorageTest* mRunner; + }; + + UniquePtr mCallback; +}; // class CDMStorageTest + + +TEST(GeckoMediaPlugins, CDMStorageGetNodeId) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestGetNodeId); +} + +TEST(GeckoMediaPlugins, CDMStorageBasic) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestBasicStorage); +} + +TEST(GeckoMediaPlugins, CDMStorageForgetThisSite) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestForgetThisSite); +} + +TEST(GeckoMediaPlugins, CDMStorageClearRecentHistory1) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestClearRecentHistory1); +} + +TEST(GeckoMediaPlugins, CDMStorageClearRecentHistory2) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestClearRecentHistory2); +} + +TEST(GeckoMediaPlugins, CDMStorageClearRecentHistory3) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestClearRecentHistory3); +} + +TEST(GeckoMediaPlugins, CDMStorageCrossOrigin) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestCrossOriginStorage); +} + +TEST(GeckoMediaPlugins, CDMStoragePrivateBrowsing) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestPBStorage); +} + +#if defined(XP_WIN) +TEST(GeckoMediaPlugins, GMPOutputProtection) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestOutputProtection); +} +#endif + +TEST(GeckoMediaPlugins, CDMStorageLongRecordNames) { + RefPtr runner = new CDMStorageTest(); + runner->DoTest(&CDMStorageTest::TestLongRecordNames); +} diff --git a/dom/media/gtest/TestGMPCrossOrigin.cpp b/dom/media/gtest/TestGMPCrossOrigin.cpp index 0e10b595dc9b..3245fa255045 100644 --- a/dom/media/gtest/TestGMPCrossOrigin.cpp +++ b/dom/media/gtest/TestGMPCrossOrigin.cpp @@ -8,21 +8,14 @@ #include "nsIObserverService.h" #include "mozilla/Services.h" #include "mozilla/StaticPtr.h" -#include "ChromiumCDMCallback.h" #include "GMPTestMonitor.h" #include "GMPVideoDecoderProxy.h" #include "GMPVideoEncoderProxy.h" -#include "GMPDecryptorProxy.h" #include "GMPServiceParent.h" #include "MediaPrefs.h" #include "nsAppDirectoryServiceDefs.h" -#include "nsIFile.h" -#include "nsISimpleEnumerator.h" #include "mozilla/Atomics.h" -#include "nsNSSComponent.h" #include "mozilla/DebugOnly.h" -#include "mozilla/dom/MediaKeyStatusMapBinding.h" // For MediaKeyStatus -#include "mozilla/dom/MediaKeyMessageEventBinding.h" // For MediaKeyMessageType #include "nsThreadUtils.h" using namespace std; @@ -229,1102 +222,13 @@ GMPTestRunner::RunTestGMPCrossOrigin4(GMPTestMonitor& aMonitor) aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin1")); } -static already_AddRefed -GetGMPThread() +void +GMPTestRunner::DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&)) { RefPtr service = GeckoMediaPluginService::GetGeckoMediaPluginService(); nsCOMPtr thread; EXPECT_TRUE(NS_SUCCEEDED(service->GetThread(getter_AddRefs(thread)))); - return thread.forget(); -} - -static RefPtr -GetAbstractGMPThread() -{ - RefPtr service = - GeckoMediaPluginService::GetGeckoMediaPluginService(); - return service->GetAbstractGMPThread(); -} -/** - * Enumerate files under |aPath| (non-recursive). - */ -template -static nsresult -EnumerateDir(nsIFile* aPath, T&& aDirIter) -{ - nsCOMPtr iter; - nsresult rv = aPath->GetDirectoryEntries(getter_AddRefs(iter)); - if (NS_FAILED(rv)) { - return rv; - } - - bool hasMore = false; - while (NS_SUCCEEDED(iter->HasMoreElements(&hasMore)) && hasMore) { - nsCOMPtr supports; - rv = iter->GetNext(getter_AddRefs(supports)); - if (NS_FAILED(rv)) { - continue; - } - - nsCOMPtr entry(do_QueryInterface(supports, &rv)); - if (NS_FAILED(rv)) { - continue; - } - - aDirIter(entry); - } - return NS_OK; -} - -/** - * Enumerate files under $profileDir/gmp/$platform/gmp-fake/$aDir/ (non-recursive). - */ -template -static nsresult -EnumerateGMPStorageDir(const nsACString& aDir, T&& aDirIter) -{ - RefPtr service = - GeckoMediaPluginServiceParent::GetSingleton(); - MOZ_ASSERT(service); - - // $profileDir/gmp/$platform/ - nsCOMPtr path; - nsresult rv = service->GetStorageDir(getter_AddRefs(path)); - if (NS_FAILED(rv)) { - return rv; - } - - - // $profileDir/gmp/$platform/gmp-fake/ - rv = path->Append(NS_LITERAL_STRING("gmp-fake")); - if (NS_FAILED(rv)) { - return rv; - } - - // $profileDir/gmp/$platform/gmp-fake/$aDir/ - rv = path->AppendNative(aDir); - if (NS_FAILED(rv)) { - return rv; - } - - return EnumerateDir(path, aDirIter); -} - -class GMPShutdownObserver : public nsIRunnable - , public nsIObserver { -public: - GMPShutdownObserver(already_AddRefed aShutdownTask, - already_AddRefed Continuation, - const nsACString& aNodeId) - : mShutdownTask(aShutdownTask) - , mContinuation(Continuation) - , mNodeId(NS_ConvertUTF8toUTF16(aNodeId)) - {} - - NS_DECL_THREADSAFE_ISUPPORTS - - NS_IMETHOD Run() override { - MOZ_ASSERT(NS_IsMainThread()); - nsCOMPtr observerService = - mozilla::services::GetObserverService(); - EXPECT_TRUE(observerService); - observerService->AddObserver(this, "gmp-shutdown", false); - - nsCOMPtr thread(GetGMPThread()); - thread->Dispatch(mShutdownTask, NS_DISPATCH_NORMAL); - return NS_OK; - } - - NS_IMETHOD Observe(nsISupports* aSubject, - const char* aTopic, - const char16_t* aSomeData) override - { - if (!strcmp(aTopic, "gmp-shutdown") && - mNodeId.Equals(nsDependentString(aSomeData))) { - nsCOMPtr observerService = - mozilla::services::GetObserverService(); - EXPECT_TRUE(observerService); - observerService->RemoveObserver(this, "gmp-shutdown"); - nsCOMPtr thread(GetGMPThread()); - thread->Dispatch(mContinuation, NS_DISPATCH_NORMAL); - } - return NS_OK; - } - -private: - virtual ~GMPShutdownObserver() {} - nsCOMPtr mShutdownTask; - nsCOMPtr mContinuation; - const nsString mNodeId; -}; - -NS_IMPL_ISUPPORTS(GMPShutdownObserver, nsIRunnable, nsIObserver) - -class NotifyObserversTask : public Runnable { -public: - explicit NotifyObserversTask(const char* aTopic) - : mozilla::Runnable("NotifyObserversTask") - , mTopic(aTopic) - {} - NS_IMETHOD Run() override { - MOZ_ASSERT(NS_IsMainThread()); - nsCOMPtr observerService = - mozilla::services::GetObserverService(); - if (observerService) { - observerService->NotifyObservers(nullptr, mTopic, nullptr); - } - return NS_OK; - } - const char* mTopic; -}; - -class ClearGMPStorageTask : public nsIRunnable - , public nsIObserver { -public: - ClearGMPStorageTask(already_AddRefed Continuation, - nsIThread* aTarget, PRTime aSince) - : mContinuation(Continuation) - , mTarget(aTarget) - , mSince(aSince) - {} - - NS_DECL_THREADSAFE_ISUPPORTS - - NS_IMETHOD Run() override { - MOZ_ASSERT(NS_IsMainThread()); - nsCOMPtr observerService = - mozilla::services::GetObserverService(); - EXPECT_TRUE(observerService); - observerService->AddObserver(this, "gmp-clear-storage-complete", false); - if (observerService) { - nsAutoString str; - if (mSince >= 0) { - str.AppendInt(static_cast(mSince)); - } - observerService->NotifyObservers( - nullptr, "browser:purge-session-history", str.Data()); - } - return NS_OK; - } - - NS_IMETHOD Observe(nsISupports* aSubject, - const char* aTopic, - const char16_t* aSomeData) override - { - if (!strcmp(aTopic, "gmp-clear-storage-complete")) { - nsCOMPtr observerService = - mozilla::services::GetObserverService(); - EXPECT_TRUE(observerService); - observerService->RemoveObserver(this, "gmp-clear-storage-complete"); - mTarget->Dispatch(mContinuation, NS_DISPATCH_NORMAL); - } - return NS_OK; - } - -private: - virtual ~ClearGMPStorageTask() {} - nsCOMPtr mContinuation; - nsCOMPtr mTarget; - const PRTime mSince; -}; - -NS_IMPL_ISUPPORTS(ClearGMPStorageTask, nsIRunnable, nsIObserver) - -static void -ClearGMPStorage(already_AddRefed aContinuation, - nsIThread* aTarget, PRTime aSince = -1) -{ - RefPtr task( - new ClearGMPStorageTask(Move(aContinuation), aTarget, aSince)); - SystemGroup::Dispatch(TaskCategory::Other, task.forget()); -} - -static void -SimulatePBModeExit() -{ - // SystemGroup::EventTargetFor() doesn't support NS_DISPATCH_SYNC. - NS_DispatchToMainThread(new NotifyObserversTask("last-pb-context-exited"), NS_DISPATCH_SYNC); -} - -class TestGetNodeIdCallback : public GetNodeIdCallback -{ -public: - TestGetNodeIdCallback(nsCString& aNodeId, nsresult& aResult) - : mNodeId(aNodeId), - mResult(aResult) - { - } - - void Done(nsresult aResult, const nsACString& aNodeId) - { - mResult = aResult; - mNodeId = aNodeId; - } - -private: - nsCString& mNodeId; - nsresult& mResult; -}; - -static NodeId -GetNodeId(const nsAString& aOrigin, - const nsAString& aTopLevelOrigin, - const nsAString & aGmpName, - bool aInPBMode) -{ - OriginAttributes attrs; - attrs.mPrivateBrowsingId = aInPBMode ? 1 : 0; - - nsAutoCString suffix; - attrs.CreateSuffix(suffix); - - nsAutoString origin; - origin.Assign(aOrigin); - origin.Append(NS_ConvertUTF8toUTF16(suffix)); - - nsAutoString topLevelOrigin; - topLevelOrigin.Assign(aTopLevelOrigin); - topLevelOrigin.Append(NS_ConvertUTF8toUTF16(suffix)); - return NodeId(origin, topLevelOrigin, aGmpName); -} - -static nsCString -GetNodeId(const nsAString& aOrigin, - const nsAString& aTopLevelOrigin, - bool aInPBMode) -{ - RefPtr service = - GeckoMediaPluginServiceParent::GetSingleton(); - EXPECT_TRUE(service); - nsCString nodeId; - nsresult result; - UniquePtr callback(new TestGetNodeIdCallback(nodeId, - result)); - - OriginAttributes attrs; - attrs.mPrivateBrowsingId = aInPBMode ? 1 : 0; - - nsAutoCString suffix; - attrs.CreateSuffix(suffix); - - nsAutoString origin; - origin.Assign(aOrigin); - origin.Append(NS_ConvertUTF8toUTF16(suffix)); - - nsAutoString topLevelOrigin; - topLevelOrigin.Assign(aTopLevelOrigin); - topLevelOrigin.Append(NS_ConvertUTF8toUTF16(suffix)); - - // We rely on the fact that the GetNodeId implementation for - // GeckoMediaPluginServiceParent is synchronous. - nsresult rv = service->GetNodeId(origin, - topLevelOrigin, - NS_LITERAL_STRING("gmp-fake"), - Move(callback)); - EXPECT_TRUE(NS_SUCCEEDED(rv) && NS_SUCCEEDED(result)); - return nodeId; -} - -static bool -IsGMPStorageIsEmpty() -{ - RefPtr service = - GeckoMediaPluginServiceParent::GetSingleton(); - MOZ_ASSERT(service); - nsCOMPtr storage; - nsresult rv = service->GetStorageDir(getter_AddRefs(storage)); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - bool exists = false; - if (storage) { - storage->Exists(&exists); - } - return !exists; -} - -static void -AssertIsOnGMPThread() -{ - RefPtr service = - GeckoMediaPluginService::GetGeckoMediaPluginService(); - MOZ_ASSERT(service); - nsCOMPtr thread; - service->GetThread(getter_AddRefs(thread)); - MOZ_ASSERT(thread); - nsCOMPtr currentThread; - DebugOnly rv = NS_GetCurrentThread(getter_AddRefs(currentThread)); - MOZ_ASSERT(NS_SUCCEEDED(rv)); - MOZ_ASSERT(currentThread == thread); -} - -class GMPStorageTest -{ - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPStorageTest) - - void DoTest(void (GMPStorageTest::*aTestMethod)()) { - EnsureNSSInitializedChromeOrContent(); - nsCOMPtr thread(GetGMPThread()); - ClearGMPStorage( - NewRunnableMethod("GMPStorageTest::DoTest", this, aTestMethod), thread); - AwaitFinished(); - } - - GMPStorageTest() - : mMonitor("GMPStorageTest") - , mFinished(false) - { - } - - void - Update(const nsCString& aMessage) - { - nsTArray msg; - msg.AppendElements(aMessage.get(), aMessage.Length()); - mCDM->UpdateSession(NS_LITERAL_CSTRING("fake-session-id"), 1, msg); - } - - void TestGetNodeId() - { - AssertIsOnGMPThread(); - - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - const nsString origin1 = NS_LITERAL_STRING("http://example1.com"); - const nsString origin2 = NS_LITERAL_STRING("http://example2.org"); - - nsCString PBnodeId1 = GetNodeId(origin1, origin2, true); - nsCString PBnodeId2 = GetNodeId(origin1, origin2, true); - - // Node ids for the same origins should be the same in PB mode. - EXPECT_TRUE(PBnodeId1.Equals(PBnodeId2)); - - nsCString PBnodeId3 = GetNodeId(origin2, origin1, true); - - // Node ids with origin and top level origin swapped should be different. - EXPECT_TRUE(!PBnodeId3.Equals(PBnodeId1)); - - // Getting node ids in PB mode should not result in the node id being stored. - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - nsCString nodeId1 = GetNodeId(origin1, origin2, false); - nsCString nodeId2 = GetNodeId(origin1, origin2, false); - - // NodeIds for the same origin pair in non-pb mode should be the same. - EXPECT_TRUE(nodeId1.Equals(nodeId2)); - - // Node ids for a given origin pair should be different for the PB origins should be the same in PB mode. - EXPECT_TRUE(!PBnodeId1.Equals(nodeId1)); - EXPECT_TRUE(!PBnodeId2.Equals(nodeId2)); - - nsCOMPtr thread(GetGMPThread()); - ClearGMPStorage( - NewRunnableMethod("GMPStorageTest::TestGetNodeId_Continuation", - this, - &GMPStorageTest::TestGetNodeId_Continuation, - nodeId1), - thread); - } - - void TestGetNodeId_Continuation(nsCString aNodeId1) { - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - // Once we clear storage, the node ids generated for the same origin-pair - // should be different. - const nsString origin1 = NS_LITERAL_STRING("http://example1.com"); - const nsString origin2 = NS_LITERAL_STRING("http://example2.org"); - nsCString nodeId3 = GetNodeId(origin1, origin2, false); - EXPECT_TRUE(!aNodeId1.Equals(nodeId3)); - - SetFinished(); - } - - void CreateDecryptor(const nsAString& aOrigin, - const nsAString& aTopLevelOrigin, - bool aInPBMode, - const nsCString& aUpdate) - { - nsTArray updates; - updates.AppendElement(aUpdate); - CreateDecryptor(aOrigin, aTopLevelOrigin, aInPBMode, Move(updates)); - } - - void CreateDecryptor(const nsAString& aOrigin, - const nsAString& aTopLevelOrigin, - bool aInPBMode, - nsTArray&& aUpdates) { - CreateDecryptor(GetNodeId(aOrigin, aTopLevelOrigin, NS_LITERAL_STRING("gmp-fake"), aInPBMode), Move(aUpdates)); - } - - void CreateDecryptor(const NodeId& aNodeId, - nsTArray&& aUpdates) { - RefPtr service = - GeckoMediaPluginService::GetGeckoMediaPluginService(); - EXPECT_TRUE(service); - - nsTArray tags; - tags.AppendElement(NS_LITERAL_CSTRING("fake")); - - RefPtr self = this; - RefPtr promise = - service->GetCDM(aNodeId, Move(tags), nullptr); - auto thread = GetAbstractGMPThread(); - promise->Then(thread, - __func__, - [self, aUpdates](RefPtr cdm) { - self->mCDM = cdm; - EXPECT_TRUE(!!self->mCDM); - self->mCallback.reset(new CallbackProxy(self)); - self->mCDM->Init(self->mCallback.get(), false, true, GetMainThreadEventTarget()); - - for (auto& update : aUpdates) { - self->Update(update); - } - }, - [](nsresult rv) { EXPECT_TRUE(false); }); - } - - void TestBasicStorage() { - AssertIsOnGMPThread(); - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - RefPtr service = - GeckoMediaPluginService::GetGeckoMediaPluginService(); - - // Send a message to the fake GMP for it to run its own tests internally. - // It sends us a "test-storage complete" message when its passed, or - // some other message if its tests fail. - Expect(NS_LITERAL_CSTRING("test-storage complete"), - NewRunnableMethod("GMPStorageTest::SetFinished", - this, - &GMPStorageTest::SetFinished)); - - CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), - NS_LITERAL_STRING("http://example2.com"), - false, - NS_LITERAL_CSTRING("test-storage")); - } - - /** - * 1. Generate storage data for some sites. - * 2. Forget about one of the sites. - * 3. Check if the storage data for the forgotten site are erased correctly. - * 4. Check if the storage data for other sites remain unchanged. - */ - void TestForgetThisSite() { - AssertIsOnGMPThread(); - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - // Generate storage data for some site. - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestForgetThisSite_AnotherSite", - this, - &GMPStorageTest::TestForgetThisSite_AnotherSite); - Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); - - CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), - NS_LITERAL_STRING("http://example2.com"), - false, - NS_LITERAL_CSTRING("test-storage")); - } - - void TestForgetThisSite_AnotherSite() { - Shutdown(); - - // Generate storage data for another site. - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestForgetThisSite_CollectSiteInfo", - this, - &GMPStorageTest::TestForgetThisSite_CollectSiteInfo); - Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); - - CreateDecryptor(NS_LITERAL_STRING("http://example3.com"), - NS_LITERAL_STRING("http://example4.com"), - false, - NS_LITERAL_CSTRING("test-storage")); - } - - struct NodeInfo { - explicit NodeInfo(const nsACString& aSite, - const mozilla::OriginAttributesPattern& aPattern) - : siteToForget(aSite) - , mPattern(aPattern) - { } - nsCString siteToForget; - mozilla::OriginAttributesPattern mPattern; - nsTArray expectedRemainingNodeIds; - }; - - class NodeIdCollector { - public: - explicit NodeIdCollector(NodeInfo* aInfo) : mNodeInfo(aInfo) {} - void operator()(nsIFile* aFile) { - nsCString salt; - nsresult rv = ReadSalt(aFile, salt); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - if (!MatchOrigin(aFile, mNodeInfo->siteToForget, mNodeInfo->mPattern)) { - mNodeInfo->expectedRemainingNodeIds.AppendElement(salt); - } - } - private: - NodeInfo* mNodeInfo; - }; - - void TestForgetThisSite_CollectSiteInfo() { - mozilla::OriginAttributesPattern pattern; - - UniquePtr siteInfo( - new NodeInfo(NS_LITERAL_CSTRING("http://example1.com"), - pattern)); - // Collect nodeIds that are expected to remain for later comparison. - EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), - NodeIdCollector(siteInfo.get())); - // Invoke "Forget this site" on the main thread. - SystemGroup::Dispatch(TaskCategory::Other, - NewRunnableMethod&&>( - "GMPStorageTest::TestForgetThisSite_Forget", - this, - &GMPStorageTest::TestForgetThisSite_Forget, - Move(siteInfo))); - } - - void TestForgetThisSite_Forget(UniquePtr&& aSiteInfo) { - RefPtr service = - GeckoMediaPluginServiceParent::GetSingleton(); - service->ForgetThisSiteNative(NS_ConvertUTF8toUTF16(aSiteInfo->siteToForget), - aSiteInfo->mPattern); - - nsCOMPtr thread; - service->GetThread(getter_AddRefs(thread)); - - nsCOMPtr r = NewRunnableMethod&&>( - "GMPStorageTest::TestForgetThisSite_Verify", - this, - &GMPStorageTest::TestForgetThisSite_Verify, - Move(aSiteInfo)); - thread->Dispatch(r, NS_DISPATCH_NORMAL); - - nsCOMPtr f = NewRunnableMethod( - "GMPStorageTest::SetFinished", this, &GMPStorageTest::SetFinished); - thread->Dispatch(f, NS_DISPATCH_NORMAL); - } - - class NodeIdVerifier { - public: - explicit NodeIdVerifier(const NodeInfo* aInfo) - : mNodeInfo(aInfo) - , mExpectedRemainingNodeIds(aInfo->expectedRemainingNodeIds) {} - void operator()(nsIFile* aFile) { - nsCString salt; - nsresult rv = ReadSalt(aFile, salt); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - // Shouldn't match the origin if we clear correctly. - EXPECT_FALSE(MatchOrigin(aFile, mNodeInfo->siteToForget, mNodeInfo->mPattern)); - // Check if remaining nodeIDs are as expected. - EXPECT_TRUE(mExpectedRemainingNodeIds.RemoveElement(salt)); - } - ~NodeIdVerifier() { - EXPECT_TRUE(mExpectedRemainingNodeIds.IsEmpty()); - } - private: - const NodeInfo* mNodeInfo; - nsTArray mExpectedRemainingNodeIds; - }; - - class StorageVerifier { - public: - explicit StorageVerifier(const NodeInfo* aInfo) - : mExpectedRemainingNodeIds(aInfo->expectedRemainingNodeIds) {} - void operator()(nsIFile* aFile) { - nsCString salt; - nsresult rv = aFile->GetNativeLeafName(salt); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - EXPECT_TRUE(mExpectedRemainingNodeIds.RemoveElement(salt)); - } - ~StorageVerifier() { - EXPECT_TRUE(mExpectedRemainingNodeIds.IsEmpty()); - } - private: - nsTArray mExpectedRemainingNodeIds; - }; - - void TestForgetThisSite_Verify(UniquePtr&& aSiteInfo) { - nsresult rv = EnumerateGMPStorageDir( - NS_LITERAL_CSTRING("id"), NodeIdVerifier(aSiteInfo.get())); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - rv = EnumerateGMPStorageDir( - NS_LITERAL_CSTRING("storage"), StorageVerifier(aSiteInfo.get())); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - } - - /** - * 1. Generate some storage data. - * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/id/. - * 3. Pass |t| to clear recent history. - * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and - * $profileDir/gmp/$platform/gmp-fake/storage are removed. - */ - void TestClearRecentHistory1() { - AssertIsOnGMPThread(); - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - // Generate storage data for some site. - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestClearRecentHistory1_Clear", - this, - &GMPStorageTest::TestClearRecentHistory1_Clear); - Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); - - CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), - NS_LITERAL_STRING("http://example2.com"), - false, - NS_LITERAL_CSTRING("test-storage")); -} - - /** - * 1. Generate some storage data. - * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/storage/. - * 3. Pass |t| to clear recent history. - * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and - * $profileDir/gmp/$platform/gmp-fake/storage are removed. - */ - void TestClearRecentHistory2() { - AssertIsOnGMPThread(); - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - // Generate storage data for some site. - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestClearRecentHistory2_Clear", - this, - &GMPStorageTest::TestClearRecentHistory2_Clear); - Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); - - CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), - NS_LITERAL_STRING("http://example2.com"), - false, - NS_LITERAL_CSTRING("test-storage")); - } - - /** - * 1. Generate some storage data. - * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/storage/. - * 3. Pass |t+1| to clear recent history. - * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and - * $profileDir/gmp/$platform/gmp-fake/storage remain unchanged. - */ - void TestClearRecentHistory3() { - AssertIsOnGMPThread(); - EXPECT_TRUE(IsGMPStorageIsEmpty()); - - // Generate storage data for some site. - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestClearRecentHistory3_Clear", - this, - &GMPStorageTest::TestClearRecentHistory3_Clear); - Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget()); - - CreateDecryptor(NS_LITERAL_STRING("http://example1.com"), - NS_LITERAL_STRING("http://example2.com"), - false, - NS_LITERAL_CSTRING("test-storage")); - } - - class MaxMTimeFinder { - public: - MaxMTimeFinder() : mMaxTime(0) {} - void operator()(nsIFile* aFile) { - PRTime lastModified; - nsresult rv = aFile->GetLastModifiedTime(&lastModified); - if (NS_SUCCEEDED(rv) && lastModified > mMaxTime) { - mMaxTime = lastModified; - } - EnumerateDir(aFile, *this); - } - PRTime GetResult() const { return mMaxTime; } - private: - PRTime mMaxTime; - }; - - void TestClearRecentHistory1_Clear() { - MaxMTimeFinder f; - nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), f); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestClearRecentHistory_CheckEmpty", - this, - &GMPStorageTest::TestClearRecentHistory_CheckEmpty); - nsCOMPtr t(GetGMPThread()); - ClearGMPStorage(r.forget(), t, f.GetResult()); - } - - void TestClearRecentHistory2_Clear() { - MaxMTimeFinder f; - nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), f); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestClearRecentHistory_CheckEmpty", - this, - &GMPStorageTest::TestClearRecentHistory_CheckEmpty); - nsCOMPtr t(GetGMPThread()); - ClearGMPStorage(r.forget(), t, f.GetResult()); - } - - void TestClearRecentHistory3_Clear() { - MaxMTimeFinder f; - nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), f); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - nsCOMPtr r = - NewRunnableMethod("GMPStorageTest::TestClearRecentHistory_CheckNonEmpty", - this, - &GMPStorageTest::TestClearRecentHistory_CheckNonEmpty); - nsCOMPtr t(GetGMPThread()); - ClearGMPStorage(r.forget(), t, f.GetResult() + 1); - } - - class FileCounter { - public: - FileCounter() : mCount(0) {} - void operator()(nsIFile* aFile) { - ++mCount; - } - int GetCount() const { return mCount; } - private: - int mCount; - }; - - void TestClearRecentHistory_CheckEmpty() { - FileCounter c1; - nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), c1); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - // There should be no files under $profileDir/gmp/$platform/gmp-fake/id/ - EXPECT_EQ(c1.GetCount(), 0); - - FileCounter c2; - rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), c2); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - // There should be no files under $profileDir/gmp/$platform/gmp-fake/storage/ - EXPECT_EQ(c2.GetCount(), 0); - - SetFinished(); - } - - void TestClearRecentHistory_CheckNonEmpty() { - FileCounter c1; - nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), c1); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - // There should be one directory under $profileDir/gmp/$platform/gmp-fake/id/ - EXPECT_EQ(c1.GetCount(), 1); - - FileCounter c2; - rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), c2); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - // There should be one directory under $profileDir/gmp/$platform/gmp-fake/storage/ - EXPECT_EQ(c2.GetCount(), 1); - - SetFinished(); - } - - void TestCrossOriginStorage() { - EXPECT_TRUE(!mCDM); - - // Send the decryptor the message "store recordid $time" - // Wait for the decrytor to send us "stored recordid $time" - auto t = time(0); - nsCString response("stored crossOriginTestRecordId "); - response.AppendInt((int64_t)t); - Expect(response, - NewRunnableMethod( - "GMPStorageTest::TestCrossOriginStorage_RecordStoredContinuation", - this, - &GMPStorageTest::TestCrossOriginStorage_RecordStoredContinuation)); - - nsCString update("store crossOriginTestRecordId "); - update.AppendInt((int64_t)t); - - // Open decryptor on one, origin, write a record, and test that that - // record can't be read on another origin. - CreateDecryptor(NS_LITERAL_STRING("http://example3.com"), - NS_LITERAL_STRING("http://example4.com"), - false, - update); - } - - void TestCrossOriginStorage_RecordStoredContinuation() { - // Close the old decryptor, and create a new one on a different origin, - // and try to read the record. - Shutdown(); - - Expect(NS_LITERAL_CSTRING( - "retrieve crossOriginTestRecordId succeeded (length 0 bytes)"), - NewRunnableMethod("GMPStorageTest::SetFinished", - this, - &GMPStorageTest::SetFinished)); - - CreateDecryptor(NS_LITERAL_STRING("http://example5.com"), - NS_LITERAL_STRING("http://example6.com"), - false, - NS_LITERAL_CSTRING("retrieve crossOriginTestRecordId")); - } - - void TestPBStorage() { - // Send the decryptor the message "store recordid $time" - // Wait for the decrytor to send us "stored recordid $time" - nsCString response("stored pbdata test-pb-data"); - Expect(response, - NewRunnableMethod( - "GMPStorageTest::TestPBStorage_RecordStoredContinuation", - this, - &GMPStorageTest::TestPBStorage_RecordStoredContinuation)); - - // Open decryptor on one, origin, write a record, close decryptor, - // open another, and test that record can be read, close decryptor, - // then send pb-last-context-closed notification, then open decryptor - // and check that it can't read that data; it should have been purged. - CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"), - NS_LITERAL_STRING("http://pb2.com"), - true, - NS_LITERAL_CSTRING("store pbdata test-pb-data")); - } - - void TestPBStorage_RecordStoredContinuation() { - Shutdown(); - - Expect(NS_LITERAL_CSTRING("retrieve pbdata succeeded (length 12 bytes)"), - NewRunnableMethod( - "GMPStorageTest::TestPBStorage_RecordRetrievedContinuation", - this, - &GMPStorageTest::TestPBStorage_RecordRetrievedContinuation)); - - CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"), - NS_LITERAL_STRING("http://pb2.com"), - true, - NS_LITERAL_CSTRING("retrieve pbdata")); - } - - void TestPBStorage_RecordRetrievedContinuation() { - Shutdown(); - SimulatePBModeExit(); - - Expect(NS_LITERAL_CSTRING("retrieve pbdata succeeded (length 0 bytes)"), - NewRunnableMethod("GMPStorageTest::SetFinished", - this, - &GMPStorageTest::SetFinished)); - - CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"), - NS_LITERAL_STRING("http://pb2.com"), - true, - NS_LITERAL_CSTRING("retrieve pbdata")); - } - -#if defined(XP_WIN) - void TestOutputProtection() { - Shutdown(); - - Expect(NS_LITERAL_CSTRING("OP tests completed"), - NewRunnableMethod("GMPStorageTest::SetFinished", - this, &GMPStorageTest::SetFinished)); - - CreateDecryptor(NS_LITERAL_STRING("http://example15.com"), - NS_LITERAL_STRING("http://example16.com"), - false, - NS_LITERAL_CSTRING("test-op-apis")); - } -#endif - - void TestLongRecordNames() { - NS_NAMED_LITERAL_CSTRING(longRecordName, - "A_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_" - "long_record_name"); - - NS_NAMED_LITERAL_CSTRING(data, "Just_some_arbitrary_data."); - - MOZ_ASSERT(longRecordName.Length() < GMP_MAX_RECORD_NAME_SIZE); - MOZ_ASSERT(longRecordName.Length() > 260); // Windows MAX_PATH - - nsCString response("stored "); - response.Append(longRecordName); - response.AppendLiteral(" "); - response.Append(data); - Expect(response, - NewRunnableMethod("GMPStorageTest::SetFinished", - this, - &GMPStorageTest::SetFinished)); - - nsCString update("store "); - update.Append(longRecordName); - update.AppendLiteral(" "); - update.Append(data); - CreateDecryptor(NS_LITERAL_STRING("http://fuz.com"), - NS_LITERAL_STRING("http://baz.com"), - false, - update); - } - - void Expect(const nsCString& aMessage, already_AddRefed aContinuation) { - mExpected.AppendElement(ExpectedMessage(aMessage, Move(aContinuation))); - } - - void AwaitFinished() { - mozilla::SpinEventLoopUntil([&]() -> bool { return mFinished; }); - mFinished = false; - } - - void ShutdownThen(already_AddRefed aContinuation) { - EXPECT_TRUE(!!mCDM); - if (!mCDM) { - return; - } - EXPECT_FALSE(mNodeId.IsEmpty()); - RefPtr task(new GMPShutdownObserver( - NewRunnableMethod( - "GMPStorageTest::Shutdown", this, &GMPStorageTest::Shutdown), - Move(aContinuation), - mNodeId)); - SystemGroup::Dispatch(TaskCategory::Other, task.forget()); - } - - void Shutdown() { - if (mCDM) { - mCDM->Shutdown(); - mCDM = nullptr; - mNodeId = EmptyCString(); - } - } - - void Dummy() { - } - - void SetFinished() { - mFinished = true; - Shutdown(); - nsCOMPtr task = - NewRunnableMethod("GMPStorageTest::Dummy", this, &GMPStorageTest::Dummy); - SystemGroup::Dispatch(TaskCategory::Other, task.forget()); - } - - void SessionMessage(const nsACString& aSessionId, - uint32_t aMessageType, - const nsTArray& aMessage) - { - MonitorAutoLock mon(mMonitor); - - nsCString msg((const char*)aMessage.Elements(), aMessage.Length()); - EXPECT_TRUE(mExpected.Length() > 0); - bool matches = mExpected[0].mMessage.Equals(msg); - EXPECT_STREQ(mExpected[0].mMessage.get(), msg.get()); - if (mExpected.Length() > 0 && matches) { - nsCOMPtr continuation = mExpected[0].mContinuation; - mExpected.RemoveElementAt(0); - if (continuation) { - NS_DispatchToCurrentThread(continuation); - } - } - } - - void Terminated() { - if (mCDM) { - mCDM->Shutdown(); - mCDM = nullptr; - } - } - -private: - ~GMPStorageTest() { } - - struct ExpectedMessage { - ExpectedMessage(const nsCString& aMessage, already_AddRefed aContinuation) - : mMessage(aMessage) - , mContinuation(aContinuation) - {} - nsCString mMessage; - nsCOMPtr mContinuation; - }; - - nsTArray mExpected; - - RefPtr mSetDecryptorIdContinuation; - - GMPDecryptorProxy* mDecryptor; - RefPtr mCDM; - Monitor mMonitor; - Atomic mFinished; - nsCString mNodeId; - - class CallbackProxy : public ChromiumCDMCallback { - public: - - CallbackProxy(GMPStorageTest* aRunner) - : mRunner(aRunner) - { - } - - void SetSessionId(uint32_t aPromiseId, - const nsCString& aSessionId) override { } - - void ResolveLoadSessionPromise(uint32_t aPromiseId, - bool aSuccessful) override { } - - void ResolvePromise(uint32_t aPromiseId) override { } - - void RejectPromise(uint32_t aPromiseId, - nsresult aError, - const nsCString& aErrorMessage) override { } - - void SessionMessage(const nsACString& aSessionId, - uint32_t aMessageType, - nsTArray&& aMessage) override - { - mRunner->SessionMessage(aSessionId, aMessageType, Move(aMessage)); - } - - void SessionKeysChange(const nsCString& aSessionId, - nsTArray&& aKeysInfo) override { } - - void ExpirationChange(const nsCString& aSessionId, - double aSecondsSinceEpoch) override { } - - void SessionClosed(const nsCString& aSessionId) override { } - - void LegacySessionError(const nsCString& aSessionId, - nsresult aError, - uint32_t aSystemCode, - const nsCString& aMessage) override { } - - void Terminated() override { mRunner->Terminated(); } - - void Shutdown() override { mRunner->Shutdown(); } - - private: - - // Warning: Weak ref. - GMPStorageTest* mRunner; - }; - - UniquePtr mCallback; -}; // class GMPStorageTest - -void -GMPTestRunner::DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&)) -{ - nsCOMPtr thread(GetGMPThread()); GMPTestMonitor monitor; thread->Dispatch(NewRunnableMethod( @@ -1347,55 +251,3 @@ TEST(GeckoMediaPlugins, GMPCrossOrigin) { runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin3); runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin4); } - -TEST(GeckoMediaPlugins, GMPStorageGetNodeId) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestGetNodeId); -} - -TEST(GeckoMediaPlugins, GMPStorageBasic) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestBasicStorage); -} - -TEST(GeckoMediaPlugins, GMPStorageForgetThisSite) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestForgetThisSite); -} - -TEST(GeckoMediaPlugins, GMPStorageClearRecentHistory1) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestClearRecentHistory1); -} - -TEST(GeckoMediaPlugins, GMPStorageClearRecentHistory2) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestClearRecentHistory2); -} - -TEST(GeckoMediaPlugins, GMPStorageClearRecentHistory3) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestClearRecentHistory3); -} - -TEST(GeckoMediaPlugins, GMPStorageCrossOrigin) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestCrossOriginStorage); -} - -TEST(GeckoMediaPlugins, GMPStoragePrivateBrowsing) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestPBStorage); -} - -#if defined(XP_WIN) -TEST(GeckoMediaPlugins, GMPOutputProtection) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestOutputProtection); -} -#endif - -TEST(GeckoMediaPlugins, GMPStorageLongRecordNames) { - RefPtr runner = new GMPStorageTest(); - runner->DoTest(&GMPStorageTest::TestLongRecordNames); -} diff --git a/dom/media/gtest/moz.build b/dom/media/gtest/moz.build index d83c2a59f71b..bb0022efa93a 100644 --- a/dom/media/gtest/moz.build +++ b/dom/media/gtest/moz.build @@ -13,6 +13,7 @@ UNIFIED_SOURCES += [ 'TestAudioSegment.cpp', 'TestAudioTrackEncoder.cpp', 'TestBlankVideoDataCreator.cpp', + 'TestCDMStorage.cpp', 'TestGMPCrossOrigin.cpp', 'TestGMPRemoveAndDelete.cpp', 'TestGMPUtils.cpp', From ea01048e16929c07fe6aab694b611be610a268a6 Mon Sep 17 00:00:00 2001 From: James Cheng Date: Tue, 26 Sep 2017 17:28:43 +0800 Subject: [PATCH 025/108] Bug 1396493 - Part6 - Fix unified build error due to adding a new gtest unit. r=cpearce MozReview-Commit-ID: 8l3N9c8emDb --HG-- extra : rebase_source : e85c543e35585a5bb3c291bf8bb9c6c44be3f7d6 --- dom/media/gtest/TestMediaEventSource.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/dom/media/gtest/TestMediaEventSource.cpp b/dom/media/gtest/TestMediaEventSource.cpp index 35ff041c950d..9e593be29c7e 100644 --- a/dom/media/gtest/TestMediaEventSource.cpp +++ b/dom/media/gtest/TestMediaEventSource.cpp @@ -5,6 +5,7 @@ #include "gtest/gtest.h" +#include "mozilla/SharedThreadPool.h" #include "mozilla/TaskQueue.h" #include "mozilla/UniquePtr.h" #include "MediaEventSource.h" From d88213c50f282fbc94c807a5b18b9fa142f9e578 Mon Sep 17 00:00:00 2001 From: James Cheng Date: Wed, 27 Sep 2017 02:27:29 +0800 Subject: [PATCH 026/108] Bug 1396493 - Part7 - Rename dom/media/gmp-plugin to dom/media/fake-cdm r=cpearce MozReview-Commit-ID: JswVNPW3SXS --HG-- rename : dom/media/gmp-plugin/cdm-fake.cpp => dom/media/fake-cdm/cdm-fake.cpp rename : dom/media/gmp-plugin/cdm-test-decryptor.cpp => dom/media/fake-cdm/cdm-test-decryptor.cpp rename : dom/media/gmp-plugin/cdm-test-decryptor.h => dom/media/fake-cdm/cdm-test-decryptor.h rename : dom/media/gmp-plugin/cdm-test-output-protection.h => dom/media/fake-cdm/cdm-test-output-protection.h rename : dom/media/gmp-plugin/cdm-test-storage.cpp => dom/media/fake-cdm/cdm-test-storage.cpp rename : dom/media/gmp-plugin/cdm-test-storage.h => dom/media/fake-cdm/cdm-test-storage.h rename : dom/media/gmp-plugin/manifest.json => dom/media/fake-cdm/manifest.json rename : dom/media/gmp-plugin/moz.build => dom/media/fake-cdm/moz.build extra : rebase_source : 7af2ee71047d6fa85f692fa0132d2a04533027b0 --- dom/media/{gmp-plugin => fake-cdm}/cdm-fake.cpp | 0 dom/media/{gmp-plugin => fake-cdm}/cdm-test-decryptor.cpp | 0 dom/media/{gmp-plugin => fake-cdm}/cdm-test-decryptor.h | 0 dom/media/{gmp-plugin => fake-cdm}/cdm-test-output-protection.h | 0 dom/media/{gmp-plugin => fake-cdm}/cdm-test-storage.cpp | 0 dom/media/{gmp-plugin => fake-cdm}/cdm-test-storage.h | 0 dom/media/{gmp-plugin => fake-cdm}/manifest.json | 0 dom/media/{gmp-plugin => fake-cdm}/moz.build | 0 dom/media/moz.build | 2 +- 9 files changed, 1 insertion(+), 1 deletion(-) rename dom/media/{gmp-plugin => fake-cdm}/cdm-fake.cpp (100%) rename dom/media/{gmp-plugin => fake-cdm}/cdm-test-decryptor.cpp (100%) rename dom/media/{gmp-plugin => fake-cdm}/cdm-test-decryptor.h (100%) rename dom/media/{gmp-plugin => fake-cdm}/cdm-test-output-protection.h (100%) rename dom/media/{gmp-plugin => fake-cdm}/cdm-test-storage.cpp (100%) rename dom/media/{gmp-plugin => fake-cdm}/cdm-test-storage.h (100%) rename dom/media/{gmp-plugin => fake-cdm}/manifest.json (100%) rename dom/media/{gmp-plugin => fake-cdm}/moz.build (100%) diff --git a/dom/media/gmp-plugin/cdm-fake.cpp b/dom/media/fake-cdm/cdm-fake.cpp similarity index 100% rename from dom/media/gmp-plugin/cdm-fake.cpp rename to dom/media/fake-cdm/cdm-fake.cpp diff --git a/dom/media/gmp-plugin/cdm-test-decryptor.cpp b/dom/media/fake-cdm/cdm-test-decryptor.cpp similarity index 100% rename from dom/media/gmp-plugin/cdm-test-decryptor.cpp rename to dom/media/fake-cdm/cdm-test-decryptor.cpp diff --git a/dom/media/gmp-plugin/cdm-test-decryptor.h b/dom/media/fake-cdm/cdm-test-decryptor.h similarity index 100% rename from dom/media/gmp-plugin/cdm-test-decryptor.h rename to dom/media/fake-cdm/cdm-test-decryptor.h diff --git a/dom/media/gmp-plugin/cdm-test-output-protection.h b/dom/media/fake-cdm/cdm-test-output-protection.h similarity index 100% rename from dom/media/gmp-plugin/cdm-test-output-protection.h rename to dom/media/fake-cdm/cdm-test-output-protection.h diff --git a/dom/media/gmp-plugin/cdm-test-storage.cpp b/dom/media/fake-cdm/cdm-test-storage.cpp similarity index 100% rename from dom/media/gmp-plugin/cdm-test-storage.cpp rename to dom/media/fake-cdm/cdm-test-storage.cpp diff --git a/dom/media/gmp-plugin/cdm-test-storage.h b/dom/media/fake-cdm/cdm-test-storage.h similarity index 100% rename from dom/media/gmp-plugin/cdm-test-storage.h rename to dom/media/fake-cdm/cdm-test-storage.h diff --git a/dom/media/gmp-plugin/manifest.json b/dom/media/fake-cdm/manifest.json similarity index 100% rename from dom/media/gmp-plugin/manifest.json rename to dom/media/fake-cdm/manifest.json diff --git a/dom/media/gmp-plugin/moz.build b/dom/media/fake-cdm/moz.build similarity index 100% rename from dom/media/gmp-plugin/moz.build rename to dom/media/fake-cdm/moz.build diff --git a/dom/media/moz.build b/dom/media/moz.build index 08caf20bdade..b0d735289bc6 100644 --- a/dom/media/moz.build +++ b/dom/media/moz.build @@ -34,9 +34,9 @@ with Files('GetUserMedia*'): DIRS += [ 'eme', 'encoder', + 'fake-cdm', 'flac', 'gmp', - 'gmp-plugin', 'gmp-plugin-openh264', 'imagecapture', 'ipc', From 1a809037a4c52ed1acafab0078bdd50439718a5e Mon Sep 17 00:00:00 2001 From: James Cheng Date: Wed, 27 Sep 2017 02:31:30 +0800 Subject: [PATCH 027/108] Bug 1396493 - Part8 - Delete fakeopenh264.voucher. r=cpearce MozReview-Commit-ID: 56gfZT1vdX0 --HG-- extra : rebase_source : 3ff00d96e2a8f51f028e7828732db8f312c34973 --- dom/media/gmp-plugin-openh264/fakeopenh264.voucher | 1 - dom/media/gmp-plugin-openh264/moz.build | 1 - 2 files changed, 2 deletions(-) delete mode 100644 dom/media/gmp-plugin-openh264/fakeopenh264.voucher diff --git a/dom/media/gmp-plugin-openh264/fakeopenh264.voucher b/dom/media/gmp-plugin-openh264/fakeopenh264.voucher deleted file mode 100644 index 2104d73c7dd1..000000000000 --- a/dom/media/gmp-plugin-openh264/fakeopenh264.voucher +++ /dev/null @@ -1 +0,0 @@ -gmp-fakeopenh264 placeholder voucher diff --git a/dom/media/gmp-plugin-openh264/moz.build b/dom/media/gmp-plugin-openh264/moz.build index d689db9654a3..32a3d5389933 100644 --- a/dom/media/gmp-plugin-openh264/moz.build +++ b/dom/media/gmp-plugin-openh264/moz.build @@ -10,7 +10,6 @@ FINAL_TARGET = 'dist/bin/gmp-fakeopenh264/1.0' FINAL_TARGET_FILES += [ 'fakeopenh264.info', - 'fakeopenh264.voucher', ] SOURCES += [ From 10b963a86584db692cc33e1ed220da018ce55fe2 Mon Sep 17 00:00:00 2001 From: Shih-Chiang Chien Date: Mon, 12 Jun 2017 11:51:26 +0800 Subject: [PATCH 028/108] Bug 1372065 - fix cppcheck linter error in Necko. r=jduell For netwerk/cache2/CacheFileInputStream.cpp:148 and netwerk/protocol/http/nsHttpHeaderArray.cpp:358, missing "()" in the if statement. For netwerk/base/rust-url-capi/test/test.cpp:29, netwerk/streamconv/converters/nsHTTPCompressConv.cpp:297, and netwerk/streamconv/converters/nsHTTPCompressConv.cpp:300, null pointer will be returned but the original memory buffer will not be freed if |realloc| fails. We should remember the original memory buffer and free it if error is detected. MozReview-Commit-ID: 2ggXsL73jYV --HG-- extra : rebase_source : e47e41f2b37f717207bd13990efead22a14db1c0 --- netwerk/base/rust-url-capi/test/test.cpp | 7 +++++-- netwerk/cache2/CacheFileInputStream.cpp | 3 ++- netwerk/protocol/http/nsHttpHeaderArray.cpp | 2 +- netwerk/streamconv/converters/nsHTTPCompressConv.cpp | 10 ++++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/netwerk/base/rust-url-capi/test/test.cpp b/netwerk/base/rust-url-capi/test/test.cpp index 80a83c91d691..7233e3c453b2 100644 --- a/netwerk/base/rust-url-capi/test/test.cpp +++ b/netwerk/base/rust-url-capi/test/test.cpp @@ -26,7 +26,10 @@ public: { mLength = size; if (mBuffer) { - mBuffer = (char *)realloc(mBuffer, size); + char* originalBuffer = mBuffer; + if (!(mBuffer = (char *)realloc(originalBuffer, size))) { + free(originalBuffer); + } return; } mBuffer = (char *)malloc(size); @@ -142,4 +145,4 @@ int main() { printf("SUCCESS\n"); return 0; -} \ No newline at end of file +} diff --git a/netwerk/cache2/CacheFileInputStream.cpp b/netwerk/cache2/CacheFileInputStream.cpp index a12e108f7d8f..c0c39be3d95e 100644 --- a/netwerk/cache2/CacheFileInputStream.cpp +++ b/netwerk/cache2/CacheFileInputStream.cpp @@ -145,8 +145,9 @@ CacheFileInputStream::ReadSegments(nsWriteSegmentFun aWriter, void *aClosure, LOG(("CacheFileInputStream::ReadSegments() - Stream is closed. [this=%p, " "status=0x%08" PRIx32 "]", this, static_cast(mStatus))); - if NS_FAILED(mStatus) + if (NS_FAILED(mStatus)) { return mStatus; + } return NS_OK; } diff --git a/netwerk/protocol/http/nsHttpHeaderArray.cpp b/netwerk/protocol/http/nsHttpHeaderArray.cpp index 87750413794d..5047b8bd1e39 100644 --- a/netwerk/protocol/http/nsHttpHeaderArray.cpp +++ b/netwerk/protocol/http/nsHttpHeaderArray.cpp @@ -343,7 +343,7 @@ nsHttpHeaderArray::VisitHeaders(nsIHttpHeaderVisitor *visitor, nsHttpHeaderArray hdr = entry.headerNameOriginal; } rv = visitor->VisitHeader(hdr, entry.value); - if NS_FAILED(rv) { + if (NS_FAILED(rv)) { return rv; } } diff --git a/netwerk/streamconv/converters/nsHTTPCompressConv.cpp b/netwerk/streamconv/converters/nsHTTPCompressConv.cpp index 238bf621df7f..5b3cd51452f7 100644 --- a/netwerk/streamconv/converters/nsHTTPCompressConv.cpp +++ b/netwerk/streamconv/converters/nsHTTPCompressConv.cpp @@ -294,10 +294,16 @@ nsHTTPCompressConv::OnDataAvailable(nsIRequest* request, case HTTP_COMPRESS_DEFLATE: if (mInpBuffer != nullptr && streamLen > mInpBufferLen) { - mInpBuffer = (unsigned char *) realloc(mInpBuffer, mInpBufferLen = streamLen); + unsigned char* originalInpBuffer = mInpBuffer; + if (!(mInpBuffer = (unsigned char *) realloc(originalInpBuffer, mInpBufferLen = streamLen))) { + free(originalInpBuffer); + } if (mOutBufferLen < streamLen * 2) { - mOutBuffer = (unsigned char *) realloc(mOutBuffer, mOutBufferLen = streamLen * 3); + unsigned char* originalOutBuffer = mOutBuffer; + if (!(mOutBuffer = (unsigned char *) realloc(mOutBuffer, mOutBufferLen = streamLen * 3))) { + free(originalOutBuffer); + } } if (mInpBuffer == nullptr || mOutBuffer == nullptr) { From 4deddf3e9db72059330d3025e032465ab74fc75e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A3o=20Gottwald?= Date: Thu, 28 Sep 2017 10:19:23 +0200 Subject: [PATCH 029/108] Bug 1403853 - Hide the menu button separator in popup windows. r=nhnt11 MozReview-Commit-ID: HxAC8oXcQOn --HG-- extra : rebase_source : b108a8544dbbe1dc079c3542473e5a4829f305a0 --- browser/themes/shared/customizableui/panelUI.inc.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/themes/shared/customizableui/panelUI.inc.css b/browser/themes/shared/customizableui/panelUI.inc.css index d954f266a140..ef6adfbdc7aa 100644 --- a/browser/themes/shared/customizableui/panelUI.inc.css +++ b/browser/themes/shared/customizableui/panelUI.inc.css @@ -92,14 +92,14 @@ to { transform: perspective(5000px) rotateY(360deg); } } -:root:not([uidensity=compact]) #PanelUI-button { +:root:not([uidensity=compact]):not([chromehidden~="toolbar"]) #PanelUI-button { margin-inline-start: 3px; border-inline-start: 1px solid; border-image: linear-gradient(transparent 4px, rgba(0,0,0,.1) 4px, rgba(0,0,0,.1) calc(100% - 4px), transparent calc(100% - 4px)); border-image-slice: 1; } -:root:not([uidensity=compact]) #nav-bar[brighttext] > #PanelUI-button { +:root:not([uidensity=compact]):not([chromehidden~="toolbar"]) #nav-bar[brighttext] > #PanelUI-button { border-image-source: linear-gradient(transparent 4px, rgba(100%,100%,100%,.2) 4px, rgba(100%,100%,100%,.2) calc(100% - 4px), transparent calc(100% - 4px)); } From 5573e8270f5af7d7613f93a8a0a0427bdec95723 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Thu, 28 Sep 2017 11:30:33 +0200 Subject: [PATCH 030/108] Backed out changeset 0ce8d073a16e (bug 256180) --- .../en-US/chrome/layout/htmlparser.properties | 1 - layout/reftests/bugs/256180-5-ref.html | 2004 ---------------- layout/reftests/bugs/256180-5.html | 2042 ----------------- layout/reftests/bugs/256180-6-ref.html | 2004 ---------------- layout/reftests/bugs/256180-6.html | 48 - layout/reftests/bugs/reftest.list | 2 - parser/html/javasrc/StateSnapshot.java | 57 +- parser/html/javasrc/TreeBuilder.java | 136 +- parser/html/nsAHtml5TreeBuilderState.h | 2 + parser/html/nsHtml5StateSnapshot.cpp | 64 +- parser/html/nsHtml5StateSnapshot.h | 38 +- parser/html/nsHtml5TreeBuilder.cpp | 119 +- parser/html/nsHtml5TreeBuilder.h | 3 +- parser/html/nsHtml5TreeBuilderCppSupplement.h | 46 +- parser/html/nsHtml5TreeBuilderHSupplement.h | 3 - parser/html/nsHtml5TreeOpExecutor.cpp | 22 +- parser/html/nsHtml5TreeOpExecutor.h | 8 - parser/html/nsHtml5TreeOperation.cpp | 5 - parser/html/nsHtml5TreeOperation.h | 9 - 19 files changed, 208 insertions(+), 6405 deletions(-) delete mode 100644 layout/reftests/bugs/256180-5-ref.html delete mode 100644 layout/reftests/bugs/256180-5.html delete mode 100644 layout/reftests/bugs/256180-6-ref.html delete mode 100644 layout/reftests/bugs/256180-6.html diff --git a/dom/locales/en-US/chrome/layout/htmlparser.properties b/dom/locales/en-US/chrome/layout/htmlparser.properties index 5f9557584490..66987846c755 100644 --- a/dom/locales/en-US/chrome/layout/htmlparser.properties +++ b/dom/locales/en-US/chrome/layout/htmlparser.properties @@ -83,7 +83,6 @@ errNoSpaceBetweenPublicAndSystemIds=No space between the doctype public and syst errNoSpaceBetweenDoctypePublicKeywordAndQuote=No space between the doctype “PUBLIC” keyword and the quote. # Tree builder errors -errDeepTree=The document tree is too deep. The tree will be flattened to be 513 elements deep. errStrayStartTag2=Stray start tag “%1$S”. errStrayEndTag=Stray end tag “%1$S”. errUnclosedElements=End tag “%1$S” seen, but there were open elements. diff --git a/layout/reftests/bugs/256180-5-ref.html b/layout/reftests/bugs/256180-5-ref.html deleted file mode 100644 index 7227bce3ed0a..000000000000 --- a/layout/reftests/bugs/256180-5-ref.html +++ /dev/null @@ -1,2004 +0,0 @@ -<font> with alternating attributes and a character between each tag 4000 -

    <font> with alternating attributes and a character between each tag 4000

    -

    Actual depth (including text leaves): 514

    -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -PASS diff --git a/layout/reftests/bugs/256180-5.html b/layout/reftests/bugs/256180-5.html deleted file mode 100644 index 9fffc05dcfcd..000000000000 --- a/layout/reftests/bugs/256180-5.html +++ /dev/null @@ -1,2042 +0,0 @@ -<font> with alternating attributes and a character between each tag 4000 - -

    <font> with alternating attributes and a character between each tag 4000

    zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -PASS diff --git a/layout/reftests/bugs/256180-6-ref.html b/layout/reftests/bugs/256180-6-ref.html deleted file mode 100644 index e7c01b3e7270..000000000000 --- a/layout/reftests/bugs/256180-6-ref.html +++ /dev/null @@ -1,2004 +0,0 @@ -<font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs -

    <font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs

    -

    Actual depth (including text leaves): 535

    -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -zx -PASS diff --git a/layout/reftests/bugs/256180-6.html b/layout/reftests/bugs/256180-6.html deleted file mode 100644 index b8d67316d212..000000000000 --- a/layout/reftests/bugs/256180-6.html +++ /dev/null @@ -1,48 +0,0 @@ -<font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs - -

    <font> with alternating attributes and a character between each tag 4000 in innerHTML inside 20 divs

    -
    diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 975318606857..60a879ba1534 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -53,8 +53,6 @@ skip-if(isDebugBuild||Android||AddressSanitizer||(winWidget&&(!is64Bit))) == 256 # Debug builds have larger stack frames, so skipped. # Making Android on aarch64 not crash is bug 1400811. skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-4.html 256180-4-ref.html -skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-5.html 256180-5-ref.html -skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-6.html 256180-6-ref.html == 25888-1l.html 25888-1l-ref.html != 25888-1l.html 25888-1l-notref.html == 25888-1r.html 25888-1r-ref.html diff --git a/parser/html/javasrc/StateSnapshot.java b/parser/html/javasrc/StateSnapshot.java index 5d03e53039d9..169727021c4c 100644 --- a/parser/html/javasrc/StateSnapshot.java +++ b/parser/html/javasrc/StateSnapshot.java @@ -1,22 +1,22 @@ /* * Copyright (c) 2009-2010 Mozilla Foundation * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in + * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ @@ -37,10 +37,12 @@ public class StateSnapshot implements TreeBuilderState { private final T headPointer; + private final T deepTreeSurrogateParent; + private final int mode; private final int originalMode; - + private final boolean framesetOk; private final boolean needToDropLF; @@ -53,6 +55,7 @@ public class StateSnapshot implements TreeBuilderState { * @param templateModeStack * @param formPointer * @param headPointer + * @param deepTreeSurrogateParent * @param mode * @param originalMode * @param framesetOk @@ -61,20 +64,21 @@ public class StateSnapshot implements TreeBuilderState { */ StateSnapshot(StackNode[] stack, StackNode[] listOfActiveFormattingElements, int[] templateModeStack, T formPointer, - T headPointer, int mode, int originalMode, + T headPointer, T deepTreeSurrogateParent, int mode, int originalMode, boolean framesetOk, boolean needToDropLF, boolean quirks) { this.stack = stack; this.listOfActiveFormattingElements = listOfActiveFormattingElements; this.templateModeStack = templateModeStack; this.formPointer = formPointer; this.headPointer = headPointer; + this.deepTreeSurrogateParent = deepTreeSurrogateParent; this.mode = mode; this.originalMode = originalMode; this.framesetOk = framesetOk; this.needToDropLF = needToDropLF; this.quirks = quirks; } - + /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getStack() */ @@ -105,16 +109,25 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the headPointer. - * + * * @return the headPointer */ public T getHeadPointer() { return headPointer; } + /** + * Returns the deepTreeSurrogateParent. + * + * @return the deepTreeSurrogateParent + */ + public T getDeepTreeSurrogateParent() { + return deepTreeSurrogateParent; + } + /** * Returns the mode. - * + * * @return the mode */ public int getMode() { @@ -123,7 +136,7 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the originalMode. - * + * * @return the originalMode */ public int getOriginalMode() { @@ -132,7 +145,7 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the framesetOk. - * + * * @return the framesetOk */ public boolean isFramesetOk() { @@ -141,7 +154,7 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the needToDropLF. - * + * * @return the needToDropLF */ public boolean isNeedToDropLF() { @@ -150,13 +163,13 @@ public class StateSnapshot implements TreeBuilderState { /** * Returns the quirks. - * + * * @return the quirks */ public boolean isQuirks() { return quirks; } - + /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElementsLength() */ diff --git a/parser/html/javasrc/TreeBuilder.java b/parser/html/javasrc/TreeBuilder.java index a35d1521b3e9..1338b0b1b7d0 100644 --- a/parser/html/javasrc/TreeBuilder.java +++ b/parser/html/javasrc/TreeBuilder.java @@ -444,6 +444,11 @@ public abstract class TreeBuilder implements TokenHandler, private T headPointer; + /** + * Used to work around Gecko limitations. Not used in Java. + */ + private T deepTreeSurrogateParent; + protected @Auto char[] charBuffer; protected int charBufferLen = 0; @@ -610,6 +615,7 @@ public abstract class TreeBuilder implements TokenHandler, listPtr = -1; formPointer = null; headPointer = null; + deepTreeSurrogateParent = null; // [NOCPP[ html4 = false; idLocations.clear(); @@ -1636,6 +1642,7 @@ public abstract class TreeBuilder implements TokenHandler, public final void endTokenization() throws SAXException { formPointer = null; headPointer = null; + deepTreeSurrogateParent = null; templateModeStack = null; if (stack != null) { while (currentPtr > -1) { @@ -4711,11 +4718,7 @@ public abstract class TreeBuilder implements TokenHandler, removeFromListOfActiveFormattingElements(formattingEltListPos); return true; } - // commonAncestor is used for running the algorithm and - // insertionCommonAncestor is used for the actual insertions to - // keep them depth-limited. StackNode commonAncestor = stack[formattingEltStackPos - 1]; // weak ref - T insertionCommonAncestor = nodeFromStackWithBlinkCompat(formattingEltStackPos - 1); // weak ref StackNode furthestBlock = stack[furthestBlockPos]; // weak ref // detachFromParent(furthestBlock.node); XXX AAA CHANGE int bookmark = formattingEltListPos; @@ -4763,7 +4766,7 @@ public abstract class TreeBuilder implements TokenHandler, assert node == listOfActiveFormattingElements[nodeListPos]; assert node == stack[nodePos]; T clone = createElement("http://www.w3.org/1999/xhtml", - node.name, node.attributes.cloneAttributes(null), insertionCommonAncestor + node.name, node.attributes.cloneAttributes(null), commonAncestor.node // CPPONLY: , htmlCreator(node.getHtmlCreator()) ); StackNode newNode = createStackNode(node.getFlags(), node.ns, @@ -4782,18 +4785,16 @@ public abstract class TreeBuilder implements TokenHandler, node = newNode; // } XXX AAA CHANGE detachFromParent(lastNode.node); - appendElement(lastNode.node, nodeFromStackWithBlinkCompat(nodePos)); + appendElement(lastNode.node, node.node); lastNode = node; } - // If we insert into a foster parent, for simplicity, we insert - // accoding to the spec without Blink's depth limit. if (commonAncestor.isFosterParenting()) { fatal(); detachFromParent(lastNode.node); insertIntoFosterParent(lastNode.node); } else { detachFromParent(lastNode.node); - appendElement(lastNode.node, insertionCommonAncestor); + appendElement(lastNode.node, commonAncestor.node); } T clone = createElement("http://www.w3.org/1999/xhtml", formattingElt.name, @@ -4979,21 +4980,20 @@ public abstract class TreeBuilder implements TokenHandler, while (entryPos < listPtr) { entryPos++; StackNode entry = listOfActiveFormattingElements[entryPos]; - StackNode current = stack[currentPtr]; + StackNode currentNode = stack[currentPtr]; T clone; - if (current.isFosterParenting()) { + if (currentNode.isFosterParenting()) { clone = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", entry.name, entry.attributes.cloneAttributes(null) // CPPONLY: , htmlCreator(entry.getHtmlCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); clone = createElement("http://www.w3.org/1999/xhtml", entry.name, - entry.attributes.cloneAttributes(null), currentNode + entry.attributes.cloneAttributes(null), currentNode.node // CPPONLY: , htmlCreator(entry.getHtmlCreator()) ); - appendElement(clone, currentNode); + appendElement(clone, currentNode.node); } StackNode entryClone = createStackNode(entry.getFlags(), @@ -5336,7 +5336,7 @@ public abstract class TreeBuilder implements TokenHandler, // [NOCPP[ checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + T currentNode = stack[currentPtr].node; T elt = createElement("http://www.w3.org/1999/xhtml", "head", attributes, currentNode /* * head uses NS_NewHTMLSharedElement creator @@ -5378,11 +5378,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(NS_NewHTMLFormElement) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, currentNode + elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, current.node // CPPONLY: , htmlCreator(NS_NewHTMLFormElement) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } if (!isTemplateContents()) { @@ -5416,11 +5415,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode + elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, current.node // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } StackNode node = createStackNode(elementName, elt, clone // [NOCPP[ @@ -5439,7 +5437,7 @@ public abstract class TreeBuilder implements TokenHandler, checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] // This method can't be called for custom elements - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + T currentNode = stack[currentPtr].node; T elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); @@ -5473,11 +5471,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, currentNode + elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } StackNode node = createStackNode(elementName, elt, popName // [NOCPP[ @@ -5512,11 +5509,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(null) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, currentNode + elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node // CPPONLY: , htmlCreator(null) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } StackNode node = createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint @@ -5566,11 +5562,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/2000/svg", popName, attributes, currentNode + elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } StackNode node = createStackNode(elementName, popName, elt // [NOCPP[ @@ -5597,12 +5592,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), - attributes, formOwner, currentNode + attributes, formOwner, current.node // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } StackNode node = createStackNode(elementName, elt // [NOCPP[ @@ -5629,12 +5623,11 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement("http://www.w3.org/1999/xhtml", name, - attributes, formOwner, currentNode + attributes, formOwner, current.node // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } elementPushed("http://www.w3.org/1999/xhtml", name, elt); elementPopped("http://www.w3.org/1999/xhtml", name, elt); @@ -5658,11 +5651,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, currentNode + elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node // CPPONLY: , htmlCreator(elementName.getHtmlCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } elementPushed("http://www.w3.org/1999/xhtml", popName, elt); elementPopped("http://www.w3.org/1999/xhtml", popName, elt); @@ -5686,11 +5678,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/2000/svg", popName, attributes, currentNode + elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node // CPPONLY: , svgCreator(elementName.getSvgCreator()) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } elementPushed("http://www.w3.org/2000/svg", popName, elt); elementPopped("http://www.w3.org/2000/svg", popName, elt); @@ -5714,11 +5705,10 @@ public abstract class TreeBuilder implements TokenHandler, // CPPONLY: , htmlCreator(null) ); } else { - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); - elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, currentNode + elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node // CPPONLY: , htmlCreator(null) ); - appendElement(elt, currentNode); + appendElement(elt, current.node); } elementPushed("http://www.w3.org/1998/Math/MathML", popName, elt); elementPopped("http://www.w3.org/1998/Math/MathML", popName, elt); @@ -5729,7 +5719,7 @@ public abstract class TreeBuilder implements TokenHandler, checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] // Can't be called for custom elements - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + T currentNode = stack[currentPtr].node; T elt = createElement("http://www.w3.org/1999/xhtml", "input", attributes, form == null || fragment || isTemplateContents() ? null : form, currentNode // CPPONLY: , htmlCreator(NS_NewHTMLInputElement) @@ -5743,7 +5733,7 @@ public abstract class TreeBuilder implements TokenHandler, // [NOCPP[ checkAttributes(attributes, "http://www.w3.org/1999/xhtml"); // ]NOCPP] - T currentNode = nodeFromStackWithBlinkCompat(currentPtr); + T currentNode = stack[currentPtr].node; T elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, currentNode // CPPONLY: , htmlCreator(NS_NewHTMLFormElement) @@ -6155,7 +6145,7 @@ public abstract class TreeBuilder implements TokenHandler, System.arraycopy(templateModeStack, 0, templateModeStackCopy, 0, templateModeStackCopy.length); return new StateSnapshot(stackCopy, listCopy, templateModeStackCopy, formPointer, - headPointer, mode, originalMode, framesetOk, + headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks); } @@ -6172,6 +6162,7 @@ public abstract class TreeBuilder implements TokenHandler, || templateModeStackLen != templateModePtr + 1 || formPointer != snapshot.getFormPointer() || headPointer != snapshot.getHeadPointer() + || deepTreeSurrogateParent != snapshot.getDeepTreeSurrogateParent() || mode != snapshot.getMode() || originalMode != snapshot.getOriginalMode() || framesetOk != snapshot.isFramesetOk() @@ -6277,6 +6268,7 @@ public abstract class TreeBuilder implements TokenHandler, System.arraycopy(templateModeStackCopy, 0, templateModeStack, 0, templateModeStackLen); formPointer = snapshot.getFormPointer(); headPointer = snapshot.getHeadPointer(); + deepTreeSurrogateParent = snapshot.getDeepTreeSurrogateParent(); mode = snapshot.getMode(); originalMode = snapshot.getOriginalMode(); framesetOk = snapshot.isFramesetOk(); @@ -6293,33 +6285,6 @@ public abstract class TreeBuilder implements TokenHandler, return -1; } - /** - * Returns stack[stackPos].node if stackPos is - * smaller than Blink's magic limit or the node at Blink's magic limit - * otherwise. - * - * In order to get Blink-compatible handling of excessive deeply-nested - * markup, this method must be used to obtain the node that is used as the - * parent node of an insertion. - * - * Blink's magic number is 512, but our counting is off by one compared to - * Blink's way of counting, so in order to get the same - * externally-observable outcome, we use 511 as our magic number. - * - * @param stackPos the stack position to attempt to read - * @return node at the position capped to Blink's magic number - * @throws SAXException - */ - private T nodeFromStackWithBlinkCompat(int stackPos) throws SAXException { - // Magic number if off by one relative to Blink's magic number, but the - // outcome is the same, because the counting is different by one. - if (stackPos > 511) { - errDeepTree(); - return stack[511].node; - } - return stack[stackPos].node; - } - /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getFormPointer() */ @@ -6336,6 +6301,15 @@ public abstract class TreeBuilder implements TokenHandler, return headPointer; } + /** + * Returns the deepTreeSurrogateParent. + * + * @return the deepTreeSurrogateParent + */ + public T getDeepTreeSurrogateParent() { + return deepTreeSurrogateParent; + } + /** * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElements() */ @@ -6423,16 +6397,6 @@ public abstract class TreeBuilder implements TokenHandler, return templateModePtr + 1; } - /** - * Complains about an over-deep tree. Theoretically this should just be - * a warning, but in practice authors should take this as an error. - * - * @throws SAXException - */ - private void errDeepTree() throws SAXException { - err("The document tree is more than 513 elements deep, which causes Firefox and Chrome flatten the tree."); - } - /** * Reports a stray start tag. * @param name the name of the stray tag diff --git a/parser/html/nsAHtml5TreeBuilderState.h b/parser/html/nsAHtml5TreeBuilderState.h index 2edef8279983..c06e53b4da82 100644 --- a/parser/html/nsAHtml5TreeBuilderState.h +++ b/parser/html/nsAHtml5TreeBuilderState.h @@ -31,6 +31,8 @@ class nsAHtml5TreeBuilderState { virtual nsIContentHandle* getHeadPointer() = 0; + virtual nsIContentHandle* getDeepTreeSurrogateParent() = 0; + virtual int32_t getMode() = 0; virtual int32_t getOriginalMode() = 0; diff --git a/parser/html/nsHtml5StateSnapshot.cpp b/parser/html/nsHtml5StateSnapshot.cpp index 6b1aa67543df..4d7e6489b08d 100644 --- a/parser/html/nsHtml5StateSnapshot.cpp +++ b/parser/html/nsHtml5StateSnapshot.cpp @@ -1,22 +1,22 @@ /* * Copyright (c) 2009-2010 Mozilla Foundation * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in + * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ @@ -54,27 +54,19 @@ #include "nsHtml5StateSnapshot.h" -nsHtml5StateSnapshot::nsHtml5StateSnapshot( - jArray stack, - jArray listOfActiveFormattingElements, - jArray templateModeStack, - nsIContentHandle* formPointer, - nsIContentHandle* headPointer, - int32_t mode, - int32_t originalMode, - bool framesetOk, - bool needToDropLF, - bool quirks) - : stack(stack) - , listOfActiveFormattingElements(listOfActiveFormattingElements) - , templateModeStack(templateModeStack) - , formPointer(formPointer) - , headPointer(headPointer) - , mode(mode) - , originalMode(originalMode) - , framesetOk(framesetOk) - , needToDropLF(needToDropLF) - , quirks(quirks) + +nsHtml5StateSnapshot::nsHtml5StateSnapshot(jArray stack, jArray listOfActiveFormattingElements, jArray templateModeStack, nsIContentHandle* formPointer, nsIContentHandle* headPointer, nsIContentHandle* deepTreeSurrogateParent, int32_t mode, int32_t originalMode, bool framesetOk, bool needToDropLF, bool quirks) + : stack(stack), + listOfActiveFormattingElements(listOfActiveFormattingElements), + templateModeStack(templateModeStack), + formPointer(formPointer), + headPointer(headPointer), + deepTreeSurrogateParent(deepTreeSurrogateParent), + mode(mode), + originalMode(originalMode), + framesetOk(framesetOk), + needToDropLF(needToDropLF), + quirks(quirks) { MOZ_COUNT_CTOR(nsHtml5StateSnapshot); } @@ -109,6 +101,12 @@ nsHtml5StateSnapshot::getHeadPointer() return headPointer; } +nsIContentHandle* +nsHtml5StateSnapshot::getDeepTreeSurrogateParent() +{ + return deepTreeSurrogateParent; +} + int32_t nsHtml5StateSnapshot::getMode() { diff --git a/parser/html/nsHtml5StateSnapshot.h b/parser/html/nsHtml5StateSnapshot.h index d7d48f093d28..1f8ecc170a1d 100644 --- a/parser/html/nsHtml5StateSnapshot.h +++ b/parser/html/nsHtml5StateSnapshot.h @@ -1,22 +1,22 @@ /* * Copyright (c) 2009-2010 Mozilla Foundation * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in + * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ @@ -63,28 +63,20 @@ class nsHtml5StateSnapshot : public nsAHtml5TreeBuilderState autoJArray templateModeStack; nsIContentHandle* formPointer; nsIContentHandle* headPointer; + nsIContentHandle* deepTreeSurrogateParent; int32_t mode; int32_t originalMode; bool framesetOk; bool needToDropLF; bool quirks; public: - nsHtml5StateSnapshot( - jArray stack, - jArray listOfActiveFormattingElements, - jArray templateModeStack, - nsIContentHandle* formPointer, - nsIContentHandle* headPointer, - int32_t mode, - int32_t originalMode, - bool framesetOk, - bool needToDropLF, - bool quirks); + nsHtml5StateSnapshot(jArray stack, jArray listOfActiveFormattingElements, jArray templateModeStack, nsIContentHandle* formPointer, nsIContentHandle* headPointer, nsIContentHandle* deepTreeSurrogateParent, int32_t mode, int32_t originalMode, bool framesetOk, bool needToDropLF, bool quirks); jArray getStack(); jArray getTemplateModeStack(); jArray getListOfActiveFormattingElements(); nsIContentHandle* getFormPointer(); nsIContentHandle* getHeadPointer(); + nsIContentHandle* getDeepTreeSurrogateParent(); int32_t getMode(); int32_t getOriginalMode(); bool isFramesetOk(); diff --git a/parser/html/nsHtml5TreeBuilder.cpp b/parser/html/nsHtml5TreeBuilder.cpp index b35a687d3be3..ca3bb8ebdfa8 100644 --- a/parser/html/nsHtml5TreeBuilder.cpp +++ b/parser/html/nsHtml5TreeBuilder.cpp @@ -87,6 +87,7 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) listPtr = -1; formPointer = nullptr; headPointer = nullptr; + deepTreeSurrogateParent = nullptr; start(fragment); charBufferLen = 0; charBuffer = nullptr; @@ -608,6 +609,7 @@ nsHtml5TreeBuilder::endTokenization() { formPointer = nullptr; headPointer = nullptr; + deepTreeSurrogateParent = nullptr; templateModeStack = nullptr; if (stack) { while (currentPtr > -1) { @@ -3673,8 +3675,6 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) return true; } nsHtml5StackNode* commonAncestor = stack[formattingEltStackPos - 1]; - nsIContentHandle* insertionCommonAncestor = - nodeFromStackWithBlinkCompat(formattingEltStackPos - 1); nsHtml5StackNode* furthestBlock = stack[furthestBlockPos]; int32_t bookmark = formattingEltListPos; int32_t nodePos = furthestBlockPos; @@ -3715,7 +3715,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) createElement(kNameSpaceID_XHTML, node->name, node->attributes->cloneAttributes(nullptr), - insertionCommonAncestor, + commonAncestor->node, htmlCreator(node->getHtmlCreator())); nsHtml5StackNode* newNode = createStackNode(node->getFlags(), node->ns, @@ -3732,7 +3732,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) node->release(this); node = newNode; detachFromParent(lastNode->node); - appendElement(lastNode->node, nodeFromStackWithBlinkCompat(nodePos)); + appendElement(lastNode->node, node->node); lastNode = node; } if (commonAncestor->isFosterParenting()) { @@ -3741,7 +3741,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) insertIntoFosterParent(lastNode->node); } else { detachFromParent(lastNode->node); - appendElement(lastNode->node, insertionCommonAncestor); + appendElement(lastNode->node, commonAncestor->node); } nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, @@ -3916,22 +3916,21 @@ nsHtml5TreeBuilder::reconstructTheActiveFormattingElements() while (entryPos < listPtr) { entryPos++; nsHtml5StackNode* entry = listOfActiveFormattingElements[entryPos]; - nsHtml5StackNode* current = stack[currentPtr]; + nsHtml5StackNode* currentNode = stack[currentPtr]; nsIContentHandle* clone; - if (current->isFosterParenting()) { + if (currentNode->isFosterParenting()) { clone = createAndInsertFosterParentedElement( kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), htmlCreator(entry->getHtmlCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); clone = createElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), - currentNode, + currentNode->node, htmlCreator(entry->getHtmlCreator())); - appendElement(clone, currentNode); + appendElement(clone, currentNode->node); } nsHtml5StackNode* entryClone = createStackNode(entry->getFlags(), entry->ns, @@ -4153,7 +4152,7 @@ nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush() void nsHtml5TreeBuilder::appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes) { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); + nsIContentHandle* currentNode = stack[currentPtr]->node; nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::head, attributes, @@ -4190,13 +4189,12 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAt attributes, htmlCreator(NS_NewHTMLFormElement)); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, - currentNode, + current->node, htmlCreator(NS_NewHTMLFormElement)); - appendElement(elt, currentNode); + appendElement(elt, current->node); } if (!isTemplateContents()) { formPointer = elt; @@ -4219,13 +4217,12 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5 attributes, htmlCreator(elementName->getHtmlCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, - currentNode, + current->node, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } nsHtml5StackNode* node = createStackNode(elementName, elt, clone); push(node); @@ -4236,7 +4233,7 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5 void nsHtml5TreeBuilder::appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); + nsIContentHandle* currentNode = stack[currentPtr]->node; nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, elementName->getName(), @@ -4265,13 +4262,12 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementNam attributes, htmlCreator(elementName->getHtmlCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, popName, attributes, - currentNode, + current->node, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } nsHtml5StackNode* node = createStackNode(elementName, elt, popName); push(node); @@ -4292,13 +4288,12 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5Elem elt = createAndInsertFosterParentedElement( kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr)); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_MathML, popName, attributes, - currentNode, + current->node, htmlCreator(nullptr)); - appendElement(elt, currentNode); + appendElement(elt, current->node); } nsHtml5StackNode* node = createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint); @@ -4330,13 +4325,12 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5Element attributes, svgCreator(elementName->getSvgCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_SVG, popName, attributes, - currentNode, + current->node, svgCreator(elementName->getSvgCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } nsHtml5StackNode* node = createStackNode(elementName, popName, elt); push(node); @@ -4357,14 +4351,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementNam formOwner, htmlCreator(elementName->getHtmlCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, formOwner, - currentNode, + current->node, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } nsHtml5StackNode* node = createStackNode(elementName, elt); push(node); @@ -4389,14 +4382,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster( formOwner, htmlCreator(elementName->getHtmlCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, name, attributes, formOwner, - currentNode, + current->node, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } elementPushed(kNameSpaceID_XHTML, name, elt); elementPopped(kNameSpaceID_XHTML, name, elt); @@ -4416,13 +4408,12 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elem attributes, htmlCreator(elementName->getHtmlCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_XHTML, popName, attributes, - currentNode, + current->node, htmlCreator(elementName->getHtmlCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } elementPushed(kNameSpaceID_XHTML, popName, elt); elementPopped(kNameSpaceID_XHTML, popName, elt); @@ -4442,13 +4433,12 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* e attributes, svgCreator(elementName->getSvgCreator())); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_SVG, popName, attributes, - currentNode, + current->node, svgCreator(elementName->getSvgCreator())); - appendElement(elt, currentNode); + appendElement(elt, current->node); } elementPushed(kNameSpaceID_SVG, popName, elt); elementPopped(kNameSpaceID_SVG, popName, elt); @@ -4465,13 +4455,12 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName elt = createAndInsertFosterParentedElement( kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr)); } else { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); elt = createElement(kNameSpaceID_MathML, popName, attributes, - currentNode, + current->node, htmlCreator(nullptr)); - appendElement(elt, currentNode); + appendElement(elt, current->node); } elementPushed(kNameSpaceID_MathML, popName, elt); elementPopped(kNameSpaceID_MathML, popName, elt); @@ -4481,7 +4470,7 @@ void nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes, nsIContentHandle* form) { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); + nsIContentHandle* currentNode = stack[currentPtr]->node; nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::input, @@ -4497,7 +4486,7 @@ nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes, void nsHtml5TreeBuilder::appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes) { - nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr); + nsIContentHandle* currentNode = stack[currentPtr]->node; nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, @@ -4655,16 +4644,7 @@ nsHtml5TreeBuilder::newSnapshot() } jArray templateModeStackCopy = jArray::newJArray(templateModePtr + 1); nsHtml5ArrayCopy::arraycopy(templateModeStack, templateModeStackCopy, templateModeStackCopy.length); - return new nsHtml5StateSnapshot(stackCopy, - listCopy, - templateModeStackCopy, - formPointer, - headPointer, - mode, - originalMode, - framesetOk, - needToDropLF, - quirks); + return new nsHtml5StateSnapshot(stackCopy, listCopy, templateModeStackCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks); } bool @@ -4676,15 +4656,7 @@ nsHtml5TreeBuilder::snapshotMatches(nsAHtml5TreeBuilderState* snapshot) int32_t listLen = snapshot->getListOfActiveFormattingElementsLength(); jArray templateModeStackCopy = snapshot->getTemplateModeStack(); int32_t templateModeStackLen = snapshot->getTemplateModeStackLength(); - if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || - templateModeStackLen != templateModePtr + 1 || - formPointer != snapshot->getFormPointer() || - headPointer != snapshot->getHeadPointer() || - mode != snapshot->getMode() || - originalMode != snapshot->getOriginalMode() || - framesetOk != snapshot->isFramesetOk() || - needToDropLF != snapshot->isNeedToDropLF() || - quirks != snapshot->isQuirks()) { + if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || templateModeStackLen != templateModePtr + 1 || formPointer != snapshot->getFormPointer() || headPointer != snapshot->getHeadPointer() || deepTreeSurrogateParent != snapshot->getDeepTreeSurrogateParent() || mode != snapshot->getMode() || originalMode != snapshot->getOriginalMode() || framesetOk != snapshot->isFramesetOk() || needToDropLF != snapshot->isNeedToDropLF() || quirks != snapshot->isQuirks()) { return false; } for (int32_t i = listLen - 1; i >= 0; i--) { @@ -4776,6 +4748,7 @@ nsHtml5TreeBuilder::loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTab nsHtml5ArrayCopy::arraycopy(templateModeStackCopy, templateModeStack, templateModeStackLen); formPointer = snapshot->getFormPointer(); headPointer = snapshot->getHeadPointer(); + deepTreeSurrogateParent = snapshot->getDeepTreeSurrogateParent(); mode = snapshot->getMode(); originalMode = snapshot->getOriginalMode(); framesetOk = snapshot->isFramesetOk(); @@ -4794,28 +4767,24 @@ nsHtml5TreeBuilder::findInArray(nsHtml5StackNode* node, jArray 511) { - errDeepTree(); - return stack[511]->node; - } - return stack[stackPos]->node; -} - -nsIContentHandle* +nsIContentHandle* nsHtml5TreeBuilder::getFormPointer() { return formPointer; } -nsIContentHandle* +nsIContentHandle* nsHtml5TreeBuilder::getHeadPointer() { return headPointer; } +nsIContentHandle* +nsHtml5TreeBuilder::getDeepTreeSurrogateParent() +{ + return deepTreeSurrogateParent; +} + jArray nsHtml5TreeBuilder::getListOfActiveFormattingElements() { diff --git a/parser/html/nsHtml5TreeBuilder.h b/parser/html/nsHtml5TreeBuilder.h index 35ed6742cb3c..e5686634f4ef 100644 --- a/parser/html/nsHtml5TreeBuilder.h +++ b/parser/html/nsHtml5TreeBuilder.h @@ -308,6 +308,7 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState int32_t listPtr; nsIContentHandle* formPointer; nsIContentHandle* headPointer; + nsIContentHandle* deepTreeSurrogateParent; protected: autoJArray charBuffer; int32_t charBufferLen; @@ -550,10 +551,10 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState void loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTable* interner); private: int32_t findInArray(nsHtml5StackNode* node, jArray arr); - nsIContentHandle* nodeFromStackWithBlinkCompat(int32_t stackPos); public: nsIContentHandle* getFormPointer(); nsIContentHandle* getHeadPointer(); + nsIContentHandle* getDeepTreeSurrogateParent(); jArray getListOfActiveFormattingElements(); jArray getStack(); jArray getTemplateModeStack(); diff --git a/parser/html/nsHtml5TreeBuilderCppSupplement.h b/parser/html/nsHtml5TreeBuilderCppSupplement.h index bcbfb374cab1..da832a67cf43 100644 --- a/parser/html/nsHtml5TreeBuilderCppSupplement.h +++ b/parser/html/nsHtml5TreeBuilderCppSupplement.h @@ -7,6 +7,7 @@ #include "nsError.h" #include "nsIPresShell.h" #include "nsNodeUtils.h" +#include "nsIFrame.h" #include "mozilla/Likely.h" #include "mozilla/UniquePtr.h" @@ -483,6 +484,10 @@ nsHtml5TreeBuilder::appendElement(nsIContentHandle* aChild, nsIContentHandle* aP { NS_PRECONDITION(aChild, "Null child"); NS_PRECONDITION(aParent, "Null parent"); + if (deepTreeSurrogateParent) { + return; + } + if (mBuilder) { nsresult rv = nsHtml5TreeOperation::Append(static_cast(aChild), static_cast(aParent), @@ -589,11 +594,12 @@ nsHtml5TreeBuilder::appendCharacters(nsIContentHandle* aParent, char16_t* aBuffe MOZ_ASSERT(!aStart, "aStart must always be zero."); if (mBuilder) { - nsresult rv = - nsHtml5TreeOperation::AppendText(aBuffer, // XXX aStart always ignored??? - aLength, - static_cast(aParent), - mBuilder); + nsresult rv = nsHtml5TreeOperation::AppendText( + aBuffer, // XXX aStart always ignored??? + aLength, + static_cast(deepTreeSurrogateParent ? + deepTreeSurrogateParent : aParent), + mBuilder); if (NS_FAILED(rv)) { MarkAsBrokenAndRequestSuspension(rv); } @@ -613,7 +619,8 @@ nsHtml5TreeBuilder::appendCharacters(nsIContentHandle* aParent, char16_t* aBuffe nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement(); NS_ASSERTION(treeOp, "Tree op allocation failed."); - treeOp->Init(eTreeOpAppendText, bufferCopy, aLength, aParent); + treeOp->Init(eTreeOpAppendText, bufferCopy, aLength, + deepTreeSurrogateParent ? deepTreeSurrogateParent : aParent); } void @@ -623,6 +630,10 @@ nsHtml5TreeBuilder::appendComment(nsIContentHandle* aParent, char16_t* aBuffer, NS_PRECONDITION(aParent, "Null parent"); MOZ_ASSERT(!aStart, "aStart must always be zero."); + if (deepTreeSurrogateParent) { + return; + } + if (mBuilder) { nsresult rv = nsHtml5TreeOperation::AppendComment( static_cast(aParent), @@ -732,6 +743,7 @@ void nsHtml5TreeBuilder::start(bool fragment) { mCurrentHtmlScriptIsAsyncOrDefer = false; + deepTreeSurrogateParent = nullptr; #ifdef DEBUG mActive = true; #endif @@ -798,6 +810,13 @@ nsHtml5TreeBuilder::elementPushed(int32_t aNamespace, nsIAtom* aName, nsIContent * table elements shouldn't be used as surrogate parents for user experience * reasons. */ + if (!deepTreeSurrogateParent && currentPtr >= MAX_REFLOW_DEPTH && + !(aName == nsGkAtoms::script || aName == nsGkAtoms::table || + aName == nsGkAtoms::thead || aName == nsGkAtoms::tfoot || + aName == nsGkAtoms::tbody || aName == nsGkAtoms::tr || + aName == nsGkAtoms::colgroup || aName == nsGkAtoms::style)) { + deepTreeSurrogateParent = aElement; + } if (aNamespace != kNameSpaceID_XHTML) { return; } @@ -843,6 +862,9 @@ nsHtml5TreeBuilder::elementPopped(int32_t aNamespace, nsIAtom* aName, nsIContent NS_ASSERTION(aNamespace == kNameSpaceID_XHTML || aNamespace == kNameSpaceID_SVG || aNamespace == kNameSpaceID_MathML, "Element isn't HTML, SVG or MathML!"); NS_ASSERTION(aName, "Element doesn't have local name!"); NS_ASSERTION(aElement, "No element!"); + if (deepTreeSurrogateParent && currentPtr <= MAX_REFLOW_DEPTH) { + deepTreeSurrogateParent = nullptr; + } if (aNamespace == kNameSpaceID_MathML) { return; } @@ -1290,18 +1312,6 @@ nsHtml5TreeBuilder::EnableViewSource(nsHtml5Highlighter* aHighlighter) mViewSource = aHighlighter; } -void -nsHtml5TreeBuilder::errDeepTree() -{ - if (MOZ_UNLIKELY(mViewSource)) { - mViewSource->AddErrorToCurrentRun("errDeepTree"); - } else if (!mBuilder) { - nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement(); - MOZ_ASSERT(treeOp, "Tree op allocation failed."); - treeOp->InitDeepTree(tokenizer->getLineNumber()); - } -} - void nsHtml5TreeBuilder::errStrayStartTag(nsIAtom* aName) { diff --git a/parser/html/nsHtml5TreeBuilderHSupplement.h b/parser/html/nsHtml5TreeBuilderHSupplement.h index 357a7dfdc588..e802e2c2f8d3 100644 --- a/parser/html/nsHtml5TreeBuilderHSupplement.h +++ b/parser/html/nsHtml5TreeBuilderHSupplement.h @@ -145,9 +145,6 @@ void EnableViewSource(nsHtml5Highlighter* aHighlighter); - void - errDeepTree(); - void errStrayStartTag(nsIAtom* aName); void errStrayEndTag(nsIAtom* aName); diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp index c667477127d2..3455c0d91e97 100644 --- a/parser/html/nsHtml5TreeOpExecutor.cpp +++ b/parser/html/nsHtml5TreeOpExecutor.cpp @@ -65,13 +65,12 @@ nsHtml5TreeOpExecutor::nsHtml5TreeOpExecutor() , mSuppressEOF(false) , mReadingFromStage(false) , mStreamParser(nullptr) - , mPreloadedURLs(23) // Mean # of preloadable resources per page on dmoz + , mPreloadedURLs(23) // Mean # of preloadable resources per page on dmoz , mSpeculationReferrerPolicy(mozilla::net::RP_Unset) , mStarted(false) , mRunFlushLoopOnStack(false) , mCallContinueInterruptedParsingIfEnabled(false) , mAlreadyComplainedAboutCharset(false) - , mAlreadyComplainedAboutDeepTree(false) { } @@ -816,25 +815,6 @@ nsHtml5TreeOpExecutor::ComplainAboutBogusProtocolCharset(nsIDocument* aDoc) "EncProtocolUnsupported"); } -void -nsHtml5TreeOpExecutor::MaybeComplainAboutDeepTree(uint32_t aLineNumber) -{ - if (mAlreadyComplainedAboutDeepTree) { - return; - } - mAlreadyComplainedAboutDeepTree = true; - nsContentUtils::ReportToConsole(nsIScriptError::errorFlag, - NS_LITERAL_CSTRING("HTML parser"), - mDocument, - nsContentUtils::eHTMLPARSER_PROPERTIES, - "errDeepTree", - nullptr, - 0, - nullptr, - EmptyString(), - aLineNumber); -} - nsHtml5Parser* nsHtml5TreeOpExecutor::GetParser() { diff --git a/parser/html/nsHtml5TreeOpExecutor.h b/parser/html/nsHtml5TreeOpExecutor.h index fe2a4e79f054..074b39415e5e 100644 --- a/parser/html/nsHtml5TreeOpExecutor.h +++ b/parser/html/nsHtml5TreeOpExecutor.h @@ -92,12 +92,6 @@ class nsHtml5TreeOpExecutor final : public nsHtml5DocumentBuilder, */ bool mAlreadyComplainedAboutCharset; - /** - * Whether this executor has already complained about the tree being too - * deep. - */ - bool mAlreadyComplainedAboutDeepTree; - public: nsHtml5TreeOpExecutor(); @@ -202,8 +196,6 @@ class nsHtml5TreeOpExecutor final : public nsHtml5DocumentBuilder, void ComplainAboutBogusProtocolCharset(nsIDocument* aDoc); - void MaybeComplainAboutDeepTree(uint32_t aLineNumber); - bool IsComplete() { return !mParser; diff --git a/parser/html/nsHtml5TreeOperation.cpp b/parser/html/nsHtml5TreeOperation.cpp index 11de6b7fcbb9..92de3d875c3f 100644 --- a/parser/html/nsHtml5TreeOperation.cpp +++ b/parser/html/nsHtml5TreeOperation.cpp @@ -1011,11 +1011,6 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder, aBuilder->MaybeComplainAboutCharset(msgId, error, (uint32_t)lineNumber); return NS_OK; } - case eTreeOpMaybeComplainAboutDeepTree: { - int32_t lineNumber = mOne.integer; - aBuilder->MaybeComplainAboutDeepTree((uint32_t)lineNumber); - return NS_OK; - } case eTreeOpAddClass: { nsIContent* node = *(mOne.node); char16_t* str = mTwo.unicharPtr; diff --git a/parser/html/nsHtml5TreeOperation.h b/parser/html/nsHtml5TreeOperation.h index dacab29ea3de..e06465808ac0 100644 --- a/parser/html/nsHtml5TreeOperation.h +++ b/parser/html/nsHtml5TreeOperation.h @@ -59,7 +59,6 @@ enum eHtml5TreeOperation eTreeOpSetScriptLineNumberAndFreeze, eTreeOpSvgLoad, eTreeOpMaybeComplainAboutCharset, - eTreeOpMaybeComplainAboutDeepTree, eTreeOpAddClass, eTreeOpAddViewSourceHref, eTreeOpAddViewSourceBase, @@ -466,14 +465,6 @@ class nsHtml5TreeOperation final { mThree.integer = aLineNumber; } - inline void InitDeepTree(int32_t aLineNumber) - { - MOZ_ASSERT(mOpCode == eTreeOpUninitialized, - "Op code must be uninitialized when initializing."); - mOpCode = eTreeOpMaybeComplainAboutDeepTree; - mOne.integer = aLineNumber; - } - inline void Init(eHtml5TreeOperation aOpCode, const nsAString& aString) { NS_PRECONDITION(mOpCode == eTreeOpUninitialized, From 974df9b9e8f254334dc685fa8f4e15611d0ff386 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Thu, 28 Sep 2017 11:30:38 +0200 Subject: [PATCH 031/108] Backed out changeset 6a527c7a89a0 (bug 256180) --- layout/generic/nsIFrame.h | 27 +--------- layout/reftests/bugs/256180-1-ref.html | 11 ----- layout/reftests/bugs/256180-1.html | 68 -------------------------- layout/reftests/bugs/256180-2-ref.html | 11 ----- layout/reftests/bugs/256180-2.html | 68 -------------------------- layout/reftests/bugs/256180-3-ref.html | 12 ----- layout/reftests/bugs/256180-3.html | 63 ------------------------ layout/reftests/bugs/256180-4-ref.html | 12 ----- layout/reftests/bugs/256180-4.html | 63 ------------------------ layout/reftests/bugs/reftest.list | 15 ------ layout/tools/reftest/reftest.jsm | 2 - 11 files changed, 1 insertion(+), 351 deletions(-) delete mode 100644 layout/reftests/bugs/256180-1-ref.html delete mode 100644 layout/reftests/bugs/256180-1.html delete mode 100644 layout/reftests/bugs/256180-2-ref.html delete mode 100644 layout/reftests/bugs/256180-2.html delete mode 100644 layout/reftests/bugs/256180-3-ref.html delete mode 100644 layout/reftests/bugs/256180-3.html delete mode 100644 layout/reftests/bugs/256180-4-ref.html delete mode 100644 layout/reftests/bugs/256180-4.html diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 3d62a08f47bb..1025e8e15bfc 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -13,32 +13,7 @@ #error This header/class should only be used within Mozilla code. It should not be used by extensions. #endif -#if (defined(XP_WIN) && !defined(HAVE_64BIT_BUILD)) || defined(ANDROID) -// Blink's magic depth limit from its HTML parser (513) plus as much as fits in the -// default run-time stack on armv7 Android on Dalvik when using display: block minus -// a bit just to be sure. The Dalvik default stack crashes at 588. ART can do a few -// frames more. Using the same number for 32-bit Windows for consistency. Over there, -// Blink's magic depth of 513 doesn't fit in the default stack of 1 MB, but this magic -// depth fits when the default is grown by mere 192 KB (tested in 64 KB increments). -// -// 32-bit Windows has a different limit compared to 64-bit desktop, because the -// default stack size affects all threads and consumes address space. Fixing that -// is bug 1257522. -// -// 32-bit Android on ARM already happens to have defaults that are close enough to -// what makes sense as a temporary measure on Windows, so adjusting the Android -// stack can be a follow-up. The stack on 64-bit ARM needs adjusting in any case -// before 64-bit ARM can become tier-1. See bug 1400811. -// -// Ideally, we'd get rid of this smaller limit and make 32-bit Windows and Android -// capable of working with the Linux/Mac/Win64 number below. -#define MAX_REFLOW_DEPTH 585 -#else -// Blink's magic depth limit from its HTML parser times two. Also just about fits -// within the system default runtime stack limit of 8 MB on 64-bit Mac and Linux with -// display: table-cell. -#define MAX_REFLOW_DEPTH 1026 -#endif +#define MAX_REFLOW_DEPTH 200 /* nsIFrame is in the process of being deCOMtaminated, i.e., this file is eventually going to be eliminated, and all callers will use nsFrame instead. At the moment diff --git a/layout/reftests/bugs/256180-1-ref.html b/layout/reftests/bugs/256180-1-ref.html deleted file mode 100644 index c69c53450908..000000000000 --- a/layout/reftests/bugs/256180-1-ref.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 1026-deep display: table-cell - - -

    1026-element-deep display: table-cell

    -

    Actual depth (including text leaves): 1027 - - diff --git a/layout/reftests/bugs/256180-1.html b/layout/reftests/bugs/256180-1.html deleted file mode 100644 index 82c1bf4bb490..000000000000 --- a/layout/reftests/bugs/256180-1.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - -1026-element-deep display: table-cell - - - - -

    1026-element-deep display: table-cell

    - - diff --git a/layout/reftests/bugs/256180-2-ref.html b/layout/reftests/bugs/256180-2-ref.html deleted file mode 100644 index 544d7ef5c25f..000000000000 --- a/layout/reftests/bugs/256180-2-ref.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 585-deep display: table-cell - - -

    585-element-deep display: table-cell

    -

    Actual depth (including text leaves): 586 - - diff --git a/layout/reftests/bugs/256180-2.html b/layout/reftests/bugs/256180-2.html deleted file mode 100644 index 1887379364d1..000000000000 --- a/layout/reftests/bugs/256180-2.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - -585-element-deep display: table-cell - - - - -

    585-element-deep display: table-cell

    - - diff --git a/layout/reftests/bugs/256180-3-ref.html b/layout/reftests/bugs/256180-3-ref.html deleted file mode 100644 index d5bec521175c..000000000000 --- a/layout/reftests/bugs/256180-3-ref.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - 1026-deep display: block - - -

    1026-element-deep display: block

    -

    Actual depth (including text leaves): 1027 -

    PASS
    - - diff --git a/layout/reftests/bugs/256180-3.html b/layout/reftests/bugs/256180-3.html deleted file mode 100644 index 8b0d6e8c65d6..000000000000 --- a/layout/reftests/bugs/256180-3.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - -1026-element-deep display: block - - - -

    1026-element-deep display: block

    - - diff --git a/layout/reftests/bugs/256180-4-ref.html b/layout/reftests/bugs/256180-4-ref.html deleted file mode 100644 index 5b957e3e614b..000000000000 --- a/layout/reftests/bugs/256180-4-ref.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - 585-deep display: block - - -

    585-element-deep display: block

    -

    Actual depth (including text leaves): 586 -

    PASS
    - - diff --git a/layout/reftests/bugs/256180-4.html b/layout/reftests/bugs/256180-4.html deleted file mode 100644 index eabe43ada638..000000000000 --- a/layout/reftests/bugs/256180-4.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - -585-element-deep display: block - - - -

    585-element-deep display: block

    - - diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 60a879ba1534..89ac62e14ddf 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -38,21 +38,6 @@ HTTP(..) == 10209-3.html 10209-3-ref.html == 23604-1.html 23604-1-ref.html == 23604-2.html 23604-2-ref.html != 24998-1.html 24998-1-ref.html -# Debug builds and ASAN builds have larger stack frames, so skipped. -# Android and 32-bit Windows don't have enough run-time stack to deal -# with the test, so skipped. -skip-if(isDebugBuild||Android||AddressSanitizer||(winWidget&&(!is64Bit))) == 256180-1.html 256180-1-ref.html -# Debug builds have larger stack frames, so skipped. -# Android and 32-bit Windows don't have enough run-time stack to deal -# with the test, so skipped. -skip-if(isDebugBuild||Android||(winWidget&&(!is64Bit))) == 256180-2.html 256180-2-ref.html -# Debug builds and ASAN builds have larger stack frames, so skipped. -# Android and 32-bit Windows don't have enough run-time stack to deal -# with the test, so skipped. -skip-if(isDebugBuild||Android||AddressSanitizer||(winWidget&&(!is64Bit))) == 256180-3.html 256180-3-ref.html -# Debug builds have larger stack frames, so skipped. -# Making Android on aarch64 not crash is bug 1400811. -skip-if(isDebugBuild||(Android&&is64Bit)) == 256180-4.html 256180-4-ref.html == 25888-1l.html 25888-1l-ref.html != 25888-1l.html 25888-1l-notref.html == 25888-1r.html 25888-1r-ref.html diff --git a/layout/tools/reftest/reftest.jsm b/layout/tools/reftest/reftest.jsm index 9d95aba08879..86d922ed6486 100644 --- a/layout/tools/reftest/reftest.jsm +++ b/layout/tools/reftest/reftest.jsm @@ -737,8 +737,6 @@ function BuildConditionSandbox(aURL) { sandbox.qtWidget = xr.widgetToolkit == "qt"; sandbox.winWidget = xr.widgetToolkit == "windows"; - sandbox.is64Bit = xr.is64Bit; - // Scrollbars that are semi-transparent. See bug 1169666. sandbox.transparentScrollbars = xr.widgetToolkit == "gtk3"; From 4ad3e6f78d050a8678ce9026fe517a90ace7d7c6 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Thu, 28 Sep 2017 11:31:47 +0200 Subject: [PATCH 032/108] Backed out changeset 1ae1bd9b2b5c (bug 256180) for crashtest failures on Windows 7 debug, e.g. in layout/base/crashtests/507119.html, and on suspicion of causing crashtest failures on Android. r=backout --- config/config.mk | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/config/config.mk b/config/config.mk index ab6456dfbc33..beaa86c6f937 100644 --- a/config/config.mk +++ b/config/config.mk @@ -398,21 +398,13 @@ endif # WINNT ifdef _MSC_VER ifeq ($(CPU_ARCH),x86_64) -# Normal operation on 64-bit Windows needs 2 MB of stack. (Bug 582910) -# ASAN requires 6 MB of stack. -# Setting the stack to 8 MB to match the capability of other systems -# to deal with frame construction for unreasonably deep DOM trees -# with worst-case styling. This uses address space unnecessarily for -# non-main threads, but that should be tolerable on 64-bit systems. -# (Bug 256180) -WIN32_EXE_LDFLAGS += -STACK:8388608 +ifdef MOZ_ASAN +# ASan could have 3x stack memory usage of normal builds. +WIN32_EXE_LDFLAGS += -STACK:6291456 else -# Since this setting affects the default stack size for non-main -# threads, too, to avoid burning the address space, increase only -# 192 KB over the default. Just enough to be able to deal with -# reasonable styling applied to DOM trees whose depth is near what -# Blink's HTML parser can output. (Bug 256180) -WIN32_EXE_LDFLAGS += -STACK:1245184 +# set stack to 2MB on x64 build. See bug 582910 +WIN32_EXE_LDFLAGS += -STACK:2097152 +endif endif endif From 69bc7bda8847f03ef1f32cc91ea4a2f333c04fd1 Mon Sep 17 00:00:00 2001 From: Jing-wei Wu Date: Thu, 28 Sep 2017 17:08:56 +0800 Subject: [PATCH 033/108] Bug 1399378 - Update Fennec logo icons for 57 beta/release. r=nechen MozReview-Commit-ID: CUy4RSuiRnD --HG-- extra : rebase_source : f6c9486833bacfd89fbd404bbd65997a2a44ee23 --- .../android/branding/beta/content/about.png | Bin 20047 -> 11317 bytes .../branding/beta/content/favicon32.png | Bin 2361 -> 2168 bytes .../branding/beta/content/favicon64.png | Bin 6632 -> 5249 bytes .../branding/beta/res/drawable-hdpi/icon.png | Bin 7327 -> 5896 bytes .../beta/res/drawable-hdpi/large_icon.png | Bin 18707 -> 14529 bytes .../res/drawable-hdpi/launcher_widget.png | Bin 13836 -> 8368 bytes .../beta/res/drawable-hdpi/widget_icon.png | Bin 6514 -> 4849 bytes .../branding/beta/res/drawable-xhdpi/icon.png | Bin 14223 -> 9065 bytes .../beta/res/drawable-xhdpi/large_icon.png | Bin 36645 -> 21399 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 20826 -> 11566 bytes .../beta/res/drawable-xhdpi/widget_icon.png | Bin 9929 -> 6395 bytes .../beta/res/drawable-xxhdpi/icon.png | Bin 18707 -> 15297 bytes .../beta/res/drawable-xxhdpi/large_icon.png | Bin 18461 -> 35086 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 37201 -> 19238 bytes .../beta/res/drawable-xxhdpi/widget_icon.png | Bin 17359 -> 11439 bytes .../beta/res/drawable-xxxhdpi/icon.png | Bin 36668 -> 21399 bytes .../branding/official/content/about.png | Bin 20047 -> 11317 bytes .../branding/official/content/favicon32.png | Bin 2361 -> 2240 bytes .../branding/official/content/favicon64.png | Bin 6628 -> 5344 bytes .../official/res/drawable-hdpi/icon.png | Bin 7902 -> 6154 bytes .../official/res/drawable-hdpi/large_icon.png | Bin 21306 -> 14851 bytes .../res/drawable-hdpi/launcher_widget.png | Bin 13305 -> 8041 bytes .../res/drawable-hdpi/widget_icon.png | Bin 5977 -> 4714 bytes .../official/res/drawable-xhdpi/icon.png | Bin 13891 -> 8931 bytes .../res/drawable-xhdpi/large_icon.png | Bin 37644 -> 21297 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 20302 -> 11252 bytes .../res/drawable-xhdpi/widget_icon.png | Bin 9193 -> 6561 bytes .../official/res/drawable-xxhdpi/icon.png | Bin 21306 -> 14851 bytes .../res/drawable-xxhdpi/large_icon.png | Bin 21556 -> 34702 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 29503 -> 18413 bytes .../res/drawable-xxhdpi/widget_icon.png | Bin 16737 -> 10897 bytes .../official/res/drawable-xxxhdpi/icon.png | Bin 37610 -> 21297 bytes 32 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mobile/android/branding/beta/content/about.png b/mobile/android/branding/beta/content/about.png index dc52e843bd00d8b0ba7790ee13eab31df37686b4..615ca5e8643c5c405770231f886397c6c0c3c888 100644 GIT binary patch literal 11317 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 literal 20047 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 Hu0mjfNyO2H literal 6632 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 FV1m%o1Xut7 diff --git a/mobile/android/branding/beta/res/drawable-hdpi/large_icon.png b/mobile/android/branding/beta/res/drawable-hdpi/large_icon.png index 8b7f313fbeb4e0590b3c4eb1b68dcae4794aec92..91d694351848a3805a04e6b00f3ce4ad0a4e424e 100644 GIT binary patch literal 14529 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%0A#H>9h5<_Lu1pOekr7t5LO!&2N1$Z|Lpyb$g;Z}= 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 literal 13836 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

    r;>=pBS$^wf^Uf|2gNF=VHh+0_DeUU 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 diff --git a/mobile/android/branding/beta/res/drawable-hdpi/widget_icon.png b/mobile/android/branding/beta/res/drawable-hdpi/widget_icon.png index 8c60639e21457e8466656ee23367e87d144ae236..88c288fd9668cd070fc6d27d32147b1417e558fe 100644 GIT binary patch literal 4849 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 l5WNeEs;D3kR?dieaE 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 !ual<#CDl+i_gm&)q9)oHziKCFM5uSg0f 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 Ud0Gjn_5c6?07*qoM6N<$f^pa5MgRZ+ literal 36645 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 literal 20826 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 P00000NkvXXu0mjf2AKR2 diff --git a/mobile/android/branding/beta/res/drawable-xhdpi/widget_icon.png b/mobile/android/branding/beta/res/drawable-xhdpi/widget_icon.png index 5ec6b038e7f04937655a334dd5a99b5aabf4376f..97a5decfee12cd6c4ad497a45e184ca6e718e187 100644 GIT binary patch literal 6395 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 Hu0mjfF)c=8 diff --git a/mobile/android/branding/beta/res/drawable-xxhdpi/icon.png b/mobile/android/branding/beta/res/drawable-xxhdpi/icon.png index 8b7f313fbeb4e0590b3c4eb1b68dcae4794aec92..3cedfac70c54298989513cc6dae2aed1410ddd56 100644 GIT binary patch literal 15297 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%0A#H>9h5<_Lu1pOekr7t5LO!&2N1$Z|Lpyb$g;Z}= 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 diff --git a/mobile/android/branding/beta/res/drawable-xxhdpi/widget_icon.png b/mobile/android/branding/beta/res/drawable-xxhdpi/widget_icon.png index c4d71316e0665992582b8c31399bd50830402ae0..864dbde0457bf3fa28fd4b9e23fb0626cd0126ad 100644 GIT binary patch literal 11439 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 !ual<#CDl+i_gm&)q9)oHziKCFM5uSg0f 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 Ud0Gjn_5c6?07*qoM6N<$f^pa5MgRZ+ literal 36668 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 Ac>n+a literal 18461 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 TR8=b`00000NkvXXu0mjf*8AJs diff --git a/mobile/android/branding/beta/res/drawable-xxhdpi/launcher_widget.png b/mobile/android/branding/beta/res/drawable-xxhdpi/launcher_widget.png index df75a5b2f7ba944703c5342fc2cbe9f929d40782..736a1ee1a4e742db40e46a6c51fc438af4d5b175 100644 GIT binary patch literal 19238 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