Shared security patch analysis results
AI Used: DEEPSEEK deepseek-chat--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/gfx/wr/webrender/src/image_tiling.rs+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/gfx/wr/webrender/src/image_tiling.rs@@ -45,6 +45,12 @@ current_origin: LayoutPoint, initial_origin: LayoutPoint, stride: LayoutSize,+}++impl RepetitionIterator {+ pub fn num_repetitions(&self) -> usize {+ (self.y_count * self.x_count) as usize+ } } impl Iterator for RepetitionIterator {
Analysis of the provided code diff: 1. Vulnerability Existed: not sure [Potential Integer Overflow] [gfx/wr/webrender/src/image_tiling.rs] [Lines 45-51] [Old Code: No explicit method to calculate total repetitions] [Fixed Code: Added num_repetitions() method that multiplies y_count and x_count] Note: While the diff shows the addition of a num_repetitions() method, it's not clear if this was fixing a specific security vulnerability or just adding functionality. The multiplication of y_count and x_count could potentially lead to integer overflow if not properly checked, but there's no explicit evidence this was a vulnerability in the old code. The change appears to be more of a feature addition than a security fix.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/gfx/2d/Swizzle.cpp+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/gfx/2d/Swizzle.cpp@@ -10,6 +10,7 @@ #include "Tools.h" #include "mozilla/CheckedInt.h" #include "mozilla/EndianUtils.h"+#include "mozilla/UniquePtr.h" #ifdef USE_SSE2 # include "mozilla/SSE.h"@@ -18,6 +19,8 @@ #ifdef USE_NEON # include "mozilla/arm.h" #endif++#include <new> namespace mozilla { namespace gfx {@@ -1185,6 +1188,92 @@ MOZ_ASSERT(false, "Unsupported swizzle formats"); return false;+}++static bool SwizzleYFlipDataInternal(const uint8_t* aSrc, int32_t aSrcStride,+ SurfaceFormat aSrcFormat, uint8_t* aDst,+ int32_t aDstStride,+ SurfaceFormat aDstFormat,+ const IntSize& aSize,+ SwizzleRowFn aSwizzleFn) {+ if (!aSwizzleFn) {+ return false;+ }++ // Guarantee our width and height are both greater than zero.+ if (aSize.IsEmpty()) {+ return true;+ }++ // Unlike SwizzleData/PremultiplyData, we don't use the stride gaps directly,+ // but we can use it to verify that the stride is valid for our width and+ // format.+ int32_t srcGap = GetStrideGap(aSize.width, aSrcFormat, aSrcStride);+ int32_t dstGap = GetStrideGap(aSize.width, aDstFormat, aDstStride);+ MOZ_ASSERT(srcGap >= 0 && dstGap >= 0);+ if (srcGap < 0 || dstGap < 0) {+ return false;+ }++ // Swapping/swizzling to a new buffer is trivial.+ if (aSrc != aDst) {+ const uint8_t* src = aSrc;+ const uint8_t* srcEnd = aSrc + aSize.height * aSrcStride;+ uint8_t* dst = aDst + (aSize.height - 1) * aDstStride;+ while (src < srcEnd) {+ aSwizzleFn(src, dst, aSize.width);+ src += aSrcStride;+ dst -= aDstStride;+ }+ return true;+ }++ if (aSrcStride != aDstStride) {+ return false;+ }++ // If we are swizzling in place, then we need a temporary row buffer.+ UniquePtr<uint8_t[]> rowBuffer(new (std::nothrow) uint8_t[aDstStride]);+ if (!rowBuffer) {+ return false;+ }++ // Swizzle and swap the top and bottom rows until we meet in the middle.+ int32_t middleRow = aSize.height / 2;+ uint8_t* top = aDst;+ uint8_t* bottom = aDst + (aSize.height - 1) * aDstStride;+ for (int32_t row = 0; row < middleRow; ++row) {+ memcpy(rowBuffer.get(), bottom, aDstStride);+ aSwizzleFn(top, bottom, aSize.width);+ aSwizzleFn(rowBuffer.get(), top, aSize.width);+ top += aDstStride;+ bottom -= aDstStride;+ }++ // If there is an odd numbered row, we haven't swizzled it yet.+ if (aSize.height % 2 == 1) {+ top = aDst + middleRow * aDstStride;+ aSwizzleFn(top, top, aSize.width);+ }+ return true;+}++bool SwizzleYFlipData(const uint8_t* aSrc, int32_t aSrcStride,+ SurfaceFormat aSrcFormat, uint8_t* aDst,+ int32_t aDstStride, SurfaceFormat aDstFormat,+ const IntSize& aSize) {+ return SwizzleYFlipDataInternal(aSrc, aSrcStride, aSrcFormat, aDst,+ aDstStride, aDstFormat, aSize,+ SwizzleRow(aSrcFormat, aDstFormat));+}++bool PremultiplyYFlipData(const uint8_t* aSrc, int32_t aSrcStride,+ SurfaceFormat aSrcFormat, uint8_t* aDst,+ int32_t aDstStride, SurfaceFormat aDstFormat,+ const IntSize& aSize) {+ return SwizzleYFlipDataInternal(aSrc, aSrcStride, aSrcFormat, aDst,+ aDstStride, aDstFormat, aSize,+ PremultiplyRow(aSrcFormat, aDstFormat)); } SwizzleRowFn SwizzleRow(SurfaceFormat aSrcFormat, SurfaceFormat aDstFormat) {
Analyzing the provided code diff, here are the potential security vulnerabilities: 1. Vulnerability Existed: yes Buffer Overflow Vulnerability [File] gfx/2d/Swizzle.cpp [Lines] 1185-1280 [Old Code] No previous implementation of SwizzleYFlipDataInternal existed [Fixed Code] Added new function SwizzleYFlipDataInternal with proper bounds checking (srcGap/dstGap validation) and memory allocation checks (rowBuffer) 2. Vulnerability Existed: yes Memory Allocation Vulnerability [File] gfx/2d/Swizzle.cpp [Lines] 1232-1234 [Old Code] No previous implementation [Fixed Code] Added proper memory allocation checking with std::nothrow and UniquePtr for rowBuffer 3. Vulnerability Existed: yes Integer Overflow Vulnerability [File] gfx/2d/Swizzle.cpp [Lines] 1209-1212 [Old Code] No previous implementation [Fixed Code] Added CheckedInt usage through GetStrideGap to prevent potential integer overflows in stride calculations 4. Vulnerability Existed: not sure Potential Race Condition [File] gfx/2d/Swizzle.cpp [Lines] 1214-1226 [Old Code] No previous implementation [Fixed Code] Added in-place swizzling with temporary buffer, but unclear if this needs thread safety considerations The main security improvements appear to be: 1. Proper bounds checking for buffer operations 2. Safe memory allocation patterns 3. Prevention of integer overflows in calculations 4. Proper handling of in-place operations with temporary buffers The changes show good security practices being implemented where none existed before, particularly around memory safety and bounds checking.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/path-objects/2d.path.arc.end.worker.js+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/path-objects/2d.path.arc.end.worker.js@@ -13,8 +13,8 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); ctx.fillStyle = '#f00'; ctx.fillRect(0, 0, 100, 50);@@ -25,7 +25,7 @@ ctx.arc(-100, 0, 25, -Math.PI/2, Math.PI/2, true); ctx.lineTo(100, 25); ctx.stroke();-_assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); t.done(); });
Based on the provided code diff, here's the analysis following the required format: Vulnerability Existed: no [No specific vulnerability] [testing/web-platform/tests/html/canvas/offscreen/path-objects/2d.path.arc.end.worker.js] [Lines 13-25] [Old Code] var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); ... _assertPixel(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); [Fixed Code] var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); ... _assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255"); Additional Details: The changes appear to be purely variable renaming (from 'offscreenCanvas' to 'canvas') with no security implications. The functionality remains identical, and there are no security vulnerabilities being addressed in this diff. The modification seems to be for code consistency or readability rather than security fixes.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/text/2d.text.drawing.style.textRendering.settings.html+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/text/2d.text.drawing.style.textRendering.settings.html@@ -17,8 +17,8 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); // Setting textRendering with lower cases _assertSame(ctx.textRendering, "auto", "ctx.textRendering", "\"auto\"");
Analysis of the provided code diff: 1. Vulnerability Existed: no No security vulnerability found [File] [Lines 17-18] Old Code: var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); Fixed Code: var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); Additional Notes: - The change appears to be purely a variable name change from `offscreenCanvas` to `canvas` - No security implications are evident in this change - The modification doesn't affect any security-related functionality or introduce/remove any security controls - This is likely a code style or consistency improvement rather than a security fix
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/third_party/rust/wgpu-core/src/conv.rs+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/third_party/rust/wgpu-core/src/conv.rs@@ -69,6 +69,10 @@ u.set( hal::TextureUses::COPY_SRC, usage.contains(wgt::TextureUsages::COPY_SRC),+ );+ u.set(+ hal::TextureUses::COPY_DST,+ usage.contains(wgt::TextureUsages::COPY_DST), ); u.set( hal::TextureUses::RESOURCE,
Analyzing the provided code diff: 1. Vulnerability Existed: not sure [Potential Missing Texture Usage Validation] [third_party/rust/wgpu-core/src/conv.rs] [Lines 69+] [Old Code] ```rust u.set( hal::TextureUses::COPY_SRC, usage.contains(wgt::TextureUsages::COPY_SRC), ); ``` [Fixed Code] ```rust u.set( hal::TextureUses::COPY_SRC, usage.contains(wgt::TextureUsages::COPY_SRC), ); u.set( hal::TextureUses::COPY_DST, usage.contains(wgt::TextureUsages::COPY_DST), ); ``` Details: The diff shows an addition of COPY_DST texture usage validation. While this doesn't appear to be fixing a known vulnerability, it could potentially prevent security issues related to improper texture usage validation if the missing check could have led to unauthorized memory operations. Without more context about the broader system, we can't be certain if this was actually exploitable. The change improves completeness of texture usage validation.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/third_party/rust/darling_core/src/util/mod.rs+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/third_party/rust/darling_core/src/util/mod.rs@@ -2,19 +2,20 @@ use std::ops::{BitAnd, BitOr, Deref, Not};-use syn;-use {FromMeta, Result};+use crate::{FromMeta, Result}; mod ident_string; mod ignored; mod over_ride;+mod parse_attribute; mod path_list;+mod spanned_value; mod with_original;-mod spanned_value; pub use self::ident_string::IdentString; pub use self::ignored::Ignored; pub use self::over_ride::Override;+pub use self::parse_attribute::parse_attribute_to_meta_list; pub use self::path_list::PathList; pub use self::spanned_value::SpannedValue; pub use self::with_original::WithOriginal;@@ -99,6 +100,7 @@ type Output = Self; fn bitand(self, rhs: Self) -> Self {+ #[allow(clippy::suspicious_arithmetic_impl)] (self.into() && rhs.into()).into() } }@@ -107,6 +109,7 @@ type Output = Self; fn bitor(self, rhs: Self) -> Self {+ #[allow(clippy::suspicious_arithmetic_impl)] (self.into() || rhs.into()).into() } }
I'll analyze the provided code diff for security fixes following the specified format. Vulnerability Existed: no No specific vulnerability found [third_party/rust/darling_core/src/util/mod.rs] [Various lines] [Old Code] Various lines showing imports and implementations without clippy allow attributes [Fixed Code] Added #[allow(clippy::suspicious_arithmetic_impl)] for bitwise operation implementations Additional details: 1. The changes are primarily: - Reorganization of imports (using crate-relative paths) - Addition of new module declarations - Addition of clippy allow attributes for suspicious arithmetic implementations 2. The clippy warning being suppressed (suspicious_arithmetic_impl) is more of a code style/possible logic error warning than a security vulnerability 3. No actual security vulnerabilities appear to have been fixed in this diff 4. The changes seem focused on code organization and lint handling rather than security fixes The diff shows improvements in code organization and handling of linter warnings, but doesn't appear to address any specific security vulnerabilities. The suspicious_arithmetic_impl warning being suppressed is about potentially confusing operator implementations, not about security issues.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/dom/cache/test/mochitest/test_cache_orphaned_cache.html+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/dom/cache/test/mochitest/test_cache_orphaned_cache.html@@ -64,7 +64,13 @@ "set": [["dom.caches.enabled", true], ["dom.caches.testing.enabled", true], ["dom.quotaManager.testing", true]],-}, function() {+}, async function() {+ // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5)+ // Acquire storage access permission here so that the Cache API is avaialable+ SpecialPowers.wrap(document).notifyUserGestureActivation();+ await SpecialPowers.addPermission("storageAccessAPI", true, window.location.href);+ await SpecialPowers.wrap(document).requestStorageAccess();+ var name = "toBeOrphaned"; var cache = null; var initialUsage = 0;
Here's the analysis of the provided code diff: Vulnerability Existed: not sure [Potential Cross-Site Storage Access Issue] [dom/cache/test/mochitest/test_cache_orphaned_cache.html] [Lines 64-70] [Old Code] }, function() { [Fixed Code] }, async function() { // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5) // Acquire storage access permission here so that the Cache API is avaialable SpecialPowers.wrap(document).notifyUserGestureActivation(); await SpecialPowers.addPermission("storageAccessAPI", true, window.location.href); await SpecialPowers.wrap(document).requestStorageAccess(); Additional Details: The changes appear to be related to test functionality when Total Cookie Protection (TCP) is enabled (cookieBehavior = 5). While this isn't fixing a direct vulnerability in the production code, it's addressing test reliability under stricter security conditions. The changes ensure proper storage access permissions are granted before testing Cache API functionality, which could be related to preventing potential cross-site storage access issues in test scenarios. However, since this is test code and the changes are more about test reliability than fixing a security flaw, I'm marking this as "not sure" for vulnerability existence.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/docshell/base/nsDocShell.cpp+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/docshell/base/nsDocShell.cpp@@ -88,6 +88,7 @@ #include "mozilla/dom/nsHTTPSOnlyUtils.h" #include "mozilla/dom/LoadURIOptionsBinding.h" #include "mozilla/dom/JSWindowActorChild.h"+#include "mozilla/dom/DocumentBinding.h" #include "mozilla/ipc/ProtocolUtils.h" #include "mozilla/net/DocumentChannel.h" #include "mozilla/net/DocumentChannelChild.h"@@ -389,7 +390,8 @@ mWillChangeProcess(false), mIsNavigating(false), mSuspendMediaWhenInactive(false),- mForcedAutodetection(false) {+ mForcedAutodetection(false),+ mCheckingSessionHistory(false) { // If no outer window ID was provided, generate a new one. if (aContentWindowID == 0) { mContentWindowID = nsContentUtils::GenerateWindowId();@@ -890,6 +892,83 @@ return mActiveEntryIsLoadingFromSessionHistory; }+// StopDetector is modeled similarly to OnloadBlocker; it is a rather+// dummy nsIRequest implementation which can be added to an nsILoadGroup to+// detect Cancel calls.+class StopDetector final : public nsIRequest {+ public:+ StopDetector() = default;++ NS_DECL_ISUPPORTS+ NS_DECL_NSIREQUEST++ bool Canceled() { return mCanceled; }++ private:+ ~StopDetector() = default;++ bool mCanceled = false;+};++NS_IMPL_ISUPPORTS(StopDetector, nsIRequest)++NS_IMETHODIMP+StopDetector::GetName(nsACString& aResult) {+ aResult.AssignLiteral("about:stop-detector");+ return NS_OK;+}++NS_IMETHODIMP+StopDetector::IsPending(bool* aRetVal) {+ *aRetVal = true;+ return NS_OK;+}++NS_IMETHODIMP+StopDetector::GetStatus(nsresult* aStatus) {+ *aStatus = NS_OK;+ return NS_OK;+}++NS_IMETHODIMP+StopDetector::Cancel(nsresult aStatus) {+ mCanceled = true;+ return NS_OK;+}++NS_IMETHODIMP+StopDetector::Suspend(void) { return NS_OK; }+NS_IMETHODIMP+StopDetector::Resume(void) { return NS_OK; }++NS_IMETHODIMP+StopDetector::GetLoadGroup(nsILoadGroup** aLoadGroup) {+ *aLoadGroup = nullptr;+ return NS_OK;+}++NS_IMETHODIMP+StopDetector::SetLoadGroup(nsILoadGroup* aLoadGroup) { return NS_OK; }++NS_IMETHODIMP+StopDetector::GetLoadFlags(nsLoadFlags* aLoadFlags) {+ *aLoadFlags = nsIRequest::LOAD_NORMAL;+ return NS_OK;+}++NS_IMETHODIMP+StopDetector::GetTRRMode(nsIRequest::TRRMode* aTRRMode) {+ return GetTRRModeImpl(aTRRMode);+}++NS_IMETHODIMP+StopDetector::SetTRRMode(nsIRequest::TRRMode aTRRMode) {+ return SetTRRModeImpl(aTRRMode);+}++NS_IMETHODIMP+StopDetector::SetLoadFlags(nsLoadFlags aLoadFlags) { return NS_OK; }+ bool nsDocShell::MaybeHandleSubframeHistory( nsDocShellLoadState* aLoadState, bool aContinueHandlingSubframeHistory) { // First, verify if this is a subframe.@@ -932,7 +1011,9 @@ !GetCreatedDynamically()) { if (XRE_IsContentProcess()) { dom::ContentChild* contentChild = dom::ContentChild::GetSingleton();- if (contentChild) {+ nsCOMPtr<nsILoadGroup> loadGroup;+ GetLoadGroup(getter_AddRefs(loadGroup));+ if (contentChild && loadGroup && !mCheckingSessionHistory) { RefPtr<Document> parentDoc = parentDS->GetDocument(); parentDoc->BlockOnload(); RefPtr<BrowsingContext> browsingContext = mBrowsingContext;@@ -940,11 +1021,34 @@ mBrowsingContext->GetCurrentLoadIdentifier(); RefPtr<nsDocShellLoadState> loadState = aLoadState; bool isNavigating = mIsNavigating;+ RefPtr<StopDetector> stopDetector = new StopDetector();+ loadGroup->AddRequest(stopDetector, nullptr);+ // Need to set mCheckingSessionHistory so that+ // GetIsAttemptingToNavigate() returns true.+ mCheckingSessionHistory = true; auto resolve = [currentLoadIdentifier, browsingContext, parentDoc, loadState,- isNavigating](+ isNavigating, loadGroup, stopDetector]( mozilla::Maybe<LoadingSessionHistoryInfo>&& aResult) {+ RefPtr<nsDocShell> docShell =+ static_cast<nsDocShell*>(browsingContext->GetDocShell());+ auto unblockParent = MakeScopeExit(+ [loadGroup, stopDetector, parentDoc, docShell]() {+ if (docShell) {+ docShell->mCheckingSessionHistory = false;+ }+ loadGroup->RemoveRequest(stopDetector, nullptr, NS_OK);+ parentDoc->UnblockOnload(false);+ });++ if (!docShell || !docShell->mCheckingSessionHistory) {+ return;+ }++ if (stopDetector->Canceled()) {+ return;+ } if (currentLoadIdentifier == browsingContext->GetCurrentLoadIdentifier() && aResult.isSome()) {@@ -953,16 +1057,20 @@ // history, index doesn't need to be updated. loadState->SetLoadIsFromSessionHistory(0, false); }- RefPtr<nsDocShell> docShell =- static_cast<nsDocShell*>(browsingContext->GetDocShell());- if (docShell) {- // We got the results back from the parent process, call- // LoadURI again with the possibly updated data.- docShell->LoadURI(loadState, isNavigating, true);- }- parentDoc->UnblockOnload(false);++ // We got the results back from the parent process, call+ // LoadURI again with the possibly updated data.+ docShell->LoadURI(loadState, isNavigating, true); };- auto reject = [parentDoc](mozilla::ipc::ResponseRejectReason) {+ auto reject = [loadGroup, stopDetector, browsingContext,+ parentDoc](mozilla::ipc::ResponseRejectReason) {+ RefPtr<nsDocShell> docShell =+ static_cast<nsDocShell*>(browsingContext->GetDocShell());+ if (docShell) {+ docShell->mCheckingSessionHistory = false;+ }+ // In practise reject shouldn't be called ever.+ loadGroup->RemoveRequest(stopDetector, nullptr, NS_OK); parentDoc->UnblockOnload(false); }; contentChild->SendGetLoadingSessionHistoryInfoFromParent(@@ -5548,6 +5656,7 @@ if (!aIsTransientAboutBlank && mozilla::SessionHistoryInParent()) { bool expired = false;+ uint32_t cacheKey = 0; nsCOMPtr<nsICacheInfoChannel> cacheChannel = do_QueryInterface(aRequest); if (cacheChannel) { // Check if the page has expired from cache@@ -5557,10 +5666,21 @@ if (expTime <= now) { expired = true; }++ // The checks for updating cache key are similar to the old session+ // history in OnNewURI. Try to update the cache key if+ // - we should update session history and aren't doing a session+ // history load.+ // - we're doing a forced reload.+ if (((!mLoadingEntry || !mLoadingEntry->mLoadIsFromSessionHistory) &&+ mBrowsingContext->ShouldUpdateSessionHistory(mLoadType)) ||+ IsForceReloadType(mLoadType)) {+ cacheChannel->GetCacheKey(&cacheKey);+ } } MOZ_LOG(gSHLog, LogLevel::Debug, ("document %p Embed", this));- MoveLoadingToActiveEntry(aPersist, expired);+ MoveLoadingToActiveEntry(aPersist, expired, cacheKey); } bool updateHistory = true;@@ -8804,6 +8924,7 @@ if (mActiveEntry) { mActiveEntry->SetScrollPosition(scrollPos.x, scrollPos.y); if (mBrowsingContext) {+ CollectWireframe(); if (XRE_IsParentProcess()) { SessionHistoryEntry* entry = mBrowsingContext->Canonical()->GetActiveSessionHistoryEntry();@@ -8893,15 +9014,17 @@ mActiveEntry->SetLayoutHistoryState(currentLayoutHistoryState); }+ if (cacheKey != 0) {+ mActiveEntry->SetCacheKey(cacheKey);+ } // We're passing in mCurrentURI, which could be null. SessionHistoryCommit // does require a non-null uri if this is for a refresh load of the same // URI, but in that case mCurrentURI won't be null here. mBrowsingContext->SessionHistoryCommit( *mLoadingEntry, mLoadType, mCurrentURI, hadActiveEntry, true, true, /* No expiration update on the same document loads*/- false);+ false, cacheKey); // FIXME Need to set postdata.- SetCacheKeyOnHistoryEntry(nullptr, cacheKey); // Set the title for the SH entry for this target url so that // SH menus in go/back/forward buttons won't be empty for this.@@ -10951,6 +11074,29 @@ mReferrerInfo = httpChannel->GetReferrerInfo(); } return onLocationChangeNeeded;+}++void nsDocShell::CollectWireframe() {+ if (mozilla::SessionHistoryInParent() &&+ StaticPrefs::browser_history_collectWireframes() &&+ mBrowsingContext->IsTop() && mActiveEntry) {+ RefPtr<Document> doc = mContentViewer->GetDocument();+ Nullable<Wireframe> wireframe;+ doc->GetWireframeWithoutFlushing(false, wireframe);+ if (!wireframe.IsNull()) {+ if (XRE_IsParentProcess()) {+ SessionHistoryEntry* entry =+ mBrowsingContext->Canonical()->GetActiveSessionHistoryEntry();+ if (entry) {+ entry->SetWireframe(Some(wireframe.Value()));+ }+ } else {+ mozilla::Unused+ << ContentChild::GetSingleton()->SendSessionHistoryEntryWireframe(+ mBrowsingContext, wireframe.Value());+ }+ }+ } } //*****************************************************************************@@ -11720,6 +11866,11 @@ // SessionHistoryEntry, but just replace its SessionHistoryInfo, that way the // entry keeps identity but its data is replaced. bool replace = aReplace && mActiveEntry;++ if (!replace) {+ CollectWireframe();+ }+ if (mActiveEntry) { // Link this entry to the previous active entry. mActiveEntry = MakeUnique<SessionHistoryInfo>(*mActiveEntry, aURI);@@ -11869,6 +12020,8 @@ if (scrollRestorationIsManual && layoutState) { layoutState->ResetScrollState(); }++ CollectWireframe(); } return rv;@@ -13379,7 +13532,7 @@ } }- return false;+ return mCheckingSessionHistory; } void nsDocShell::SetLoadingSessionHistoryInfo(@@ -13392,7 +13545,8 @@ mLoadingEntry = MakeUnique<LoadingSessionHistoryInfo>(aLoadingInfo); }-void nsDocShell::MoveLoadingToActiveEntry(bool aPersist, bool aExpired) {+void nsDocShell::MoveLoadingToActiveEntry(bool aPersist, bool aExpired,+ uint32_t aCacheKey) { MOZ_ASSERT(mozilla::SessionHistoryInParent()); MOZ_LOG(gSHLog, LogLevel::Debug,@@ -13416,6 +13570,9 @@ } if (mActiveEntry) {+ if (aCacheKey != 0) {+ mActiveEntry->SetCacheKey(aCacheKey);+ } MOZ_ASSERT(loadingEntry); uint32_t loadType = mLoadType == LOAD_ERROR_PAGE ? mFailedLoadType : mLoadType;@@ -13425,7 +13582,7 @@ // URI, but in that case mCurrentURI won't be null here. mBrowsingContext->SessionHistoryCommit(*loadingEntry, loadType, mCurrentURI, hadActiveEntry, aPersist, false,- aExpired);+ aExpired, aCacheKey); } }
Here's the analysis of the provided code diff for security fixes: 1. Vulnerability Existed: not sure Race Condition in Session History Handling [docshell/base/nsDocShell.cpp] [Lines 932-1060] Old Code: No explicit check for canceled requests during session history loading Fixed Code: Added StopDetector class and checks to handle canceled requests during session history loading 2. Vulnerability Existed: not sure Potential Information Leak [docshell/base/nsDocShell.cpp] [Lines 8804-8924] Old Code: No wireframe collection for session history Fixed Code: Added CollectWireframe() function to collect and store wireframe information for session history 3. Vulnerability Existed: not sure Cache Key Handling [docshell/base/nsDocShell.cpp] [Lines 5548-5666] Old Code: No proper cache key handling during session history updates Fixed Code: Added cache key handling and propagation through session history operations 4. Vulnerability Existed: not sure Session History State Management [docshell/base/nsDocShell.cpp] [Lines 13379-13532] Old Code: Simple return false for GetIsAttemptingToNavigate() Fixed Code: Added mCheckingSessionHistory flag and proper state management Note: While these changes appear to be security-related improvements, I cannot definitively confirm they are fixing known vulnerabilities without additional context. The changes primarily focus on improving the robustness of session history handling and preventing potential race conditions or state mismanagement issues.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/devtools/shared/compatibility/dataset/browsers.json+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/devtools/shared/compatibility/dataset/browsers.json@@ -1 +1 @@-{"chrome":{"name":"Chrome","preview_name":"Canary","pref_url":"chrome://flags","releases":{"1":{"release_date":"2008-12-11","release_notes":"https://chromereleases.googleblog.com/2008/12/stable-release-google-chrome-is-out-of.html","status":"retired","engine":"WebKit","engine_version":"528"},"2":{"release_date":"2009-05-21","release_notes":"https://chromereleases.googleblog.com/2009/05/stable-update-google-chrome-2017228.html","status":"retired","engine":"WebKit","engine_version":"530"},"3":{"release_date":"2009-09-15","release_notes":"https://chromereleases.googleblog.com/2009/09/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"532"},"4":{"release_date":"2010-01-25","release_notes":"https://chromereleases.googleblog.com/2010/01/stable-channel-update_25.html","status":"retired","engine":"WebKit","engine_version":"532.5"},"5":{"release_date":"2010-05-25","release_notes":"https://chromereleases.googleblog.com/2010/05/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"533"},"6":{"release_date":"2010-09-02","release_notes":"https://chromereleases.googleblog.com/2010/09/stable-and-beta-channel-updates.html","status":"retired","engine":"WebKit","engine_version":"534.3"},"7":{"release_date":"2010-10-19","release_notes":"https://chromereleases.googleblog.com/2010/10/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"534.7"},"8":{"release_date":"2010-12-02","release_notes":"https://chromereleases.googleblog.com/2010/12/stable-beta-channel-updates.html","status":"retired","engine":"WebKit","engine_version":"534.10"},"9":{"release_date":"2011-02-03","release_notes":"https://chromereleases.googleblog.com/2011/02/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"534.13"},"10":{"release_date":"2011-03-08","release_notes":"https://chromereleases.googleblog.com/2011/03/chrome-stable-release.html","status":"retired","engine":"WebKit","engine_version":"534.16"},"11":{"release_date":"2011-04-27","release_notes":"https://chromereleases.googleblog.com/2011/04/chrome-stable-update.html","status":"retired","engine":"WebKit","engine_version":"534.24"},"12":{"release_date":"2011-06-07","release_notes":"https://chromereleases.googleblog.com/2011/06/chrome-stable-release.html","status":"retired","engine":"WebKit","engine_version":"534.30"},"13":{"release_date":"2011-08-02","release_notes":"https://chromereleases.googleblog.com/2011/08/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"535.1"},"14":{"release_date":"2011-09-16","release_notes":"https://chromereleases.googleblog.com/2011/09/stable-channel-update_16.html","status":"retired","engine":"WebKit","engine_version":"535.1"},"15":{"release_date":"2011-10-25","release_notes":"https://chromereleases.googleblog.com/2011/10/chrome-stable-release.html","status":"retired","engine":"WebKit","engine_version":"535.2"},"16":{"release_date":"2011-12-13","release_notes":"https://chromereleases.googleblog.com/2011/12/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"535.7"},"17":{"release_date":"2012-02-08","release_notes":"https://chromereleases.googleblog.com/2012/02/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"535.11"},"18":{"release_date":"2012-03-28","release_notes":"https://chromereleases.googleblog.com/2012/03/stable-channel-release-and-beta-channel.html","status":"retired","engine":"WebKit","engine_version":"535.19"},"19":{"release_date":"2012-05-15","release_notes":"https://chromereleases.googleblog.com/2012/05/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"536.5"},"20":{"release_date":"2012-06-26","release_notes":"https://chromereleases.googleblog.com/2012/06/stable-channel-update_26.html","status":"retired","engine":"WebKit","engine_version":"536.10"},"21":{"release_date":"2012-07-31","release_notes":"https://chromereleases.googleblog.com/2012/07/stable-channel-release.html","status":"retired","engine":"WebKit","engine_version":"537.1"},"22":{"release_date":"2012-09-25","release_notes":"https://chromereleases.googleblog.com/2012/09/stable-channel-update_25.html","status":"retired","engine":"WebKit","engine_version":"537.4"},"23":{"release_date":"2012-11-06","release_notes":"https://chromereleases.googleblog.com/2012/11/stable-channel-release-and-beta-channel.html","status":"retired","engine":"WebKit","engine_version":"537.11"},"24":{"release_date":"2013-01-10","release_notes":"https://chromereleases.googleblog.com/2013/01/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"537.17"},"25":{"release_date":"2013-02-21","release_notes":"https://chromereleases.googleblog.com/2013/02/stable-channel-update_21.html","status":"retired","engine":"WebKit","engine_version":"537.22"},"26":{"release_date":"2013-03-26","release_notes":"https://chromereleases.googleblog.com/2013/03/stable-channel-update_26.html","status":"retired","engine":"WebKit","engine_version":"537.31"},"27":{"release_date":"2013-05-21","release_notes":"https://chromereleases.googleblog.com/2013/05/stable-channel-release.html","status":"retired","engine":"WebKit","engine_version":"537.36"},"28":{"release_date":"2013-07-09","release_notes":"https://chromereleases.googleblog.com/2013/07/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"28"},"29":{"release_date":"2013-08-20","release_notes":"https://chromereleases.googleblog.com/2013/08/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"29"},"30":{"release_date":"2013-10-01","release_notes":"https://chromereleases.googleblog.com/2013/10/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"30"},"31":{"release_date":"2013-11-12","release_notes":"https://chromereleases.googleblog.com/2013/11/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"31"},"32":{"release_date":"2014-01-14","release_notes":"https://chromereleases.googleblog.com/2014/01/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"32"},"33":{"release_date":"2014-02-20","release_notes":"https://chromereleases.googleblog.com/2014/02/stable-channel-update_20.html","status":"retired","engine":"Blink","engine_version":"33"},"34":{"release_date":"2014-04-08","release_notes":"https://chromereleases.googleblog.com/2014/04/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"34"},"35":{"release_date":"2014-05-20","release_notes":"https://chromereleases.googleblog.com/2014/05/stable-channel-update_20.html","status":"retired","engine":"Blink","engine_version":"35"},"36":{"release_date":"2014-07-16","release_notes":"https://chromereleases.googleblog.com/2014/07/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"36"},"37":{"release_date":"2014-08-26","release_notes":"https://chromereleases.googleblog.com/2014/08/stable-channel-update_26.html","status":"retired","engine":"Blink","engine_version":"37"},"38":{"release_date":"2014-10-07","release_notes":"https://chromereleases.googleblog.com/2014/10/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"38"},"39":{"release_date":"2014-11-18","release_notes":"https://chromereleases.googleblog.com/2014/11/stable-channel-update_18.html","status":"retired","engine":"Blink","engine_version":"39"},"40":{"release_date":"2015-01-21","release_notes":"https://chromereleases.googleblog.com/2015/01/stable-update.html","status":"retired","engine":"Blink","engine_version":"40"},"41":{"release_date":"2015-03-03","release_notes":"https://chromereleases.googleblog.com/2015/03/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"41"},"42":{"release_date":"2015-04-14","release_notes":"https://chromereleases.googleblog.com/2015/04/stable-channel-update_14.html","status":"retired","engine":"Blink","engine_version":"42"},"43":{"release_date":"2015-05-19","release_notes":"https://chromereleases.googleblog.com/2015/05/stable-channel-update_19.html","status":"retired","engine":"Blink","engine_version":"43"},"44":{"release_date":"2015-07-21","release_notes":"https://chromereleases.googleblog.com/2015/07/stable-channel-update_21.html","status":"retired","engine":"Blink","engine_version":"44"},"45":{"release_date":"2015-09-01","release_notes":"https://chromereleases.googleblog.com/2015/09/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"45"},"46":{"release_date":"2015-10-13","release_notes":"https://chromereleases.googleblog.com/2015/10/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"46"},"47":{"release_date":"2015-12-01","release_notes":"https://chromereleases.googleblog.com/2015/12/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"47"},"48":{"release_date":"2016-01-20","release_notes":"https://chromereleases.googleblog.com/2016/01/stable-channel-update_20.html","status":"retired","engine":"Blink","engine_version":"48"},"49":{"release_date":"2016-03-02","release_notes":"https://chromereleases.googleblog.com/2016/03/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"49"},"50":{"release_date":"2016-04-13","release_notes":"https://chromereleases.googleblog.com/2016/04/stable-channel-update_13.html","status":"retired","engine":"Blink","engine_version":"50"},"51":{"release_date":"2016-05-25","release_notes":"https://chromereleases.googleblog.com/2016/05/stable-channel-update_25.html","status":"retired","engine":"Blink","engine_version":"51"},"52":{"release_date":"2016-07-20","release_notes":"https://chromereleases.googleblog.com/2016/07/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"52"},"53":{"release_date":"2016-08-31","release_notes":"https://chromereleases.googleblog.com/2016/08/stable-channel-update-for-desktop_31.html","status":"retired","engine":"Blink","engine_version":"53"},"54":{"release_date":"2016-10-12","release_notes":"https://chromereleases.googleblog.com/2016/10/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"54"},"55":{"release_date":"2016-12-01","release_notes":"https://chromereleases.googleblog.com/2016/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"55"},"56":{"release_date":"2017-01-25","release_notes":"https://chromereleases.googleblog.com/2017/01/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"56"},"57":{"release_date":"2017-03-09","release_notes":"https://chromereleases.googleblog.com/2017/03/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"57"},"58":{"release_date":"2017-04-19","release_notes":"https://chromereleases.googleblog.com/2017/04/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"58"},"59":{"release_date":"2017-06-05","release_notes":"https://chromereleases.googleblog.com/2017/06/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"59"},"60":{"release_date":"2017-07-25","release_notes":"https://chromereleases.googleblog.com/2017/07/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"60"},"61":{"release_date":"2017-09-05","release_notes":"https://chromereleases.googleblog.com/2017/09/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"61"},"62":{"release_date":"2017-10-17","release_notes":"https://chromereleases.googleblog.com/2017/10/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"62"},"63":{"release_date":"2017-12-06","release_notes":"https://chromereleases.googleblog.com/2017/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"63"},"64":{"release_date":"2018-01-23","release_notes":"https://chromereleases.googleblog.com/2018/01/stable-channel-update-for-desktop_24.html","status":"retired","engine":"Blink","engine_version":"64"},"65":{"release_date":"2018-03-06","release_notes":"https://chromereleases.googleblog.com/2018/03/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"65"},"66":{"release_date":"2018-04-17","release_notes":"https://chromereleases.googleblog.com/2018/04/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"66"},"67":{"release_date":"2018-05-29","release_notes":"https://chromereleases.googleblog.com/2018/05/stable-channel-update-for-desktop_58.html","status":"retired","engine":"Blink","engine_version":"67"},"68":{"release_date":"2018-07-24","release_notes":"https://chromereleases.googleblog.com/2018/07/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"68"},"69":{"release_date":"2018-09-04","release_notes":"https://chromereleases.googleblog.com/2018/09/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"69"},"70":{"release_date":"2018-10-16","release_notes":"https://chromereleases.googleblog.com/2018/10/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"70"},"71":{"release_date":"2018-12-04","release_notes":"https://chromereleases.googleblog.com/2018/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"71"},"72":{"release_date":"2019-01-29","release_notes":"https://chromereleases.googleblog.com/2019/01/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"72"},"73":{"release_date":"2019-03-12","release_notes":"https://chromereleases.googleblog.com/2019/03/stable-channel-update-for-desktop_12.html","status":"retired","engine":"Blink","engine_version":"73"},"74":{"release_date":"2019-04-23","release_notes":"https://chromereleases.googleblog.com/2019/04/stable-channel-update-for-desktop_23.html","status":"retired","engine":"Blink","engine_version":"74"},"75":{"release_date":"2019-06-04","release_notes":"https://chromereleases.googleblog.com/2019/06/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"75"},"76":{"release_date":"2019-07-30","release_notes":"https://chromereleases.googleblog.com/2019/07/stable-channel-update-for-desktop_30.html","status":"retired","engine":"Blink","engine_version":"76"},"77":{"release_date":"2019-09-10","release_notes":"https://chromereleases.googleblog.com/2019/09/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"77"},"78":{"release_date":"2019-10-22","release_notes":"https://chromereleases.googleblog.com/2019/10/stable-channel-update-for-desktop_22.html","status":"retired","engine":"Blink","engine_version":"78"},"79":{"release_date":"2019-12-10","release_notes":"https://chromereleases.googleblog.com/2019/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-04","release_notes":"https://chromereleases.googleblog.com/2020/02/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-07","release_notes":"https://chromereleases.googleblog.com/2020/04/stable-channel-update-for-desktop_7.html","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-19","release_notes":"https://chromereleases.googleblog.com/2020/05/stable-channel-update-for-desktop_19.html","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-27","release_notes":"https://chromereleases.googleblog.com/2020/07/stable-channel-update-for-desktop_27.html","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-25","release_notes":"https://chromereleases.googleblog.com/2020/08/stable-channel-update-for-desktop_25.html","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-20","release_notes":"https://chromereleases.googleblog.com/2020/10/stable-channel-update-for-desktop_20.html","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-17","release_notes":"https://chromereleases.googleblog.com/2020/11/stable-channel-update-for-desktop_17.html","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-19","release_notes":"https://chromereleases.googleblog.com/2021/01/stable-channel-update-for-desktop_19.html","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-02","release_notes":"https://chromereleases.googleblog.com/2021/03/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-13","release_notes":"https://chromereleases.googleblog.com/2021/04/stable-channel-update-for-desktop_14.html","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-25","release_notes":"https://chromereleases.googleblog.com/2021/05/stable-channel-update-for-desktop_25.html","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-20","release_notes":"https://chromereleases.googleblog.com/2021/07/stable-channel-update-for-desktop_20.html","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-08-31","release_notes":"https://chromereleases.googleblog.com/2021/08/stable-channel-update-for-desktop_31.html","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-21","release_notes":"https://chromereleases.googleblog.com/2021/09/stable-channel-update-for-desktop_21.html","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-19","release_notes":"https://chromereleases.googleblog.com/2021/10/stable-channel-update-for-desktop_19.html","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-15","release_notes":"https://chromereleases.googleblog.com/2021/11/stable-channel-update-for-desktop.html","status":"current","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-04","status":"beta","engine":"Blink","engine_version":"97"},"98":{"release_date":"2022-02-01","status":"nightly","engine":"Blink","engine_version":"98"}}},"chrome_android":{"name":"Chrome Android","pref_url":"chrome://flags","releases":{"18":{"release_date":"2012-06-27","release_notes":"https://chromereleases.googleblog.com/2012/06/chrome-for-android-out-of-beta.html","status":"retired","engine":"WebKit","engine_version":"535.19"},"25":{"release_date":"2013-02-27","release_notes":"https://chromereleases.googleblog.com/2013/02/chrome-for-android-update.html","status":"retired","engine":"WebKit","engine_version":"537.22"},"26":{"release_date":"2013-04-03","release_notes":"https://chromereleases.googleblog.com/2013/04/chrome-for-android-stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"537.31"},"27":{"release_date":"2013-05-22","release_notes":"https://chromereleases.googleblog.com/2013/05/chrome-for-android-update.html","status":"retired","engine":"WebKit","engine_version":"537.36"},"28":{"release_date":"2013-07-10","release_notes":"https://chromereleases.googleblog.com/2013/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"28"},"29":{"release_date":"2013-08-21","release_notes":"https://chromereleases.googleblog.com/2013/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"29"},"30":{"release_date":"2013-10-02","release_notes":"https://chromereleases.googleblog.com/2013/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"30"},"31":{"release_date":"2013-11-14","release_notes":"https://chromereleases.googleblog.com/2013/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"31"},"32":{"release_date":"2014-01-15","release_notes":"https://chromereleases.googleblog.com/2014/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"32"},"33":{"release_date":"2014-02-26","release_notes":"https://chromereleases.googleblog.com/2014/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"33"},"34":{"release_date":"2014-04-02","release_notes":"https://chromereleases.googleblog.com/2014/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"34"},"35":{"release_date":"2014-05-20","release_notes":"https://chromereleases.googleblog.com/2014/05/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"35"},"36":{"release_date":"2014-07-16","release_notes":"https://chromereleases.googleblog.com/2014/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"36"},"37":{"release_date":"2014-09-03","release_notes":"https://chromereleases.googleblog.com/2014/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"37"},"38":{"release_date":"2014-10-08","release_notes":"https://chromereleases.googleblog.com/2014/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"38"},"39":{"release_date":"2014-11-12","release_notes":"https://chromereleases.googleblog.com/2014/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"39"},"40":{"release_date":"2015-01-21","release_notes":"https://chromereleases.googleblog.com/2015/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"40"},"41":{"release_date":"2015-03-11","release_notes":"https://chromereleases.googleblog.com/2015/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"41"},"42":{"release_date":"2015-04-15","release_notes":"https://chromereleases.googleblog.com/2015/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"42"},"43":{"release_date":"2015-05-27","release_notes":"https://chromereleases.googleblog.com/2015/05/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"43"},"44":{"release_date":"2015-07-29","release_notes":"https://chromereleases.googleblog.com/2015/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"44"},"45":{"release_date":"2015-09-01","release_notes":"https://chromereleases.googleblog.com/2015/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"45"},"46":{"release_date":"2015-10-14","release_notes":"https://chromereleases.googleblog.com/2015/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"46"},"47":{"release_date":"2015-12-02","release_notes":"https://chromereleases.googleblog.com/2015/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"47"},"48":{"release_date":"2016-01-26","status":"retired","engine":"Blink","engine_version":"48"},"49":{"release_date":"2016-03-09","release_notes":"https://chromereleases.googleblog.com/2016/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"49"},"50":{"release_date":"2016-04-13","status":"retired","engine":"Blink","engine_version":"50"},"51":{"release_date":"2016-06-08","release_notes":"https://chromereleases.googleblog.com/2016/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"51"},"52":{"release_date":"2016-07-27","release_notes":"https://chromereleases.googleblog.com/2016/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"52"},"53":{"release_date":"2016-09-07","release_notes":"https://chromereleases.googleblog.com/2016/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"53"},"54":{"release_date":"2016-10-19","release_notes":"https://chromereleases.googleblog.com/2016/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"54"},"55":{"release_date":"2016-12-06","release_notes":"https://chromereleases.googleblog.com/2016/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"55"},"56":{"release_date":"2017-02-01","release_notes":"https://chromereleases.googleblog.com/2017/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"56"},"57":{"release_date":"2017-03-16","release_notes":"https://chromereleases.googleblog.com/2017/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"57"},"58":{"release_date":"2017-04-25","release_notes":"https://chromereleases.googleblog.com/2017/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"58"},"59":{"release_date":"2017-06-06","release_notes":"https://chromereleases.googleblog.com/2017/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"59"},"60":{"release_date":"2017-08-01","release_notes":"https://chromereleases.googleblog.com/2017/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"60"},"61":{"release_date":"2017-09-05","release_notes":"https://chromereleases.googleblog.com/2017/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"61"},"62":{"release_date":"2017-10-24","release_notes":"https://chromereleases.googleblog.com/2017/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"62"},"63":{"release_date":"2017-12-05","release_notes":"https://chromereleases.googleblog.com/2017/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"63"},"64":{"release_date":"2018-01-23","release_notes":"https://chromereleases.googleblog.com/2018/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"64"},"65":{"release_date":"2018-03-06","release_notes":"https://chromereleases.googleblog.com/2018/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"65"},"66":{"release_date":"2018-04-17","release_notes":"https://chromereleases.googleblog.com/2018/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"66"},"67":{"release_date":"2018-05-31","release_notes":"https://chromereleases.googleblog.com/2018/05/chrome-for-android-update_31.html","status":"retired","engine":"Blink","engine_version":"67"},"68":{"release_date":"2018-07-24","release_notes":"https://chromereleases.googleblog.com/2018/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"68"},"69":{"release_date":"2018-09-04","release_notes":"https://chromereleases.googleblog.com/2018/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"69"},"70":{"release_date":"2018-10-17","release_notes":"https://chromereleases.googleblog.com/2018/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"70"},"71":{"release_date":"2018-12-04","release_notes":"https://chromereleases.googleblog.com/2018/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"71"},"72":{"release_date":"2019-01-29","release_notes":"https://chromereleases.googleblog.com/2019/01/chrome-for-android-update_29.html","status":"retired","engine":"Blink","engine_version":"72"},"73":{"release_date":"2019-03-12","release_notes":"https://chromereleases.googleblog.com/2019/03/chrome-for-android-update_12.html","status":"retired","engine":"Blink","engine_version":"73"},"74":{"release_date":"2019-04-24","release_notes":"https://chromereleases.googleblog.com/2019/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"74"},"75":{"release_date":"2019-06-04","release_notes":"https://chromereleases.googleblog.com/2019/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"75"},"76":{"release_date":"2019-07-30","release_notes":"https://chromereleases.googleblog.com/2019/07/chrome-for-android-update_30.html","status":"retired","engine":"Blink","engine_version":"76"},"77":{"release_date":"2019-09-10","release_notes":"https://chromereleases.googleblog.com/2019/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"77"},"78":{"release_date":"2019-10-22","release_notes":"https://chromereleases.googleblog.com/2019/10/chrome-for-android-update_22.html","status":"retired","engine":"Blink","engine_version":"78"},"79":{"release_date":"2019-12-17","release_notes":"https://chromereleases.googleblog.com/2019/12/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-04","release_notes":"https://chromereleases.googleblog.com/2020/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-07","release_notes":"https://chromereleases.googleblog.com/2020/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-19","release_notes":"https://chromereleases.googleblog.com/2020/05/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-27","release_notes":"https://chromereleases.googleblog.com/2020/07/chrome-for-android-update_27.html","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-25","release_notes":"https://chromereleases.googleblog.com/2020/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-20","release_notes":"https://chromereleases.googleblog.com/2020/10/chrome-for-android-update_20.html","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-17","release_notes":"https://chromereleases.googleblog.com/2020/11/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-19","release_notes":"https://chromereleases.googleblog.com/2021/01/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-02","release_notes":"https://chromereleases.googleblog.com/2021/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-13","release_notes":"https://chromereleases.googleblog.com/2021/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-25","release_notes":"https://chromereleases.googleblog.com/2021/05/chrome-for-android-update_01607414128.html","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-20","release_notes":"https://chromereleases.googleblog.com/2021/07/chrome-for-android-update_01500789893.html","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-08-31","release_notes":"https://chromereleases.googleblog.com/2021/08/chrome-for-android-update_0881967577.html","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-21","release_notes":"https://chromereleases.googleblog.com/2021/09/chrome-for-android-update_21.html","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-19","release_notes":"https://chromereleases.googleblog.com/2021/10/chrome-for-android-update_01703513036.html","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-15","release_notes":"https://chromereleases.googleblog.com/2021/11/chrome-for-android-update.html","status":"current","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-04","status":"beta","engine":"Blink","engine_version":"97"},"98":{"release_date":"2022-02-01","status":"nightly","engine":"Blink","engine_version":"98"}}},"deno":{"name":"Deno","releases":{"1.0":{"release_date":"2020-05-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.0.0","status":"retired","engine":"V8","engine_version":"8.4"},"1.1":{"release_date":"2020-06-12","release_notes":"https://github.com/denoland/deno/releases/tag/v1.1.0","status":"retired","engine":"V8","engine_version":"8.4"},"1.2":{"release_date":"2020-07-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.2.0","status":"retired","engine":"V8","engine_version":"8.5"},"1.3":{"release_date":"2020-08-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.3.0","status":"retired","engine":"V8","engine_version":"8.6"},"1.4":{"release_date":"2020-09-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.4.0","status":"retired","engine":"V8","engine_version":"8.7"},"1.5":{"release_date":"2020-10-27","release_notes":"https://github.com/denoland/deno/releases/tag/v1.5.0","status":"retired","engine":"V8","engine_version":"8.7"},"1.6":{"release_date":"2020-12-08","release_notes":"https://github.com/denoland/deno/releases/tag/v1.6.0","status":"retired","engine":"V8","engine_version":"8.8"},"1.7":{"release_date":"2021-01-19","release_notes":"https://github.com/denoland/deno/releases/tag/v1.7.0","status":"retired","engine":"V8","engine_version":"8.9"},"1.8":{"release_date":"2021-03-02","release_notes":"https://github.com/denoland/deno/releases/tag/v1.8.0","status":"retired","engine":"V8","engine_version":"9.0"},"1.9":{"release_date":"2021-04-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.9.0","status":"retired","engine":"V8","engine_version":"9.1"},"1.10":{"release_date":"2021-05-11","release_notes":"https://github.com/denoland/deno/releases/tag/v1.10.1","status":"retired","engine":"V8","engine_version":"9.1"},"1.11":{"release_date":"2021-06-08","release_notes":"https://github.com/denoland/deno/releases/tag/v1.11.0","status":"retired","engine":"V8","engine_version":"9.1"},"1.12":{"release_date":"2021-07-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.12.0","status":"retired","engine":"V8","engine_version":"9.2"},"1.13":{"release_date":"2021-08-10","release_notes":"https://github.com/denoland/deno/releases/tag/v1.13.0","status":"retired","engine":"V8","engine_version":"9.3"},"1.14":{"release_date":"2021-09-14","release_notes":"https://github.com/denoland/deno/releases/tag/v1.14.0","status":"retired","engine":"V8","engine_version":"9.4"},"1.15":{"release_date":"2021-10-12","release_notes":"https://github.com/denoland/deno/releases/tag/v1.15.0","status":"retired","engine":"V8","engine_version":"9.5"},"1.16":{"release_date":"2021-11-08","release_notes":"https://github.com/denoland/deno/releases/tag/v1.16.0","status":"current","engine":"V8","engine_version":"9.7"},"1.17":{"release_date":"2021-12-21","status":"nightly","engine":"V8","engine_version":"9.7"}}},"edge":{"name":"Edge","pref_url":"about:flags","releases":{"12":{"release_date":"2015-07-28","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-12","status":"retired","engine":"EdgeHTML","engine_version":"12"},"13":{"release_date":"2015-11-12","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-13","status":"retired","engine":"EdgeHTML","engine_version":"13"},"14":{"release_date":"2016-08-02","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-14","status":"retired","engine":"EdgeHTML","engine_version":"14"},"15":{"release_date":"2017-04-05","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-15","status":"retired","engine":"EdgeHTML","engine_version":"15"},"16":{"release_date":"2017-10-17","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-16","status":"retired","engine":"EdgeHTML","engine_version":"16"},"17":{"release_date":"2018-04-30","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-17","status":"retired","engine":"EdgeHTML","engine_version":"17"},"18":{"release_date":"2018-10-02","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new","status":"retired","engine":"EdgeHTML","engine_version":"18"},"79":{"release_date":"2020-01-15","release_notes":"https://blogs.windows.com/windowsexperience/2020/01/15/new-year-new-browser-the-new-microsoft-edge-is-out-of-preview-and-now-available-for-download/","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-07","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-80036148-february-7","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-13","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-81041653-april-13","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-21","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-83047837-may-21","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-16","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-84052240-july-16","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-27","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-85056441-august-27","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-09","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-86062238-october-9","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-19","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-87066441-november-19","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-21","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-88070550-january-21","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-04","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-89077445-march-4","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-15","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-90081839-april-15","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-27","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-91086437-may-27","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-22","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-92090255-july-22","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-09-02","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-93096138-september-02","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-24","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-94099231-september-24","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-21","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-950102030-october-21","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-19","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-960105429-november-19","status":"current","engine":"Blink","engine_version":"96"},"97":{"status":"beta","engine":"Blink","engine_version":"97"},"98":{"status":"nightly","engine":"Blink","engine_version":"98"}}},"firefox":{"name":"Firefox","preview_name":"Nightly","pref_url":"about:config","releases":{"1":{"release_date":"2004-11-09","release_notes":"http://website-archive.mozilla.org/www.mozilla.org/firefox_releasenotes/en-US/firefox/releases/1.0.html","status":"retired","engine":"Gecko","engine_version":"1.7"},"2":{"release_date":"2006-10-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/2","status":"retired","engine":"Gecko","engine_version":"1.8.1"},"3":{"release_date":"2008-06-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/3","status":"retired","engine":"Gecko","engine_version":"1.9"},"4":{"release_date":"2011-03-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/4","status":"retired","engine":"Gecko","engine_version":"2"},"5":{"release_date":"2011-06-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/5","status":"retired","engine":"Gecko","engine_version":"5"},"6":{"release_date":"2011-08-16","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/6","status":"retired","engine":"Gecko","engine_version":"6"},"7":{"release_date":"2011-09-27","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/7","status":"retired","engine":"Gecko","engine_version":"7"},"8":{"release_date":"2011-11-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/8","status":"retired","engine":"Gecko","engine_version":"8"},"9":{"release_date":"2011-12-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/9","status":"retired","engine":"Gecko","engine_version":"9"},"10":{"release_date":"2012-01-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/10","status":"retired","engine":"Gecko","engine_version":"10"},"11":{"release_date":"2012-03-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/11","status":"retired","engine":"Gecko","engine_version":"11"},"12":{"release_date":"2012-04-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/12","status":"retired","engine":"Gecko","engine_version":"12"},"13":{"release_date":"2012-06-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/13","status":"retired","engine":"Gecko","engine_version":"13"},"14":{"release_date":"2012-07-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/14","status":"retired","engine":"Gecko","engine_version":"14"},"15":{"release_date":"2012-08-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/15","status":"retired","engine":"Gecko","engine_version":"15"},"16":{"release_date":"2012-10-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/16","status":"retired","engine":"Gecko","engine_version":"16"},"17":{"release_date":"2012-11-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/17","status":"retired","engine":"Gecko","engine_version":"17"},"18":{"release_date":"2013-01-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/18","status":"retired","engine":"Gecko","engine_version":"18"},"19":{"release_date":"2013-02-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/19","status":"retired","engine":"Gecko","engine_version":"19"},"20":{"release_date":"2013-04-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/20","status":"retired","engine":"Gecko","engine_version":"20"},"21":{"release_date":"2013-05-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/21","status":"retired","engine":"Gecko","engine_version":"21"},"22":{"release_date":"2013-06-25","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/22","status":"retired","engine":"Gecko","engine_version":"22"},"23":{"release_date":"2013-08-06","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/23","status":"retired","engine":"Gecko","engine_version":"23"},"24":{"release_date":"2013-09-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/24","status":"retired","engine":"Gecko","engine_version":"24"},"25":{"release_date":"2013-10-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/25","status":"retired","engine":"Gecko","engine_version":"25"},"26":{"release_date":"2013-12-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/26","status":"retired","engine":"Gecko","engine_version":"26"},"27":{"release_date":"2014-02-04","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/27","status":"retired","engine":"Gecko","engine_version":"27"},"28":{"release_date":"2014-03-18","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/28","status":"retired","engine":"Gecko","engine_version":"28"},"29":{"release_date":"2014-04-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/29","status":"retired","engine":"Gecko","engine_version":"29"},"30":{"release_date":"2014-06-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/30","status":"retired","engine":"Gecko","engine_version":"30"},"31":{"release_date":"2014-07-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/31","status":"retired","engine":"Gecko","engine_version":"31"},"32":{"release_date":"2014-09-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/32","status":"retired","engine":"Gecko","engine_version":"32"},"33":{"release_date":"2014-10-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/33","status":"retired","engine":"Gecko","engine_version":"33"},"34":{"release_date":"2014-12-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/34","status":"retired","engine":"Gecko","engine_version":"34"},"35":{"release_date":"2015-01-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/35","status":"retired","engine":"Gecko","engine_version":"35"},"36":{"release_date":"2015-02-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/36","status":"retired","engine":"Gecko","engine_version":"36"},"37":{"release_date":"2015-03-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/37","status":"retired","engine":"Gecko","engine_version":"37"},"38":{"release_date":"2015-05-12","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/38","status":"retired","engine":"Gecko","engine_version":"38"},"39":{"release_date":"2015-07-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/39","status":"retired","engine":"Gecko","engine_version":"39"},"40":{"release_date":"2015-08-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/40","status":"retired","engine":"Gecko","engine_version":"40"},"41":{"release_date":"2015-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/41","status":"retired","engine":"Gecko","engine_version":"41"},"42":{"release_date":"2015-11-03","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/42","status":"retired","engine":"Gecko","engine_version":"42"},"43":{"release_date":"2015-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/43","status":"retired","engine":"Gecko","engine_version":"43"},"44":{"release_date":"2016-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/44","status":"retired","engine":"Gecko","engine_version":"44"},"45":{"release_date":"2016-03-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/45","status":"retired","engine":"Gecko","engine_version":"45"},"46":{"release_date":"2016-04-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/46","status":"retired","engine":"Gecko","engine_version":"46"},"47":{"release_date":"2016-06-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/47","status":"retired","engine":"Gecko","engine_version":"47"},"48":{"release_date":"2016-08-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/48","status":"retired","engine":"Gecko","engine_version":"48"},"49":{"release_date":"2016-09-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/49","status":"retired","engine":"Gecko","engine_version":"49"},"50":{"release_date":"2016-11-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/50","status":"retired","engine":"Gecko","engine_version":"50"},"51":{"release_date":"2017-01-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/51","status":"retired","engine":"Gecko","engine_version":"51"},"52":{"release_date":"2017-03-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/52","status":"retired","engine":"Gecko","engine_version":"52"},"53":{"release_date":"2017-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/53","status":"retired","engine":"Gecko","engine_version":"53"},"54":{"release_date":"2017-06-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/54","status":"retired","engine":"Gecko","engine_version":"54"},"55":{"release_date":"2017-08-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/55","status":"retired","engine":"Gecko","engine_version":"55"},"56":{"release_date":"2017-09-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/56","status":"retired","engine":"Gecko","engine_version":"56"},"57":{"release_date":"2017-11-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/57","status":"retired","engine":"Gecko","engine_version":"57"},"58":{"release_date":"2018-01-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/58","status":"retired","engine":"Gecko","engine_version":"58"},"59":{"release_date":"2018-03-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/59","status":"retired","engine":"Gecko","engine_version":"59"},"60":{"release_date":"2018-05-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/60","status":"esr","engine":"Gecko","engine_version":"60"},"61":{"release_date":"2018-06-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/61","status":"retired","engine":"Gecko","engine_version":"61"},"62":{"release_date":"2018-09-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/62","status":"retired","engine":"Gecko","engine_version":"62"},"63":{"release_date":"2018-10-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/63","status":"retired","engine":"Gecko","engine_version":"63"},"64":{"release_date":"2018-12-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/64","status":"retired","engine":"Gecko","engine_version":"64"},"65":{"release_date":"2019-01-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/65","status":"retired","engine":"Gecko","engine_version":"65"},"66":{"release_date":"2019-03-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/66","status":"retired","engine":"Gecko","engine_version":"66"},"67":{"release_date":"2019-05-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/67","status":"retired","engine":"Gecko","engine_version":"67"},"68":{"release_date":"2019-07-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/68","status":"retired","engine":"Gecko","engine_version":"68"},"69":{"release_date":"2019-09-03","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/69","status":"retired","engine":"Gecko","engine_version":"69"},"70":{"release_date":"2019-10-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/70","status":"retired","engine":"Gecko","engine_version":"70"},"71":{"release_date":"2019-12-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/71","status":"retired","engine":"Gecko","engine_version":"71"},"72":{"release_date":"2020-01-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/72","status":"retired","engine":"Gecko","engine_version":"72"},"73":{"release_date":"2020-02-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/73","status":"retired","engine":"Gecko","engine_version":"73"},"74":{"release_date":"2020-03-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/74","status":"retired","engine":"Gecko","engine_version":"74"},"75":{"release_date":"2020-04-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/75","status":"retired","engine":"Gecko","engine_version":"75"},"76":{"release_date":"2020-05-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/76","status":"retired","engine":"Gecko","engine_version":"76"},"77":{"release_date":"2020-06-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/77","status":"retired","engine":"Gecko","engine_version":"77"},"78":{"release_date":"2020-06-30","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/78","status":"retired","engine":"Gecko","engine_version":"78"},"79":{"release_date":"2020-07-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/79","status":"retired","engine":"Gecko","engine_version":"79"},"80":{"release_date":"2020-08-25","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/80","status":"retired","engine":"Gecko","engine_version":"80"},"81":{"release_date":"2020-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/81","status":"retired","engine":"Gecko","engine_version":"81"},"82":{"release_date":"2020-10-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/82","status":"retired","engine":"Gecko","engine_version":"82"},"83":{"release_date":"2020-11-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/83","status":"retired","engine":"Gecko","engine_version":"83"},"84":{"release_date":"2020-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/84","status":"retired","engine":"Gecko","engine_version":"84"},"85":{"release_date":"2021-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/85","status":"retired","engine":"Gecko","engine_version":"85"},"86":{"release_date":"2021-02-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/86","status":"retired","engine":"Gecko","engine_version":"86"},"87":{"release_date":"2021-03-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/87","status":"retired","engine":"Gecko","engine_version":"87"},"88":{"release_date":"2021-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/88","status":"retired","engine":"Gecko","engine_version":"88"},"89":{"release_date":"2021-06-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/89","status":"retired","engine":"Gecko","engine_version":"89"},"90":{"release_date":"2021-07-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/90","status":"retired","engine":"Gecko","engine_version":"90"},"91":{"release_date":"2021-08-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/91","status":"retired","engine":"Gecko","engine_version":"91"},"92":{"release_date":"2021-09-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/92","status":"retired","engine":"Gecko","engine_version":"92"},"93":{"release_date":"2021-10-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/93","status":"retired","engine":"Gecko","engine_version":"93"},"94":{"release_date":"2021-11-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/94","status":"retired","engine":"Gecko","engine_version":"94"},"95":{"release_date":"2021-12-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/95","status":"current","engine":"Gecko","engine_version":"95"},"96":{"release_date":"2022-01-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/96","status":"beta","engine":"Gecko","engine_version":"96"},"97":{"release_date":"2022-02-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/97","status":"nightly","engine":"Gecko","engine_version":"97"},"98":{"release_date":"2022-03-08","status":"planned","engine":"Gecko","engine_version":"98"},"1.5":{"release_date":"2005-11-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/1.5","status":"retired","engine":"Gecko","engine_version":"1.8"},"3.5":{"release_date":"2009-06-30","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/3.5","status":"retired","engine":"Gecko","engine_version":"1.9.1"},"3.6":{"release_date":"2010-01-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/3.6","status":"retired","engine":"Gecko","engine_version":"1.9.2"}}},"firefox_android":{"name":"Firefox for Android","pref_url":"about:config","releases":{"4":{"release_date":"2011-03-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/4","status":"retired","engine":"Gecko","engine_version":"2"},"5":{"release_date":"2011-06-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/5","status":"retired","engine":"Gecko","engine_version":"5"},"6":{"release_date":"2011-08-16","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/6","status":"retired","engine":"Gecko","engine_version":"6"},"7":{"release_date":"2011-09-27","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/7","status":"retired","engine":"Gecko","engine_version":"7"},"8":{"release_date":"2011-11-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/8","status":"retired","engine":"Gecko","engine_version":"8"},"9":{"release_date":"2011-12-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/9","status":"retired","engine":"Gecko","engine_version":"9"},"10":{"release_date":"2012-01-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/10","status":"retired","engine":"Gecko","engine_version":"10"},"14":{"release_date":"2012-06-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/14","status":"retired","engine":"Gecko","engine_version":"14"},"15":{"release_date":"2012-08-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/15","status":"retired","engine":"Gecko","engine_version":"15"},"16":{"release_date":"2012-10-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/16","status":"retired","engine":"Gecko","engine_version":"16"},"17":{"release_date":"2012-11-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/17","status":"retired","engine":"Gecko","engine_version":"17"},"18":{"release_date":"2013-01-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/18","status":"retired","engine":"Gecko","engine_version":"18"},"19":{"release_date":"2013-02-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/19","status":"retired","engine":"Gecko","engine_version":"19"},"20":{"release_date":"2013-04-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/20","status":"retired","engine":"Gecko","engine_version":"20"},"21":{"release_date":"2013-05-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/21","status":"retired","engine":"Gecko","engine_version":"21"},"22":{"release_date":"2013-06-25","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/22","status":"retired","engine":"Gecko","engine_version":"22"},"23":{"release_date":"2013-08-06","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/23","status":"retired","engine":"Gecko","engine_version":"23"},"24":{"release_date":"2013-09-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/24","status":"retired","engine":"Gecko","engine_version":"24"},"25":{"release_date":"2013-10-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/25","status":"retired","engine":"Gecko","engine_version":"25"},"26":{"release_date":"2013-12-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/26","status":"retired","engine":"Gecko","engine_version":"26"},"27":{"release_date":"2014-02-04","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/27","status":"retired","engine":"Gecko","engine_version":"27"},"28":{"release_date":"2014-03-18","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/28","status":"retired","engine":"Gecko","engine_version":"28"},"29":{"release_date":"2014-04-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/29","status":"retired","engine":"Gecko","engine_version":"29"},"30":{"release_date":"2014-06-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/30","status":"retired","engine":"Gecko","engine_version":"30"},"31":{"release_date":"2014-07-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/31","status":"retired","engine":"Gecko","engine_version":"31"},"32":{"release_date":"2014-09-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/32","status":"retired","engine":"Gecko","engine_version":"32"},"33":{"release_date":"2014-10-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/33","status":"retired","engine":"Gecko","engine_version":"33"},"34":{"release_date":"2014-12-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/34","status":"retired","engine":"Gecko","engine_version":"34"},"35":{"release_date":"2015-01-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/35","status":"retired","engine":"Gecko","engine_version":"35"},"36":{"release_date":"2015-02-27","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/36","status":"retired","engine":"Gecko","engine_version":"36"},"37":{"release_date":"2015-03-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/37","status":"retired","engine":"Gecko","engine_version":"37"},"38":{"release_date":"2015-05-12","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/38","status":"retired","engine":"Gecko","engine_version":"38"},"39":{"release_date":"2015-07-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/39","status":"retired","engine":"Gecko","engine_version":"39"},"40":{"release_date":"2015-08-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/40","status":"retired","engine":"Gecko","engine_version":"40"},"41":{"release_date":"2015-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/41","status":"retired","engine":"Gecko","engine_version":"41"},"42":{"release_date":"2015-11-03","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/42","status":"retired","engine":"Gecko","engine_version":"42"},"43":{"release_date":"2015-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/43","status":"retired","engine":"Gecko","engine_version":"43"},"44":{"release_date":"2016-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/44","status":"retired","engine":"Gecko","engine_version":"44"},"45":{"release_date":"2016-03-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/45","status":"retired","engine":"Gecko","engine_version":"45"},"46":{"release_date":"2016-04-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/46","status":"retired","engine":"Gecko","engine_version":"46"},"47":{"release_date":"2016-06-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/47","status":"retired","engine":"Gecko","engine_version":"47"},"48":{"release_date":"2016-08-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/48","status":"retired","engine":"Gecko","engine_version":"48"},"49":{"release_date":"2016-09-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/49","status":"retired","engine":"Gecko","engine_version":"49"},"50":{"release_date":"2016-11-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/50","status":"retired","engine":"Gecko","engine_version":"50"},"51":{"release_date":"2017-01-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/51","status":"retired","engine":"Gecko","engine_version":"51"},"52":{"release_date":"2017-03-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/52","status":"retired","engine":"Gecko","engine_version":"52"},"53":{"release_date":"2017-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/53","status":"retired","engine":"Gecko","engine_version":"53"},"54":{"release_date":"2017-06-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/54","status":"retired","engine":"Gecko","engine_version":"54"},"55":{"release_date":"2017-08-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/55","status":"retired","engine":"Gecko","engine_version":"55"},"56":{"release_date":"2017-09-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/56","status":"retired","engine":"Gecko","engine_version":"56"},"57":{"release_date":"2017-11-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/57","status":"retired","engine":"Gecko","engine_version":"57"},"58":{"release_date":"2018-01-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/58","status":"retired","engine":"Gecko","engine_version":"58"},"59":{"release_date":"2018-03-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/59","status":"retired","engine":"Gecko","engine_version":"59"},"60":{"release_date":"2018-05-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/60","status":"retired","engine":"Gecko","engine_version":"60"},"61":{"release_date":"2018-06-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/61","status":"retired","engine":"Gecko","engine_version":"61"},"62":{"release_date":"2018-09-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/62","status":"retired","engine":"Gecko","engine_version":"62"},"63":{"release_date":"2018-10-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/63","status":"retired","engine":"Gecko","engine_version":"63"},"64":{"release_date":"2018-12-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/64","status":"retired","engine":"Gecko","engine_version":"64"},"65":{"release_date":"2019-01-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/65","status":"retired","engine":"Gecko","engine_version":"65"},"66":{"release_date":"2019-03-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/66","status":"retired","engine":"Gecko","engine_version":"66"},"67":{"release_date":"2019-05-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/67","status":"retired","engine":"Gecko","engine_version":"67"},"68":{"release_date":"2019-07-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/68","status":"retired","engine":"Gecko","engine_version":"68"},"79":{"release_date":"2020-07-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/79","status":"retired","engine":"Gecko","engine_version":"79"},"80":{"release_date":"2020-08-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/80","status":"retired","engine":"Gecko","engine_version":"80"},"81":{"release_date":"2020-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/81","status":"retired","engine":"Gecko","engine_version":"81"},"82":{"release_date":"2020-10-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/82","status":"retired","engine":"Gecko","engine_version":"82"},"83":{"release_date":"2020-11-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/83","status":"retired","engine":"Gecko","engine_version":"83"},"84":{"release_date":"2020-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/84","status":"retired","engine":"Gecko","engine_version":"84"},"85":{"release_date":"2021-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/85","status":"retired","engine":"Gecko","engine_version":"85"},"86":{"release_date":"2021-02-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/86","status":"retired","engine":"Gecko","engine_version":"86"},"87":{"release_date":"2021-03-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/87","status":"retired","engine":"Gecko","engine_version":"87"},"88":{"release_date":"2021-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/88","status":"retired","engine":"Gecko","engine_version":"88"},"89":{"release_date":"2021-06-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/89","status":"retired","engine":"Gecko","engine_version":"89"},"90":{"release_date":"2021-07-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/90","status":"retired","engine":"Gecko","engine_version":"90"},"91":{"release_date":"2021-08-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/91","status":"retired","engine":"Gecko","engine_version":"91"},"92":{"release_date":"2021-09-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/92","status":"retired","engine":"Gecko","engine_version":"92"},"93":{"release_date":"2021-10-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/93","status":"retired","engine":"Gecko","engine_version":"93"},"94":{"release_date":"2021-11-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/94","status":"retired","engine":"Gecko","engine_version":"94"},"95":{"release_date":"2021-12-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/95","status":"current","engine":"Gecko","engine_version":"95"},"96":{"release_date":"2022-01-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/96","status":"beta","engine":"Gecko","engine_version":"96"},"97":{"release_date":"2022-02-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/97","status":"nightly","engine":"Gecko","engine_version":"97"},"98":{"release_date":"2022-03-08","status":"planned","engine":"Gecko","engine_version":"98"}}},"ie":{"name":"Internet Explorer","releases":{"1":{"release_date":"1995-08-16","status":"retired"},"2":{"release_date":"1995-11-22","status":"retired"},"3":{"release_date":"1996-08-13","status":"retired"},"4":{"release_date":"1997-09-30","status":"retired"},"5":{"release_date":"1999-03-18","status":"retired"},"6":{"release_date":"2001-08-27","status":"retired"},"7":{"release_date":"2006-10-18","status":"retired"},"8":{"release_date":"2009-03-19","status":"retired","engine":"Trident","engine_version":"4.0"},"9":{"release_date":"2011-03-14","status":"retired","engine":"Trident","engine_version":"5.0"},"10":{"release_date":"2012-10-26","status":"retired","engine":"Trident","engine_version":"6.0"},"11":{"release_date":"2013-10-17","status":"current","engine":"Trident","engine_version":"7.0"},"5.5":{"release_date":"2000-07-06","status":"retired"}}},"nodejs":{"name":"Node.js","releases":{"0.10.0":{"release_date":"2013-03-11","release_notes":"https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V010.md","status":"retired","engine":"V8","engine_version":"3.14"},"0.12.0":{"release_date":"2015-02-06","release_notes":"https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V012.md","status":"retired","engine":"V8","engine_version":"3.28"},"4.0.0":{"release_date":"2015-09-08","release_notes":"https://nodejs.org/en/blog/release/v4.0.0/","status":"retired","engine":"V8","engine_version":"4.5"},"5.0.0":{"release_date":"2015-10-29","release_notes":"https://nodejs.org/en/blog/release/v5.0.0/","status":"retired","engine":"V8","engine_version":"4.6"},"6.0.0":{"release_date":"2016-04-26","release_notes":"https://nodejs.org/en/blog/release/v6.0.0/","status":"retired","engine":"V8","engine_version":"5"},"6.5.0":{"release_date":"2016-08-26","release_notes":"https://nodejs.org/en/blog/release/v6.5.0/","status":"retired","engine":"V8","engine_version":"5.1"},"7.0.0":{"release_date":"2016-10-25","release_notes":"https://nodejs.org/en/blog/release/v7.0.0/","status":"retired","engine":"V8","engine_version":"5.4"},"7.5.0":{"release_date":"2017-01-31","release_notes":"https://nodejs.org/en/blog/release/v7.5.0/","status":"retired","engine":"V8","engine_version":"5.4"},"7.6.0":{"release_date":"2017-02-21","release_notes":"https://nodejs.org/en/blog/release/v7.6.0/","status":"retired","engine":"V8","engine_version":"5.5"},"7.7.0":{"release_date":"2017-02-28","release_notes":"https://nodejs.org/en/blog/release/v7.7.0/","status":"retired","engine":"V8","engine_version":"5.5"},"7.10.0":{"release_date":"2017-05-02","release_notes":"https://nodejs.org/en/blog/release/v7.10.0/","status":"retired","engine":"V8","engine_version":"5.5"},"8.0.0":{"release_date":"2017-05-30","release_notes":"https://nodejs.org/en/blog/release/v8.0.0/","status":"retired","engine":"V8","engine_version":"5.8"},"8.3.0":{"release_date":"2017-08-09","release_notes":"https://nodejs.org/en/blog/release/v8.3.0/","status":"retired","engine":"V8","engine_version":"6.0"},"8.5.0":{"release_date":"2017-09-12","release_notes":"https://nodejs.org/en/blog/release/v8.5.0/","status":"retired","engine":"V8","engine_version":"6.0"},"8.7.0":{"release_date":"2017-10-11","release_notes":"https://nodejs.org/en/blog/release/v8.7.0/","status":"retired","engine":"V8","engine_version":"6.1"},"8.10.0":{"release_date":"2018-03-06","release_notes":"https://nodejs.org/en/blog/release/v8.10.0/","status":"retired","engine":"V8","engine_version":"6.2"},"9.3.0":{"release_date":"2017-12-12","release_notes":"https://nodejs.org/en/blog/release/v9.3.0/","status":"retired","engine":"V8","engine_version":"6.2"},"10.0.0":{"release_date":"2018-04-24","release_notes":"https://nodejs.org/en/blog/release/v10.0.0/","status":"retired","engine":"V8","engine_version":"6.6"},"10.4.0":{"release_date":"2018-06-06","release_notes":"https://nodejs.org/en/blog/release/v10.4.0/","status":"retired","engine":"V8","engine_version":"6.7"},"10.5.0":{"release_date":"2018-06-20","release_notes":"https://nodejs.org/en/blog/release/v10.5.0/","status":"retired","engine":"V8","engine_version":"6.7"},"10.7.0":{"release_date":"2018-07-18","release_notes":"https://nodejs.org/en/blog/release/v10.7.0/","status":"retired","engine":"V8","engine_version":"6.7"},"10.9.0":{"release_date":"2018-08-16","release_notes":"https://nodejs.org/en/blog/release/v10.9.0/","status":"retired","engine":"V8","engine_version":"6.8"},"11.0.0":{"release_date":"2018-10-23","release_notes":"https://nodejs.org/en/blog/release/v11.0.0/","status":"retired","engine":"V8","engine_version":"7.0"},"11.7.0":{"release_date":"2019-01-18","release_notes":"https://nodejs.org/en/blog/release/v11.7.0/","status":"retired","engine":"V8","engine_version":"7.0"},"12.0.0":{"release_date":"2019-04-23","release_notes":"https://nodejs.org/en/blog/release/v12.0.0/","status":"retired","engine":"V8","engine_version":"7.4"},"12.5.0":{"release_date":"2019-06-27","release_notes":"https://nodejs.org/en/blog/release/v12.5.0/","status":"retired","engine":"V8","engine_version":"7.5"},"12.9.0":{"release_date":"2019-08-20","release_notes":"https://nodejs.org/en/blog/release/v12.9.0/","status":"retired","engine":"V8","engine_version":"7.6"},"12.11.0":{"release_date":"2019-09-25","release_notes":"https://nodejs.org/en/blog/release/v12.11.0/","status":"retired","engine":"V8","engine_version":"7.7"},"12.17.0":{"release_date":"2020-05-26","release_notes":"https://nodejs.org/en/blog/release/v12.17.0/","status":"esr","engine":"V8","engine_version":"7.8"},"13.0.0":{"release_date":"2019-10-10","release_notes":"https://nodejs.org/en/blog/release/v13.0.0/","status":"retired","engine":"V8","engine_version":"7.8"},"13.2.0":{"release_date":"2019-11-21","release_notes":"https://nodejs.org/en/blog/release/v13.2.0/","status":"retired","engine":"V8","engine_version":"7.9"},"14.0.0":{"release_date":"2020-04-21","release_notes":"https://nodejs.org/en/blog/release/v14.0.0/","status":"retired","engine":"V8","engine_version":"8.1"},"14.3.0":{"release_date":"2020-05-19","release_notes":"https://nodejs.org/en/blog/release/v14.3.0/","status":"retired","engine":"V8","engine_version":"8.3"},"14.5.0":{"release_date":"2020-06-30","release_notes":"https://nodejs.org/en/blog/release/v14.5.0/","status":"retired","engine":"V8","engine_version":"8.3"},"14.6.0":{"release_date":"2020-07-21","release_notes":"https://nodejs.org/en/blog/release/v14.6.0/","status":"retired","engine":"V8","engine_version":"8.4"},"14.7.0":{"release_date":"2020-07-29","release_notes":"https://nodejs.org/en/blog/release/v14.7.0/","status":"retired","engine":"V8","engine_version":"8.4"},"14.8.0":{"release_date":"2020-08-11","release_notes":"https://nodejs.org/en/blog/release/v14.8.0/","status":"esr","engine":"V8","engine_version":"8.4"},"15.0.0":{"release_date":"2020-10-20","release_notes":"https://nodejs.org/en/blog/release/v15.0.0/","status":"retired","engine":"V8","engine_version":"8.6"},"15.4.0":{"release_date":"2020-12-09","release_notes":"https://nodejs.org/en/blog/release/v15.4.0/","status":"retired","engine":"V8","engine_version":"8.6"},"15.7.0":{"release_date":"2021-01-26","release_notes":"https://nodejs.org/en/blog/release/v15.7.0/","status":"retired","engine":"V8","engine_version":"8.6"},"15.12.0":{"release_date":"2021-03-17","release_notes":"https://nodejs.org/en/blog/release/v15.12.0/","status":"retired","engine":"V8","engine_version":"8.6"},"16.0.0":{"release_date":"2021-04-20","release_notes":"https://nodejs.org/en/blog/release/v16.0.0/","status":"retired","engine":"V8","engine_version":"9.0"},"16.4.0":{"release_date":"2021-06-23","release_notes":"https://nodejs.org/en/blog/release/v16.4.0/","status":"retired","engine":"V8","engine_version":"9.1"},"16.5.0":{"release_date":"2021-07-14","release_notes":"https://nodejs.org/en/blog/release/v16.5.0/","status":"retired","engine":"V8","engine_version":"9.2"},"16.6.0":{"release_date":"2021-07-29","release_notes":"https://nodejs.org/en/blog/release/v16.6.0/","status":"retired","engine":"V8","engine_version":"9.2"},"16.7.0":{"release_date":"2021-08-17","release_notes":"https://nodejs.org/en/blog/release/v16.7.0/","status":"retired","engine":"V8","engine_version":"9.2"},"16.9.0":{"release_date":"2021-09-07","release_notes":"https://nodejs.org/en/blog/release/v16.9.0/","status":"current","engine":"V8","engine_version":"9.3"},"17.0.0":{"release_date":"2021-10-19","release_notes":"https://nodejs.org/en/blog/release/v17.0.0/","status":"current","engine":"V8","engine_version":"9.5"}}},"opera":{"name":"Opera","releases":{"2":{"release_date":"1996-07-14","status":"retired"},"3":{"release_date":"1997-12-01","status":"retired"},"4":{"release_date":"2000-06-28","status":"retired"},"5":{"release_date":"2000-12-06","status":"retired"},"6":{"release_date":"2001-12-18","status":"retired"},"7":{"release_date":"2003-01-28","status":"retired","engine":"Presto","engine_version":"1"},"8":{"release_date":"2005-04-19","status":"retired","engine":"Presto","engine_version":"1"},"9":{"release_date":"2006-06-20","status":"retired","engine":"Presto","engine_version":"2"},"10":{"release_date":"2009-09-01","release_notes":"https://dev.opera.com/blog/opera-10-weve-only-just-begun/","status":"retired","engine":"Presto","engine_version":"2.2"},"11":{"release_date":"2010-12-16","release_notes":"https://dev.opera.com/blog/new-html5-features-in-opera-11/","status":"retired","engine":"Presto","engine_version":"2.7"},"12":{"release_date":"2012-06-14","release_notes":"https://dev.opera.com/blog/hello-opera-12/","status":"retired","engine":"Presto","engine_version":"2.10"},"15":{"release_date":"2013-07-02","release_notes":"https://dev.opera.com/blog/introducing-opera-15-for-desktop-and-a-fast-release-cycle/","status":"retired","engine":"Blink","engine_version":"28"},"16":{"release_date":"2013-08-27","release_notes":"https://dev.opera.com/blog/opera-16-released-in-the-wild/","status":"retired","engine":"Blink","engine_version":"29"},"17":{"release_date":"2013-10-08","release_notes":"https://dev.opera.com/blog/opera-desktop-17-released/","status":"retired","engine":"Blink","engine_version":"30"},"18":{"release_date":"2013-11-19","release_notes":"https://dev.opera.com/blog/opera-desktop-18-released/","status":"retired","engine":"Blink","engine_version":"31"},"19":{"release_date":"2014-01-28","release_notes":"https://dev.opera.com/blog/opera-19/","status":"retired","engine":"Blink","engine_version":"32"},"20":{"release_date":"2014-03-04","release_notes":"https://dev.opera.com/blog/opera-20/","status":"retired","engine":"Blink","engine_version":"33"},"21":{"release_date":"2014-05-06","release_notes":"https://dev.opera.com/blog/opera-21/","status":"retired","engine":"Blink","engine_version":"34"},"22":{"release_date":"2014-06-03","release_notes":"https://dev.opera.com/blog/opera-22/","status":"retired","engine":"Blink","engine_version":"35"},"23":{"release_date":"2014-07-22","release_notes":"https://dev.opera.com/blog/opera-23/","status":"retired","engine":"Blink","engine_version":"36"},"24":{"release_date":"2014-09-02","release_notes":"https://dev.opera.com/blog/opera-24/","status":"retired","engine":"Blink","engine_version":"37"},"25":{"release_date":"2014-10-15","release_notes":"https://dev.opera.com/blog/opera-25/","status":"retired","engine":"Blink","engine_version":"38"},"26":{"release_date":"2014-12-03","release_notes":"https://dev.opera.com/blog/opera-26/","status":"retired","engine":"Blink","engine_version":"39"},"27":{"release_date":"2015-01-27","release_notes":"https://dev.opera.com/blog/opera-27/","status":"retired","engine":"Blink","engine_version":"40"},"28":{"release_date":"2015-03-10","release_notes":"https://dev.opera.com/blog/opera-28/","status":"retired","engine":"Blink","engine_version":"41"},"29":{"release_date":"2015-04-28","release_notes":"https://dev.opera.com/blog/opera-29/","status":"retired","engine":"Blink","engine_version":"42"},"30":{"release_date":"2015-06-09","release_notes":"https://dev.opera.com/blog/opera-30/","status":"retired","engine":"Blink","engine_version":"43"},"31":{"release_date":"2015-08-04","release_notes":"https://dev.opera.com/blog/opera-31/","status":"retired","engine":"Blink","engine_version":"44"},"32":{"release_date":"2015-09-15","release_notes":"https://dev.opera.com/blog/opera-32/","status":"retired","engine":"Blink","engine_version":"45"},"33":{"release_date":"2015-10-27","release_notes":"https://dev.opera.com/blog/opera-33/","status":"retired","engine":"Blink","engine_version":"46"},"34":{"release_date":"2015-12-08","release_notes":"https://dev.opera.com/blog/opera-34/","status":"retired","engine":"Blink","engine_version":"47"},"35":{"release_date":"2016-02-02","release_notes":"https://dev.opera.com/blog/opera-35/","status":"retired","engine":"Blink","engine_version":"48"},"36":{"release_date":"2016-03-15","release_notes":"https://dev.opera.com/blog/opera-36/","status":"retired","engine":"Blink","engine_version":"49"},"37":{"release_date":"2016-05-04","release_notes":"https://dev.opera.com/blog/opera-37/","status":"retired","engine":"Blink","engine_version":"50"},"38":{"release_date":"2016-06-08","release_notes":"https://dev.opera.com/blog/opera-38/","status":"retired","engine":"Blink","engine_version":"51"},"39":{"release_date":"2016-08-02","release_notes":"https://dev.opera.com/blog/opera-39/","status":"retired","engine":"Blink","engine_version":"52"},"40":{"release_date":"2016-09-20","release_notes":"https://dev.opera.com/blog/opera-40/","status":"retired","engine":"Blink","engine_version":"53"},"41":{"release_date":"2016-10-25","release_notes":"https://dev.opera.com/blog/opera-41/","status":"retired","engine":"Blink","engine_version":"54"},"42":{"release_date":"2016-12-13","release_notes":"https://dev.opera.com/blog/opera-42/","status":"retired","engine":"Blink","engine_version":"55"},"43":{"release_date":"2017-02-07","release_notes":"https://dev.opera.com/blog/opera-43/","status":"retired","engine":"Blink","engine_version":"56"},"44":{"release_date":"2017-03-21","release_notes":"https://dev.opera.com/blog/opera-44/","status":"retired","engine":"Blink","engine_version":"57"},"45":{"release_date":"2017-05-10","release_notes":"https://dev.opera.com/blog/opera-45/","status":"retired","engine":"Blink","engine_version":"58"},"46":{"release_date":"2017-06-22","release_notes":"https://dev.opera.com/blog/opera-46/","status":"retired","engine":"Blink","engine_version":"59"},"47":{"release_date":"2017-08-09","release_notes":"https://dev.opera.com/blog/opera-47/","status":"retired","engine":"Blink","engine_version":"60"},"48":{"release_date":"2017-09-27","status":"retired","engine":"Blink","engine_version":"61"},"49":{"release_date":"2017-11-08","release_notes":"https://dev.opera.com/blog/opera-49/","status":"retired","engine":"Blink","engine_version":"62"},"50":{"release_date":"2018-01-04","release_notes":"https://dev.opera.com/blog/opera-50/","status":"retired","engine":"Blink","engine_version":"63"},"51":{"release_date":"2018-02-07","release_notes":"https://dev.opera.com/blog/opera-51/","status":"retired","engine":"Blink","engine_version":"64"},"52":{"release_date":"2018-03-22","release_notes":"https://dev.opera.com/blog/opera-52/","status":"retired","engine":"Blink","engine_version":"65"},"53":{"release_date":"2018-05-10","release_notes":"https://dev.opera.com/blog/opera-53/","status":"retired","engine":"Blink","engine_version":"66"},"54":{"release_date":"2018-06-28","release_notes":"https://dev.opera.com/blog/opera-54/","status":"retired","engine":"Blink","engine_version":"67"},"55":{"release_date":"2018-08-16","release_notes":"https://blogs.opera.com/desktop/2018/08/opera-55-offers-better-control-web-pages-accessible-bookmarks/","status":"retired","engine":"Blink","engine_version":"68"},"56":{"release_date":"2018-09-25","release_notes":"https://dev.opera.com/blog/opera-56/","status":"retired","engine":"Blink","engine_version":"69"},"57":{"release_date":"2018-11-28","release_notes":"https://dev.opera.com/blog/opera-57/","status":"retired","engine":"Blink","engine_version":"70"},"58":{"release_date":"2019-01-23","release_notes":"https://dev.opera.com/blog/opera-58/","status":"retired","engine":"Blink","engine_version":"71"},"60":{"release_date":"2019-04-09","release_notes":"https://blogs.opera.com/desktop/2019/04/opera-60-reborn-3-web-3-0-vpn-ad-blocker/","status":"retired","engine":"Blink","engine_version":"73"},"62":{"release_date":"2019-06-27","release_notes":"https://blogs.opera.com/desktop/2019/06/opera-62-comes-with-design-updates-to-reborn-3/","status":"retired","engine":"Blink","engine_version":"75"},"63":{"release_date":"2019-08-20","release_notes":"https://blogs.opera.com/desktop/2019/08/opera-63-initial-release/","status":"retired","engine":"Blink","engine_version":"76"},"64":{"release_date":"2019-10-07","release_notes":"https://blogs.opera.com/desktop/2019/10/opera-64-faster-more-private-more-fun/","status":"retired","engine":"Blink","engine_version":"77"},"65":{"release_date":"2019-11-13","release_notes":"https://blogs.opera.com/desktop/2019/11/opera-65-comes-with-an-improved-tracker-blocker-and-redesigned-address-bar/","status":"retired","engine":"Blink","engine_version":"78"},"66":{"release_date":"2020-01-07","release_notes":"https://blogs.opera.com/desktop/2020/01/opera-66-initial-release-makes-it-easier-to-reopen-closed-tabs-and-to-access-extensions/","status":"retired","engine":"Blink","engine_version":"79"},"67":{"release_date":"2020-03-03","release_notes":"https://blogs.opera.com/desktop/2020/03/opera-67-3575-53-stable-update/","status":"retired","engine":"Blink","engine_version":"80"},"68":{"release_date":"2020-04-22","release_notes":"https://blogs.opera.com/desktop/2020/04/opera-68-is-here-with-built-in-instagram-in-the-sidebar/","status":"retired","engine":"Blink","engine_version":"81"},"69":{"release_date":"2020-06-24","release_notes":"https://blogs.opera.com/desktop/2020/06/opera-69-comes-with-built-in-twitter/","status":"retired","engine":"Blink","engine_version":"83"},"70":{"release_date":"2020-07-27","release_notes":"https://blogs.opera.com/desktop/2020/07/opera-70-comes-with-easier-access-to-closed-tabs-simpler-searches-and-new-workspace-icons/","status":"retired","engine":"Blink","engine_version":"84"},"71":{"release_date":"2020-09-15","release_notes":"https://blogs.opera.com/desktop/2020/09/opera-71-update/","status":"retired","engine":"Blink","engine_version":"85"},"72":{"release_date":"2020-10-21","release_notes":"https://blogs.opera.com/desktop/2020/10/opera-72-update/","status":"retired","engine":"Blink","engine_version":"86"},"73":{"release_date":"2020-12-09","release_notes":"https://blogs.opera.com/desktop/2020/12/opera-73-update/","status":"retired","engine":"Blink","engine_version":"87"},"74":{"release_date":"2021-02-02","release_notes":"https://blogs.opera.com/desktop/2021/02/opera-74-stable/","status":"retired","engine":"Blink","engine_version":"88"},"75":{"release_date":"2021-03-24","release_notes":"https://blogs.opera.com/desktop/2021/03/opera-75-brings-easier-access-to-top-features-2/","status":"retired","engine":"Blink","engine_version":"89"},"76":{"release_date":"2021-04-28","release_notes":"https://blogs.opera.com/desktop/2021/04/opera-76-stable/","status":"retired","engine":"Blink","engine_version":"90"},"77":{"release_date":"2021-06-09","release_notes":"https://blogs.opera.com/desktop/2021/06/opera-77-stable/","status":"retired","engine":"Blink","engine_version":"91"},"78":{"release_date":"2021-08-03","release_notes":"https://blogs.opera.com/desktop/2021/08/opera-78-stable/","status":"retired","engine":"Blink","engine_version":"92"},"79":{"release_date":"2021-09-14","release_notes":"https://blogs.opera.com/desktop/2021/09/opera-79-stable/","status":"retired","engine":"Blink","engine_version":"93"},"80":{"release_date":"2021-10-05","release_notes":"https://blogs.opera.com/desktop/2021/10/opera-80-stable/","status":"retired","engine":"Blink","engine_version":"94"},"81":{"release_date":"2021-11-04","release_notes":"https://blogs.opera.com/desktop/2021/11/opera-81-stable/","status":"retired","engine":"Blink","engine_version":"95"},"82":{"release_date":"2021-12-02","release_notes":"https://blogs.opera.com/desktop/2021/12/opera-82/","status":"current","engine":"Blink","engine_version":"96"},"83":{"status":"beta","engine":"Blink","engine_version":"97"},"84":{"status":"nightly","engine":"Blink","engine_version":"98"},"3.5":{"release_date":"1998-11-18","status":"retired"},"3.6":{"release_date":"1999-05-06","status":"retired"},"5.1":{"release_date":"2001-04-10","status":"retired"},"7.1":{"release_date":"2003-04-11","status":"retired","engine":"Presto","engine_version":"1"},"7.2":{"release_date":"2003-09-23","status":"retired","engine":"Presto","engine_version":"1"},"7.5":{"release_date":"2004-05-12","status":"retired","engine":"Presto","engine_version":"1"},"8.5":{"release_date":"2005-09-20","status":"retired","engine":"Presto","engine_version":"1"},"9.1":{"release_date":"2006-12-18","status":"retired","engine":"Presto","engine_version":"2"},"9.2":{"release_date":"2007-04-11","status":"retired","engine":"Presto","engine_version":"2"},"9.5":{"release_date":"2008-06-12","status":"retired","engine":"Presto","engine_version":"2.1"},"9.6":{"release_date":"2008-10-08","release_notes":"https://dev.opera.com/blog/a-look-under-the-hood-of-opera-9-6/","status":"retired","engine":"Presto","engine_version":"2.1"},"10.1":{"release_date":"2009-11-23","release_notes":"https://dev.opera.com/blog/opera-10-10-and-10-2-alpha/","status":"retired","engine":"Presto","engine_version":"2.2"},"10.5":{"release_date":"2010-03-02","release_notes":"https://dev.opera.com/blog/opera-10-50-final-for-windows-is-out/","status":"retired","engine":"Presto","engine_version":"2.5"},"10.6":{"release_date":"2010-07-01","release_notes":"https://dev.opera.com/blog/hello-opera-10-60/","status":"retired","engine":"Presto","engine_version":"2.6"},"11.1":{"release_date":"2011-04-12","release_notes":"https://dev.opera.com/blog/unveiling-opera-11-10-final/","status":"retired","engine":"Presto","engine_version":"2.8"},"11.5":{"release_date":"2011-06-28","release_notes":"https://dev.opera.com/blog/opera-11-50-released-speed-dial-extensions-improved-standards-support/","status":"retired","engine":"Presto","engine_version":"2.9"},"11.6":{"release_date":"2011-12-06","release_notes":"https://dev.opera.com/blog/hello-opera-11-60/","status":"retired","engine":"Presto","engine_version":"2.10"},"12.1":{"release_date":"2012-11-20","release_notes":"https://dev.opera.com/blog/opera-12-10-is-out/","status":"retired","engine":"Presto","engine_version":"2.12"}}},"opera_android":{"name":"Opera Android","releases":{"11":{"release_date":"2011-03-22","release_notes":"https://dev.opera.com/blog/opera-mobile-11-for-maemo-meego-windows/","status":"retired","engine":"Presto","engine_version":"2.7"},"12":{"release_date":"2012-02-25","release_notes":"https://dev.opera.com/blog/opera-mobile-12-and-introducing-opera-mini-next/","status":"retired","engine":"Presto","engine_version":"2.10"},"14":{"release_date":"2013-05-21","release_notes":"https://dev.opera.com/blog/opera-14-for-android-is-out/","status":"retired","engine":"Blink","engine_version":"26"},"15":{"release_date":"2013-07-08","release_notes":"https://blogs.opera.com/news/2013/07/opera-15-for-android/","status":"retired","engine":"Blink","engine_version":"28"},"16":{"release_date":"2013-09-18","status":"retired","engine":"Blink","engine_version":"29"},"18":{"release_date":"2013-11-20","release_notes":"https://blogs.opera.com/news/2013/11/opera-18-android-tablet/","status":"retired","engine":"Blink","engine_version":"31"},"19":{"release_date":"2014-01-28","release_notes":"https://dev.opera.com/blog/opera-19/","status":"retired","engine":"Blink","engine_version":"32"},"20":{"release_date":"2014-03-06","release_notes":"https://forums.opera.com/topic/1081/opera-20-final-release","status":"retired","engine":"Blink","engine_version":"33"},"21":{"release_date":"2014-04-22","release_notes":"https://forums.opera.com/topic/2211/opera-21-final-release","status":"retired","engine":"Blink","engine_version":"34"},"22":{"release_date":"2014-06-17","release_notes":"https://forums.opera.com/topic/3446/opera-22","status":"retired","engine":"Blink","engine_version":"35"},"24":{"release_date":"2014-09-10","release_notes":"https://forums.opera.com/topic/5022/opera-24-final-release","status":"retired","engine":"Blink","engine_version":"37"},"25":{"release_date":"2014-10-16","release_notes":"https://forums.opera.com/topic/5715/opera-25-final-release","status":"retired","engine":"Blink","engine_version":"38"},"26":{"release_date":"2014-12-02","release_notes":"https://forums.opera.com/topic/6800/opera-26-final-release","status":"retired","engine":"Blink","engine_version":"39"},"27":{"release_date":"2015-01-29","release_notes":"https://forums.opera.com/topic/7871/opera-27-final-release","status":"retired","engine":"Blink","engine_version":"40"},"28":{"release_date":"2015-03-10","release_notes":"https://forums.opera.com/topic/8556/synced-bookmarks-and-improved-memory-usage-in-opera-28-for-android","status":"retired","engine":"Blink","engine_version":"41"},"29":{"release_date":"2015-04-28","release_notes":"https://dev.opera.com/blog/opera-29/","status":"retired","engine":"Blink","engine_version":"42"},"30":{"release_date":"2015-06-10","release_notes":"https://blogs.opera.com/mobile/2015/06/opera-30-android-sync-speeddials/","status":"retired","engine":"Blink","engine_version":"43"},"32":{"release_date":"2015-09-23","release_notes":"https://blogs.opera.com/mobile/2015/09/opera-32-add-to-home-screen/","status":"retired","engine":"Blink","engine_version":"45"},"33":{"release_date":"2015-11-03","release_notes":"https://forums.opera.com/topic/12480/opera-33-now-featuring-video-optimization-and-brand-new-icons","status":"retired","engine":"Blink","engine_version":"46"},"34":{"release_date":"2015-12-16","release_notes":"https://forums.opera.com/topic/13085/opera-34-for-android-released","status":"retired","engine":"Blink","engine_version":"47"},"35":{"release_date":"2016-02-04","release_notes":"https://blogs.opera.com/mobile/2016/02/save-space-on-your-android-phone-with-web-apps/","status":"retired","engine":"Blink","engine_version":"48"},"36":{"release_date":"2016-03-31","release_notes":"https://forums.opera.com/topic/14514/opera-36-released","status":"retired","engine":"Blink","engine_version":"49"},"37":{"release_date":"2016-06-16","release_notes":"https://forums.opera.com/topic/15753/opera-37-released","status":"retired","engine":"Blink","engine_version":"50"},"41":{"release_date":"2016-10-25","status":"retired","engine":"Blink","engine_version":"54"},"42":{"release_date":"2017-01-21","release_notes":"https://forums.opera.com/topic/18950/opera-for-android-42","status":"retired","engine":"Blink","engine_version":"55"},"43":{"release_date":"2017-09-27","release_notes":"https://forums.opera.com/topic/22708/opera-for-android-43","status":"retired","engine":"Blink","engine_version":"59"},"44":{"release_date":"2017-12-11","release_notes":"https://forums.opera.com/topic/23860/opera-for-android-44","status":"retired","engine":"Blink","engine_version":"60"},"45":{"release_date":"2018-02-15","release_notes":"https://forums.opera.com/topic/25124/opera-for-android-45","status":"retired","engine":"Blink","engine_version":"61"},"46":{"release_date":"2018-05-14","release_notes":"https://forums.opera.com/topic/26662/opera-for-android-46","status":"retired","engine":"Blink","engine_version":"63"},"47":{"release_date":"2018-07-23","release_notes":"https://forums.opera.com/topic/27794/opera-for-android-47","status":"retired","engine":"Blink","engine_version":"66"},"48":{"release_date":"2018-11-08","release_notes":"https://forums.opera.com/topic/29525/opera-for-android-48","status":"retired","engine":"Blink","engine_version":"69"},"49":{"release_date":"2018-12-07","release_notes":"https://forums.opera.com/topic/29983/opera-for-android-49","status":"retired","engine":"Blink","engine_version":"70"},"50":{"release_date":"2019-02-18","release_notes":"https://forums.opera.com/topic/31003/opera-for-android-50","status":"retired","engine":"Blink","engine_version":"71"},"51":{"release_date":"2019-03-21","release_notes":"https://forums.opera.com/topic/31467/opera-for-android-51-built-in-vpn","status":"retired","engine":"Blink","engine_version":"72"},"52":{"release_date":"2019-05-17","release_notes":"https://forums.opera.com/topic/32516/opera-for-android-52","status":"retired","engine":"Blink","engine_version":"73"},"53":{"release_date":"2019-07-11","release_notes":"https://forums.opera.com/topic/33558/opera-for-android-53","status":"retired","engine":"Blink","engine_version":"74"},"54":{"release_date":"2019-10-18","release_notes":"https://forums.opera.com/topic/35853/opera-for-android-54","status":"retired","engine":"Blink","engine_version":"76"},"55":{"release_date":"2019-12-03","release_notes":"https://forums.opera.com/topic/36858/opera-for-android-55","status":"retired","engine":"Blink","engine_version":"77"},"56":{"release_date":"2020-02-06","release_notes":"https://blogs.opera.com/mobile/2020/02/easy-reading-in-opera-for-android/","status":"retired","engine":"Blink","engine_version":"78"},"57":{"release_date":"2020-03-30","release_notes":"https://blogs.opera.com/mobile/2020/03/introducing-new-features-in-opera-for-android-57/","status":"retired","engine":"Blink","engine_version":"80"},"58":{"release_date":"2020-05-13","release_notes":"https://blogs.opera.com/mobile/2020/05/opera-for-android-58-handle-notifications-easily-and-group-speed-dials-for-a-cleaner-appearance/","status":"retired","engine":"Blink","engine_version":"81"},"59":{"release_date":"2020-06-30","release_notes":"https://blogs.opera.com/mobile/2020/06/opera-for-android-59/","status":"retired","engine":"Blink","engine_version":"83"},"60":{"release_date":"2020-09-23","release_notes":"https://blogs.opera.com/mobile/2020/09/keep-in-sync-with-opera-for-android-60/","status":"retired","engine":"Blink","engine_version":"85"},"61":{"release_date":"2020-12-07","release_notes":"https://blogs.opera.com/mobile/2020/12/new-opera-for-android-61/","status":"retired","engine":"Blink","engine_version":"86"},"62":{"release_date":"2021-02-16","release_notes":"https://blogs.opera.com/mobile/2021/02/the-opera-browser-for-android-hit-a-new-record-of-80-million-maus/","status":"retired","engine":"Blink","engine_version":"87"},"63":{"release_date":"2021-04-16","status":"retired","engine":"Blink","engine_version":"89"},"64":{"release_date":"2021-05-25","status":"retired","engine":"Blink","engine_version":"91"},"65":{"release_date":"2021-10-20","release_notes":"https://blogs.opera.com/mobile/2021/10/opera-for-android-version-65/","status":"current","engine":"Blink","engine_version":"92"},"10.1":{"release_date":"2010-11-09","release_notes":"https://dev.opera.com/blog/opera-mobile-10-1-beta-for-android-is-here/","status":"retired","engine":"Presto","engine_version":"2.5"},"11.1":{"release_date":"2011-06-30","release_notes":"https://dev.opera.com/blog/opera-mobile-11-1-new-features-and-additions/","status":"retired","engine":"Presto","engine_version":"2.8"},"11.5":{"release_date":"2011-10-12","status":"retired","engine":"Presto","engine_version":"2.9"},"12.1":{"release_date":"2012-10-09","release_notes":"https://dev.opera.com/blog/opera-mobile-12-1-with-spdy-web-sockets-flexbox-and-more/","status":"retired","engine":"Presto","engine_version":"2.11"}}},"safari":{"name":"Safari","preview_name":"TP","releases":{"1":{"release_date":"2003-06-23","status":"retired","engine":"WebKit","engine_version":"85"},"2":{"release_date":"2005-04-29","status":"retired","engine":"WebKit","engine_version":"412"},"3":{"release_date":"2007-10-26","status":"retired","engine":"WebKit","engine_version":"523.10"},"4":{"release_date":"2009-06-08","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_4_0.html","status":"retired","engine":"WebKit","engine_version":"530.17"},"5":{"release_date":"2010-06-07","status":"retired","engine":"WebKit","engine_version":"533.16"},"6":{"release_date":"2012-07-25","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_6_0.html","status":"retired","engine":"WebKit","engine_version":"536.25"},"7":{"release_date":"2013-10-22","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_7_0.html","status":"retired","engine":"WebKit","engine_version":"537.71"},"8":{"release_date":"2014-10-16","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_8_0.html","status":"retired","engine":"WebKit","engine_version":"538.35"},"9":{"release_date":"2015-09-30","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_9_0.html","status":"retired","engine":"WebKit","engine_version":"601.1.56"},"10":{"release_date":"2016-09-20","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html","status":"retired","engine":"WebKit","engine_version":"602.1.50"},"11":{"release_date":"2017-09-19","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Safari_11_0/Safari_11_0.html","status":"retired","engine":"WebKit","engine_version":"604.2.4"},"12":{"release_date":"2018-09-24","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_release_notes","status":"retired","engine":"WebKit","engine_version":"606.1.36"},"13":{"release_date":"2019-09-19","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_13_release_notes","status":"retired","engine":"WebKit","engine_version":"608.2.11"},"14":{"release_date":"2020-09-16","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14-release-notes","status":"retired","engine":"WebKit","engine_version":"610.1.28"},"15":{"release_date":"2021-09-20","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-15-release-notes","status":"retired","engine":"WebKit","engine_version":"612.1.29"},"1.1":{"release_date":"2003-10-24","status":"retired","engine":"WebKit","engine_version":"100"},"1.2":{"release_date":"2004-02-02","status":"retired","engine":"WebKit","engine_version":"125"},"1.3":{"release_date":"2005-04-15","status":"retired","engine":"WebKit","engine_version":"312"},"3.1":{"release_date":"2008-03-18","status":"retired","engine":"WebKit","engine_version":"525.13"},"5.1":{"release_date":"2011-07-20","status":"retired","engine":"WebKit","engine_version":"534.48"},"9.1":{"release_date":"2016-03-21","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_9_1.html","status":"retired","engine":"WebKit","engine_version":"601.5.17"},"10.1":{"release_date":"2017-03-27","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_1.html","status":"retired","engine":"WebKit","engine_version":"603.2.1"},"11.1":{"release_date":"2018-04-12","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_11_1.html","status":"retired","engine":"WebKit","engine_version":"605.1.33"},"12.1":{"release_date":"2019-03-25","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_1_release_notes","status":"retired","engine":"WebKit","engine_version":"607.1.40"},"13.1":{"release_date":"2020-03-24","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-13_1-release_notes","status":"retired","engine":"WebKit","engine_version":"609.1.20"},"14.1":{"release_date":"2021-04-26","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14_1-release-notes","status":"retired","engine":"WebKit","engine_version":"611.1.21"},"15.1":{"release_date":"2021-10-25","status":"current","engine":"WebKit","engine_version":"612.2.9"},"15.2":{"status":"beta","engine":"WebKit","engine_version":"612.3.2"}}},"safari_ios":{"name":"Safari on iOS","releases":{"1":{"status":"retired","engine":"WebKit","engine_version":"522.11","release_date":"2007-06-29"},"2":{"status":"retired","engine":"WebKit","engine_version":"525.18","release_date":"2008-07-11"},"3":{"status":"retired","engine":"WebKit","engine_version":"528.18","release_date":"2009-06-17"},"4":{"status":"retired","engine":"WebKit","engine_version":"532.9","release_date":"2010-06-21"},"5":{"status":"retired","engine":"WebKit","engine_version":"534.46","release_date":"2011-10-12"},"6":{"status":"retired","engine":"WebKit","engine_version":"536.26","release_date":"2012-09-10"},"7":{"status":"retired","engine":"WebKit","engine_version":"537.51","release_date":"2013-09-18"},"8":{"status":"retired","engine":"WebKit","engine_version":"600.1.4","release_date":"2014-09-17"},"9":{"status":"retired","engine":"WebKit","engine_version":"601.1.56","release_date":"2015-09-16"},"10":{"status":"retired","engine":"WebKit","engine_version":"602.1.50","release_date":"2016-09-13"},"11":{"status":"retired","engine":"WebKit","engine_version":"604.2.4","release_date":"2017-09-19"},"12":{"release_date":"2018-09-17","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_release_notes","status":"retired","engine":"WebKit","engine_version":"606.1.36"},"13":{"release_date":"2019-09-19","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_13_release_notes","status":"retired","engine":"WebKit","engine_version":"608.2.11"},"14":{"release_date":"2020-09-16","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14-release-notes","status":"retired","engine":"WebKit","engine_version":"610.1.28"},"15":{"release_date":"2021-09-20","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-15-release-notes","status":"retired","engine":"WebKit","engine_version":"612.1.27"},"3.2":{"status":"retired","engine":"WebKit","engine_version":"531.21","release_date":"2010-04-03"},"4.2":{"status":"retired","engine":"WebKit","engine_version":"533.17","release_date":"2010-11-22"},"9.3":{"status":"retired","engine":"WebKit","engine_version":"601.5.17","release_date":"2016-03-21"},"10.3":{"status":"retired","engine":"WebKit","engine_version":"603.2.1","release_date":"2017-03-27"},"11.3":{"status":"retired","engine":"WebKit","engine_version":"605.1.33","release_date":"2018-03-29"},"12.2":{"release_date":"2019-03-25","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_1_release_notes","status":"retired","engine":"WebKit","engine_version":"607.1.40"},"13.4":{"release_date":"2020-03-24","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-13_1-release_notes","status":"retired","engine":"WebKit","engine_version":"609.1.20"},"14.5":{"release_date":"2021-04-26","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14_1-release-notes","status":"retired","engine":"WebKit","engine_version":"611.1.21"},"15.1":{"release_date":"2021-10-25","status":"current","engine":"WebKit","engine_version":"612.2.9"},"15.2":{"status":"beta","engine":"WebKit","engine_version":"612.3.2"}}},"samsunginternet_android":{"name":"Samsung Internet","accepts_flags":false,"releases":{"1.0":{"release_date":"2013-04-27","status":"retired","engine":"WebKit","engine_version":"535.19"},"1.5":{"release_date":"2013-09-25","status":"retired","engine":"Blink","engine_version":"28"},"1.6":{"release_date":"2014-04-11","status":"retired","engine":"Blink","engine_version":"28"},"2.0":{"release_date":"2014-10-17","status":"retired","engine":"Blink","engine_version":"34"},"2.1":{"release_date":"2015-01-07","status":"retired","engine":"Blink","engine_version":"34"},"3.0":{"release_date":"2015-04-10","status":"retired","engine":"Blink","engine_version":"38"},"3.2":{"release_date":"2015-08-24","status":"retired","engine":"Blink","engine_version":"38"},"4.0":{"release_date":"2016-03-11","status":"retired","engine":"Blink","engine_version":"44"},"4.2":{"release_date":"2016-08-02","status":"retired","engine":"Blink","engine_version":"44"},"5.0":{"release_date":"2016-12-15","status":"retired","engine":"Blink","engine_version":"51"},"5.2":{"release_date":"2017-04-21","status":"retired","engine":"Blink","engine_version":"51"},"5.4":{"release_date":"2017-05-17","status":"retired","engine":"Blink","engine_version":"51"},"6.0":{"release_date":"2017-08-23","status":"retired","engine":"Blink","engine_version":"56"},"6.2":{"release_date":"2017-10-26","status":"retired","engine":"Blink","engine_version":"56"},"6.4":{"release_date":"2018-02-19","status":"retired","engine":"Blink","engine_version":"56"},"7.0":{"release_date":"2018-03-16","status":"retired","engine":"Blink","engine_version":"59"},"7.2":{"release_date":"2018-06-20","status":"retired","engine":"Blink","engine_version":"59"},"7.4":{"release_date":"2018-09-12","status":"retired","engine":"Blink","engine_version":"59"},"8.0":{"release_date":"2018-07-18","status":"retired","engine":"Blink","engine_version":"63"},"8.2":{"release_date":"2018-12-21","status":"retired","engine":"Blink","engine_version":"63"},"9.0":{"release_date":"2018-09-15","status":"retired","engine":"Blink","engine_version":"67"},"9.2":{"release_date":"2019-04-02","status":"retired","engine":"Blink","engine_version":"67"},"9.4":{"release_date":"2019-07-25","status":"retired","engine":"Blink","engine_version":"67"},"10.0":{"release_date":"2019-08-22","status":"retired","engine":"Blink","engine_version":"71"},"10.2":{"release_date":"2019-10-09","status":"retired","engine":"Blink","engine_version":"71"},"11.0":{"release_date":"2019-12-05","status":"retired","engine":"Blink","engine_version":"75"},"11.2":{"release_date":"2020-03-22","status":"retired","engine":"Blink","engine_version":"75"},"12.0":{"release_date":"2020-06-19","status":"retired","engine":"Blink","engine_version":"79"},"12.1":{"release_date":"2020-07-07","status":"retired","engine":"Blink","engine_version":"79"},"13.0":{"release_date":"2020-12-02","status":"retired","engine":"Blink","engine_version":"83"},"13.2":{"release_date":"2021-01-20","status":"retired","engine":"Blink","engine_version":"83"},"14.0":{"release_date":"2021-04-17","status":"retired","engine":"Blink","engine_version":"87"},"14.2":{"release_date":"2021-06-25","status":"retired","engine":"Blink","engine_version":"87"},"15.0":{"release_date":"2021-08-13","status":"retired","engine":"Blink","engine_version":"90"},"16.0":{"release_date":"2021-11-25","status":"current","engine":"Blink","engine_version":"92"}}},"webview_android":{"name":"WebView Android","accepts_flags":false,"releases":{"1":{"release_date":"2008-09-23","release_notes":"https://en.wikipedia.org/wiki/Android_version_history#Android_1.0_(API_1)","status":"retired","engine":"WebKit","engine_version":"523.12"},"2":{"release_date":"2009-10-26","release_notes":"https://en.wikipedia.org/wiki/Android_Eclair","status":"retired","engine":"WebKit","engine_version":"530.17"},"3":{"release_date":"2011-02-22","release_notes":"https://en.wikipedia.org/wiki/Android_Honeycomb","status":"retired","engine":"WebKit","engine_version":"534.13"},"4":{"release_date":"2011-10-18","release_notes":"https://en.wikipedia.org/wiki/Android_Ice_Cream_Sandwich","status":"retired","engine":"WebKit","engine_version":"534.30"},"37":{"release_date":"2014-09-03","release_notes":"https://chromereleases.googleblog.com/2014/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"37"},"38":{"release_date":"2014-10-08","release_notes":"https://chromereleases.googleblog.com/2014/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"38"},"39":{"release_date":"2014-11-12","release_notes":"https://chromereleases.googleblog.com/2014/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"39"},"40":{"release_date":"2015-01-21","release_notes":"https://chromereleases.googleblog.com/2015/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"40"},"41":{"release_date":"2015-03-11","release_notes":"https://chromereleases.googleblog.com/2015/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"41"},"42":{"release_date":"2015-04-15","release_notes":"https://chromereleases.googleblog.com/2015/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"42"},"43":{"release_date":"2015-05-27","release_notes":"https://chromereleases.googleblog.com/2015/05/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"43"},"44":{"release_date":"2015-07-29","release_notes":"https://chromereleases.googleblog.com/2015/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"44"},"45":{"release_date":"2015-09-01","release_notes":"https://chromereleases.googleblog.com/2015/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"45"},"46":{"release_date":"2015-10-14","release_notes":"https://chromereleases.googleblog.com/2015/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"46"},"47":{"release_date":"2015-12-02","release_notes":"https://chromereleases.googleblog.com/2015/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"47"},"48":{"release_date":"2016-01-26","status":"retired","engine":"Blink","engine_version":"48"},"49":{"release_date":"2016-03-09","release_notes":"https://chromereleases.googleblog.com/2016/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"49"},"50":{"release_date":"2016-04-13","status":"retired","engine":"Blink","engine_version":"50"},"51":{"release_date":"2016-06-08","release_notes":"https://chromereleases.googleblog.com/2016/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"51"},"52":{"release_date":"2016-07-27","release_notes":"https://chromereleases.googleblog.com/2016/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"52"},"53":{"release_date":"2016-09-07","release_notes":"https://chromereleases.googleblog.com/2016/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"53"},"54":{"release_date":"2016-10-19","release_notes":"https://chromereleases.googleblog.com/2016/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"54"},"55":{"release_date":"2016-12-06","release_notes":"https://chromereleases.googleblog.com/2016/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"55"},"56":{"release_date":"2017-02-01","release_notes":"https://chromereleases.googleblog.com/2017/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"56"},"57":{"release_date":"2017-03-16","release_notes":"https://chromereleases.googleblog.com/2017/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"57"},"58":{"release_date":"2017-04-25","release_notes":"https://chromereleases.googleblog.com/2017/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"58"},"59":{"release_date":"2017-06-06","release_notes":"https://chromereleases.googleblog.com/2017/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"59"},"60":{"release_date":"2017-08-01","release_notes":"https://chromereleases.googleblog.com/2017/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"60"},"61":{"release_date":"2017-09-05","release_notes":"https://chromereleases.googleblog.com/2017/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"61"},"62":{"release_date":"2017-10-24","release_notes":"https://chromereleases.googleblog.com/2017/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"62"},"63":{"release_date":"2017-12-05","release_notes":"https://chromereleases.googleblog.com/2017/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"63"},"64":{"release_date":"2018-01-23","release_notes":"https://chromereleases.googleblog.com/2018/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"64"},"65":{"release_date":"2017-03-06","release_notes":"https://chromereleases.googleblog.com/2018/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"65"},"66":{"release_date":"2017-04-17","release_notes":"https://chromereleases.googleblog.com/2018/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"66"},"67":{"release_date":"2018-05-31","release_notes":"https://chromereleases.googleblog.com/2018/05/chrome-for-android-update_31.html","status":"retired","engine":"Blink","engine_version":"67"},"68":{"release_date":"2018-07-24","release_notes":"https://chromereleases.googleblog.com/2018/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"68"},"69":{"release_date":"2018-09-04","release_notes":"https://chromereleases.googleblog.com/2018/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"69"},"70":{"release_date":"2018-10-17","release_notes":"https://chromereleases.googleblog.com/2018/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"70"},"71":{"release_date":"2018-12-04","release_notes":"https://chromereleases.googleblog.com/2018/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"71"},"72":{"release_date":"2019-01-29","release_notes":"https://chromereleases.googleblog.com/2019/01/chrome-for-android-update_29.html","status":"retired","engine":"Blink","engine_version":"72"},"73":{"release_date":"2019-03-12","release_notes":"https://chromereleases.googleblog.com/2019/03/chrome-for-android-update_12.html","status":"retired","engine":"Blink","engine_version":"73"},"74":{"release_date":"2019-04-24","release_notes":"https://chromereleases.googleblog.com/2019/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"74"},"75":{"release_date":"2019-06-04","release_notes":"https://chromereleases.googleblog.com/2019/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"75"},"76":{"release_date":"2019-07-30","release_notes":"https://chromereleases.googleblog.com/2019/07/chrome-for-android-update_30.html","status":"retired","engine":"Blink","engine_version":"76"},"77":{"release_date":"2019-09-10","release_notes":"https://chromereleases.googleblog.com/2019/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"77"},"78":{"release_date":"2019-10-22","release_notes":"https://chromereleases.googleblog.com/2019/10/chrome-for-android-update_22.html","status":"retired","engine":"Blink","engine_version":"78"},"79":{"release_date":"2019-12-17","release_notes":"https://chromereleases.googleblog.com/2019/12/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-04","release_notes":"https://chromereleases.googleblog.com/2020/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-07","release_notes":"https://chromereleases.googleblog.com/2020/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-19","release_notes":"https://chromereleases.googleblog.com/2020/05/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-27","release_notes":"https://chromereleases.googleblog.com/2020/07/chrome-for-android-update_27.html","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-25","release_notes":"https://chromereleases.googleblog.com/2020/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-20","release_notes":"https://chromereleases.googleblog.com/2020/10/chrome-for-android-update_20.html","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-17","release_notes":"https://chromereleases.googleblog.com/2020/11/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-19","release_notes":"https://chromereleases.googleblog.com/2021/01/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-02","release_notes":"https://chromereleases.googleblog.com/2021/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-13","release_notes":"https://chromereleases.googleblog.com/2021/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-25","release_notes":"https://chromereleases.googleblog.com/2021/05/chrome-for-android-update_01607414128.html","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-20","release_notes":"https://chromereleases.googleblog.com/2021/07/chrome-for-android-update_01500789893.html","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-08-31","release_notes":"https://chromereleases.googleblog.com/2021/08/chrome-for-android-update_0881967577.html","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-21","release_notes":"https://chromereleases.googleblog.com/2021/09/chrome-for-android-update_21.html","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-19","release_notes":"https://chromereleases.googleblog.com/2021/10/chrome-for-android-update_01703513036.html","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-15","release_notes":"https://chromereleases.googleblog.com/2021/11/chrome-for-android-update.html","status":"current","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-04","status":"beta","engine":"Blink","engine_version":"97"},"98":{"release_date":"2022-02-01","status":"nightly","engine":"Blink","engine_version":"98"},"1.5":{"release_date":"2009-04-27","release_notes":"https://en.wikipedia.org/wiki/Android_Cupcake","status":"retired","engine":"WebKit","engine_version":"525.20"},"2.2":{"release_date":"2010-05-20","release_notes":"https://en.wikipedia.org/wiki/Android_Froyo","status":"retired","engine":"WebKit","engine_version":"533.1"},"4.4":{"release_date":"2013-12-09","release_notes":"https://chromereleases.googleblog.com/2013/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"30"},"4.4.3":{"release_date":"2014-06-02","release_notes":"https://chromereleases.googleblog.com/2014/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"33"}}}}+{"chrome":{"name":"Chrome","preview_name":"Canary","pref_url":"chrome://flags","releases":{"1":{"release_date":"2008-12-11","release_notes":"https://chromereleases.googleblog.com/2008/12/stable-release-google-chrome-is-out-of.html","status":"retired","engine":"WebKit","engine_version":"528"},"2":{"release_date":"2009-05-21","release_notes":"https://chromereleases.googleblog.com/2009/05/stable-update-google-chrome-2017228.html","status":"retired","engine":"WebKit","engine_version":"530"},"3":{"release_date":"2009-09-15","release_notes":"https://chromereleases.googleblog.com/2009/09/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"532"},"4":{"release_date":"2010-01-25","release_notes":"https://chromereleases.googleblog.com/2010/01/stable-channel-update_25.html","status":"retired","engine":"WebKit","engine_version":"532.5"},"5":{"release_date":"2010-05-25","release_notes":"https://chromereleases.googleblog.com/2010/05/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"533"},"6":{"release_date":"2010-09-02","release_notes":"https://chromereleases.googleblog.com/2010/09/stable-and-beta-channel-updates.html","status":"retired","engine":"WebKit","engine_version":"534.3"},"7":{"release_date":"2010-10-19","release_notes":"https://chromereleases.googleblog.com/2010/10/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"534.7"},"8":{"release_date":"2010-12-02","release_notes":"https://chromereleases.googleblog.com/2010/12/stable-beta-channel-updates.html","status":"retired","engine":"WebKit","engine_version":"534.10"},"9":{"release_date":"2011-02-03","release_notes":"https://chromereleases.googleblog.com/2011/02/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"534.13"},"10":{"release_date":"2011-03-08","release_notes":"https://chromereleases.googleblog.com/2011/03/chrome-stable-release.html","status":"retired","engine":"WebKit","engine_version":"534.16"},"11":{"release_date":"2011-04-27","release_notes":"https://chromereleases.googleblog.com/2011/04/chrome-stable-update.html","status":"retired","engine":"WebKit","engine_version":"534.24"},"12":{"release_date":"2011-06-07","release_notes":"https://chromereleases.googleblog.com/2011/06/chrome-stable-release.html","status":"retired","engine":"WebKit","engine_version":"534.30"},"13":{"release_date":"2011-08-02","release_notes":"https://chromereleases.googleblog.com/2011/08/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"535.1"},"14":{"release_date":"2011-09-16","release_notes":"https://chromereleases.googleblog.com/2011/09/stable-channel-update_16.html","status":"retired","engine":"WebKit","engine_version":"535.1"},"15":{"release_date":"2011-10-25","release_notes":"https://chromereleases.googleblog.com/2011/10/chrome-stable-release.html","status":"retired","engine":"WebKit","engine_version":"535.2"},"16":{"release_date":"2011-12-13","release_notes":"https://chromereleases.googleblog.com/2011/12/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"535.7"},"17":{"release_date":"2012-02-08","release_notes":"https://chromereleases.googleblog.com/2012/02/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"535.11"},"18":{"release_date":"2012-03-28","release_notes":"https://chromereleases.googleblog.com/2012/03/stable-channel-release-and-beta-channel.html","status":"retired","engine":"WebKit","engine_version":"535.19"},"19":{"release_date":"2012-05-15","release_notes":"https://chromereleases.googleblog.com/2012/05/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"536.5"},"20":{"release_date":"2012-06-26","release_notes":"https://chromereleases.googleblog.com/2012/06/stable-channel-update_26.html","status":"retired","engine":"WebKit","engine_version":"536.10"},"21":{"release_date":"2012-07-31","release_notes":"https://chromereleases.googleblog.com/2012/07/stable-channel-release.html","status":"retired","engine":"WebKit","engine_version":"537.1"},"22":{"release_date":"2012-09-25","release_notes":"https://chromereleases.googleblog.com/2012/09/stable-channel-update_25.html","status":"retired","engine":"WebKit","engine_version":"537.4"},"23":{"release_date":"2012-11-06","release_notes":"https://chromereleases.googleblog.com/2012/11/stable-channel-release-and-beta-channel.html","status":"retired","engine":"WebKit","engine_version":"537.11"},"24":{"release_date":"2013-01-10","release_notes":"https://chromereleases.googleblog.com/2013/01/stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"537.17"},"25":{"release_date":"2013-02-21","release_notes":"https://chromereleases.googleblog.com/2013/02/stable-channel-update_21.html","status":"retired","engine":"WebKit","engine_version":"537.22"},"26":{"release_date":"2013-03-26","release_notes":"https://chromereleases.googleblog.com/2013/03/stable-channel-update_26.html","status":"retired","engine":"WebKit","engine_version":"537.31"},"27":{"release_date":"2013-05-21","release_notes":"https://chromereleases.googleblog.com/2013/05/stable-channel-release.html","status":"retired","engine":"WebKit","engine_version":"537.36"},"28":{"release_date":"2013-07-09","release_notes":"https://chromereleases.googleblog.com/2013/07/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"28"},"29":{"release_date":"2013-08-20","release_notes":"https://chromereleases.googleblog.com/2013/08/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"29"},"30":{"release_date":"2013-10-01","release_notes":"https://chromereleases.googleblog.com/2013/10/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"30"},"31":{"release_date":"2013-11-12","release_notes":"https://chromereleases.googleblog.com/2013/11/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"31"},"32":{"release_date":"2014-01-14","release_notes":"https://chromereleases.googleblog.com/2014/01/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"32"},"33":{"release_date":"2014-02-20","release_notes":"https://chromereleases.googleblog.com/2014/02/stable-channel-update_20.html","status":"retired","engine":"Blink","engine_version":"33"},"34":{"release_date":"2014-04-08","release_notes":"https://chromereleases.googleblog.com/2014/04/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"34"},"35":{"release_date":"2014-05-20","release_notes":"https://chromereleases.googleblog.com/2014/05/stable-channel-update_20.html","status":"retired","engine":"Blink","engine_version":"35"},"36":{"release_date":"2014-07-16","release_notes":"https://chromereleases.googleblog.com/2014/07/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"36"},"37":{"release_date":"2014-08-26","release_notes":"https://chromereleases.googleblog.com/2014/08/stable-channel-update_26.html","status":"retired","engine":"Blink","engine_version":"37"},"38":{"release_date":"2014-10-07","release_notes":"https://chromereleases.googleblog.com/2014/10/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"38"},"39":{"release_date":"2014-11-18","release_notes":"https://chromereleases.googleblog.com/2014/11/stable-channel-update_18.html","status":"retired","engine":"Blink","engine_version":"39"},"40":{"release_date":"2015-01-21","release_notes":"https://chromereleases.googleblog.com/2015/01/stable-update.html","status":"retired","engine":"Blink","engine_version":"40"},"41":{"release_date":"2015-03-03","release_notes":"https://chromereleases.googleblog.com/2015/03/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"41"},"42":{"release_date":"2015-04-14","release_notes":"https://chromereleases.googleblog.com/2015/04/stable-channel-update_14.html","status":"retired","engine":"Blink","engine_version":"42"},"43":{"release_date":"2015-05-19","release_notes":"https://chromereleases.googleblog.com/2015/05/stable-channel-update_19.html","status":"retired","engine":"Blink","engine_version":"43"},"44":{"release_date":"2015-07-21","release_notes":"https://chromereleases.googleblog.com/2015/07/stable-channel-update_21.html","status":"retired","engine":"Blink","engine_version":"44"},"45":{"release_date":"2015-09-01","release_notes":"https://chromereleases.googleblog.com/2015/09/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"45"},"46":{"release_date":"2015-10-13","release_notes":"https://chromereleases.googleblog.com/2015/10/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"46"},"47":{"release_date":"2015-12-01","release_notes":"https://chromereleases.googleblog.com/2015/12/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"47"},"48":{"release_date":"2016-01-20","release_notes":"https://chromereleases.googleblog.com/2016/01/stable-channel-update_20.html","status":"retired","engine":"Blink","engine_version":"48"},"49":{"release_date":"2016-03-02","release_notes":"https://chromereleases.googleblog.com/2016/03/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"49"},"50":{"release_date":"2016-04-13","release_notes":"https://chromereleases.googleblog.com/2016/04/stable-channel-update_13.html","status":"retired","engine":"Blink","engine_version":"50"},"51":{"release_date":"2016-05-25","release_notes":"https://chromereleases.googleblog.com/2016/05/stable-channel-update_25.html","status":"retired","engine":"Blink","engine_version":"51"},"52":{"release_date":"2016-07-20","release_notes":"https://chromereleases.googleblog.com/2016/07/stable-channel-update.html","status":"retired","engine":"Blink","engine_version":"52"},"53":{"release_date":"2016-08-31","release_notes":"https://chromereleases.googleblog.com/2016/08/stable-channel-update-for-desktop_31.html","status":"retired","engine":"Blink","engine_version":"53"},"54":{"release_date":"2016-10-12","release_notes":"https://chromereleases.googleblog.com/2016/10/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"54"},"55":{"release_date":"2016-12-01","release_notes":"https://chromereleases.googleblog.com/2016/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"55"},"56":{"release_date":"2017-01-25","release_notes":"https://chromereleases.googleblog.com/2017/01/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"56"},"57":{"release_date":"2017-03-09","release_notes":"https://chromereleases.googleblog.com/2017/03/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"57"},"58":{"release_date":"2017-04-19","release_notes":"https://chromereleases.googleblog.com/2017/04/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"58"},"59":{"release_date":"2017-06-05","release_notes":"https://chromereleases.googleblog.com/2017/06/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"59"},"60":{"release_date":"2017-07-25","release_notes":"https://chromereleases.googleblog.com/2017/07/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"60"},"61":{"release_date":"2017-09-05","release_notes":"https://chromereleases.googleblog.com/2017/09/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"61"},"62":{"release_date":"2017-10-17","release_notes":"https://chromereleases.googleblog.com/2017/10/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"62"},"63":{"release_date":"2017-12-06","release_notes":"https://chromereleases.googleblog.com/2017/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"63"},"64":{"release_date":"2018-01-23","release_notes":"https://chromereleases.googleblog.com/2018/01/stable-channel-update-for-desktop_24.html","status":"retired","engine":"Blink","engine_version":"64"},"65":{"release_date":"2018-03-06","release_notes":"https://chromereleases.googleblog.com/2018/03/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"65"},"66":{"release_date":"2018-04-17","release_notes":"https://chromereleases.googleblog.com/2018/04/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"66"},"67":{"release_date":"2018-05-29","release_notes":"https://chromereleases.googleblog.com/2018/05/stable-channel-update-for-desktop_58.html","status":"retired","engine":"Blink","engine_version":"67"},"68":{"release_date":"2018-07-24","release_notes":"https://chromereleases.googleblog.com/2018/07/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"68"},"69":{"release_date":"2018-09-04","release_notes":"https://chromereleases.googleblog.com/2018/09/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"69"},"70":{"release_date":"2018-10-16","release_notes":"https://chromereleases.googleblog.com/2018/10/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"70"},"71":{"release_date":"2018-12-04","release_notes":"https://chromereleases.googleblog.com/2018/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"71"},"72":{"release_date":"2019-01-29","release_notes":"https://chromereleases.googleblog.com/2019/01/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"72"},"73":{"release_date":"2019-03-12","release_notes":"https://chromereleases.googleblog.com/2019/03/stable-channel-update-for-desktop_12.html","status":"retired","engine":"Blink","engine_version":"73"},"74":{"release_date":"2019-04-23","release_notes":"https://chromereleases.googleblog.com/2019/04/stable-channel-update-for-desktop_23.html","status":"retired","engine":"Blink","engine_version":"74"},"75":{"release_date":"2019-06-04","release_notes":"https://chromereleases.googleblog.com/2019/06/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"75"},"76":{"release_date":"2019-07-30","release_notes":"https://chromereleases.googleblog.com/2019/07/stable-channel-update-for-desktop_30.html","status":"retired","engine":"Blink","engine_version":"76"},"77":{"release_date":"2019-09-10","release_notes":"https://chromereleases.googleblog.com/2019/09/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"77"},"78":{"release_date":"2019-10-22","release_notes":"https://chromereleases.googleblog.com/2019/10/stable-channel-update-for-desktop_22.html","status":"retired","engine":"Blink","engine_version":"78"},"79":{"release_date":"2019-12-10","release_notes":"https://chromereleases.googleblog.com/2019/12/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-04","release_notes":"https://chromereleases.googleblog.com/2020/02/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-07","release_notes":"https://chromereleases.googleblog.com/2020/04/stable-channel-update-for-desktop_7.html","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-19","release_notes":"https://chromereleases.googleblog.com/2020/05/stable-channel-update-for-desktop_19.html","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-27","release_notes":"https://chromereleases.googleblog.com/2020/07/stable-channel-update-for-desktop_27.html","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-25","release_notes":"https://chromereleases.googleblog.com/2020/08/stable-channel-update-for-desktop_25.html","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-20","release_notes":"https://chromereleases.googleblog.com/2020/10/stable-channel-update-for-desktop_20.html","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-17","release_notes":"https://chromereleases.googleblog.com/2020/11/stable-channel-update-for-desktop_17.html","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-19","release_notes":"https://chromereleases.googleblog.com/2021/01/stable-channel-update-for-desktop_19.html","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-02","release_notes":"https://chromereleases.googleblog.com/2021/03/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-13","release_notes":"https://chromereleases.googleblog.com/2021/04/stable-channel-update-for-desktop_14.html","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-25","release_notes":"https://chromereleases.googleblog.com/2021/05/stable-channel-update-for-desktop_25.html","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-20","release_notes":"https://chromereleases.googleblog.com/2021/07/stable-channel-update-for-desktop_20.html","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-08-31","release_notes":"https://chromereleases.googleblog.com/2021/08/stable-channel-update-for-desktop_31.html","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-21","release_notes":"https://chromereleases.googleblog.com/2021/09/stable-channel-update-for-desktop_21.html","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-19","release_notes":"https://chromereleases.googleblog.com/2021/10/stable-channel-update-for-desktop_19.html","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-15","release_notes":"https://chromereleases.googleblog.com/2021/11/stable-channel-update-for-desktop.html","status":"retired","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-04","release_notes":"https://chromereleases.googleblog.com/2022/01/stable-channel-update-for-desktop.html","status":"current","engine":"Blink","engine_version":"97"},"98":{"release_date":"2022-02-01","status":"beta","engine":"Blink","engine_version":"98"},"99":{"release_date":"2022-03-01","status":"nightly","engine":"Blink","engine_version":"99"}}},"chrome_android":{"name":"Chrome Android","pref_url":"chrome://flags","releases":{"18":{"release_date":"2012-06-27","release_notes":"https://chromereleases.googleblog.com/2012/06/chrome-for-android-out-of-beta.html","status":"retired","engine":"WebKit","engine_version":"535.19"},"25":{"release_date":"2013-02-27","release_notes":"https://chromereleases.googleblog.com/2013/02/chrome-for-android-update.html","status":"retired","engine":"WebKit","engine_version":"537.22"},"26":{"release_date":"2013-04-03","release_notes":"https://chromereleases.googleblog.com/2013/04/chrome-for-android-stable-channel-update.html","status":"retired","engine":"WebKit","engine_version":"537.31"},"27":{"release_date":"2013-05-22","release_notes":"https://chromereleases.googleblog.com/2013/05/chrome-for-android-update.html","status":"retired","engine":"WebKit","engine_version":"537.36"},"28":{"release_date":"2013-07-10","release_notes":"https://chromereleases.googleblog.com/2013/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"28"},"29":{"release_date":"2013-08-21","release_notes":"https://chromereleases.googleblog.com/2013/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"29"},"30":{"release_date":"2013-10-02","release_notes":"https://chromereleases.googleblog.com/2013/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"30"},"31":{"release_date":"2013-11-14","release_notes":"https://chromereleases.googleblog.com/2013/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"31"},"32":{"release_date":"2014-01-15","release_notes":"https://chromereleases.googleblog.com/2014/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"32"},"33":{"release_date":"2014-02-26","release_notes":"https://chromereleases.googleblog.com/2014/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"33"},"34":{"release_date":"2014-04-02","release_notes":"https://chromereleases.googleblog.com/2014/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"34"},"35":{"release_date":"2014-05-20","release_notes":"https://chromereleases.googleblog.com/2014/05/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"35"},"36":{"release_date":"2014-07-16","release_notes":"https://chromereleases.googleblog.com/2014/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"36"},"37":{"release_date":"2014-09-03","release_notes":"https://chromereleases.googleblog.com/2014/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"37"},"38":{"release_date":"2014-10-08","release_notes":"https://chromereleases.googleblog.com/2014/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"38"},"39":{"release_date":"2014-11-12","release_notes":"https://chromereleases.googleblog.com/2014/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"39"},"40":{"release_date":"2015-01-21","release_notes":"https://chromereleases.googleblog.com/2015/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"40"},"41":{"release_date":"2015-03-11","release_notes":"https://chromereleases.googleblog.com/2015/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"41"},"42":{"release_date":"2015-04-15","release_notes":"https://chromereleases.googleblog.com/2015/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"42"},"43":{"release_date":"2015-05-27","release_notes":"https://chromereleases.googleblog.com/2015/05/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"43"},"44":{"release_date":"2015-07-29","release_notes":"https://chromereleases.googleblog.com/2015/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"44"},"45":{"release_date":"2015-09-01","release_notes":"https://chromereleases.googleblog.com/2015/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"45"},"46":{"release_date":"2015-10-14","release_notes":"https://chromereleases.googleblog.com/2015/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"46"},"47":{"release_date":"2015-12-02","release_notes":"https://chromereleases.googleblog.com/2015/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"47"},"48":{"release_date":"2016-01-26","status":"retired","engine":"Blink","engine_version":"48"},"49":{"release_date":"2016-03-09","release_notes":"https://chromereleases.googleblog.com/2016/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"49"},"50":{"release_date":"2016-04-13","status":"retired","engine":"Blink","engine_version":"50"},"51":{"release_date":"2016-06-08","release_notes":"https://chromereleases.googleblog.com/2016/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"51"},"52":{"release_date":"2016-07-27","release_notes":"https://chromereleases.googleblog.com/2016/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"52"},"53":{"release_date":"2016-09-07","release_notes":"https://chromereleases.googleblog.com/2016/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"53"},"54":{"release_date":"2016-10-19","release_notes":"https://chromereleases.googleblog.com/2016/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"54"},"55":{"release_date":"2016-12-06","release_notes":"https://chromereleases.googleblog.com/2016/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"55"},"56":{"release_date":"2017-02-01","release_notes":"https://chromereleases.googleblog.com/2017/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"56"},"57":{"release_date":"2017-03-16","release_notes":"https://chromereleases.googleblog.com/2017/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"57"},"58":{"release_date":"2017-04-25","release_notes":"https://chromereleases.googleblog.com/2017/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"58"},"59":{"release_date":"2017-06-06","release_notes":"https://chromereleases.googleblog.com/2017/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"59"},"60":{"release_date":"2017-08-01","release_notes":"https://chromereleases.googleblog.com/2017/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"60"},"61":{"release_date":"2017-09-05","release_notes":"https://chromereleases.googleblog.com/2017/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"61"},"62":{"release_date":"2017-10-24","release_notes":"https://chromereleases.googleblog.com/2017/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"62"},"63":{"release_date":"2017-12-05","release_notes":"https://chromereleases.googleblog.com/2017/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"63"},"64":{"release_date":"2018-01-23","release_notes":"https://chromereleases.googleblog.com/2018/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"64"},"65":{"release_date":"2018-03-06","release_notes":"https://chromereleases.googleblog.com/2018/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"65"},"66":{"release_date":"2018-04-17","release_notes":"https://chromereleases.googleblog.com/2018/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"66"},"67":{"release_date":"2018-05-31","release_notes":"https://chromereleases.googleblog.com/2018/05/chrome-for-android-update_31.html","status":"retired","engine":"Blink","engine_version":"67"},"68":{"release_date":"2018-07-24","release_notes":"https://chromereleases.googleblog.com/2018/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"68"},"69":{"release_date":"2018-09-04","release_notes":"https://chromereleases.googleblog.com/2018/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"69"},"70":{"release_date":"2018-10-17","release_notes":"https://chromereleases.googleblog.com/2018/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"70"},"71":{"release_date":"2018-12-04","release_notes":"https://chromereleases.googleblog.com/2018/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"71"},"72":{"release_date":"2019-01-29","release_notes":"https://chromereleases.googleblog.com/2019/01/chrome-for-android-update_29.html","status":"retired","engine":"Blink","engine_version":"72"},"73":{"release_date":"2019-03-12","release_notes":"https://chromereleases.googleblog.com/2019/03/chrome-for-android-update_12.html","status":"retired","engine":"Blink","engine_version":"73"},"74":{"release_date":"2019-04-24","release_notes":"https://chromereleases.googleblog.com/2019/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"74"},"75":{"release_date":"2019-06-04","release_notes":"https://chromereleases.googleblog.com/2019/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"75"},"76":{"release_date":"2019-07-30","release_notes":"https://chromereleases.googleblog.com/2019/07/chrome-for-android-update_30.html","status":"retired","engine":"Blink","engine_version":"76"},"77":{"release_date":"2019-09-10","release_notes":"https://chromereleases.googleblog.com/2019/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"77"},"78":{"release_date":"2019-10-22","release_notes":"https://chromereleases.googleblog.com/2019/10/chrome-for-android-update_22.html","status":"retired","engine":"Blink","engine_version":"78"},"79":{"release_date":"2019-12-17","release_notes":"https://chromereleases.googleblog.com/2019/12/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-04","release_notes":"https://chromereleases.googleblog.com/2020/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-07","release_notes":"https://chromereleases.googleblog.com/2020/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-19","release_notes":"https://chromereleases.googleblog.com/2020/05/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-27","release_notes":"https://chromereleases.googleblog.com/2020/07/chrome-for-android-update_27.html","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-25","release_notes":"https://chromereleases.googleblog.com/2020/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-20","release_notes":"https://chromereleases.googleblog.com/2020/10/chrome-for-android-update_20.html","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-17","release_notes":"https://chromereleases.googleblog.com/2020/11/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-19","release_notes":"https://chromereleases.googleblog.com/2021/01/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-02","release_notes":"https://chromereleases.googleblog.com/2021/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-13","release_notes":"https://chromereleases.googleblog.com/2021/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-25","release_notes":"https://chromereleases.googleblog.com/2021/05/chrome-for-android-update_01607414128.html","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-20","release_notes":"https://chromereleases.googleblog.com/2021/07/chrome-for-android-update_01500789893.html","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-08-31","release_notes":"https://chromereleases.googleblog.com/2021/08/chrome-for-android-update_0881967577.html","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-21","release_notes":"https://chromereleases.googleblog.com/2021/09/chrome-for-android-update_21.html","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-19","release_notes":"https://chromereleases.googleblog.com/2021/10/chrome-for-android-update_01703513036.html","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-15","release_notes":"https://chromereleases.googleblog.com/2021/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-04","release_notes":"https://chromereleases.googleblog.com/2022/01/chrome-for-android-update.html","status":"current","engine":"Blink","engine_version":"97"},"98":{"release_date":"2022-02-01","status":"beta","engine":"Blink","engine_version":"98"},"99":{"release_date":"2022-03-01","status":"nightly","engine":"Blink","engine_version":"99"}}},"deno":{"name":"Deno","releases":{"1.0":{"release_date":"2020-05-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.0.0","status":"retired","engine":"V8","engine_version":"8.4"},"1.1":{"release_date":"2020-06-12","release_notes":"https://github.com/denoland/deno/releases/tag/v1.1.0","status":"retired","engine":"V8","engine_version":"8.4"},"1.2":{"release_date":"2020-07-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.2.0","status":"retired","engine":"V8","engine_version":"8.5"},"1.3":{"release_date":"2020-08-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.3.0","status":"retired","engine":"V8","engine_version":"8.6"},"1.4":{"release_date":"2020-09-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.4.0","status":"retired","engine":"V8","engine_version":"8.7"},"1.5":{"release_date":"2020-10-27","release_notes":"https://github.com/denoland/deno/releases/tag/v1.5.0","status":"retired","engine":"V8","engine_version":"8.7"},"1.6":{"release_date":"2020-12-08","release_notes":"https://github.com/denoland/deno/releases/tag/v1.6.0","status":"retired","engine":"V8","engine_version":"8.8"},"1.7":{"release_date":"2021-01-19","release_notes":"https://github.com/denoland/deno/releases/tag/v1.7.0","status":"retired","engine":"V8","engine_version":"8.9"},"1.8":{"release_date":"2021-03-02","release_notes":"https://github.com/denoland/deno/releases/tag/v1.8.0","status":"retired","engine":"V8","engine_version":"9.0"},"1.9":{"release_date":"2021-04-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.9.0","status":"retired","engine":"V8","engine_version":"9.1"},"1.10":{"release_date":"2021-05-11","release_notes":"https://github.com/denoland/deno/releases/tag/v1.10.1","status":"retired","engine":"V8","engine_version":"9.1"},"1.11":{"release_date":"2021-06-08","release_notes":"https://github.com/denoland/deno/releases/tag/v1.11.0","status":"retired","engine":"V8","engine_version":"9.1"},"1.12":{"release_date":"2021-07-13","release_notes":"https://github.com/denoland/deno/releases/tag/v1.12.0","status":"retired","engine":"V8","engine_version":"9.2"},"1.13":{"release_date":"2021-08-10","release_notes":"https://github.com/denoland/deno/releases/tag/v1.13.0","status":"retired","engine":"V8","engine_version":"9.3"},"1.14":{"release_date":"2021-09-14","release_notes":"https://github.com/denoland/deno/releases/tag/v1.14.0","status":"retired","engine":"V8","engine_version":"9.4"},"1.15":{"release_date":"2021-10-12","release_notes":"https://github.com/denoland/deno/releases/tag/v1.15.0","status":"retired","engine":"V8","engine_version":"9.5"},"1.16":{"release_date":"2021-11-08","release_notes":"https://github.com/denoland/deno/releases/tag/v1.16.0","status":"current","engine":"V8","engine_version":"9.7"},"1.17":{"release_date":"2021-12-16","release_notes":"https://github.com/denoland/deno/releases/tag/v1.17.0","status":"current","engine":"V8","engine_version":"9.7"},"1.18":{"release_date":"2022-01-20","release_notes":"https://github.com/denoland/deno/releases/tag/v1.18.0","status":"current","engine":"V8","engine_version":"9.8"},"1.19":{"release_date":"2022-02-17","status":"nightly","engine":"V8","engine_version":"9.9"}}},"edge":{"name":"Edge","pref_url":"about:flags","releases":{"12":{"release_date":"2015-07-28","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-12","status":"retired","engine":"EdgeHTML","engine_version":"12"},"13":{"release_date":"2015-11-12","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-13","status":"retired","engine":"EdgeHTML","engine_version":"13"},"14":{"release_date":"2016-08-02","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-14","status":"retired","engine":"EdgeHTML","engine_version":"14"},"15":{"release_date":"2017-04-05","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-15","status":"retired","engine":"EdgeHTML","engine_version":"15"},"16":{"release_date":"2017-10-17","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-16","status":"retired","engine":"EdgeHTML","engine_version":"16"},"17":{"release_date":"2018-04-30","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new/edgehtml-17","status":"retired","engine":"EdgeHTML","engine_version":"17"},"18":{"release_date":"2018-10-02","release_notes":"https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/whats-new","status":"retired","engine":"EdgeHTML","engine_version":"18"},"79":{"release_date":"2020-01-15","release_notes":"https://blogs.windows.com/windowsexperience/2020/01/15/new-year-new-browser-the-new-microsoft-edge-is-out-of-preview-and-now-available-for-download/","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-07","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-80036148-february-7","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-13","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-81041653-april-13","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-21","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-83047837-may-21","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-16","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-84052240-july-16","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-27","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-85056441-august-27","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-09","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-86062238-october-9","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-19","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-87066441-november-19","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-21","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-88070550-january-21","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-04","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-89077445-march-4","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-15","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-90081839-april-15","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-27","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-91086437-may-27","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-22","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-92090255-july-22","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-09-02","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-93096138-september-02","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-24","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-94099231-september-24","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-21","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-950102030-october-21","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-19","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-960105429-november-19","status":"retired","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-06","release_notes":"https://docs.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel#version-970107255-january-6","status":"current","engine":"Blink","engine_version":"97"},"98":{"status":"beta","engine":"Blink","engine_version":"98"},"99":{"status":"nightly","engine":"Blink","engine_version":"99"}}},"firefox":{"name":"Firefox","preview_name":"Nightly","pref_url":"about:config","releases":{"1":{"release_date":"2004-11-09","release_notes":"http://website-archive.mozilla.org/www.mozilla.org/firefox_releasenotes/en-US/firefox/releases/1.0.html","status":"retired","engine":"Gecko","engine_version":"1.7"},"2":{"release_date":"2006-10-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/2","status":"retired","engine":"Gecko","engine_version":"1.8.1"},"3":{"release_date":"2008-06-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/3","status":"retired","engine":"Gecko","engine_version":"1.9"},"4":{"release_date":"2011-03-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/4","status":"retired","engine":"Gecko","engine_version":"2"},"5":{"release_date":"2011-06-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/5","status":"retired","engine":"Gecko","engine_version":"5"},"6":{"release_date":"2011-08-16","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/6","status":"retired","engine":"Gecko","engine_version":"6"},"7":{"release_date":"2011-09-27","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/7","status":"retired","engine":"Gecko","engine_version":"7"},"8":{"release_date":"2011-11-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/8","status":"retired","engine":"Gecko","engine_version":"8"},"9":{"release_date":"2011-12-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/9","status":"retired","engine":"Gecko","engine_version":"9"},"10":{"release_date":"2012-01-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/10","status":"retired","engine":"Gecko","engine_version":"10"},"11":{"release_date":"2012-03-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/11","status":"retired","engine":"Gecko","engine_version":"11"},"12":{"release_date":"2012-04-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/12","status":"retired","engine":"Gecko","engine_version":"12"},"13":{"release_date":"2012-06-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/13","status":"retired","engine":"Gecko","engine_version":"13"},"14":{"release_date":"2012-07-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/14","status":"retired","engine":"Gecko","engine_version":"14"},"15":{"release_date":"2012-08-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/15","status":"retired","engine":"Gecko","engine_version":"15"},"16":{"release_date":"2012-10-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/16","status":"retired","engine":"Gecko","engine_version":"16"},"17":{"release_date":"2012-11-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/17","status":"retired","engine":"Gecko","engine_version":"17"},"18":{"release_date":"2013-01-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/18","status":"retired","engine":"Gecko","engine_version":"18"},"19":{"release_date":"2013-02-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/19","status":"retired","engine":"Gecko","engine_version":"19"},"20":{"release_date":"2013-04-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/20","status":"retired","engine":"Gecko","engine_version":"20"},"21":{"release_date":"2013-05-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/21","status":"retired","engine":"Gecko","engine_version":"21"},"22":{"release_date":"2013-06-25","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/22","status":"retired","engine":"Gecko","engine_version":"22"},"23":{"release_date":"2013-08-06","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/23","status":"retired","engine":"Gecko","engine_version":"23"},"24":{"release_date":"2013-09-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/24","status":"retired","engine":"Gecko","engine_version":"24"},"25":{"release_date":"2013-10-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/25","status":"retired","engine":"Gecko","engine_version":"25"},"26":{"release_date":"2013-12-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/26","status":"retired","engine":"Gecko","engine_version":"26"},"27":{"release_date":"2014-02-04","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/27","status":"retired","engine":"Gecko","engine_version":"27"},"28":{"release_date":"2014-03-18","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/28","status":"retired","engine":"Gecko","engine_version":"28"},"29":{"release_date":"2014-04-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/29","status":"retired","engine":"Gecko","engine_version":"29"},"30":{"release_date":"2014-06-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/30","status":"retired","engine":"Gecko","engine_version":"30"},"31":{"release_date":"2014-07-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/31","status":"retired","engine":"Gecko","engine_version":"31"},"32":{"release_date":"2014-09-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/32","status":"retired","engine":"Gecko","engine_version":"32"},"33":{"release_date":"2014-10-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/33","status":"retired","engine":"Gecko","engine_version":"33"},"34":{"release_date":"2014-12-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/34","status":"retired","engine":"Gecko","engine_version":"34"},"35":{"release_date":"2015-01-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/35","status":"retired","engine":"Gecko","engine_version":"35"},"36":{"release_date":"2015-02-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/36","status":"retired","engine":"Gecko","engine_version":"36"},"37":{"release_date":"2015-03-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/37","status":"retired","engine":"Gecko","engine_version":"37"},"38":{"release_date":"2015-05-12","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/38","status":"retired","engine":"Gecko","engine_version":"38"},"39":{"release_date":"2015-07-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/39","status":"retired","engine":"Gecko","engine_version":"39"},"40":{"release_date":"2015-08-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/40","status":"retired","engine":"Gecko","engine_version":"40"},"41":{"release_date":"2015-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/41","status":"retired","engine":"Gecko","engine_version":"41"},"42":{"release_date":"2015-11-03","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/42","status":"retired","engine":"Gecko","engine_version":"42"},"43":{"release_date":"2015-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/43","status":"retired","engine":"Gecko","engine_version":"43"},"44":{"release_date":"2016-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/44","status":"retired","engine":"Gecko","engine_version":"44"},"45":{"release_date":"2016-03-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/45","status":"retired","engine":"Gecko","engine_version":"45"},"46":{"release_date":"2016-04-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/46","status":"retired","engine":"Gecko","engine_version":"46"},"47":{"release_date":"2016-06-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/47","status":"retired","engine":"Gecko","engine_version":"47"},"48":{"release_date":"2016-08-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/48","status":"retired","engine":"Gecko","engine_version":"48"},"49":{"release_date":"2016-09-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/49","status":"retired","engine":"Gecko","engine_version":"49"},"50":{"release_date":"2016-11-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/50","status":"retired","engine":"Gecko","engine_version":"50"},"51":{"release_date":"2017-01-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/51","status":"retired","engine":"Gecko","engine_version":"51"},"52":{"release_date":"2017-03-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/52","status":"retired","engine":"Gecko","engine_version":"52"},"53":{"release_date":"2017-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/53","status":"retired","engine":"Gecko","engine_version":"53"},"54":{"release_date":"2017-06-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/54","status":"retired","engine":"Gecko","engine_version":"54"},"55":{"release_date":"2017-08-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/55","status":"retired","engine":"Gecko","engine_version":"55"},"56":{"release_date":"2017-09-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/56","status":"retired","engine":"Gecko","engine_version":"56"},"57":{"release_date":"2017-11-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/57","status":"retired","engine":"Gecko","engine_version":"57"},"58":{"release_date":"2018-01-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/58","status":"retired","engine":"Gecko","engine_version":"58"},"59":{"release_date":"2018-03-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/59","status":"retired","engine":"Gecko","engine_version":"59"},"60":{"release_date":"2018-05-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/60","status":"retired","engine":"Gecko","engine_version":"60"},"61":{"release_date":"2018-06-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/61","status":"retired","engine":"Gecko","engine_version":"61"},"62":{"release_date":"2018-09-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/62","status":"retired","engine":"Gecko","engine_version":"62"},"63":{"release_date":"2018-10-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/63","status":"retired","engine":"Gecko","engine_version":"63"},"64":{"release_date":"2018-12-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/64","status":"retired","engine":"Gecko","engine_version":"64"},"65":{"release_date":"2019-01-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/65","status":"retired","engine":"Gecko","engine_version":"65"},"66":{"release_date":"2019-03-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/66","status":"retired","engine":"Gecko","engine_version":"66"},"67":{"release_date":"2019-05-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/67","status":"retired","engine":"Gecko","engine_version":"67"},"68":{"release_date":"2019-07-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/68","status":"retired","engine":"Gecko","engine_version":"68"},"69":{"release_date":"2019-09-03","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/69","status":"retired","engine":"Gecko","engine_version":"69"},"70":{"release_date":"2019-10-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/70","status":"retired","engine":"Gecko","engine_version":"70"},"71":{"release_date":"2019-12-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/71","status":"retired","engine":"Gecko","engine_version":"71"},"72":{"release_date":"2020-01-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/72","status":"retired","engine":"Gecko","engine_version":"72"},"73":{"release_date":"2020-02-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/73","status":"retired","engine":"Gecko","engine_version":"73"},"74":{"release_date":"2020-03-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/74","status":"retired","engine":"Gecko","engine_version":"74"},"75":{"release_date":"2020-04-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/75","status":"retired","engine":"Gecko","engine_version":"75"},"76":{"release_date":"2020-05-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/76","status":"retired","engine":"Gecko","engine_version":"76"},"77":{"release_date":"2020-06-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/77","status":"retired","engine":"Gecko","engine_version":"77"},"78":{"release_date":"2020-06-30","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/78","status":"retired","engine":"Gecko","engine_version":"78"},"79":{"release_date":"2020-07-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/79","status":"retired","engine":"Gecko","engine_version":"79"},"80":{"release_date":"2020-08-25","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/80","status":"retired","engine":"Gecko","engine_version":"80"},"81":{"release_date":"2020-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/81","status":"retired","engine":"Gecko","engine_version":"81"},"82":{"release_date":"2020-10-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/82","status":"retired","engine":"Gecko","engine_version":"82"},"83":{"release_date":"2020-11-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/83","status":"retired","engine":"Gecko","engine_version":"83"},"84":{"release_date":"2020-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/84","status":"retired","engine":"Gecko","engine_version":"84"},"85":{"release_date":"2021-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/85","status":"retired","engine":"Gecko","engine_version":"85"},"86":{"release_date":"2021-02-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/86","status":"retired","engine":"Gecko","engine_version":"86"},"87":{"release_date":"2021-03-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/87","status":"retired","engine":"Gecko","engine_version":"87"},"88":{"release_date":"2021-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/88","status":"retired","engine":"Gecko","engine_version":"88"},"89":{"release_date":"2021-06-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/89","status":"retired","engine":"Gecko","engine_version":"89"},"90":{"release_date":"2021-07-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/90","status":"retired","engine":"Gecko","engine_version":"90"},"91":{"release_date":"2021-08-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/91","status":"esr","engine":"Gecko","engine_version":"91"},"92":{"release_date":"2021-09-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/92","status":"retired","engine":"Gecko","engine_version":"92"},"93":{"release_date":"2021-10-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/93","status":"retired","engine":"Gecko","engine_version":"93"},"94":{"release_date":"2021-11-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/94","status":"retired","engine":"Gecko","engine_version":"94"},"95":{"release_date":"2021-12-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/95","status":"retired","engine":"Gecko","engine_version":"95"},"96":{"release_date":"2022-01-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/96","status":"current","engine":"Gecko","engine_version":"96"},"97":{"release_date":"2022-02-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/97","status":"beta","engine":"Gecko","engine_version":"97"},"98":{"release_date":"2022-03-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/98","status":"nightly","engine":"Gecko","engine_version":"98"},"1.5":{"release_date":"2005-11-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/1.5","status":"retired","engine":"Gecko","engine_version":"1.8"},"3.5":{"release_date":"2009-06-30","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/3.5","status":"retired","engine":"Gecko","engine_version":"1.9.1"},"3.6":{"release_date":"2010-01-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/3.6","status":"retired","engine":"Gecko","engine_version":"1.9.2"}}},"firefox_android":{"name":"Firefox for Android","pref_url":"about:config","releases":{"4":{"release_date":"2011-03-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/4","status":"retired","engine":"Gecko","engine_version":"2"},"5":{"release_date":"2011-06-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/5","status":"retired","engine":"Gecko","engine_version":"5"},"6":{"release_date":"2011-08-16","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/6","status":"retired","engine":"Gecko","engine_version":"6"},"7":{"release_date":"2011-09-27","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/7","status":"retired","engine":"Gecko","engine_version":"7"},"8":{"release_date":"2011-11-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/8","status":"retired","engine":"Gecko","engine_version":"8"},"9":{"release_date":"2011-12-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/9","status":"retired","engine":"Gecko","engine_version":"9"},"10":{"release_date":"2012-01-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/10","status":"retired","engine":"Gecko","engine_version":"10"},"14":{"release_date":"2012-06-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/14","status":"retired","engine":"Gecko","engine_version":"14"},"15":{"release_date":"2012-08-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/15","status":"retired","engine":"Gecko","engine_version":"15"},"16":{"release_date":"2012-10-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/16","status":"retired","engine":"Gecko","engine_version":"16"},"17":{"release_date":"2012-11-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/17","status":"retired","engine":"Gecko","engine_version":"17"},"18":{"release_date":"2013-01-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/18","status":"retired","engine":"Gecko","engine_version":"18"},"19":{"release_date":"2013-02-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/19","status":"retired","engine":"Gecko","engine_version":"19"},"20":{"release_date":"2013-04-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/20","status":"retired","engine":"Gecko","engine_version":"20"},"21":{"release_date":"2013-05-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/21","status":"retired","engine":"Gecko","engine_version":"21"},"22":{"release_date":"2013-06-25","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/22","status":"retired","engine":"Gecko","engine_version":"22"},"23":{"release_date":"2013-08-06","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/23","status":"retired","engine":"Gecko","engine_version":"23"},"24":{"release_date":"2013-09-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/24","status":"retired","engine":"Gecko","engine_version":"24"},"25":{"release_date":"2013-10-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/25","status":"retired","engine":"Gecko","engine_version":"25"},"26":{"release_date":"2013-12-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/26","status":"retired","engine":"Gecko","engine_version":"26"},"27":{"release_date":"2014-02-04","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/27","status":"retired","engine":"Gecko","engine_version":"27"},"28":{"release_date":"2014-03-18","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/28","status":"retired","engine":"Gecko","engine_version":"28"},"29":{"release_date":"2014-04-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/29","status":"retired","engine":"Gecko","engine_version":"29"},"30":{"release_date":"2014-06-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/30","status":"retired","engine":"Gecko","engine_version":"30"},"31":{"release_date":"2014-07-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/31","status":"retired","engine":"Gecko","engine_version":"31"},"32":{"release_date":"2014-09-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/32","status":"retired","engine":"Gecko","engine_version":"32"},"33":{"release_date":"2014-10-14","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/33","status":"retired","engine":"Gecko","engine_version":"33"},"34":{"release_date":"2014-12-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/34","status":"retired","engine":"Gecko","engine_version":"34"},"35":{"release_date":"2015-01-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/35","status":"retired","engine":"Gecko","engine_version":"35"},"36":{"release_date":"2015-02-27","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/36","status":"retired","engine":"Gecko","engine_version":"36"},"37":{"release_date":"2015-03-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/37","status":"retired","engine":"Gecko","engine_version":"37"},"38":{"release_date":"2015-05-12","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/38","status":"retired","engine":"Gecko","engine_version":"38"},"39":{"release_date":"2015-07-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/39","status":"retired","engine":"Gecko","engine_version":"39"},"40":{"release_date":"2015-08-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/40","status":"retired","engine":"Gecko","engine_version":"40"},"41":{"release_date":"2015-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/41","status":"retired","engine":"Gecko","engine_version":"41"},"42":{"release_date":"2015-11-03","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/42","status":"retired","engine":"Gecko","engine_version":"42"},"43":{"release_date":"2015-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/43","status":"retired","engine":"Gecko","engine_version":"43"},"44":{"release_date":"2016-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/44","status":"retired","engine":"Gecko","engine_version":"44"},"45":{"release_date":"2016-03-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/45","status":"retired","engine":"Gecko","engine_version":"45"},"46":{"release_date":"2016-04-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/46","status":"retired","engine":"Gecko","engine_version":"46"},"47":{"release_date":"2016-06-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/47","status":"retired","engine":"Gecko","engine_version":"47"},"48":{"release_date":"2016-08-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/48","status":"retired","engine":"Gecko","engine_version":"48"},"49":{"release_date":"2016-09-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/49","status":"retired","engine":"Gecko","engine_version":"49"},"50":{"release_date":"2016-11-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/50","status":"retired","engine":"Gecko","engine_version":"50"},"51":{"release_date":"2017-01-24","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/51","status":"retired","engine":"Gecko","engine_version":"51"},"52":{"release_date":"2017-03-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/52","status":"retired","engine":"Gecko","engine_version":"52"},"53":{"release_date":"2017-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/53","status":"retired","engine":"Gecko","engine_version":"53"},"54":{"release_date":"2017-06-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/54","status":"retired","engine":"Gecko","engine_version":"54"},"55":{"release_date":"2017-08-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/55","status":"retired","engine":"Gecko","engine_version":"55"},"56":{"release_date":"2017-09-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/56","status":"retired","engine":"Gecko","engine_version":"56"},"57":{"release_date":"2017-11-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/57","status":"retired","engine":"Gecko","engine_version":"57"},"58":{"release_date":"2018-01-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/58","status":"retired","engine":"Gecko","engine_version":"58"},"59":{"release_date":"2018-03-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/59","status":"retired","engine":"Gecko","engine_version":"59"},"60":{"release_date":"2018-05-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/60","status":"retired","engine":"Gecko","engine_version":"60"},"61":{"release_date":"2018-06-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/61","status":"retired","engine":"Gecko","engine_version":"61"},"62":{"release_date":"2018-09-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/62","status":"retired","engine":"Gecko","engine_version":"62"},"63":{"release_date":"2018-10-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/63","status":"retired","engine":"Gecko","engine_version":"63"},"64":{"release_date":"2018-12-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/64","status":"retired","engine":"Gecko","engine_version":"64"},"65":{"release_date":"2019-01-29","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/65","status":"retired","engine":"Gecko","engine_version":"65"},"66":{"release_date":"2019-03-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/66","status":"retired","engine":"Gecko","engine_version":"66"},"67":{"release_date":"2019-05-21","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/67","status":"retired","engine":"Gecko","engine_version":"67"},"68":{"release_date":"2019-07-09","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/68","status":"retired","engine":"Gecko","engine_version":"68"},"79":{"release_date":"2020-07-28","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/79","status":"retired","engine":"Gecko","engine_version":"79"},"80":{"release_date":"2020-08-31","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/80","status":"retired","engine":"Gecko","engine_version":"80"},"81":{"release_date":"2020-09-22","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/81","status":"retired","engine":"Gecko","engine_version":"81"},"82":{"release_date":"2020-10-20","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/82","status":"retired","engine":"Gecko","engine_version":"82"},"83":{"release_date":"2020-11-17","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/83","status":"retired","engine":"Gecko","engine_version":"83"},"84":{"release_date":"2020-12-15","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/84","status":"retired","engine":"Gecko","engine_version":"84"},"85":{"release_date":"2021-01-26","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/85","status":"retired","engine":"Gecko","engine_version":"85"},"86":{"release_date":"2021-02-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/86","status":"retired","engine":"Gecko","engine_version":"86"},"87":{"release_date":"2021-03-23","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/87","status":"retired","engine":"Gecko","engine_version":"87"},"88":{"release_date":"2021-04-19","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/88","status":"retired","engine":"Gecko","engine_version":"88"},"89":{"release_date":"2021-06-01","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/89","status":"retired","engine":"Gecko","engine_version":"89"},"90":{"release_date":"2021-07-13","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/90","status":"retired","engine":"Gecko","engine_version":"90"},"91":{"release_date":"2021-08-10","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/91","status":"retired","engine":"Gecko","engine_version":"91"},"92":{"release_date":"2021-09-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/92","status":"retired","engine":"Gecko","engine_version":"92"},"93":{"release_date":"2021-10-05","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/93","status":"retired","engine":"Gecko","engine_version":"93"},"94":{"release_date":"2021-11-02","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/94","status":"retired","engine":"Gecko","engine_version":"94"},"95":{"release_date":"2021-12-07","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/95","status":"retired","engine":"Gecko","engine_version":"95"},"96":{"release_date":"2022-01-11","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/96","status":"current","engine":"Gecko","engine_version":"96"},"97":{"release_date":"2022-02-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/97","status":"beta","engine":"Gecko","engine_version":"97"},"98":{"release_date":"2022-03-08","release_notes":"https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/98","status":"nightly","engine":"Gecko","engine_version":"98"}}},"ie":{"name":"Internet Explorer","releases":{"1":{"release_date":"1995-08-16","status":"retired"},"2":{"release_date":"1995-11-22","status":"retired"},"3":{"release_date":"1996-08-13","status":"retired"},"4":{"release_date":"1997-09-30","status":"retired"},"5":{"release_date":"1999-03-18","status":"retired"},"6":{"release_date":"2001-08-27","status":"retired"},"7":{"release_date":"2006-10-18","status":"retired"},"8":{"release_date":"2009-03-19","status":"retired","engine":"Trident","engine_version":"4.0"},"9":{"release_date":"2011-03-14","status":"retired","engine":"Trident","engine_version":"5.0"},"10":{"release_date":"2012-10-26","status":"retired","engine":"Trident","engine_version":"6.0"},"11":{"release_date":"2013-10-17","status":"current","engine":"Trident","engine_version":"7.0"},"5.5":{"release_date":"2000-07-06","status":"retired"}}},"nodejs":{"name":"Node.js","releases":{"0.10.0":{"release_date":"2013-03-11","release_notes":"https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V010.md","status":"retired","engine":"V8","engine_version":"3.14"},"0.12.0":{"release_date":"2015-02-06","release_notes":"https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V012.md","status":"retired","engine":"V8","engine_version":"3.28"},"4.0.0":{"release_date":"2015-09-08","release_notes":"https://nodejs.org/en/blog/release/v4.0.0/","status":"retired","engine":"V8","engine_version":"4.5"},"5.0.0":{"release_date":"2015-10-29","release_notes":"https://nodejs.org/en/blog/release/v5.0.0/","status":"retired","engine":"V8","engine_version":"4.6"},"6.0.0":{"release_date":"2016-04-26","release_notes":"https://nodejs.org/en/blog/release/v6.0.0/","status":"retired","engine":"V8","engine_version":"5"},"6.5.0":{"release_date":"2016-08-26","release_notes":"https://nodejs.org/en/blog/release/v6.5.0/","status":"retired","engine":"V8","engine_version":"5.1"},"7.0.0":{"release_date":"2016-10-25","release_notes":"https://nodejs.org/en/blog/release/v7.0.0/","status":"retired","engine":"V8","engine_version":"5.4"},"7.5.0":{"release_date":"2017-01-31","release_notes":"https://nodejs.org/en/blog/release/v7.5.0/","status":"retired","engine":"V8","engine_version":"5.4"},"7.6.0":{"release_date":"2017-02-21","release_notes":"https://nodejs.org/en/blog/release/v7.6.0/","status":"retired","engine":"V8","engine_version":"5.5"},"7.7.0":{"release_date":"2017-02-28","release_notes":"https://nodejs.org/en/blog/release/v7.7.0/","status":"retired","engine":"V8","engine_version":"5.5"},"7.10.0":{"release_date":"2017-05-02","release_notes":"https://nodejs.org/en/blog/release/v7.10.0/","status":"retired","engine":"V8","engine_version":"5.5"},"8.0.0":{"release_date":"2017-05-30","release_notes":"https://nodejs.org/en/blog/release/v8.0.0/","status":"retired","engine":"V8","engine_version":"5.8"},"8.3.0":{"release_date":"2017-08-09","release_notes":"https://nodejs.org/en/blog/release/v8.3.0/","status":"retired","engine":"V8","engine_version":"6.0"},"8.5.0":{"release_date":"2017-09-12","release_notes":"https://nodejs.org/en/blog/release/v8.5.0/","status":"retired","engine":"V8","engine_version":"6.0"},"8.7.0":{"release_date":"2017-10-11","release_notes":"https://nodejs.org/en/blog/release/v8.7.0/","status":"retired","engine":"V8","engine_version":"6.1"},"8.10.0":{"release_date":"2018-03-06","release_notes":"https://nodejs.org/en/blog/release/v8.10.0/","status":"retired","engine":"V8","engine_version":"6.2"},"9.3.0":{"release_date":"2017-12-12","release_notes":"https://nodejs.org/en/blog/release/v9.3.0/","status":"retired","engine":"V8","engine_version":"6.2"},"10.0.0":{"release_date":"2018-04-24","release_notes":"https://nodejs.org/en/blog/release/v10.0.0/","status":"retired","engine":"V8","engine_version":"6.6"},"10.4.0":{"release_date":"2018-06-06","release_notes":"https://nodejs.org/en/blog/release/v10.4.0/","status":"retired","engine":"V8","engine_version":"6.7"},"10.5.0":{"release_date":"2018-06-20","release_notes":"https://nodejs.org/en/blog/release/v10.5.0/","status":"retired","engine":"V8","engine_version":"6.7"},"10.7.0":{"release_date":"2018-07-18","release_notes":"https://nodejs.org/en/blog/release/v10.7.0/","status":"retired","engine":"V8","engine_version":"6.7"},"10.9.0":{"release_date":"2018-08-16","release_notes":"https://nodejs.org/en/blog/release/v10.9.0/","status":"retired","engine":"V8","engine_version":"6.8"},"11.0.0":{"release_date":"2018-10-23","release_notes":"https://nodejs.org/en/blog/release/v11.0.0/","status":"retired","engine":"V8","engine_version":"7.0"},"11.7.0":{"release_date":"2019-01-18","release_notes":"https://nodejs.org/en/blog/release/v11.7.0/","status":"retired","engine":"V8","engine_version":"7.0"},"12.0.0":{"release_date":"2019-04-23","release_notes":"https://nodejs.org/en/blog/release/v12.0.0/","status":"retired","engine":"V8","engine_version":"7.4"},"12.5.0":{"release_date":"2019-06-27","release_notes":"https://nodejs.org/en/blog/release/v12.5.0/","status":"retired","engine":"V8","engine_version":"7.5"},"12.9.0":{"release_date":"2019-08-20","release_notes":"https://nodejs.org/en/blog/release/v12.9.0/","status":"retired","engine":"V8","engine_version":"7.6"},"12.11.0":{"release_date":"2019-09-25","release_notes":"https://nodejs.org/en/blog/release/v12.11.0/","status":"retired","engine":"V8","engine_version":"7.7"},"12.17.0":{"release_date":"2020-05-26","release_notes":"https://nodejs.org/en/blog/release/v12.17.0/","status":"esr","engine":"V8","engine_version":"7.8"},"13.0.0":{"release_date":"2019-10-10","release_notes":"https://nodejs.org/en/blog/release/v13.0.0/","status":"retired","engine":"V8","engine_version":"7.8"},"13.2.0":{"release_date":"2019-11-21","release_notes":"https://nodejs.org/en/blog/release/v13.2.0/","status":"retired","engine":"V8","engine_version":"7.9"},"14.0.0":{"release_date":"2020-04-21","release_notes":"https://nodejs.org/en/blog/release/v14.0.0/","status":"retired","engine":"V8","engine_version":"8.1"},"14.3.0":{"release_date":"2020-05-19","release_notes":"https://nodejs.org/en/blog/release/v14.3.0/","status":"retired","engine":"V8","engine_version":"8.3"},"14.5.0":{"release_date":"2020-06-30","release_notes":"https://nodejs.org/en/blog/release/v14.5.0/","status":"retired","engine":"V8","engine_version":"8.3"},"14.6.0":{"release_date":"2020-07-21","release_notes":"https://nodejs.org/en/blog/release/v14.6.0/","status":"retired","engine":"V8","engine_version":"8.4"},"14.7.0":{"release_date":"2020-07-29","release_notes":"https://nodejs.org/en/blog/release/v14.7.0/","status":"retired","engine":"V8","engine_version":"8.4"},"14.8.0":{"release_date":"2020-08-11","release_notes":"https://nodejs.org/en/blog/release/v14.8.0/","status":"esr","engine":"V8","engine_version":"8.4"},"15.0.0":{"release_date":"2020-10-20","release_notes":"https://nodejs.org/en/blog/release/v15.0.0/","status":"retired","engine":"V8","engine_version":"8.6"},"15.4.0":{"release_date":"2020-12-09","release_notes":"https://nodejs.org/en/blog/release/v15.4.0/","status":"retired","engine":"V8","engine_version":"8.6"},"15.7.0":{"release_date":"2021-01-26","release_notes":"https://nodejs.org/en/blog/release/v15.7.0/","status":"retired","engine":"V8","engine_version":"8.6"},"15.12.0":{"release_date":"2021-03-17","release_notes":"https://nodejs.org/en/blog/release/v15.12.0/","status":"retired","engine":"V8","engine_version":"8.6"},"16.0.0":{"release_date":"2021-04-20","release_notes":"https://nodejs.org/en/blog/release/v16.0.0/","status":"retired","engine":"V8","engine_version":"9.0"},"16.4.0":{"release_date":"2021-06-23","release_notes":"https://nodejs.org/en/blog/release/v16.4.0/","status":"retired","engine":"V8","engine_version":"9.1"},"16.5.0":{"release_date":"2021-07-14","release_notes":"https://nodejs.org/en/blog/release/v16.5.0/","status":"retired","engine":"V8","engine_version":"9.2"},"16.6.0":{"release_date":"2021-07-29","release_notes":"https://nodejs.org/en/blog/release/v16.6.0/","status":"retired","engine":"V8","engine_version":"9.2"},"16.7.0":{"release_date":"2021-08-17","release_notes":"https://nodejs.org/en/blog/release/v16.7.0/","status":"retired","engine":"V8","engine_version":"9.2"},"16.9.0":{"release_date":"2021-09-07","release_notes":"https://nodejs.org/en/blog/release/v16.9.0/","status":"current","engine":"V8","engine_version":"9.3"},"17.0.0":{"release_date":"2021-10-19","release_notes":"https://nodejs.org/en/blog/release/v17.0.0/","status":"current","engine":"V8","engine_version":"9.5"}}},"opera":{"name":"Opera","releases":{"2":{"release_date":"1996-07-14","status":"retired"},"3":{"release_date":"1997-12-01","status":"retired"},"4":{"release_date":"2000-06-28","status":"retired"},"5":{"release_date":"2000-12-06","status":"retired"},"6":{"release_date":"2001-12-18","status":"retired"},"7":{"release_date":"2003-01-28","status":"retired","engine":"Presto","engine_version":"1"},"8":{"release_date":"2005-04-19","status":"retired","engine":"Presto","engine_version":"1"},"9":{"release_date":"2006-06-20","status":"retired","engine":"Presto","engine_version":"2"},"10":{"release_date":"2009-09-01","release_notes":"https://dev.opera.com/blog/opera-10-weve-only-just-begun/","status":"retired","engine":"Presto","engine_version":"2.2"},"11":{"release_date":"2010-12-16","release_notes":"https://dev.opera.com/blog/new-html5-features-in-opera-11/","status":"retired","engine":"Presto","engine_version":"2.7"},"12":{"release_date":"2012-06-14","release_notes":"https://dev.opera.com/blog/hello-opera-12/","status":"retired","engine":"Presto","engine_version":"2.10"},"15":{"release_date":"2013-07-02","release_notes":"https://dev.opera.com/blog/introducing-opera-15-for-desktop-and-a-fast-release-cycle/","status":"retired","engine":"Blink","engine_version":"28"},"16":{"release_date":"2013-08-27","release_notes":"https://dev.opera.com/blog/opera-16-released-in-the-wild/","status":"retired","engine":"Blink","engine_version":"29"},"17":{"release_date":"2013-10-08","release_notes":"https://dev.opera.com/blog/opera-desktop-17-released/","status":"retired","engine":"Blink","engine_version":"30"},"18":{"release_date":"2013-11-19","release_notes":"https://dev.opera.com/blog/opera-desktop-18-released/","status":"retired","engine":"Blink","engine_version":"31"},"19":{"release_date":"2014-01-28","release_notes":"https://dev.opera.com/blog/opera-19/","status":"retired","engine":"Blink","engine_version":"32"},"20":{"release_date":"2014-03-04","release_notes":"https://dev.opera.com/blog/opera-20/","status":"retired","engine":"Blink","engine_version":"33"},"21":{"release_date":"2014-05-06","release_notes":"https://dev.opera.com/blog/opera-21/","status":"retired","engine":"Blink","engine_version":"34"},"22":{"release_date":"2014-06-03","release_notes":"https://dev.opera.com/blog/opera-22/","status":"retired","engine":"Blink","engine_version":"35"},"23":{"release_date":"2014-07-22","release_notes":"https://dev.opera.com/blog/opera-23/","status":"retired","engine":"Blink","engine_version":"36"},"24":{"release_date":"2014-09-02","release_notes":"https://dev.opera.com/blog/opera-24/","status":"retired","engine":"Blink","engine_version":"37"},"25":{"release_date":"2014-10-15","release_notes":"https://dev.opera.com/blog/opera-25/","status":"retired","engine":"Blink","engine_version":"38"},"26":{"release_date":"2014-12-03","release_notes":"https://dev.opera.com/blog/opera-26/","status":"retired","engine":"Blink","engine_version":"39"},"27":{"release_date":"2015-01-27","release_notes":"https://dev.opera.com/blog/opera-27/","status":"retired","engine":"Blink","engine_version":"40"},"28":{"release_date":"2015-03-10","release_notes":"https://dev.opera.com/blog/opera-28/","status":"retired","engine":"Blink","engine_version":"41"},"29":{"release_date":"2015-04-28","release_notes":"https://dev.opera.com/blog/opera-29/","status":"retired","engine":"Blink","engine_version":"42"},"30":{"release_date":"2015-06-09","release_notes":"https://dev.opera.com/blog/opera-30/","status":"retired","engine":"Blink","engine_version":"43"},"31":{"release_date":"2015-08-04","release_notes":"https://dev.opera.com/blog/opera-31/","status":"retired","engine":"Blink","engine_version":"44"},"32":{"release_date":"2015-09-15","release_notes":"https://dev.opera.com/blog/opera-32/","status":"retired","engine":"Blink","engine_version":"45"},"33":{"release_date":"2015-10-27","release_notes":"https://dev.opera.com/blog/opera-33/","status":"retired","engine":"Blink","engine_version":"46"},"34":{"release_date":"2015-12-08","release_notes":"https://dev.opera.com/blog/opera-34/","status":"retired","engine":"Blink","engine_version":"47"},"35":{"release_date":"2016-02-02","release_notes":"https://dev.opera.com/blog/opera-35/","status":"retired","engine":"Blink","engine_version":"48"},"36":{"release_date":"2016-03-15","release_notes":"https://dev.opera.com/blog/opera-36/","status":"retired","engine":"Blink","engine_version":"49"},"37":{"release_date":"2016-05-04","release_notes":"https://dev.opera.com/blog/opera-37/","status":"retired","engine":"Blink","engine_version":"50"},"38":{"release_date":"2016-06-08","release_notes":"https://dev.opera.com/blog/opera-38/","status":"retired","engine":"Blink","engine_version":"51"},"39":{"release_date":"2016-08-02","release_notes":"https://dev.opera.com/blog/opera-39/","status":"retired","engine":"Blink","engine_version":"52"},"40":{"release_date":"2016-09-20","release_notes":"https://dev.opera.com/blog/opera-40/","status":"retired","engine":"Blink","engine_version":"53"},"41":{"release_date":"2016-10-25","release_notes":"https://dev.opera.com/blog/opera-41/","status":"retired","engine":"Blink","engine_version":"54"},"42":{"release_date":"2016-12-13","release_notes":"https://dev.opera.com/blog/opera-42/","status":"retired","engine":"Blink","engine_version":"55"},"43":{"release_date":"2017-02-07","release_notes":"https://dev.opera.com/blog/opera-43/","status":"retired","engine":"Blink","engine_version":"56"},"44":{"release_date":"2017-03-21","release_notes":"https://dev.opera.com/blog/opera-44/","status":"retired","engine":"Blink","engine_version":"57"},"45":{"release_date":"2017-05-10","release_notes":"https://dev.opera.com/blog/opera-45/","status":"retired","engine":"Blink","engine_version":"58"},"46":{"release_date":"2017-06-22","release_notes":"https://dev.opera.com/blog/opera-46/","status":"retired","engine":"Blink","engine_version":"59"},"47":{"release_date":"2017-08-09","release_notes":"https://dev.opera.com/blog/opera-47/","status":"retired","engine":"Blink","engine_version":"60"},"48":{"release_date":"2017-09-27","status":"retired","engine":"Blink","engine_version":"61"},"49":{"release_date":"2017-11-08","release_notes":"https://dev.opera.com/blog/opera-49/","status":"retired","engine":"Blink","engine_version":"62"},"50":{"release_date":"2018-01-04","release_notes":"https://dev.opera.com/blog/opera-50/","status":"retired","engine":"Blink","engine_version":"63"},"51":{"release_date":"2018-02-07","release_notes":"https://dev.opera.com/blog/opera-51/","status":"retired","engine":"Blink","engine_version":"64"},"52":{"release_date":"2018-03-22","release_notes":"https://dev.opera.com/blog/opera-52/","status":"retired","engine":"Blink","engine_version":"65"},"53":{"release_date":"2018-05-10","release_notes":"https://dev.opera.com/blog/opera-53/","status":"retired","engine":"Blink","engine_version":"66"},"54":{"release_date":"2018-06-28","release_notes":"https://dev.opera.com/blog/opera-54/","status":"retired","engine":"Blink","engine_version":"67"},"55":{"release_date":"2018-08-16","release_notes":"https://blogs.opera.com/desktop/2018/08/opera-55-offers-better-control-web-pages-accessible-bookmarks/","status":"retired","engine":"Blink","engine_version":"68"},"56":{"release_date":"2018-09-25","release_notes":"https://dev.opera.com/blog/opera-56/","status":"retired","engine":"Blink","engine_version":"69"},"57":{"release_date":"2018-11-28","release_notes":"https://dev.opera.com/blog/opera-57/","status":"retired","engine":"Blink","engine_version":"70"},"58":{"release_date":"2019-01-23","release_notes":"https://dev.opera.com/blog/opera-58/","status":"retired","engine":"Blink","engine_version":"71"},"60":{"release_date":"2019-04-09","release_notes":"https://blogs.opera.com/desktop/2019/04/opera-60-reborn-3-web-3-0-vpn-ad-blocker/","status":"retired","engine":"Blink","engine_version":"73"},"62":{"release_date":"2019-06-27","release_notes":"https://blogs.opera.com/desktop/2019/06/opera-62-comes-with-design-updates-to-reborn-3/","status":"retired","engine":"Blink","engine_version":"75"},"63":{"release_date":"2019-08-20","release_notes":"https://blogs.opera.com/desktop/2019/08/opera-63-initial-release/","status":"retired","engine":"Blink","engine_version":"76"},"64":{"release_date":"2019-10-07","release_notes":"https://blogs.opera.com/desktop/2019/10/opera-64-faster-more-private-more-fun/","status":"retired","engine":"Blink","engine_version":"77"},"65":{"release_date":"2019-11-13","release_notes":"https://blogs.opera.com/desktop/2019/11/opera-65-comes-with-an-improved-tracker-blocker-and-redesigned-address-bar/","status":"retired","engine":"Blink","engine_version":"78"},"66":{"release_date":"2020-01-07","release_notes":"https://blogs.opera.com/desktop/2020/01/opera-66-initial-release-makes-it-easier-to-reopen-closed-tabs-and-to-access-extensions/","status":"retired","engine":"Blink","engine_version":"79"},"67":{"release_date":"2020-03-03","release_notes":"https://blogs.opera.com/desktop/2020/03/opera-67-3575-53-stable-update/","status":"retired","engine":"Blink","engine_version":"80"},"68":{"release_date":"2020-04-22","release_notes":"https://blogs.opera.com/desktop/2020/04/opera-68-is-here-with-built-in-instagram-in-the-sidebar/","status":"retired","engine":"Blink","engine_version":"81"},"69":{"release_date":"2020-06-24","release_notes":"https://blogs.opera.com/desktop/2020/06/opera-69-comes-with-built-in-twitter/","status":"retired","engine":"Blink","engine_version":"83"},"70":{"release_date":"2020-07-27","release_notes":"https://blogs.opera.com/desktop/2020/07/opera-70-comes-with-easier-access-to-closed-tabs-simpler-searches-and-new-workspace-icons/","status":"retired","engine":"Blink","engine_version":"84"},"71":{"release_date":"2020-09-15","release_notes":"https://blogs.opera.com/desktop/2020/09/opera-71-update/","status":"retired","engine":"Blink","engine_version":"85"},"72":{"release_date":"2020-10-21","release_notes":"https://blogs.opera.com/desktop/2020/10/opera-72-update/","status":"retired","engine":"Blink","engine_version":"86"},"73":{"release_date":"2020-12-09","release_notes":"https://blogs.opera.com/desktop/2020/12/opera-73-update/","status":"retired","engine":"Blink","engine_version":"87"},"74":{"release_date":"2021-02-02","release_notes":"https://blogs.opera.com/desktop/2021/02/opera-74-stable/","status":"retired","engine":"Blink","engine_version":"88"},"75":{"release_date":"2021-03-24","release_notes":"https://blogs.opera.com/desktop/2021/03/opera-75-brings-easier-access-to-top-features-2/","status":"retired","engine":"Blink","engine_version":"89"},"76":{"release_date":"2021-04-28","release_notes":"https://blogs.opera.com/desktop/2021/04/opera-76-stable/","status":"retired","engine":"Blink","engine_version":"90"},"77":{"release_date":"2021-06-09","release_notes":"https://blogs.opera.com/desktop/2021/06/opera-77-stable/","status":"retired","engine":"Blink","engine_version":"91"},"78":{"release_date":"2021-08-03","release_notes":"https://blogs.opera.com/desktop/2021/08/opera-78-stable/","status":"retired","engine":"Blink","engine_version":"92"},"79":{"release_date":"2021-09-14","release_notes":"https://blogs.opera.com/desktop/2021/09/opera-79-stable/","status":"retired","engine":"Blink","engine_version":"93"},"80":{"release_date":"2021-10-05","release_notes":"https://blogs.opera.com/desktop/2021/10/opera-80-stable/","status":"retired","engine":"Blink","engine_version":"94"},"81":{"release_date":"2021-11-04","release_notes":"https://blogs.opera.com/desktop/2021/11/opera-81-stable/","status":"retired","engine":"Blink","engine_version":"95"},"82":{"release_date":"2021-12-02","release_notes":"https://blogs.opera.com/desktop/2021/12/opera-82/","status":"retired","engine":"Blink","engine_version":"96"},"83":{"release_date":"2022-01-19","release_notes":"https://blogs.opera.com/desktop/2022/01/opera-83/","status":"current","engine":"Blink","engine_version":"97"},"84":{"status":"beta","engine":"Blink","engine_version":"98"},"85":{"status":"nightly","engine":"Blink","engine_version":"99"},"3.5":{"release_date":"1998-11-18","status":"retired"},"3.6":{"release_date":"1999-05-06","status":"retired"},"5.1":{"release_date":"2001-04-10","status":"retired"},"7.1":{"release_date":"2003-04-11","status":"retired","engine":"Presto","engine_version":"1"},"7.2":{"release_date":"2003-09-23","status":"retired","engine":"Presto","engine_version":"1"},"7.5":{"release_date":"2004-05-12","status":"retired","engine":"Presto","engine_version":"1"},"8.5":{"release_date":"2005-09-20","status":"retired","engine":"Presto","engine_version":"1"},"9.1":{"release_date":"2006-12-18","status":"retired","engine":"Presto","engine_version":"2"},"9.2":{"release_date":"2007-04-11","status":"retired","engine":"Presto","engine_version":"2"},"9.5":{"release_date":"2008-06-12","status":"retired","engine":"Presto","engine_version":"2.1"},"9.6":{"release_date":"2008-10-08","release_notes":"https://dev.opera.com/blog/a-look-under-the-hood-of-opera-9-6/","status":"retired","engine":"Presto","engine_version":"2.1"},"10.1":{"release_date":"2009-11-23","release_notes":"https://dev.opera.com/blog/opera-10-10-and-10-2-alpha/","status":"retired","engine":"Presto","engine_version":"2.2"},"10.5":{"release_date":"2010-03-02","release_notes":"https://dev.opera.com/blog/opera-10-50-final-for-windows-is-out/","status":"retired","engine":"Presto","engine_version":"2.5"},"10.6":{"release_date":"2010-07-01","release_notes":"https://dev.opera.com/blog/hello-opera-10-60/","status":"retired","engine":"Presto","engine_version":"2.6"},"11.1":{"release_date":"2011-04-12","release_notes":"https://dev.opera.com/blog/unveiling-opera-11-10-final/","status":"retired","engine":"Presto","engine_version":"2.8"},"11.5":{"release_date":"2011-06-28","release_notes":"https://dev.opera.com/blog/opera-11-50-released-speed-dial-extensions-improved-standards-support/","status":"retired","engine":"Presto","engine_version":"2.9"},"11.6":{"release_date":"2011-12-06","release_notes":"https://dev.opera.com/blog/hello-opera-11-60/","status":"retired","engine":"Presto","engine_version":"2.10"},"12.1":{"release_date":"2012-11-20","release_notes":"https://dev.opera.com/blog/opera-12-10-is-out/","status":"retired","engine":"Presto","engine_version":"2.12"}}},"opera_android":{"name":"Opera Android","releases":{"11":{"release_date":"2011-03-22","release_notes":"https://dev.opera.com/blog/opera-mobile-11-for-maemo-meego-windows/","status":"retired","engine":"Presto","engine_version":"2.7"},"12":{"release_date":"2012-02-25","release_notes":"https://dev.opera.com/blog/opera-mobile-12-and-introducing-opera-mini-next/","status":"retired","engine":"Presto","engine_version":"2.10"},"14":{"release_date":"2013-05-21","release_notes":"https://dev.opera.com/blog/opera-14-for-android-is-out/","status":"retired","engine":"Blink","engine_version":"26"},"15":{"release_date":"2013-07-08","release_notes":"https://blogs.opera.com/news/2013/07/opera-15-for-android/","status":"retired","engine":"Blink","engine_version":"28"},"16":{"release_date":"2013-09-18","status":"retired","engine":"Blink","engine_version":"29"},"18":{"release_date":"2013-11-20","release_notes":"https://blogs.opera.com/news/2013/11/opera-18-android-tablet/","status":"retired","engine":"Blink","engine_version":"31"},"19":{"release_date":"2014-01-28","release_notes":"https://dev.opera.com/blog/opera-19/","status":"retired","engine":"Blink","engine_version":"32"},"20":{"release_date":"2014-03-06","release_notes":"https://forums.opera.com/topic/1081/opera-20-final-release","status":"retired","engine":"Blink","engine_version":"33"},"21":{"release_date":"2014-04-22","release_notes":"https://forums.opera.com/topic/2211/opera-21-final-release","status":"retired","engine":"Blink","engine_version":"34"},"22":{"release_date":"2014-06-17","release_notes":"https://forums.opera.com/topic/3446/opera-22","status":"retired","engine":"Blink","engine_version":"35"},"24":{"release_date":"2014-09-10","release_notes":"https://forums.opera.com/topic/5022/opera-24-final-release","status":"retired","engine":"Blink","engine_version":"37"},"25":{"release_date":"2014-10-16","release_notes":"https://forums.opera.com/topic/5715/opera-25-final-release","status":"retired","engine":"Blink","engine_version":"38"},"26":{"release_date":"2014-12-02","release_notes":"https://forums.opera.com/topic/6800/opera-26-final-release","status":"retired","engine":"Blink","engine_version":"39"},"27":{"release_date":"2015-01-29","release_notes":"https://forums.opera.com/topic/7871/opera-27-final-release","status":"retired","engine":"Blink","engine_version":"40"},"28":{"release_date":"2015-03-10","release_notes":"https://forums.opera.com/topic/8556/synced-bookmarks-and-improved-memory-usage-in-opera-28-for-android","status":"retired","engine":"Blink","engine_version":"41"},"29":{"release_date":"2015-04-28","release_notes":"https://dev.opera.com/blog/opera-29/","status":"retired","engine":"Blink","engine_version":"42"},"30":{"release_date":"2015-06-10","release_notes":"https://blogs.opera.com/mobile/2015/06/opera-30-android-sync-speeddials/","status":"retired","engine":"Blink","engine_version":"43"},"32":{"release_date":"2015-09-23","release_notes":"https://blogs.opera.com/mobile/2015/09/opera-32-add-to-home-screen/","status":"retired","engine":"Blink","engine_version":"45"},"33":{"release_date":"2015-11-03","release_notes":"https://forums.opera.com/topic/12480/opera-33-now-featuring-video-optimization-and-brand-new-icons","status":"retired","engine":"Blink","engine_version":"46"},"34":{"release_date":"2015-12-16","release_notes":"https://forums.opera.com/topic/13085/opera-34-for-android-released","status":"retired","engine":"Blink","engine_version":"47"},"35":{"release_date":"2016-02-04","release_notes":"https://blogs.opera.com/mobile/2016/02/save-space-on-your-android-phone-with-web-apps/","status":"retired","engine":"Blink","engine_version":"48"},"36":{"release_date":"2016-03-31","release_notes":"https://forums.opera.com/topic/14514/opera-36-released","status":"retired","engine":"Blink","engine_version":"49"},"37":{"release_date":"2016-06-16","release_notes":"https://forums.opera.com/topic/15753/opera-37-released","status":"retired","engine":"Blink","engine_version":"50"},"41":{"release_date":"2016-10-25","status":"retired","engine":"Blink","engine_version":"54"},"42":{"release_date":"2017-01-21","release_notes":"https://forums.opera.com/topic/18950/opera-for-android-42","status":"retired","engine":"Blink","engine_version":"55"},"43":{"release_date":"2017-09-27","release_notes":"https://forums.opera.com/topic/22708/opera-for-android-43","status":"retired","engine":"Blink","engine_version":"59"},"44":{"release_date":"2017-12-11","release_notes":"https://forums.opera.com/topic/23860/opera-for-android-44","status":"retired","engine":"Blink","engine_version":"60"},"45":{"release_date":"2018-02-15","release_notes":"https://forums.opera.com/topic/25124/opera-for-android-45","status":"retired","engine":"Blink","engine_version":"61"},"46":{"release_date":"2018-05-14","release_notes":"https://forums.opera.com/topic/26662/opera-for-android-46","status":"retired","engine":"Blink","engine_version":"63"},"47":{"release_date":"2018-07-23","release_notes":"https://forums.opera.com/topic/27794/opera-for-android-47","status":"retired","engine":"Blink","engine_version":"66"},"48":{"release_date":"2018-11-08","release_notes":"https://forums.opera.com/topic/29525/opera-for-android-48","status":"retired","engine":"Blink","engine_version":"69"},"49":{"release_date":"2018-12-07","release_notes":"https://forums.opera.com/topic/29983/opera-for-android-49","status":"retired","engine":"Blink","engine_version":"70"},"50":{"release_date":"2019-02-18","release_notes":"https://forums.opera.com/topic/31003/opera-for-android-50","status":"retired","engine":"Blink","engine_version":"71"},"51":{"release_date":"2019-03-21","release_notes":"https://forums.opera.com/topic/31467/opera-for-android-51-built-in-vpn","status":"retired","engine":"Blink","engine_version":"72"},"52":{"release_date":"2019-05-17","release_notes":"https://forums.opera.com/topic/32516/opera-for-android-52","status":"retired","engine":"Blink","engine_version":"73"},"53":{"release_date":"2019-07-11","release_notes":"https://forums.opera.com/topic/33558/opera-for-android-53","status":"retired","engine":"Blink","engine_version":"74"},"54":{"release_date":"2019-10-18","release_notes":"https://forums.opera.com/topic/35853/opera-for-android-54","status":"retired","engine":"Blink","engine_version":"76"},"55":{"release_date":"2019-12-03","release_notes":"https://forums.opera.com/topic/36858/opera-for-android-55","status":"retired","engine":"Blink","engine_version":"77"},"56":{"release_date":"2020-02-06","release_notes":"https://blogs.opera.com/mobile/2020/02/easy-reading-in-opera-for-android/","status":"retired","engine":"Blink","engine_version":"78"},"57":{"release_date":"2020-03-30","release_notes":"https://blogs.opera.com/mobile/2020/03/introducing-new-features-in-opera-for-android-57/","status":"retired","engine":"Blink","engine_version":"80"},"58":{"release_date":"2020-05-13","release_notes":"https://blogs.opera.com/mobile/2020/05/opera-for-android-58-handle-notifications-easily-and-group-speed-dials-for-a-cleaner-appearance/","status":"retired","engine":"Blink","engine_version":"81"},"59":{"release_date":"2020-06-30","release_notes":"https://blogs.opera.com/mobile/2020/06/opera-for-android-59/","status":"retired","engine":"Blink","engine_version":"83"},"60":{"release_date":"2020-09-23","release_notes":"https://blogs.opera.com/mobile/2020/09/keep-in-sync-with-opera-for-android-60/","status":"retired","engine":"Blink","engine_version":"85"},"61":{"release_date":"2020-12-07","release_notes":"https://blogs.opera.com/mobile/2020/12/new-opera-for-android-61/","status":"retired","engine":"Blink","engine_version":"86"},"62":{"release_date":"2021-02-16","release_notes":"https://blogs.opera.com/mobile/2021/02/the-opera-browser-for-android-hit-a-new-record-of-80-million-maus/","status":"retired","engine":"Blink","engine_version":"87"},"63":{"release_date":"2021-04-16","status":"retired","engine":"Blink","engine_version":"89"},"64":{"release_date":"2021-05-25","status":"retired","engine":"Blink","engine_version":"91"},"65":{"release_date":"2021-10-20","release_notes":"https://blogs.opera.com/mobile/2021/10/opera-for-android-version-65/","status":"current","engine":"Blink","engine_version":"92"},"10.1":{"release_date":"2010-11-09","release_notes":"https://dev.opera.com/blog/opera-mobile-10-1-beta-for-android-is-here/","status":"retired","engine":"Presto","engine_version":"2.5"},"11.1":{"release_date":"2011-06-30","release_notes":"https://dev.opera.com/blog/opera-mobile-11-1-new-features-and-additions/","status":"retired","engine":"Presto","engine_version":"2.8"},"11.5":{"release_date":"2011-10-12","status":"retired","engine":"Presto","engine_version":"2.9"},"12.1":{"release_date":"2012-10-09","release_notes":"https://dev.opera.com/blog/opera-mobile-12-1-with-spdy-web-sockets-flexbox-and-more/","status":"retired","engine":"Presto","engine_version":"2.11"}}},"safari":{"name":"Safari","preview_name":"TP","releases":{"1":{"release_date":"2003-06-23","status":"retired","engine":"WebKit","engine_version":"85"},"2":{"release_date":"2005-04-29","status":"retired","engine":"WebKit","engine_version":"412"},"3":{"release_date":"2007-10-26","status":"retired","engine":"WebKit","engine_version":"523.10"},"4":{"release_date":"2009-06-08","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_4_0.html","status":"retired","engine":"WebKit","engine_version":"530.17"},"5":{"release_date":"2010-06-07","status":"retired","engine":"WebKit","engine_version":"533.16"},"6":{"release_date":"2012-07-25","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_6_0.html","status":"retired","engine":"WebKit","engine_version":"536.25"},"7":{"release_date":"2013-10-22","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_7_0.html","status":"retired","engine":"WebKit","engine_version":"537.71"},"8":{"release_date":"2014-10-16","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_8_0.html","status":"retired","engine":"WebKit","engine_version":"538.35"},"9":{"release_date":"2015-09-30","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_9_0.html","status":"retired","engine":"WebKit","engine_version":"601.1.56"},"10":{"release_date":"2016-09-20","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html","status":"retired","engine":"WebKit","engine_version":"602.1.50"},"11":{"release_date":"2017-09-19","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Safari_11_0/Safari_11_0.html","status":"retired","engine":"WebKit","engine_version":"604.2.4"},"12":{"release_date":"2018-09-24","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_release_notes","status":"retired","engine":"WebKit","engine_version":"606.1.36"},"13":{"release_date":"2019-09-19","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_13_release_notes","status":"retired","engine":"WebKit","engine_version":"608.2.11"},"14":{"release_date":"2020-09-16","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14-release-notes","status":"retired","engine":"WebKit","engine_version":"610.1.28"},"15":{"release_date":"2021-09-20","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-15-release-notes","status":"retired","engine":"WebKit","engine_version":"612.1.29"},"1.1":{"release_date":"2003-10-24","status":"retired","engine":"WebKit","engine_version":"100"},"1.2":{"release_date":"2004-02-02","status":"retired","engine":"WebKit","engine_version":"125"},"1.3":{"release_date":"2005-04-15","status":"retired","engine":"WebKit","engine_version":"312"},"3.1":{"release_date":"2008-03-18","status":"retired","engine":"WebKit","engine_version":"525.13"},"5.1":{"release_date":"2011-07-20","status":"retired","engine":"WebKit","engine_version":"534.48"},"9.1":{"release_date":"2016-03-21","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_9_1.html","status":"retired","engine":"WebKit","engine_version":"601.5.17"},"10.1":{"release_date":"2017-03-27","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_1.html","status":"retired","engine":"WebKit","engine_version":"603.2.1"},"11.1":{"release_date":"2018-04-12","release_notes":"https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_11_1.html","status":"retired","engine":"WebKit","engine_version":"605.1.33"},"12.1":{"release_date":"2019-03-25","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_1_release_notes","status":"retired","engine":"WebKit","engine_version":"607.1.40"},"13.1":{"release_date":"2020-03-24","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-13_1-release_notes","status":"retired","engine":"WebKit","engine_version":"609.1.20"},"14.1":{"release_date":"2021-04-26","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14_1-release-notes","status":"retired","engine":"WebKit","engine_version":"611.1.21"},"15.1":{"release_date":"2021-10-25","status":"retired","engine":"WebKit","engine_version":"612.2.9"},"15.2":{"release_date":"2021-12-13","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-15_2-release-notes","status":"current","engine":"WebKit","engine_version":"612.3.6"}}},"safari_ios":{"name":"Safari on iOS","releases":{"1":{"status":"retired","engine":"WebKit","engine_version":"522.11","release_date":"2007-06-29"},"2":{"status":"retired","engine":"WebKit","engine_version":"525.18","release_date":"2008-07-11"},"3":{"status":"retired","engine":"WebKit","engine_version":"528.18","release_date":"2009-06-17"},"4":{"status":"retired","engine":"WebKit","engine_version":"532.9","release_date":"2010-06-21"},"5":{"status":"retired","engine":"WebKit","engine_version":"534.46","release_date":"2011-10-12"},"6":{"status":"retired","engine":"WebKit","engine_version":"536.26","release_date":"2012-09-10"},"7":{"status":"retired","engine":"WebKit","engine_version":"537.51","release_date":"2013-09-18"},"8":{"status":"retired","engine":"WebKit","engine_version":"600.1.4","release_date":"2014-09-17"},"9":{"status":"retired","engine":"WebKit","engine_version":"601.1.56","release_date":"2015-09-16"},"10":{"status":"retired","engine":"WebKit","engine_version":"602.1.50","release_date":"2016-09-13"},"11":{"status":"retired","engine":"WebKit","engine_version":"604.2.4","release_date":"2017-09-19"},"12":{"release_date":"2018-09-17","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_release_notes","status":"retired","engine":"WebKit","engine_version":"606.1.36"},"13":{"release_date":"2019-09-19","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_13_release_notes","status":"retired","engine":"WebKit","engine_version":"608.2.11"},"14":{"release_date":"2020-09-16","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14-release-notes","status":"retired","engine":"WebKit","engine_version":"610.1.28"},"15":{"release_date":"2021-09-20","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-15-release-notes","status":"retired","engine":"WebKit","engine_version":"612.1.27"},"3.2":{"status":"retired","engine":"WebKit","engine_version":"531.21","release_date":"2010-04-03"},"4.2":{"status":"retired","engine":"WebKit","engine_version":"533.17","release_date":"2010-11-22"},"9.3":{"status":"retired","engine":"WebKit","engine_version":"601.5.17","release_date":"2016-03-21"},"10.3":{"status":"retired","engine":"WebKit","engine_version":"603.2.1","release_date":"2017-03-27"},"11.3":{"status":"retired","engine":"WebKit","engine_version":"605.1.33","release_date":"2018-03-29"},"12.2":{"release_date":"2019-03-25","release_notes":"https://developer.apple.com/documentation/safari_release_notes/safari_12_1_release_notes","status":"retired","engine":"WebKit","engine_version":"607.1.40"},"13.4":{"release_date":"2020-03-24","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-13_1-release_notes","status":"retired","engine":"WebKit","engine_version":"609.1.20"},"14.5":{"release_date":"2021-04-26","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-14_1-release-notes","status":"retired","engine":"WebKit","engine_version":"611.1.21"},"15.1":{"release_date":"2021-10-25","status":"retired","engine":"WebKit","engine_version":"612.2.9"},"15.2":{"release_date":"2021-12-13","release_notes":"https://developer.apple.com/documentation/safari-release-notes/safari-15_2-release-notes","status":"current","engine":"WebKit","engine_version":"612.3.6"}}},"samsunginternet_android":{"name":"Samsung Internet","accepts_flags":false,"releases":{"1.0":{"release_date":"2013-04-27","status":"retired","engine":"WebKit","engine_version":"535.19"},"1.5":{"release_date":"2013-09-25","status":"retired","engine":"Blink","engine_version":"28"},"1.6":{"release_date":"2014-04-11","status":"retired","engine":"Blink","engine_version":"28"},"2.0":{"release_date":"2014-10-17","status":"retired","engine":"Blink","engine_version":"34"},"2.1":{"release_date":"2015-01-07","status":"retired","engine":"Blink","engine_version":"34"},"3.0":{"release_date":"2015-04-10","status":"retired","engine":"Blink","engine_version":"38"},"3.2":{"release_date":"2015-08-24","status":"retired","engine":"Blink","engine_version":"38"},"4.0":{"release_date":"2016-03-11","status":"retired","engine":"Blink","engine_version":"44"},"4.2":{"release_date":"2016-08-02","status":"retired","engine":"Blink","engine_version":"44"},"5.0":{"release_date":"2016-12-15","status":"retired","engine":"Blink","engine_version":"51"},"5.2":{"release_date":"2017-04-21","status":"retired","engine":"Blink","engine_version":"51"},"5.4":{"release_date":"2017-05-17","status":"retired","engine":"Blink","engine_version":"51"},"6.0":{"release_date":"2017-08-23","status":"retired","engine":"Blink","engine_version":"56"},"6.2":{"release_date":"2017-10-26","status":"retired","engine":"Blink","engine_version":"56"},"6.4":{"release_date":"2018-02-19","status":"retired","engine":"Blink","engine_version":"56"},"7.0":{"release_date":"2018-03-16","status":"retired","engine":"Blink","engine_version":"59"},"7.2":{"release_date":"2018-06-20","status":"retired","engine":"Blink","engine_version":"59"},"7.4":{"release_date":"2018-09-12","status":"retired","engine":"Blink","engine_version":"59"},"8.0":{"release_date":"2018-07-18","status":"retired","engine":"Blink","engine_version":"63"},"8.2":{"release_date":"2018-12-21","status":"retired","engine":"Blink","engine_version":"63"},"9.0":{"release_date":"2018-09-15","status":"retired","engine":"Blink","engine_version":"67"},"9.2":{"release_date":"2019-04-02","status":"retired","engine":"Blink","engine_version":"67"},"9.4":{"release_date":"2019-07-25","status":"retired","engine":"Blink","engine_version":"67"},"10.0":{"release_date":"2019-08-22","status":"retired","engine":"Blink","engine_version":"71"},"10.2":{"release_date":"2019-10-09","status":"retired","engine":"Blink","engine_version":"71"},"11.0":{"release_date":"2019-12-05","status":"retired","engine":"Blink","engine_version":"75"},"11.2":{"release_date":"2020-03-22","status":"retired","engine":"Blink","engine_version":"75"},"12.0":{"release_date":"2020-06-19","status":"retired","engine":"Blink","engine_version":"79"},"12.1":{"release_date":"2020-07-07","status":"retired","engine":"Blink","engine_version":"79"},"13.0":{"release_date":"2020-12-02","status":"retired","engine":"Blink","engine_version":"83"},"13.2":{"release_date":"2021-01-20","status":"retired","engine":"Blink","engine_version":"83"},"14.0":{"release_date":"2021-04-17","status":"retired","engine":"Blink","engine_version":"87"},"14.2":{"release_date":"2021-06-25","status":"retired","engine":"Blink","engine_version":"87"},"15.0":{"release_date":"2021-08-13","status":"retired","engine":"Blink","engine_version":"90"},"16.0":{"release_date":"2021-11-25","status":"current","engine":"Blink","engine_version":"92"}}},"webview_android":{"name":"WebView Android","accepts_flags":false,"releases":{"1":{"release_date":"2008-09-23","release_notes":"https://en.wikipedia.org/wiki/Android_version_history#Android_1.0_(API_1)","status":"retired","engine":"WebKit","engine_version":"523.12"},"2":{"release_date":"2009-10-26","release_notes":"https://en.wikipedia.org/wiki/Android_Eclair","status":"retired","engine":"WebKit","engine_version":"530.17"},"3":{"release_date":"2011-02-22","release_notes":"https://en.wikipedia.org/wiki/Android_Honeycomb","status":"retired","engine":"WebKit","engine_version":"534.13"},"4":{"release_date":"2011-10-18","release_notes":"https://en.wikipedia.org/wiki/Android_Ice_Cream_Sandwich","status":"retired","engine":"WebKit","engine_version":"534.30"},"37":{"release_date":"2014-09-03","release_notes":"https://chromereleases.googleblog.com/2014/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"37"},"38":{"release_date":"2014-10-08","release_notes":"https://chromereleases.googleblog.com/2014/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"38"},"39":{"release_date":"2014-11-12","release_notes":"https://chromereleases.googleblog.com/2014/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"39"},"40":{"release_date":"2015-01-21","release_notes":"https://chromereleases.googleblog.com/2015/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"40"},"41":{"release_date":"2015-03-11","release_notes":"https://chromereleases.googleblog.com/2015/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"41"},"42":{"release_date":"2015-04-15","release_notes":"https://chromereleases.googleblog.com/2015/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"42"},"43":{"release_date":"2015-05-27","release_notes":"https://chromereleases.googleblog.com/2015/05/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"43"},"44":{"release_date":"2015-07-29","release_notes":"https://chromereleases.googleblog.com/2015/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"44"},"45":{"release_date":"2015-09-01","release_notes":"https://chromereleases.googleblog.com/2015/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"45"},"46":{"release_date":"2015-10-14","release_notes":"https://chromereleases.googleblog.com/2015/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"46"},"47":{"release_date":"2015-12-02","release_notes":"https://chromereleases.googleblog.com/2015/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"47"},"48":{"release_date":"2016-01-26","status":"retired","engine":"Blink","engine_version":"48"},"49":{"release_date":"2016-03-09","release_notes":"https://chromereleases.googleblog.com/2016/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"49"},"50":{"release_date":"2016-04-13","status":"retired","engine":"Blink","engine_version":"50"},"51":{"release_date":"2016-06-08","release_notes":"https://chromereleases.googleblog.com/2016/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"51"},"52":{"release_date":"2016-07-27","release_notes":"https://chromereleases.googleblog.com/2016/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"52"},"53":{"release_date":"2016-09-07","release_notes":"https://chromereleases.googleblog.com/2016/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"53"},"54":{"release_date":"2016-10-19","release_notes":"https://chromereleases.googleblog.com/2016/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"54"},"55":{"release_date":"2016-12-06","release_notes":"https://chromereleases.googleblog.com/2016/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"55"},"56":{"release_date":"2017-02-01","release_notes":"https://chromereleases.googleblog.com/2017/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"56"},"57":{"release_date":"2017-03-16","release_notes":"https://chromereleases.googleblog.com/2017/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"57"},"58":{"release_date":"2017-04-25","release_notes":"https://chromereleases.googleblog.com/2017/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"58"},"59":{"release_date":"2017-06-06","release_notes":"https://chromereleases.googleblog.com/2017/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"59"},"60":{"release_date":"2017-08-01","release_notes":"https://chromereleases.googleblog.com/2017/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"60"},"61":{"release_date":"2017-09-05","release_notes":"https://chromereleases.googleblog.com/2017/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"61"},"62":{"release_date":"2017-10-24","release_notes":"https://chromereleases.googleblog.com/2017/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"62"},"63":{"release_date":"2017-12-05","release_notes":"https://chromereleases.googleblog.com/2017/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"63"},"64":{"release_date":"2018-01-23","release_notes":"https://chromereleases.googleblog.com/2018/01/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"64"},"65":{"release_date":"2017-03-06","release_notes":"https://chromereleases.googleblog.com/2018/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"65"},"66":{"release_date":"2017-04-17","release_notes":"https://chromereleases.googleblog.com/2018/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"66"},"67":{"release_date":"2018-05-31","release_notes":"https://chromereleases.googleblog.com/2018/05/chrome-for-android-update_31.html","status":"retired","engine":"Blink","engine_version":"67"},"68":{"release_date":"2018-07-24","release_notes":"https://chromereleases.googleblog.com/2018/07/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"68"},"69":{"release_date":"2018-09-04","release_notes":"https://chromereleases.googleblog.com/2018/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"69"},"70":{"release_date":"2018-10-17","release_notes":"https://chromereleases.googleblog.com/2018/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"70"},"71":{"release_date":"2018-12-04","release_notes":"https://chromereleases.googleblog.com/2018/12/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"71"},"72":{"release_date":"2019-01-29","release_notes":"https://chromereleases.googleblog.com/2019/01/chrome-for-android-update_29.html","status":"retired","engine":"Blink","engine_version":"72"},"73":{"release_date":"2019-03-12","release_notes":"https://chromereleases.googleblog.com/2019/03/chrome-for-android-update_12.html","status":"retired","engine":"Blink","engine_version":"73"},"74":{"release_date":"2019-04-24","release_notes":"https://chromereleases.googleblog.com/2019/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"74"},"75":{"release_date":"2019-06-04","release_notes":"https://chromereleases.googleblog.com/2019/06/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"75"},"76":{"release_date":"2019-07-30","release_notes":"https://chromereleases.googleblog.com/2019/07/chrome-for-android-update_30.html","status":"retired","engine":"Blink","engine_version":"76"},"77":{"release_date":"2019-09-10","release_notes":"https://chromereleases.googleblog.com/2019/09/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"77"},"78":{"release_date":"2019-10-22","release_notes":"https://chromereleases.googleblog.com/2019/10/chrome-for-android-update_22.html","status":"retired","engine":"Blink","engine_version":"78"},"79":{"release_date":"2019-12-17","release_notes":"https://chromereleases.googleblog.com/2019/12/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"79"},"80":{"release_date":"2020-02-04","release_notes":"https://chromereleases.googleblog.com/2020/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"80"},"81":{"release_date":"2020-04-07","release_notes":"https://chromereleases.googleblog.com/2020/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"81"},"83":{"release_date":"2020-05-19","release_notes":"https://chromereleases.googleblog.com/2020/05/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"83"},"84":{"release_date":"2020-07-27","release_notes":"https://chromereleases.googleblog.com/2020/07/chrome-for-android-update_27.html","status":"retired","engine":"Blink","engine_version":"84"},"85":{"release_date":"2020-08-25","release_notes":"https://chromereleases.googleblog.com/2020/08/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"85"},"86":{"release_date":"2020-10-20","release_notes":"https://chromereleases.googleblog.com/2020/10/chrome-for-android-update_20.html","status":"retired","engine":"Blink","engine_version":"86"},"87":{"release_date":"2020-11-17","release_notes":"https://chromereleases.googleblog.com/2020/11/chrome-for-android-update_17.html","status":"retired","engine":"Blink","engine_version":"87"},"88":{"release_date":"2021-01-19","release_notes":"https://chromereleases.googleblog.com/2021/01/chrome-for-android-update_19.html","status":"retired","engine":"Blink","engine_version":"88"},"89":{"release_date":"2021-03-02","release_notes":"https://chromereleases.googleblog.com/2021/03/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"89"},"90":{"release_date":"2021-04-13","release_notes":"https://chromereleases.googleblog.com/2021/04/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"90"},"91":{"release_date":"2021-05-25","release_notes":"https://chromereleases.googleblog.com/2021/05/chrome-for-android-update_01607414128.html","status":"retired","engine":"Blink","engine_version":"91"},"92":{"release_date":"2021-07-20","release_notes":"https://chromereleases.googleblog.com/2021/07/chrome-for-android-update_01500789893.html","status":"retired","engine":"Blink","engine_version":"92"},"93":{"release_date":"2021-08-31","release_notes":"https://chromereleases.googleblog.com/2021/08/chrome-for-android-update_0881967577.html","status":"retired","engine":"Blink","engine_version":"93"},"94":{"release_date":"2021-09-21","release_notes":"https://chromereleases.googleblog.com/2021/09/chrome-for-android-update_21.html","status":"retired","engine":"Blink","engine_version":"94"},"95":{"release_date":"2021-10-19","release_notes":"https://chromereleases.googleblog.com/2021/10/chrome-for-android-update_01703513036.html","status":"retired","engine":"Blink","engine_version":"95"},"96":{"release_date":"2021-11-15","release_notes":"https://chromereleases.googleblog.com/2021/11/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"96"},"97":{"release_date":"2022-01-04","release_notes":"https://chromereleases.googleblog.com/2022/01/chrome-for-android-update.html","status":"current","engine":"Blink","engine_version":"97"},"98":{"release_date":"2022-02-01","status":"beta","engine":"Blink","engine_version":"98"},"99":{"release_date":"2022-03-01","status":"nightly","engine":"Blink","engine_version":"99"},"1.5":{"release_date":"2009-04-27","release_notes":"https://en.wikipedia.org/wiki/Android_Cupcake","status":"retired","engine":"WebKit","engine_version":"525.20"},"2.2":{"release_date":"2010-05-20","release_notes":"https://en.wikipedia.org/wiki/Android_Froyo","status":"retired","engine":"WebKit","engine_version":"533.1"},"4.4":{"release_date":"2013-12-09","release_notes":"https://chromereleases.googleblog.com/2013/10/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"30"},"4.4.3":{"release_date":"2014-06-02","release_notes":"https://chromereleases.googleblog.com/2014/02/chrome-for-android-update.html","status":"retired","engine":"Blink","engine_version":"33"}}}}=========taskcluster/scripts/misc/android-gradle-dependencies.sh========--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/taskcluster/scripts/misc/android-gradle-dependencies.sh+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/taskcluster/scripts/misc/android-gradle-dependencies.sh@@ -8,13 +8,14 @@ cd $GECKO_PATH-# Needed for Nexus-export PATH=$JAVA_HOME/bin:$PATH+# Nexus needs Java 8+export PATH=$MOZ_FETCHES_DIR/jdk-8/bin:$PATH . taskcluster/scripts/misc/android-gradle-dependencies/before.sh export MOZCONFIG=mobile/android/config/mozconfigs/android-arm-gradle-dependencies/nightly ./mach build+./mach gradle downloadDependencies ./mach android gradle-dependencies . taskcluster/scripts/misc/android-gradle-dependencies/after.sh
Error: {"error":{"message":"This model's maximum context length is 65536 tokens. However, you requested 85704 tokens (77512 in the messages, 8192 in the completion). Please reduce the length of the messages or completion.","type":"invalid_request_error","param":null,"code":"invalid_request_error"}}
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js@@ -176,9 +176,11 @@ if (props.template === "return_to_amo") { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ReturnToAMO__WEBPACK_IMPORTED_MODULE_3__["ReturnToAMO"], { message_id: props.messageId,+ type: props.type, name: props.name, url: props.url,- iconURL: props.iconURL+ iconURL: props.iconURL,+ metricsFlowUri: this.state.metricsFlowUri }); }@@ -692,20 +694,31 @@ }; const DEFAULT_RTAMO_CONTENT = { template: "return_to_amo",+ utm_term: "rtamo",+ totalNumberOfScreens: 1,+ order: 0, content: {- header: {- string_id: "onboarding-welcome-header"+ hero_text: {+ string_id: "mr1-welcome-screen-hero-text"+ },+ title: {+ string_id: "return-to-amo-subtitle" }, subtitle: {- string_id: "return-to-amo-subtitle"- },- text: { string_id: "return-to-amo-addon-title" },+ help_text: {+ text: {+ string_id: "mr1-onboarding-welcome-image-caption"+ }+ },+ hideLogo: true,+ background_url: "chrome://activity-stream/content/data/content/assets/proton-bkg.avif", primary_button: { label: { string_id: "return-to-amo-add-extension-label" },+ source_id: "ADD_EXTENSION_BUTTON", action: { type: "INSTALL_ADDON_FROM_URL", data: {@@ -714,13 +727,26 @@ } } },- startButton: {+ secondary_button: { label: { string_id: "onboarding-not-now-button-label" },- message_id: "RTAMO_START_BROWSING_BUTTON",+ source_id: "RTAMO_START_BROWSING_BUTTON", action: { type: "OPEN_AWESOME_BAR"+ }+ },+ secondary_button_top: {+ label: {+ string_id: "mr1-onboarding-sign-in-button-label"+ },+ source_id: "RTAMO_FXA_SIGNIN_BUTTON",+ action: {+ data: {+ entrypoint: "activity-stream-firstrun"+ },+ type: "SHOW_FIREFOX_ACCOUNTS",+ addFlowParams: true } } }@@ -756,6 +782,7 @@ const { autoClose, content,+ isRtamo, totalNumberOfScreens: total } = this.props; const windowObj = this.props.windowObj || window;@@ -793,7 +820,7 @@ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: "spacer-top" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__["Localized"], {- text: content.subtitle+ text: content.hero_text }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h1", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: "spacer-bottom" })), content.help_text && content.help_text.text ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__["Localized"], {@@ -820,7 +847,13 @@ className: `main-content ${isLastScreen && autoClose ? "no-steps" : ""}` }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: `brand-logo ${content.hideLogo ? "hide" : ""}`- }), isLastScreen && content.hasFancyTitle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {+ className: `${isRtamo ? "rtamo-icon" : "hide-rtamo-icon"}`+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {+ src: this.props.iconURL,+ role: "presentation",+ alt: ""+ })), isLastScreen && content.hasFancyTitle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: "confetti" }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: "main-content-inner"@@ -830,9 +863,13 @@ text: content.title }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h1", { id: "mainContentHeader"- })), !isWelcomeScreen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__["Localized"], {+ })), content.subtitle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__["Localized"], { text: content.subtitle- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h2", null)) : null), content.tiles && content.tiles.type === "colorway" && content.tiles.colorways ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Colorways__WEBPACK_IMPORTED_MODULE_2__["Colorways"], {+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h2", {+ "data-l10n-args": JSON.stringify({+ "addon-name": this.props.addonName+ })+ })) : null), content.tiles && content.tiles.type === "colorway" && content.tiles.colorways ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Colorways__WEBPACK_IMPORTED_MODULE_2__["Colorways"], { content: content, activeTheme: this.props.activeTheme, handleAction: this.props.handleAction@@ -1159,107 +1196,115 @@ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);-/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);+/* harmony import */ var _MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);+/* harmony import */ var _asrouter_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9); /* 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/. */+ class ReturnToAMO extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent { constructor(props) { super(props);- this.onClickAddExtension = this.onClickAddExtension.bind(this);- this.handleStartBtnClick = this.handleStartBtnClick.bind(this);- }-- onClickAddExtension() {- var _content$primary_butt, _content$primary_butt2;-+ this.fetchFlowParams = this.fetchFlowParams.bind(this);+ this.handleAction = this.handleAction.bind(this);+ }++ async fetchFlowParams() {+ if (this.props.metricsFlowUri) {+ this.setState({+ flowParams: await _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__["AboutWelcomeUtils"].fetchFlowParams(this.props.metricsFlowUri)+ });+ }+ }++ componentDidUpdate() {+ this.fetchFlowParams();+ }++ handleAction(event) { const { content, message_id,- url+ url,+ utm_term } = this.props;-- if (!(content !== null && content !== void 0 && (_content$primary_butt = content.primary_button) !== null && _content$primary_butt !== void 0 && (_content$primary_butt2 = _content$primary_butt.action) !== null && _content$primary_butt2 !== void 0 && _content$primary_butt2.data)) {- return;- } // Set add-on url in action.data.url property from JSON--- content.primary_button.action.data.url = url;- _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__["AboutWelcomeUtils"].handleUserAction(content.primary_button.action);- const ping = {- event: "INSTALL",- event_context: {- source: "ADD_EXTENSION_BUTTON",- page: "about:welcome"- },- message_id- };- window.AWSendEventTelemetry(ping);- }-- handleStartBtnClick() {+ let {+ action,+ source_id+ } = content[event.currentTarget.value];+ let {+ type,+ data+ } = action;++ if (type === "INSTALL_ADDON_FROM_URL") {+ if (!data) {+ return;+ } // Set add-on url in action.data.url property from JSON+++ data = { ...data,+ url+ };+ } else if (type === "SHOW_FIREFOX_ACCOUNTS") {+ let params = { ..._asrouter_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_3__["BASE_PARAMS"],+ utm_term: `aboutwelcome-${utm_term}-screen`+ };++ if (action.addFlowParams && this.state.flowParams) {+ params = { ...params,+ ...this.state.flowParams+ };+ }++ data = { ...data,+ extraParams: params+ };+ }++ _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__["AboutWelcomeUtils"].handleUserAction({+ type,+ data+ });+ _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__["AboutWelcomeUtils"].sendActionTelemetry(message_id, source_id);+ }++ render() { const { content,- message_id- } = this.props;- _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__["AboutWelcomeUtils"].handleUserAction(content.startButton.action);- const ping = {- event: "CLICK_BUTTON",- event_context: {- source: content.startButton.message_id,- page: "about:welcome"- },- message_id- };- window.AWSendEventTelemetry(ping);- }-- render() {- const {- content+ type } = this.props; if (!content) { return null;+ }++ if (content !== null && content !== void 0 && content.primary_button.label) {+ content.primary_button.label.string_id = type.includes("theme") ? "return-to-amo-add-theme-label" : "return-to-amo-add-extension-label"; } // For experiments, when needed below rendered UI allows settings hard coded strings // directly inside JSON except for ReturnToAMOText which picks add-on name and icon from fluent string return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {- className: "outer-wrapper onboardingContainer rtamo"- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("main", {- className: "screen"- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {- className: "brand-logo"- }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {- className: "welcome-text"- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__["Localized"], {- text: content.subtitle- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h1", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__["Localized"], {- text: content.text- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h2", {- "data-l10n-args": this.props.name ? JSON.stringify({- "addon-name": this.props.name- }) : null- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", {- "data-l10n-name": "icon",- src: this.props.iconURL,- role: "presentation",- alt: ""- }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__["Localized"], {- text: content.primary_button.label- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {- onClick: this.onClickAddExtension,- className: "primary"- })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__["Localized"], {- text: content.startButton.label- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {- onClick: this.handleStartBtnClick,- className: "secondary"- })))));+ className: "outer-wrapper onboardingContainer proton",+ style: {+ backgroundImage: `url(${content.background_url})`+ }+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_2__["MultiStageProtonScreen"], {+ content: content,+ isRtamo: true,+ id: this.props.messageId,+ order: this.props.order,+ totalNumberOfScreens: this.props.totalNumberOfScreens,+ autoClose: this.props.autoClose,+ iconURL: this.props.iconURL,+ addonName: this.props.name,+ handleAction: this.handleAction,+ addExtension: this.onClickAddExtension+ })); } }
I'll analyze the code diff for security vulnerabilities following the specified format. 1. Vulnerability Existed: not sure [XSS Potential] [browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js] [Lines 847-852] Old Code: (Not present in old version) Fixed Code: ```js /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: `${isRtamo ? "rtamo-icon" : "hide-rtamo-icon"}` }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", { src: this.props.iconURL, role: "presentation", alt: "" })) ``` Additional Details: The new code adds an image element with a dynamic src attribute (this.props.iconURL). While role="presentation" and alt="" are good practices, there's no visible sanitization of the URL, which could potentially lead to XSS if the URL is attacker-controlled. 2. Vulnerability Existed: not sure [Insecure Object Assignment] [browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js] [Lines 1250-1252] Old Code: (Not present in old version) Fixed Code: ```js data = { ...data, url }; ``` Additional Details: The spread operator is used to merge objects, which could potentially lead to prototype pollution if the data object contains untrusted input. However, the context suggests this is for extension installation URLs, so the risk may be limited. 3. Vulnerability Existed: not sure [Insecure Dynamic String Interpolation] [browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js] [Lines 1196-1199] Old Code: (Not present in old version) Fixed Code: ```js return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: "outer-wrapper onboardingContainer proton", style: { backgroundImage: `url(${content.background_url})` } } ``` Additional Details: The background_url is interpolated directly into a style attribute without visible sanitization, which could potentially lead to CSS injection if the URL is attacker-controlled. Note: While I've identified several potential security concerns, the actual risk depends on how these props (iconURL, background_url, etc.) are sourced and validated elsewhere in the application. The changes appear to be part of a feature enhancement rather than explicit security fixes.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/shadows/2d.shadow.image.alpha.html+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/shadows/2d.shadow.image.alpha.html@@ -17,8 +17,8 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); ctx.fillStyle = '#f00'; ctx.fillRect(0, 0, 100, 50);@@ -36,7 +36,7 @@ promise.then(function(response) { createImageBitmap(response).then(bitmap => { ctx.drawImage(bitmap, 0, -50);- _assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2);+ _assertPixelApprox(canvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); }, t_fail); }).then(t_pass, t_fail);
Based on the provided code diff, I don't see any security vulnerabilities being fixed. The changes appear to be purely variable renaming and don't involve any security-related modifications. Here's the analysis: 1. Vulnerability Existed: no Variable Renaming [File] [Lines 17-18, 36] Old Code: ```javascript var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); ``` Fixed Code: ```javascript var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); ``` 2. Vulnerability Existed: no Variable Renaming [File] [Line 36] Old Code: ```javascript _assertPixelApprox(offscreenCanvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); ``` Fixed Code: ```javascript _assertPixelApprox(canvas, 50,25, 127,0,127,255, "50,25", "127,0,127,255", 2); ``` The changes simply rename the variable `offscreenCanvas` to `canvas` for consistency or clarity, but don't address any security issues. No known vulnerabilities are being patched in this diff.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js@@ -13,8 +13,8 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); var promise = new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest();@@ -32,10 +32,10 @@ ctx.fillRect(0, 0, 100, 50); ctx.translate(-128, -78); ctx.fillRect(128, 78, 100, 50);- _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255");- _assertPixel(offscreenCanvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255");- _assertPixel(offscreenCanvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255");- _assertPixel(offscreenCanvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255");+ _assertPixel(canvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255");+ _assertPixel(canvas, 98,1, 0,255,0,255, "98,1", "0,255,0,255");+ _assertPixel(canvas, 1,48, 0,255,0,255, "1,48", "0,255,0,255");+ _assertPixel(canvas, 98,48, 0,255,0,255, "98,48", "0,255,0,255"); }, t_fail); }).then(t_pass, t_fail);
Based on the provided code diff, I don't see any security vulnerabilities being fixed. The changes appear to be purely variable renaming (from `offscreenCanvas` to `canvas`) and corresponding updates to the assertions. Here's the analysis: Vulnerability Existed: no No security vulnerability found File: testing/web-platform/tests/html/canvas/offscreen/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js Old Code: var offscreenCanvas = new OffscreenCanvas(100, 50); Fixed Code: var canvas = new OffscreenCanvas(100, 50); Vulnerability Existed: no No security vulnerability found File: testing/web-platform/tests/html/canvas/offscreen/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.worker.js Old Code: _assertPixel(offscreenCanvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); Fixed Code: _assertPixel(canvas, 1,1, 0,255,0,255, "1,1", "0,255,0,255"); The changes are consistent throughout the file, simply renaming the variable and updating all references to it. There are no security-related changes in this diff.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html@@ -17,14 +17,14 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); ctx.fillStyle = '#f00'; ctx.fillStyle = 'TrAnSpArEnT'; ctx.fillRect(0, 0, 100, 50);-_assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0");+_assertPixel(canvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); t.done(); });
Analysis of the provided code diff: 1. Vulnerability Existed: no No specific vulnerability found [File] [Lines 17-25] [Old Code] ```javascript var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); ctx.fillStyle = '#f00'; ctx.fillStyle = 'TrAnSpArEnT'; ctx.fillRect(0, 0, 100, 50); _assertPixel(offscreenCanvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); ``` [Fixed Code] ```javascript var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); ctx.fillStyle = '#f00'; ctx.fillStyle = 'TrAnSpArEnT'; ctx.fillRect(0, 0, 100, 50); _assertPixel(canvas, 50,25, 0,0,0,0, "50,25", "0,0,0,0"); ``` Additional Details: The changes appear to be purely variable renaming (from `offscreenCanvas` to `canvas`) with no security implications. The functionality remains identical. No security vulnerability was fixed in this change. Note: This diff shows only a refactoring change with no apparent security impact. The test case continues to verify the same behavior (transparent fill style handling) with different variable names.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/js/src/jit/arm64/vixl/MozSimulator-vixl.cpp+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/js/src/jit/arm64/vixl/MozSimulator-vixl.cpp@@ -542,6 +542,47 @@ int32_t, int32_t); typedef int32_t (*Prototype_Int32_GeneralInt32Int32Int32Int32General)(int64_t,+ int32_t,+ int32_t,+ int32_t,+ int32_t,+ int64_t);+typedef int32_t (*Prototype_Int32_GeneralInt32Int32Int32Int32Int32Int32General)(int64_t,+ int32_t,+ int32_t,+ int32_t,+ int32_t,+ int32_t,+ int32_t,+ int64_t);+typedef int32_t (*Prototype_Int32_GeneralInt32Float32Float32Int32Int32Int32General)(int64_t,+ int32_t,+ float,+ float,+ int32_t,+ int32_t,+ int32_t,+ int64_t);+typedef int32_t (*Prototype_Int32_GeneralInt32Float32Float32Float32Float32Int32Int32Int32Int32General)(int64_t,+ int32_t,+ float,+ float,+ float,+ float,+ int32_t,+ int32_t,+ int32_t,+ int32_t,+ int64_t);+typedef int32_t (*Prototype_Int32_GeneralInt32Float32Float32Int32Float32Float32Int32Float32Int32Int32Int32Int32General)(int64_t,+ int32_t,+ float,+ float,+ int32_t,+ float,+ float,+ int32_t,+ float, int32_t, int32_t, int32_t,@@ -650,12 +691,16 @@ int64_t x5 = xreg(5); int64_t x6 = xreg(6); int64_t x7 = xreg(7);+ int64_t x8 = xreg(8); double d0 = dreg(0); double d1 = dreg(1); double d2 = dreg(2); double d3 = dreg(3); float s0 = sreg(0); float s1 = sreg(1);+ float s2 = sreg(2);+ float s3 = sreg(3);+ float s4 = sreg(4); // Dispatch the call and set the return value. switch (redir->type()) {@@ -841,6 +886,34 @@ int32_t ret = reinterpret_cast<Prototype_Int32_GeneralInt32Int32Int32Int32General>( nativeFn)(x0, x1, x2, x3, x4, x5);+ setGPR32Result(ret);+ break;+ }+ case js::jit::Args_Int32_GeneralInt32Int32Int32Int32Int32Int32General: {+ int32_t ret =+ reinterpret_cast<Prototype_Int32_GeneralInt32Int32Int32Int32Int32Int32General>(+ nativeFn)(x0, x1, x2, x3, x4, x5, x6, x7);+ setGPR32Result(ret);+ break;+ }+ case js::jit::Args_Int32_GeneralInt32Float32Float32Int32Int32Int32General: {+ int32_t ret =+ reinterpret_cast<Prototype_Int32_GeneralInt32Float32Float32Int32Int32Int32General>(+ nativeFn)(x0, x1, s0, s1, x2, x3, x4, x5);+ setGPR32Result(ret);+ break;+ }+ case js::jit::Args_Int32_GeneralInt32Float32Float32Float32Float32Int32Int32Int32Int32General: {+ int32_t ret =+ reinterpret_cast<Prototype_Int32_GeneralInt32Float32Float32Float32Float32Int32Int32Int32Int32General>(+ nativeFn)(x0, x1, s0, s1, s2, s3, x2, x3, x4, x5, x6);+ setGPR32Result(ret);+ break;+ }+ case js::jit::Args_Int32_GeneralInt32Float32Float32Int32Float32Float32Int32Float32Int32Int32Int32Int32General: {+ int32_t ret =+ reinterpret_cast<Prototype_Int32_GeneralInt32Float32Float32Int32Float32Float32Int32Float32Int32Int32Int32Int32General>(+ nativeFn)(x0, x1, s0, s1, x2, s2, s3, x3, s4, x4, x5, x6, x7, x8); setGPR32Result(ret); break; }
After analyzing the provided code diff, I don't see any clear security vulnerabilities being fixed. The changes appear to be adding new function prototypes and corresponding case handlers for additional argument combinations in the ARM64 simulator. Here's my analysis: 1. Vulnerability Existed: no No specific vulnerability [File] js/src/jit/arm64/vixl/MozSimulator-vixl.cpp [Lines] 542-894 The changes are adding new function call prototypes and their handling cases, which appear to be feature additions rather than security fixes. The diff shows: 1. Addition of several new function pointer typedefs for different argument combinations 2. Addition of new register reads (x8, s2-s4) 3. Addition of new case handlers for these function types These changes appear to be extending the simulator's capability to handle more complex function call signatures, particularly those involving mixed integer and floating-point arguments. There's no obvious security vulnerability being addressed here, just expanded functionality. If I had to speculate about potential security implications (though not evident in the diff): - The changes could theoretically help prevent potential type confusion vulnerabilities by providing proper handling for more argument combinations - They might help ensure proper register state preservation across more complex function calls But these would be preventative measures rather than fixes for existing vulnerabilities.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/devtools/server/actors/inspector/event-collector.js+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/devtools/server/actors/inspector/event-collector.js@@ -385,9 +385,11 @@ } const eventInfo = {+ nsIEventListenerInfo: listener, capturing: listener.capturing, type: listener.type, handler: handler,+ enabled: listener.enabled, }; handlers.push(eventInfo);@@ -820,16 +822,20 @@ * * @param {DOMNode} node * The node for which events are to be gathered.- * @return {Array}+ * @return {Array<Object>} * An array containing objects in the following format: * {- * type: type, // e.g. "click"- * handler: handler, // The function called when event is triggered.- * tags: "jQuery", // Comma separated list of tags displayed- * // inside event bubble.- * hide: { // Flags for hiding certain properties.- * capturing: true,+ * {String} type: The event type, e.g. "click"+ * {Function} handler: The function called when event is triggered.+ * {Boolean} enabled: Whether the listener is enabled or not (event listeners can+ * be disabled via the inspector)+ * {String} tags: Comma separated list of tags displayed inside event bubble (e.g. "JQuery")+ * {Object} hide: Flags for hiding certain properties.+ * {Boolean} capturing * }+ * {Boolean} native+ * {String|undefined} sourceActor: The sourceActor id of the event listener+ * {nsIEventListenerInfo|undefined} nsIEventListenerInfo * } */ getEventListeners(node) {@@ -895,7 +901,10 @@ * hide: { * capturing: true * },- * native: false+ * native: false,+ * enabled: true+ * sourceActor: "sourceActor.1234",+ * nsIEventListenerInfo: nsIEventListenerInfo {…}, * } */ // eslint-disable-next-line complexity@@ -922,7 +931,7 @@ const override = listener.override || {}; const tags = listener.tags || ""; const type = listener.type || "";- let isScriptBoundToNonScriptElement = false;+ const enabled = !!listener.enabled; let functionSource = handler.toString(); let line = 0; let column = null;@@ -957,13 +966,6 @@ if (script) { const scriptSource = script.source.text;-- // Scripts are provided via script tags. If it wasn't provided by a- // script tag it must be a DOM0 event.- if (script.source.element) {- isScriptBoundToNonScriptElement =- script.source.element.class !== "HTMLScriptElement";- } line = script.startLine; column = script.startColumn;@@ -1022,9 +1024,7 @@ } else { origin = url +- (isScriptBoundToNonScriptElement || line === 0- ? ""- : ":" + line + (column === null ? "" : ":" + column));+ (line ? ":" + line + (column === null ? "" : ":" + column) : ""); } eventObj = {@@ -1039,12 +1039,14 @@ hide: typeof override.hide !== "undefined" ? override.hide : hide, native, sourceActor,+ nsIEventListenerInfo: listener.nsIEventListenerInfo,+ enabled, }; // Hide the debugger icon for DOM0 and native listeners. DOM0 listeners are // generated dynamically from e.g. an onclick="" attribute so the script // doesn't actually exist.- if (native || isScriptBoundToNonScriptElement) {+ if (!sourceActor) { eventObj.hide.debugger = true; } } finally {
Here's the analysis of the provided code diff for security fixes: 1. Vulnerability Existed: not sure [Potential Information Exposure] [devtools/server/actors/inspector/event-collector.js] [Lines 385-390, 822-836, 895-904] [Old Code] const eventInfo = { capturing: listener.capturing, type: listener.type, handler: handler, }; [Fixed Code] const eventInfo = { nsIEventListenerInfo: listener, capturing: listener.capturing, type: listener.type, handler: handler, enabled: listener.enabled, }; Additional Details: The change exposes more listener information including the full nsIEventListenerInfo object and enabled state. While not clearly a security vulnerability, exposing additional internal objects could potentially leak sensitive information if not properly sanitized. 2. Vulnerability Existed: not sure [Potential Debug Information Leak] [devtools/server/actors/inspector/event-collector.js] [Lines 1022-1024] [Old Code] origin = url + (isScriptBoundToNonScriptElement || line === 0 ? "" : ":" + line + (column === null ? "" : ":" + column)); [Fixed Code] origin = url + (line ? ":" + line + (column === null ? "" : ":" + column) : ""); Additional Details: The change simplifies the origin URL construction logic by removing the isScriptBoundToNonScriptElement check. This might affect how debug information is displayed, but it's unclear if this had any security implications. 3. Vulnerability Existed: not sure [Potential Debugger Bypass] [devtools/server/actors/inspector/event-collector.js] [Lines 1046-1048] [Old Code] if (native || isScriptBoundToNonScriptElement) { eventObj.hide.debugger = true; } [Fixed Code] if (!sourceActor) { eventObj.hide.debugger = true; } Additional Details: The condition for hiding the debugger icon was changed from checking native/isScriptBoundToNonScriptElement to checking sourceActor presence. This might affect debugging capabilities but doesn't appear to be a direct security fix. Note: While the changes add more detailed information about event listeners and modify how debugging information is handled, none of them clearly address known security vulnerabilities. The changes appear to be more about improving functionality and documentation than fixing security issues.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/css/selectors/old-tests/css3-modsel-81.xml+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/css/selectors/old-tests/css3-modsel-81.xml@@ -9,7 +9,6 @@ <link rel="author" title="Daniel Glazman" href="http://glazman.org/"/> <link rel="author" title="Ian Hickson" href="mailto:[email protected]"/> <link rel="help" href="https://www.w3.org/TR/css3-selectors/#selectors"/> <!-- bogus link to make sure it gets found -->- <meta name="flags" content="" /> </head> <body> <p class="red">This paragraph should have a green background.</p>
Based on the provided diff, I'll analyze it for potential security vulnerabilities: 1. Vulnerability Existed: no No specific vulnerability found [File] testing/web-platform/tests/css/selectors/old-tests/css3-modsel-81.xml [Lines] 9 [Old Code] <meta name="flags" content="" /> [Fixed Code] (removed line) Additional details: - The change simply removes an empty meta tag with a "flags" attribute, which doesn't appear to have any security implications - This appears to be a test file cleanup rather than a security fix - No known vulnerability patterns (XSS, injection, etc.) are present in this change - The removed tag wasn't serving any apparent security purpose Since this is just removing an unused meta tag from a test file, I don't see any security vulnerabilities being addressed here. The change seems to be purely about cleaning up test markup.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/devtools/client/webconsole/test/browser/browser_jsterm_evaluation_context_selector_targets_update.js+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/devtools/client/webconsole/test/browser/browser_jsterm_evaluation_context_selector_targets_update.js@@ -12,6 +12,7 @@ // the context is set to the top one if the destroyed target was selected). add_task(async function() {+ await pushPref("devtools.popups.debug", true); await pushPref("devtools.webconsole.input.context", true); const hud = await openNewTabWithIframesAndConsole(TEST_URI, [@@ -165,4 +166,77 @@ await waitForEagerEvaluationResult(hud, `"example.com"`); ok(true, "Instant evaluation is done against the top frame context");++ info("Open a popup");+ const originalTab = gBrowser.selectedTab;+ let onSwitchedHost = hud.toolbox.once("host-changed");+ await ContentTask.spawn(gBrowser.selectedBrowser, [IFRAME_PATH], function(+ path+ ) {+ content.open(`https://test2.example.org/${path}?id=popup`);+ });+ await onSwitchedHost;++ // Wait until the popup is rendered in the context selector+ // and that it is automatically switched to (aria-checked==true).+ await waitFor(() => {+ try {+ const items = getContextSelectorItems(hud);+ return (+ items.length === 3 &&+ items.some(+ el =>+ el+ .querySelector(".label")+ ?.textContent.includes("popup|test2.example.org") &&+ el.getAttribute("aria-checked") === "true"+ )+ );+ } catch (e) {+ // The context list may be wiped while updating and getContextSelectorItems will throw+ }+ return false;+ });++ const expectedPopupItem = {+ label: `popup|test2.example.org`,+ tooltip: `https://test2.example.org/${IFRAME_PATH}?id=popup`,+ };++ await checkContextSelectorMenu(hud, [+ {+ ...expectedTopItem,+ checked: false,+ },+ expectedSeparatorItem,+ {+ ...expectedPopupItem,+ checked: true,+ },+ ]);++ await waitForEagerEvaluationResult(hud, `"test2.example.org"`);+ ok(true, "The context was set to the popup document");++ info("Open a second popup and reload the original tab");+ onSwitchedHost = hud.toolbox.once("host-changed");+ await ContentTask.spawn(originalTab.linkedBrowser, [IFRAME_PATH], function(+ path+ ) {+ content.open(`https://test2.example.org/${path}?id=popup2`);+ });+ await onSwitchedHost;++ // Reloading the tab while having two popups opened used to+ // generate exception in the context selector component+ const onBrowserLoaded = BrowserTestUtils.browserLoaded(+ originalTab.linkedBrowser+ );+ gBrowser.reloadTab(originalTab);+ await onBrowserLoaded;++ ok(+ !hud.ui.document.querySelector(".app-error-panel"),+ "The web console did not crash"+ ); });
After analyzing the provided code diff, I don't see any clear security vulnerabilities being fixed. The changes appear to be primarily focused on adding test functionality for popup handling and context switching in the developer tools console. Here's my analysis: 1. Vulnerability Existed: no No security vulnerability found in this diff. The changes are test-related additions for popup handling and context switching scenarios. The main changes in this diff are: 1. Adding a debug preference for popups (`devtools.popups.debug`) 2. Adding test cases for: - Opening popups and verifying context switching - Handling multiple popups - Reloading tabs with popups open - Verifying the console doesn't crash in these scenarios These changes appear to be functional test improvements rather than security fixes. The test verifies proper behavior when: - Opening popups from different domains (test2.example.org) - Handling context switching between multiple popups - Reloading tabs while popups are open - Ensuring no exceptions occur in these scenarios The changes don't show any security fixes for vulnerabilities like XSS, CSRF, or other common web security issues. The modifications are focused on testing the robustness of the developer tools' context selector functionality.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/accessible/xpcom/xpcAccessibleImage.cpp+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/accessible/xpcom/xpcAccessibleImage.cpp@@ -29,7 +29,7 @@ if (!Intl()) return NS_ERROR_FAILURE;- nsIntPoint point = Intl()->Position(aCoordType);+ LayoutDeviceIntPoint point = Intl()->Position(aCoordType); *aX = point.x; *aY = point.y; return NS_OK;@@ -44,7 +44,7 @@ if (!Intl()) return NS_ERROR_FAILURE;- nsIntSize size = Intl()->Size();+ LayoutDeviceIntSize size = Intl()->Size(); *aWidth = size.width; *aHeight = size.height; return NS_OK;
Here's the analysis of the provided code diff: 1. Vulnerability Existed: not sure [Potential Integer Overflow/Type Safety Issue] [accessible/xpcom/xpcAccessibleImage.cpp] [Lines 29-33] Old Code: ```cpp nsIntPoint point = Intl()->Position(aCoordType); *aX = point.x; *aY = point.y; ``` Fixed Code: ```cpp LayoutDeviceIntPoint point = Intl()->Position(aCoordType); *aX = point.x; *aY = point.y; ``` Additional Details: The change from nsIntPoint to LayoutDeviceIntPoint suggests a potential type safety improvement, but without more context about the types' definitions and usage, we can't be certain if this fixed a specific vulnerability. 2. Vulnerability Existed: not sure [Potential Integer Overflow/Type Safety Issue] [accessible/xpcom/xpcAccessibleImage.cpp] [Lines 44-48] Old Code: ```cpp nsIntSize size = Intl()->Size(); *aWidth = size.width; *aHeight = size.height; ``` Fixed Code: ```cpp LayoutDeviceIntSize size = Intl()->Size(); *aWidth = size.width; *aHeight = size.height; ``` Additional Details: Similar to the first change, this modifies the type from nsIntSize to LayoutDeviceIntSize, which might be related to preventing integer overflows or improving type safety, but we can't confirm a specific vulnerability was fixed. Note: Both changes appear to be part of a systematic type migration (from nsInt* to LayoutDeviceInt*) which is likely related to improving type safety and consistency across the codebase, but without more context about the specific vulnerabilities these types might have caused, we can't definitively identify security issues.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/compositing/2d.composite.clip.source-in.worker.js+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/compositing/2d.composite.clip.source-in.worker.js@@ -13,8 +13,8 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); ctx.fillStyle = '#0f0';@@ -24,8 +24,8 @@ ctx.clip(); ctx.fillStyle = '#f00'; ctx.fillRect(0, 0, 50, 50);-_assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255");-_assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255");+_assertPixel(canvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255");+_assertPixel(canvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); t.done(); });
After analyzing the provided code diff, I don't see any security vulnerabilities being fixed. The changes appear to be purely variable renaming for better code clarity/consistency. Here's the analysis: Vulnerability Existed: no [No Vulnerability Found] [testing/web-platform/tests/html/canvas/offscreen/compositing/2d.composite.clip.source-in.worker.js] [Lines 13-24] [Old Code] var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); ... _assertPixel(offscreenCanvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); _assertPixel(offscreenCanvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); [Fixed Code] var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); ... _assertPixel(canvas, 25,25, 0,255,0,255, "25,25", "0,255,0,255"); _assertPixel(canvas, 75,25, 0,255,0,255, "75,25", "0,255,0,255"); The changes simply rename the variable `offscreenCanvas` to `canvas` throughout the file, which doesn't appear to address any security issues but rather improves code consistency. No security-related functionality was modified.
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.
--- /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_97_END/firefox-FIREFOX_RELEASE_97_END/testing/web-platform/tests/html/canvas/offscreen/the-offscreen-canvas/2d.getcontext.extraargs.create.html+++ /root/PatchLeaks-main/products/firefox_downloads/FIREFOX_RELEASE_98_END/firefox-FIREFOX_RELEASE_98_END/testing/web-platform/tests/html/canvas/offscreen/the-offscreen-canvas/2d.getcontext.extraargs.create.html@@ -17,8 +17,8 @@ }); t.step(function() {-var offscreenCanvas = new OffscreenCanvas(100, 50);-var ctx = offscreenCanvas.getContext('2d');+var canvas = new OffscreenCanvas(100, 50);+var ctx = canvas.getContext('2d'); _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, \"2\")", "null"); _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', 123), null, "(new OffscreenCanvas(100, 50)).getContext('2d', 123)", "null");
Analyzing the provided code diff: 1. Vulnerability Existed: no No specific vulnerability found [File] [Lines 17-18] Old Code: var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); Fixed Code: var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); Additional Notes: - The changes appear to be purely variable naming changes (from 'offscreenCanvas' to 'canvas') - The test assertions remain the same, just testing that getContext works with extra arguments - No security-relevant changes were made in this diff - The modification doesn't appear to address any known vulnerability or security issue
If an attacker could control the contents of an iframe sandboxed with <code>allow-popups</code> but not <code>allow-scripts</code>, they were able to craft a link that, when clicked, would lead to JavaScript execution in violation of the sandbox. This vulnerability affects Firefox < 98, Firefox ESR < 91.7, and Thunderbird < 91.7.