mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
9d253b796d
- Bug 1235610 - Add xpctall support for Bitrig and DragonFly. r=glandium (02b7d40eb3)
- Bug 1252072 - Prevent ASan instrumentation for unsafe xpcom functions. r=froydnj (881bfc18c0)
- Bug 1245099 - Fixed uninitialized variable warning. r=bsmedberg (6481aad0d5)
- Bug 1196370 - Remove the clang assembly workaround from bug 1028613. r=ehsan (b8b6f1a5e8)
- Bug 1234860 - move win32 NS_InvokeByIndex implementation to a separate assembly file; r=aklotz,ted.m (73ca54348f)
- Bug 1248534 (part 1) - Remove XPT encoding support. r=khuey. (e84c4dfd32)
- Bug 1248534 (part 2) - Remove unused XPT flags. r=khuey. (264be694d0)
- Bug 1248534 (part 3) - Remove almost all support for XPT annotations. r=khuey. (97a0d86e0b)
- Bug 1248534 (part 4) - Remove unused fields from XPTConstValue. r=khuey. (9eccf9eba5)
- Bug 1248534 (part 5) - Remove XPTDatapool. r=khuey. (139dab7a9f)
- Bug 1248534 (part 6) - Stack-allocate XPTState. r=khuey. (f32ce7cc9e)
- Bug 1249174 (part 7) - Only define XPTArena::name if XPT_ARENA_LOGGING is defined. r=khuey. (174a20c0a3)
- Bug 1248534 (part 8) - Remove useless XPT freeing code. r=khuey. (a5ade9739b)
- Bug 1248534 (part 9) - Remove XPT arena logging code. r=khuey. (a996dfad76)
- Bug 1251458 - Reinstate annotation handling in .xpt files. r=khuey. (fbe8d573bd)
- Bug 1249174 (part 1) - Don't store the unused XPTTypeDescriptorTags::argnum2 field in memory. r=khuey. (e1d12965eb)
- Bug 1253877 - Baldr: cast -1 to uint8 to avoid 'shifting negative' error on CLOSED TREE (r=bustage) (cdf8031264)
- Bug 1258599 - OdinMonkey: MIPS: Only reserving stack for argument registers on O32. r=huangwenjun06 (a77220a9fa)
- Bug 1253137 - Baldr: fold if_else into if to match ml-proto (r=sunfish) (54e89aafe3)
- Bug 1249174 (part 2) - Shrink xptiInterfaceEntry by reordering its fields. r=khuey. (c4d7c15e6e)
- Bug 1253137 - Baldr: update br_table syntax to match ml-proto (r=sunfish) (e7f253e4d8)
- Bug 1249174 (part 3) - Don't store the unused XPTInterfaceDirectoryEntry::name_space field in memory. r=khuey. (c308508e74)
- Bug 1249174 (part 4) - Don't store unused XPTHeader fields in memory. r=khuey. (2dfd238a54)
- Bug 1249174 (part 5) - Remove the useless BLK_HDR::size field. r=khuey. (1a362c278e)
- Bug 1249174 (part 6) - Shrink XPTTypeDescriptor. r=khuey. (5a313327fe)
- Bug 1249174 (part 7.5) - Avoid wasted space around XPT strings. r=khuey. (ac3653802c)
- Bug 1249174 (part 8) - Shrink XPTInterfaceDescriptor. r=khuey. (e9dc929d37)
- Bug 1254188 - Baldr: handle recycled phis when closing a loop with a value (r=bbouvier) (2cb0895472)
- Bug 1254167: Don't allow folding to full range for atomic accesses; r=sunfish (96a851efda)
- Bug 1256637: Set definition before returning early in EmitBrTable; r=luke (0fdb365e82)
- Bug 1255695 - BaldrMonkey: Implement unaligned accesses. r=luke (205b798249)
- Bug 1238121 - Properly guard Profiler's RAII classes r=BenWa f=mystor (a3db8e6bc9)
- Bug 1251787 - Remove remaining references to MOZILLA_XPCOMRT_API from tools. r=mstange (1632205437)
- align profiler (c2638ecf1f)
- Bug 1235502 - Fix -Wunreachable-code warning in tools/profiler/. r=BenWa (0d564937c9)
- Bug 1221846 - Properly close the tasktracer property in the GeckoSampler JSON blob. r=BenWa (dca640fb03)
- Bug 1239498 - Use Stackwalk64 on win x64. r=jrmuizel (50ffe8a649)
- Bug 1258269: Declare logging string-literals in exception_handler.cc as 'const char[]' to fix build warning & for consistency. r=ted (a9454e735f)
- parts of Bug 1151175 - Update libvpx update.py for 1.4.0. (8700fa48ab)
- Bug 1249590 - Bullet-proofing AsyncShutdown wrt exceptions;r=froydnj (7e512f1029)
- Bug 1021151 - avoid memory leak in NS_GENERIC_AGGREGATED_CONSTRUCTOR_INIT, use nsAutoPtr instead of naked ptr. r=Ehsan (d0eb754af2)
- Bug 1255223 - Null crash when logging weak maps. r=mccr8. (0d02b4b469)
- Bug 1250134 - assert mJSRuntime when IsGrayJS() is true. r=mccr8 (a3987102ed)
- Bug 1254131: Fix non-unified wasm build. r=luke (cacb86e4d0)
- Bug 1246929 - Skip installing functions and properties on builtins for the self-hosting global. r=Waldo (aa04041de9)
- Bug 986294 - Remove Proxy.create from addon-sdk. r=mossop (da3d6c40ea)
- Bug 1243805 - Replace Proxy.create with new Proxy in devtools l10n code. r=jryans (9886f857be)
- Bug 1245141 - Use new Proxy for AddonManager.addonTypes. r=mossop (6cc8dd0870)
- Bug 1253866 - Remove Proxy.create from crash tests. r=bz (76a421cf97)
- Bug 892903 - Remove Proxy.create and Proxy.createFunction. r=efaust (7b572deb10)
- Bug 1049041 - Remove scary warning about mutating [[Prototype]]. r=efaust. (367ac3f6c5)
- Bug 1257445 - #ifdef on __GLIBC__ for sched_getcpu, which is a glibc feature. r=jimb (171a1729c1)
- Followup for bug 1257445 - Remove the AutoStopwatch::getCPU implementation using sched_getcpu. r=jimb (221f52d4c4)
- Bug 1178317 - eliminate large static constructor from ShimInterfaceInfo.cpp; r=poiru (aa66704aee)
- Bug 1247580 P1 Allow old nsIX509Cert serialized objects to be read off disk. r=bz (1f8bc280a6)
- Bug 1247580 P2 Add gtest to ensure we can continue to deserialize old security info strings. r=bz (323059ac29)
- Bug 864842 - Show error for browsing Windows drive without media, r=michal (1e438bdf2f)
- Bug 1233283 - Remove unless tmp from ReadDir in nsLocalFileWin. r=froydnj (1565d1cc14)
- Bug 1258498: Use fallible allocation in nsScriptableInputStream::ReadBytes. r= froydnj (eebcb8050d)
- Bug 1236108: Add temp directory for sandboxed content processes to directory r=bsmedberg (8384b33c10)
- Bug 1255362 - Null-check GetContainer() before using it in image-related ConfigureLayer() methods. r=mstange a=Tomcat (beab7149f1)
- Bug 1205473 - Add a state bit to optimize building event regions. r=mattwoodrow (c8b1eb9839)
- Bug 1222886 - Remove unused nsCSSParser::{SetStyleSheet,SetChildLoader,SetQuirkMode} methods. r=bzbarsky (c9c6621083)
- Bug 1247327. Fix WebGL acceptance rates in telemetry. r=milan (de10319664)
- Bug 1249664 - Save dropped-down state in nsPresState. r=dbaron (734c3ee18b)
- Bug 1256745 - Cancel the DidPaint timer in SetShell(nullptr). r=mattwoodrow (d2a4202512)
- Bug 1238846 (part 1) - Remove some dead code in nsLayoutUtils. r=mattwoodrow. (e6af806e52)
- Bug 1252414 - Handle lost_context for webgl ClearBuffer*. r=jgilbert (e6728605ff)
- Bug 1228687: ScopedResolveTexturesForDraw needs the context to be current, so make those calls earlier. r=jgilbert (6e731187c5)
- Bug 1247532 - Annotate intentional switch fallthrough to suppress -Wimplicit-fallthrough warning in dom/canvas/. r=jgilbert (d7faec1848)
- Bug 1249483 - Stop filling A with 1.0 on readback from no-alpha. - r=jrmuizel (9bf71fb220)
298 lines
9.4 KiB
C++
298 lines
9.4 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "CanvasRenderingContextHelper.h"
|
|
#include "ImageBitmapRenderingContext.h"
|
|
#include "ImageEncoder.h"
|
|
#include "mozilla/dom/CanvasRenderingContext2D.h"
|
|
#include "mozilla/Telemetry.h"
|
|
#include "mozilla/UniquePtr.h"
|
|
#include "nsContentUtils.h"
|
|
#include "nsDOMJSUtils.h"
|
|
#include "nsIScriptContext.h"
|
|
#include "nsJSUtils.h"
|
|
#include "WebGL1Context.h"
|
|
#include "WebGL2Context.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
void
|
|
CanvasRenderingContextHelper::ToBlob(JSContext* aCx,
|
|
nsIGlobalObject* aGlobal,
|
|
FileCallback& aCallback,
|
|
const nsAString& aType,
|
|
JS::Handle<JS::Value> aParams,
|
|
ErrorResult& aRv)
|
|
{
|
|
// Encoder callback when encoding is complete.
|
|
class EncodeCallback : public EncodeCompleteCallback
|
|
{
|
|
public:
|
|
EncodeCallback(nsIGlobalObject* aGlobal, FileCallback* aCallback)
|
|
: mGlobal(aGlobal)
|
|
, mFileCallback(aCallback) {}
|
|
|
|
// This is called on main thread.
|
|
nsresult ReceiveBlob(already_AddRefed<Blob> aBlob)
|
|
{
|
|
RefPtr<Blob> blob = aBlob;
|
|
|
|
ErrorResult rv;
|
|
uint64_t size = blob->GetSize(rv);
|
|
if (rv.Failed()) {
|
|
rv.SuppressException();
|
|
} else {
|
|
AutoJSAPI jsapi;
|
|
if (jsapi.Init(mGlobal)) {
|
|
JS_updateMallocCounter(jsapi.cx(), size);
|
|
}
|
|
}
|
|
|
|
RefPtr<Blob> newBlob = Blob::Create(mGlobal, blob->Impl());
|
|
|
|
mFileCallback->Call(*newBlob, rv);
|
|
|
|
mGlobal = nullptr;
|
|
mFileCallback = nullptr;
|
|
|
|
return rv.StealNSResult();
|
|
}
|
|
|
|
nsCOMPtr<nsIGlobalObject> mGlobal;
|
|
RefPtr<FileCallback> mFileCallback;
|
|
};
|
|
|
|
RefPtr<EncodeCompleteCallback> callback =
|
|
new EncodeCallback(aGlobal, &aCallback);
|
|
|
|
ToBlob(aCx, aGlobal, callback, aType, aParams, aRv);
|
|
}
|
|
|
|
void
|
|
CanvasRenderingContextHelper::ToBlob(JSContext* aCx,
|
|
nsIGlobalObject* aGlobal,
|
|
EncodeCompleteCallback* aCallback,
|
|
const nsAString& aType,
|
|
JS::Handle<JS::Value> aParams,
|
|
ErrorResult& aRv)
|
|
{
|
|
nsAutoString type;
|
|
nsContentUtils::ASCIIToLower(aType, type);
|
|
|
|
nsAutoString params;
|
|
bool usingCustomParseOptions;
|
|
aRv = ParseParams(aCx, type, aParams, params, &usingCustomParseOptions);
|
|
if (aRv.Failed()) {
|
|
return;
|
|
}
|
|
|
|
if (mCurrentContext) {
|
|
// We disallow canvases of width or height zero, and set them to 1, so
|
|
// we will have a discrepancy with the sizes of the canvas and the context.
|
|
// That discrepancy is OK, the rest are not.
|
|
nsIntSize elementSize = GetWidthHeight();
|
|
if ((elementSize.width != mCurrentContext->GetWidth() &&
|
|
(elementSize.width != 0 || mCurrentContext->GetWidth() != 1)) ||
|
|
(elementSize.height != mCurrentContext->GetHeight() &&
|
|
(elementSize.height != 0 || mCurrentContext->GetHeight() != 1))) {
|
|
aRv.Throw(NS_ERROR_FAILURE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
UniquePtr<uint8_t[]> imageBuffer;
|
|
int32_t format = 0;
|
|
if (mCurrentContext) {
|
|
imageBuffer = mCurrentContext->GetImageBuffer(&format);
|
|
}
|
|
|
|
RefPtr<EncodeCompleteCallback> callback = aCallback;
|
|
|
|
aRv = ImageEncoder::ExtractDataAsync(type,
|
|
params,
|
|
usingCustomParseOptions,
|
|
Move(imageBuffer),
|
|
format,
|
|
GetWidthHeight(),
|
|
callback);
|
|
}
|
|
|
|
already_AddRefed<nsICanvasRenderingContextInternal>
|
|
CanvasRenderingContextHelper::CreateContext(CanvasContextType aContextType)
|
|
{
|
|
MOZ_ASSERT(aContextType != CanvasContextType::NoContext);
|
|
RefPtr<nsICanvasRenderingContextInternal> ret;
|
|
|
|
switch (aContextType) {
|
|
case CanvasContextType::NoContext:
|
|
break;
|
|
|
|
case CanvasContextType::Canvas2D:
|
|
Telemetry::Accumulate(Telemetry::CANVAS_2D_USED, 1);
|
|
ret = new CanvasRenderingContext2D();
|
|
break;
|
|
|
|
case CanvasContextType::WebGL1:
|
|
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL_USED, 1);
|
|
|
|
ret = WebGL1Context::Create();
|
|
if (!ret)
|
|
return nullptr;
|
|
|
|
break;
|
|
|
|
case CanvasContextType::WebGL2:
|
|
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL_USED, 1);
|
|
|
|
ret = WebGL2Context::Create();
|
|
if (!ret)
|
|
return nullptr;
|
|
|
|
break;
|
|
|
|
case CanvasContextType::ImageBitmap:
|
|
ret = new ImageBitmapRenderingContext();
|
|
|
|
break;
|
|
}
|
|
MOZ_ASSERT(ret);
|
|
|
|
return ret.forget();
|
|
}
|
|
|
|
already_AddRefed<nsISupports>
|
|
CanvasRenderingContextHelper::GetContext(JSContext* aCx,
|
|
const nsAString& aContextId,
|
|
JS::Handle<JS::Value> aContextOptions,
|
|
ErrorResult& aRv)
|
|
{
|
|
CanvasContextType contextType;
|
|
if (!CanvasUtils::GetCanvasContextType(aContextId, &contextType))
|
|
return nullptr;
|
|
|
|
if (!mCurrentContext) {
|
|
// This canvas doesn't have a context yet.
|
|
RefPtr<nsICanvasRenderingContextInternal> context;
|
|
context = CreateContext(contextType);
|
|
if (!context) {
|
|
return nullptr;
|
|
}
|
|
|
|
// Ensure that the context participates in CC. Note that returning a
|
|
// CC participant from QI doesn't addref.
|
|
nsXPCOMCycleCollectionParticipant* cp = nullptr;
|
|
CallQueryInterface(context, &cp);
|
|
if (!cp) {
|
|
aRv.Throw(NS_ERROR_FAILURE);
|
|
return nullptr;
|
|
}
|
|
|
|
mCurrentContext = context.forget();
|
|
mCurrentContextType = contextType;
|
|
|
|
nsresult rv = UpdateContext(aCx, aContextOptions, aRv);
|
|
if (NS_FAILED(rv)) {
|
|
// See bug 645792 and bug 1215072.
|
|
// We want to throw only if dictionary initialization fails,
|
|
// so only in case aRv has been set to some error value.
|
|
if (contextType == CanvasContextType::WebGL1)
|
|
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL_SUCCESS, 0);
|
|
else if (contextType == CanvasContextType::WebGL2)
|
|
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL2_SUCCESS, 0);
|
|
return nullptr;
|
|
}
|
|
if (contextType == CanvasContextType::WebGL1)
|
|
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL_SUCCESS, 1);
|
|
else if (contextType == CanvasContextType::WebGL2)
|
|
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL2_SUCCESS, 1);
|
|
} else {
|
|
// We already have a context of some type.
|
|
if (contextType != mCurrentContextType)
|
|
return nullptr;
|
|
}
|
|
|
|
nsCOMPtr<nsICanvasRenderingContextInternal> context = mCurrentContext;
|
|
return context.forget();
|
|
}
|
|
|
|
nsresult
|
|
CanvasRenderingContextHelper::UpdateContext(JSContext* aCx,
|
|
JS::Handle<JS::Value> aNewContextOptions,
|
|
ErrorResult& aRvForDictionaryInit)
|
|
{
|
|
if (!mCurrentContext)
|
|
return NS_OK;
|
|
|
|
nsIntSize sz = GetWidthHeight();
|
|
|
|
nsCOMPtr<nsICanvasRenderingContextInternal> currentContext = mCurrentContext;
|
|
|
|
nsresult rv = currentContext->SetIsOpaque(GetOpaqueAttr());
|
|
if (NS_FAILED(rv)) {
|
|
mCurrentContext = nullptr;
|
|
return rv;
|
|
}
|
|
|
|
rv = currentContext->SetContextOptions(aCx, aNewContextOptions,
|
|
aRvForDictionaryInit);
|
|
if (NS_FAILED(rv)) {
|
|
mCurrentContext = nullptr;
|
|
return rv;
|
|
}
|
|
|
|
rv = currentContext->SetDimensions(sz.width, sz.height);
|
|
if (NS_FAILED(rv)) {
|
|
mCurrentContext = nullptr;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
nsresult
|
|
CanvasRenderingContextHelper::ParseParams(JSContext* aCx,
|
|
const nsAString& aType,
|
|
const JS::Value& aEncoderOptions,
|
|
nsAString& outParams,
|
|
bool* const outUsingCustomParseOptions)
|
|
{
|
|
// Quality parameter is only valid for the image/jpeg MIME type
|
|
if (aType.EqualsLiteral("image/jpeg")) {
|
|
if (aEncoderOptions.isNumber()) {
|
|
double quality = aEncoderOptions.toNumber();
|
|
// Quality must be between 0.0 and 1.0, inclusive
|
|
if (quality >= 0.0 && quality <= 1.0) {
|
|
outParams.AppendLiteral("quality=");
|
|
outParams.AppendInt(NS_lround(quality * 100.0));
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we haven't parsed the aParams check for proprietary options.
|
|
// The proprietary option -moz-parse-options will take a image lib encoder
|
|
// parse options string as is and pass it to the encoder.
|
|
*outUsingCustomParseOptions = false;
|
|
if (outParams.Length() == 0 && aEncoderOptions.isString()) {
|
|
NS_NAMED_LITERAL_STRING(mozParseOptions, "-moz-parse-options:");
|
|
nsAutoJSString paramString;
|
|
if (!paramString.init(aCx, aEncoderOptions.toString())) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
if (StringBeginsWith(paramString, mozParseOptions)) {
|
|
nsDependentSubstring parseOptions = Substring(paramString,
|
|
mozParseOptions.Length(),
|
|
paramString.Length() -
|
|
mozParseOptions.Length());
|
|
outParams.Append(parseOptions);
|
|
*outUsingCustomParseOptions = true;
|
|
}
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|