Date: Tue, 20 Feb 2018 00:11:12 +0000 (UTC) From: Jan Beich <jbeich@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r462361 - in head/www/waterfox: . files Message-ID: <201802200011.w1K0BCrg034689@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jbeich Date: Tue Feb 20 00:11:12 2018 New Revision: 462361 URL: https://svnweb.freebsd.org/changeset/ports/462361 Log: www/waterfox: apply more FF59 fixes Added: head/www/waterfox/files/patch-bug1231203 (contents, props changed) head/www/waterfox/files/patch-bug1334465 (contents, props changed) head/www/waterfox/files/patch-bug1426988 (contents, props changed) head/www/waterfox/files/patch-bug1428947 (contents, props changed) head/www/waterfox/files/patch-bug1431336 (contents, props changed) Modified: head/www/waterfox/Makefile (contents, props changed) Modified: head/www/waterfox/Makefile ============================================================================== --- head/www/waterfox/Makefile Tue Feb 20 00:10:28 2018 (r462360) +++ head/www/waterfox/Makefile Tue Feb 20 00:11:12 2018 (r462361) @@ -2,7 +2,7 @@ PORTNAME= waterfox DISTVERSION= 56.0.4 -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= www ipv6 MAINTAINER= jbeich@FreeBSD.org Added: head/www/waterfox/files/patch-bug1231203 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/waterfox/files/patch-bug1231203 Tue Feb 20 00:11:12 2018 (r462361) @@ -0,0 +1,203 @@ +commit ef357e507dd1 +Author: David Keeler <dkeeler@mozilla.com> +Date: Thu Feb 8 17:16:03 2018 -0800 + + bug 1231203 - ensure OCSP responses to requests from private contexts aren't cached on disk r=jcj a=ritu + + MozReview-Commit-ID: 374f7hERLee + + --HG-- + extra : source : ee10aee44d26bf6eb3ddc5f54ddbbbb4fdeb4b0d +--- + security/manager/ssl/nsNSSCallbacks.cpp | 12 ++- + security/manager/ssl/tests/unit/head_psm.js | 8 +- + .../ssl/tests/unit/test_ocsp_private_caching.js | 112 +++++++++++++++++++++ + security/manager/ssl/tests/unit/xpcshell.ini | 2 + + 4 files changed, 130 insertions(+), 4 deletions(-) + +diff --git security/manager/ssl/nsNSSCallbacks.cpp security/manager/ssl/nsNSSCallbacks.cpp +index 7288a7f2c725..d3b973362ab1 100644 +--- security/manager/ssl/nsNSSCallbacks.cpp ++++ security/manager/ssl/nsNSSCallbacks.cpp +@@ -119,13 +119,19 @@ nsHTTPDownloadEvent::Run() + chan->SetLoadFlags(nsIRequest::LOAD_ANONYMOUS | + nsIChannel::LOAD_BYPASS_SERVICE_WORKER); + +- // For OCSP requests, only the first party domain aspect of origin attributes +- // is used. This means that OCSP requests are shared across different +- // containers. ++ // For OCSP requests, only the first party domain and private browsing id ++ // aspects of origin attributes are used. This means that: ++ // a) if first party isolation is enabled, OCSP requests will be isolated ++ // according to the first party domain of the original https request ++ // b) OCSP requests are shared across different containers as long as first ++ // party isolation is not enabled and none of the containers are in private ++ // browsing mode. + if (mRequestSession->mOriginAttributes != OriginAttributes()) { + OriginAttributes attrs; + attrs.mFirstPartyDomain = + mRequestSession->mOriginAttributes.mFirstPartyDomain; ++ attrs.mPrivateBrowsingId = ++ mRequestSession->mOriginAttributes.mPrivateBrowsingId; + + nsCOMPtr<nsILoadInfo> loadInfo = chan->GetLoadInfo(); + if (loadInfo) { +diff --git security/manager/ssl/tests/unit/head_psm.js security/manager/ssl/tests/unit/head_psm.js +index 6e0d41125549..51e2beb7ce1d 100644 +--- security/manager/ssl/tests/unit/head_psm.js ++++ security/manager/ssl/tests/unit/head_psm.js +@@ -609,9 +609,12 @@ function getFailingHttpServer(serverPort, serverIdentities) { + // by which HTTP method the server is expected to be queried. + // expectedResponseTypes is an optional array of OCSP response types to use (see + // GenerateOCSPResponse.cpp). ++// responseHeaderPairs is an optional array of HTTP header (name, value) pairs ++// to set in each response. + function startOCSPResponder(serverPort, identity, nssDBLocation, + expectedCertNames, expectedBasePaths, +- expectedMethods, expectedResponseTypes) { ++ expectedMethods, expectedResponseTypes, ++ responseHeaderPairs = []) { + let ocspResponseGenerationArgs = expectedCertNames.map( + function(expectedNick) { + let responseType = "good"; +@@ -640,6 +643,9 @@ function startOCSPResponder(serverPort, identity, nssDBLocation, + } + aResponse.setStatusLine(aRequest.httpVersion, 200, "OK"); + aResponse.setHeader("Content-Type", "application/ocsp-response"); ++ for (let headerPair of responseHeaderPairs) { ++ aResponse.setHeader(headerPair[0], headerPair[1]); ++ } + aResponse.write(ocspResponses.shift()); + }); + httpServer.identity.setPrimary("http", identity, serverPort); +diff --git security/manager/ssl/tests/unit/test_ocsp_private_caching.js security/manager/ssl/tests/unit/test_ocsp_private_caching.js +new file mode 100644 +index 000000000000..b61252eb6e6f +--- /dev/null ++++ security/manager/ssl/tests/unit/test_ocsp_private_caching.js +@@ -0,0 +1,112 @@ ++// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- ++// 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/. ++ ++"use strict"; ++ ++// In which we connect to a host and encounter OCSP responses with the ++// Cache-Control header set, which Necko will normally cache. We need to ensure ++// that these responses aren't cached to disk when the original https request ++// was in a private context. ++ ++do_get_profile(); // must be called before getting nsIX509CertDB ++const certdb = Cc["@mozilla.org/security/x509certdb;1"] ++ .getService(Ci.nsIX509CertDB); ++ ++const SERVER_PORT = 8888; ++ ++function start_ocsp_responder(expectedCertNames, expectedPaths, ++ expectedMethods) { ++ return startOCSPResponder(SERVER_PORT, "www.example.com", ++ "test_ocsp_fetch_method", expectedCertNames, ++ expectedPaths, expectedMethods); ++} ++ ++function check_cert_err(cert_name, expected_error) { ++ let cert = constructCertFromFile("test_ocsp_fetch_method/" + cert_name + ".pem"); ++ return checkCertErrorGeneric(certdb, cert, expected_error, ++ certificateUsageSSLServer); ++} ++ ++function add_flush_cache() { ++ add_test(() => { ++ // This appears to either fire multiple times or fire once for every ++ // observer that has ever been passed to flush. To prevent multiple calls to ++ // run_next_test, keep track of if this observer has already called it. ++ let observed = false; ++ let observer = { observe: () => { ++ if (!observed) { ++ observed = true; ++ run_next_test(); ++ } ++ } ++ }; ++ Services.cache2.QueryInterface(Ci.nsICacheTesting).flush(observer); ++ }); ++} ++ ++function add_ocsp_necko_cache_test(loadContext, shouldFindEntry) { ++ // Pre-testcase cleanup/setup. ++ add_test(() => { ++ Services.cache2.clear(); ++ run_next_test(); ++ }); ++ add_flush_cache(); ++ ++ let responder; ++ add_test(() => { ++ clearOCSPCache(); ++ clearSessionCache(); ++ responder = startOCSPResponder(SERVER_PORT, "localhost", "ocsp_certs", ++ ["default-ee"], [], [], [], ++ [["Cache-Control", "max-age: 1000"]]); ++ run_next_test(); ++ }); ++ ++ // Prepare a connection that will cause an OCSP request. ++ add_connection_test("ocsp-stapling-none.example.com", PRErrorCodeSuccess, ++ null, null, null, loadContext.originAttributes); ++ ++ add_flush_cache(); ++ ++ // Traverse the cache and ensure the response made it into the cache with the ++ // appropriate properties (private or not private). ++ add_test(() => { ++ let foundEntry = false; ++ let visitor = { ++ onCacheStorageInfo() {}, ++ onCacheEntryInfo(aURI, aIdEnhance, aDataSize, aFetchCount, ++ aLastModifiedTime, aExpirationTime, aPinned, aInfo) { ++ Assert.equal(aURI.spec, "http://localhost:8888/", ++ "expected OCSP request URI should match"); ++ foundEntry = true; ++ }, ++ onCacheEntryVisitCompleted() { ++ Assert.equal(foundEntry, shouldFindEntry, ++ "should only find a cached entry if we're expecting one"); ++ run_next_test(); ++ }, ++ QueryInterface(iid) { ++ if (iid.equals(Ci.nsICacheStorageVisitor)) { ++ return this; ++ } ++ throw Cr.NS_ERROR_NO_INTERFACE; ++ }, ++ }; ++ Services.cache2.asyncVisitAllStorages(visitor, true); ++ }); ++ ++ // Clean up (stop the responder). ++ add_test(() => { ++ responder.stop(run_next_test); ++ }); ++} ++ ++function run_test() { ++ Services.prefs.setIntPref("security.OCSP.enabled", 1); ++ add_tls_server_setup("OCSPStaplingServer", "ocsp_certs"); ++ add_ocsp_necko_cache_test(Services.loadContextInfo.private, false); ++ add_ocsp_necko_cache_test(Services.loadContextInfo.default, true); ++ run_next_test(); ++} +diff --git security/manager/ssl/tests/unit/xpcshell.ini security/manager/ssl/tests/unit/xpcshell.ini +index b85c775514eb..4dbe59ac5e73 100644 +--- security/manager/ssl/tests/unit/xpcshell.ini ++++ security/manager/ssl/tests/unit/xpcshell.ini +@@ -121,6 +121,8 @@ run-sequentially = hardcoded ports + run-sequentially = hardcoded ports + [test_ocsp_must_staple.js] + run-sequentially = hardcoded ports ++[test_ocsp_private_caching.js] ++run-sequentially = hardcoded ports + [test_ocsp_no_hsts_upgrade.js] + run-sequentially = hardcoded ports + [test_ocsp_required.js] Added: head/www/waterfox/files/patch-bug1334465 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/waterfox/files/patch-bug1334465 Tue Feb 20 00:11:12 2018 (r462361) @@ -0,0 +1,62 @@ +commit 646f99465e4f +Author: Valentin Gosu <valentin.gosu@gmail.com> +Date: Fri Feb 9 13:20:04 2018 +0100 + + Bug 1334465 - Make HttpChannelParent::mIPCClosed atomic r=bagder a=ritu + + MozReview-Commit-ID: 6irCJMAjzjW + + --HG-- + extra : source : bd315ae86709c3459a3dbf0778022ff3b1908723 +--- + netwerk/protocol/http/HttpChannelParent.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git netwerk/protocol/http/HttpChannelParent.h netwerk/protocol/http/HttpChannelParent.h +index 572d7f177d7a..ef4dbd84f792 100644 +--- netwerk/protocol/http/HttpChannelParent.h ++++ netwerk/protocol/http/HttpChannelParent.h +@@ -264,7 +264,7 @@ private: + RefPtr<HttpBaseChannel> mChannel; + nsCOMPtr<nsICacheEntry> mCacheEntry; + nsCOMPtr<nsIAssociatedContentSecurity> mAssociatedContentSecurity; +- bool mIPCClosed; // PHttpChannel actor has been Closed() ++ Atomic<bool> mIPCClosed; // PHttpChannel actor has been Closed() + + nsCOMPtr<nsIChannel> mRedirectChannel; + nsCOMPtr<nsIAsyncVerifyRedirectCallback> mRedirectCallback; +commit a87603550115 +Author: Valentin Gosu <valentin.gosu@gmail.com> +Date: Sun Feb 11 03:51:09 2018 +0100 + + Bug 1334465 - Set mIPCClosed to true before calling SendDeleteSelf in order to avoid race r=bagder a=ritu + + In the previous code, a race condition could cause us to call SendSetPriority() after calling SendDeleteSelf. + + For example: + T1: SendDeleteSelf() + T2: if (!mIPCClosed) SendSetPriority() + T1: mIPCClosed = true + + MozReview-Commit-ID: 3XOwCaphb2o + + --HG-- + extra : source : 4ebdab0e332892378558817e30d0138c95199ce5 +--- + netwerk/protocol/http/HttpChannelParent.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git netwerk/protocol/http/HttpChannelParent.cpp netwerk/protocol/http/HttpChannelParent.cpp +index 064c5659e9ed..8ee13c2b5fbd 100644 +--- netwerk/protocol/http/HttpChannelParent.cpp ++++ netwerk/protocol/http/HttpChannelParent.cpp +@@ -2262,8 +2262,8 @@ HttpChannelParent::UpdateAndSerializeSecurityInfo(nsACString& aSerializedSecurit + bool + HttpChannelParent::DoSendDeleteSelf() + { +- bool rv = SendDeleteSelf(); + mIPCClosed = true; ++ bool rv = SendDeleteSelf(); + + CleanupBackgroundChannel(); + Added: head/www/waterfox/files/patch-bug1426988 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/waterfox/files/patch-bug1426988 Tue Feb 20 00:11:12 2018 (r462361) @@ -0,0 +1,102 @@ +commit 2f7e646ad8fd +Author: Nils Ohlmeier [:drno] <drno@ohlmeier.org> +Date: Sat Jan 27 11:20:43 2018 -0800 + + Bug 1426988 - Properly exit encoder init in error cases. r=rillian, a=abillings + + --HG-- + extra : source : f3bc73c747e847db4243cf1167720fd69d62fe51 +--- + media/libvpx/libvpx/vpx/src/vpx_encoder.c | 52 ++++++++++++++++++------------- + 1 file changed, 30 insertions(+), 22 deletions(-) + +diff --git media/libvpx/libvpx/vpx/src/vpx_encoder.c media/libvpx/libvpx/vpx/src/vpx_encoder.c +index 4390cf7c8f1f..1cf2dca695a9 100644 +--- media/libvpx/libvpx/vpx/src/vpx_encoder.c ++++ media/libvpx/libvpx/vpx/src/vpx_encoder.c +@@ -12,8 +12,11 @@ + * \brief Provides the high level interface to wrap encoder algorithms. + * + */ ++#include <assert.h> + #include <limits.h> ++#include <stdlib.h> + #include <string.h> ++#include "vp8/common/blockd.h" + #include "vpx_config.h" + #include "vpx/internal/vpx_codec_internal.h" + +@@ -81,6 +84,8 @@ vpx_codec_err_t vpx_codec_enc_init_multi_ver( + int i; + void *mem_loc = NULL; + ++ if (iface->enc.mr_get_mem_loc == NULL) return VPX_CODEC_INCAPABLE; ++ + if (!(res = iface->enc.mr_get_mem_loc(cfg, &mem_loc))) { + for (i = 0; i < num_enc; i++) { + vpx_codec_priv_enc_mr_cfg_t mr_cfg; +@@ -89,28 +94,27 @@ vpx_codec_err_t vpx_codec_enc_init_multi_ver( + if (dsf->num < 1 || dsf->num > 4096 || dsf->den < 1 || + dsf->den > dsf->num) { + res = VPX_CODEC_INVALID_PARAM; +- break; ++ } else { ++ mr_cfg.mr_low_res_mode_info = mem_loc; ++ mr_cfg.mr_total_resolutions = num_enc; ++ mr_cfg.mr_encoder_id = num_enc - 1 - i; ++ mr_cfg.mr_down_sampling_factor.num = dsf->num; ++ mr_cfg.mr_down_sampling_factor.den = dsf->den; ++ ++ /* Force Key-frame synchronization. Namely, encoder at higher ++ * resolution always use the same frame_type chosen by the ++ * lowest-resolution encoder. ++ */ ++ if (mr_cfg.mr_encoder_id) cfg->kf_mode = VPX_KF_DISABLED; ++ ++ ctx->iface = iface; ++ ctx->name = iface->name; ++ ctx->priv = NULL; ++ ctx->init_flags = flags; ++ ctx->config.enc = cfg; ++ res = ctx->iface->init(ctx, &mr_cfg); + } + +- mr_cfg.mr_low_res_mode_info = mem_loc; +- mr_cfg.mr_total_resolutions = num_enc; +- mr_cfg.mr_encoder_id = num_enc - 1 - i; +- mr_cfg.mr_down_sampling_factor.num = dsf->num; +- mr_cfg.mr_down_sampling_factor.den = dsf->den; +- +- /* Force Key-frame synchronization. Namely, encoder at higher +- * resolution always use the same frame_type chosen by the +- * lowest-resolution encoder. +- */ +- if (mr_cfg.mr_encoder_id) cfg->kf_mode = VPX_KF_DISABLED; +- +- ctx->iface = iface; +- ctx->name = iface->name; +- ctx->priv = NULL; +- ctx->init_flags = flags; +- ctx->config.enc = cfg; +- res = ctx->iface->init(ctx, &mr_cfg); +- + if (res) { + const char *error_detail = ctx->priv ? ctx->priv->err_detail : NULL; + /* Destroy current ctx */ +@@ -124,10 +128,14 @@ vpx_codec_err_t vpx_codec_enc_init_multi_ver( + vpx_codec_destroy(ctx); + i--; + } ++#if CONFIG_MULTI_RES_ENCODING ++ assert(mem_loc); ++ free(((LOWER_RES_FRAME_INFO *)mem_loc)->mb_info); ++ free(mem_loc); ++#endif ++ return SAVE_STATUS(ctx, res); + } + +- if (res) break; +- + ctx++; + cfg++; + dsf++; Added: head/www/waterfox/files/patch-bug1428947 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/waterfox/files/patch-bug1428947 Tue Feb 20 00:11:12 2018 (r462361) @@ -0,0 +1,90 @@ +commit 1251c93456f6 +Author: Dan Glastonbury <dan.glastonbury@gmail.com> +Date: Thu Feb 15 13:06:39 2018 +0200 + + Bug 1428947 - Check plane width & stride constraints. r=mattwoodrow a=ritu + + MozReview-Commit-ID: HEcMG4JoEl3 + + --HG-- + extra : amend_source : af70dc6dacdc867a39c40b0b1b8c05cea49c7586 +--- + dom/media/MediaData.cpp | 2 +- + gfx/layers/ImageContainer.cpp | 23 +++++++++++++---------- + 2 files changed, 14 insertions(+), 11 deletions(-) + +diff --git dom/media/MediaData.cpp dom/media/MediaData.cpp +index 445475163687..9aa2d58e9ded 100644 +--- dom/media/MediaData.cpp ++++ dom/media/MediaData.cpp +@@ -108,7 +108,8 @@ ValidatePlane(const VideoData::YCbCrBuffer::Plane& aPlane) + return aPlane.mWidth <= PlanarYCbCrImage::MAX_DIMENSION + && aPlane.mHeight <= PlanarYCbCrImage::MAX_DIMENSION + && aPlane.mWidth * aPlane.mHeight < MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT +- && aPlane.mStride > 0; ++ && aPlane.mStride > 0 ++ && aPlane.mWidth <= aPlane.mStride; + } + + static bool ValidateBufferAndPicture(const VideoData::YCbCrBuffer& aBuffer, +diff --git gfx/layers/ImageContainer.cpp gfx/layers/ImageContainer.cpp +index f00d856754af..3e397def86f7 100644 +--- gfx/layers/ImageContainer.cpp ++++ gfx/layers/ImageContainer.cpp +@@ -539,12 +539,15 @@ static void + CopyPlane(uint8_t *aDst, const uint8_t *aSrc, + const gfx::IntSize &aSize, int32_t aStride, int32_t aSkip) + { ++ int32_t height = aSize.height; ++ int32_t width = aSize.width; ++ ++ MOZ_RELEASE_ASSERT(width <= aStride); ++ + if (!aSkip) { + // Fast path: planar input. +- memcpy(aDst, aSrc, aSize.height * aStride); ++ memcpy(aDst, aSrc, height * aStride); + } else { +- int32_t height = aSize.height; +- int32_t width = aSize.width; + for (int y = 0; y < height; ++y) { + const uint8_t *src = aSrc; + uint8_t *dst = aDst; +@@ -562,13 +565,11 @@ CopyPlane(uint8_t *aDst, const uint8_t *aSrc, + bool + RecyclingPlanarYCbCrImage::CopyData(const Data& aData) + { +- mData = aData; +- + // update buffer size + // Use uint32_t throughout to match AllocateBuffer's param and mBufferSize + const auto checkedSize = +- CheckedInt<uint32_t>(mData.mCbCrStride) * mData.mCbCrSize.height * 2 + +- CheckedInt<uint32_t>(mData.mYStride) * mData.mYSize.height; ++ CheckedInt<uint32_t>(aData.mCbCrStride) * aData.mCbCrSize.height * 2 + ++ CheckedInt<uint32_t>(aData.mYStride) * aData.mYSize.height; + + if (!checkedSize.isValid()) + return false; +@@ -583,16 +584,18 @@ RecyclingPlanarYCbCrImage::CopyData(const Data& aData) + // update buffer size + mBufferSize = size; + ++ mData = aData; + mData.mYChannel = mBuffer.get(); + mData.mCbChannel = mData.mYChannel + mData.mYStride * mData.mYSize.height; + mData.mCrChannel = mData.mCbChannel + mData.mCbCrStride * mData.mCbCrSize.height; ++ mData.mYSkip = mData.mCbSkip = mData.mCrSkip = 0; + + CopyPlane(mData.mYChannel, aData.mYChannel, +- mData.mYSize, mData.mYStride, mData.mYSkip); ++ aData.mYSize, aData.mYStride, aData.mYSkip); + CopyPlane(mData.mCbChannel, aData.mCbChannel, +- mData.mCbCrSize, mData.mCbCrStride, mData.mCbSkip); ++ aData.mCbCrSize, aData.mCbCrStride, aData.mCbSkip); + CopyPlane(mData.mCrChannel, aData.mCrChannel, +- mData.mCbCrSize, mData.mCbCrStride, mData.mCrSkip); ++ aData.mCbCrSize, aData.mCbCrStride, aData.mCrSkip); + + mSize = aData.mPicSize; + mOrigin = gfx::IntPoint(aData.mPicX, aData.mPicY); Added: head/www/waterfox/files/patch-bug1431336 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/waterfox/files/patch-bug1431336 Tue Feb 20 00:11:12 2018 (r462361) @@ -0,0 +1,34 @@ +commit d606d1200b5a +Author: Makoto Kato <m_kato@ga2.so-net.ne.jp> +Date: Mon Feb 19 13:12:29 2018 +0900 + + Bug 1431336. r=smaug a=abillings +--- + dom/html/nsTextEditorState.cpp | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git dom/html/nsTextEditorState.cpp dom/html/nsTextEditorState.cpp +index a8247d183732..1430d1005e2a 100644 +--- dom/html/nsTextEditorState.cpp ++++ dom/html/nsTextEditorState.cpp +@@ -936,7 +936,8 @@ nsTextInputListener::NotifySelectionChanged(nsIDOMDocument* aDoc, nsISelection* + + mSelectionWasCollapsed = collapsed; + +- if (!weakFrame.IsAlive() || !nsContentUtils::IsFocusedContent(mFrame->GetContent())) ++ if (!weakFrame.IsAlive() || !mFrame || ++ !nsContentUtils::IsFocusedContent(mFrame->GetContent())) + return NS_OK; + + return UpdateTextInputCommands(NS_LITERAL_STRING("select"), aSel, aReason); +@@ -1792,8 +1793,9 @@ nsTextEditorState::SetSelectionRange(uint32_t aStart, uint32_t aEnd, + props.SetEnd(aEnd); + props.SetDirection(aDirection); + } else { ++ WeakPtr<nsTextEditorState> self(this); + aRv = mBoundFrame->SetSelectionRange(aStart, aEnd, aDirection); +- if (aRv.Failed()) { ++ if (aRv.Failed() || !self.get()) { + return; + } + rv = mBoundFrame->ScrollSelectionIntoView();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802200011.w1K0BCrg034689>