mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
import changes from `dev' branch of rmottola/Arctic-Fox:
- bug 1083930 - cpu spin during large h2/spdy upload r=hurley (0949388a6a)
- Bug 1241906 - Spdy deadlock on suspended channel r=hurley (f40e9677d5)
- Bug 1247205 - dont loop on http2 softerror r=dragana (2ab3cb69ef)
- Bug 1246778 - dont loop in nshttpconnection during shutdown r=dragana (0677b9d34b)
- Bug 1201037 - only send "HTTP pings" on seemingly idle connections, r=mcmanus (134198bc79)
- Bug 1174899 - discarded spdy data with fin attributed to wrong stream r=bagder (f3b801c734)
- Bug 1236170 - Make Http2Session::UncompressAndDiscard push-aware. r=mcmanus (e71634e853)
- Bug 1240025 - incorrect close state on pushed stream r=hurley (eb2832177a)
- Bug 1227931 - init Http2Stream::mReceivedData in the constructor. r=nwgh (44f1d8e897)
- Bug 241788 - net_FilterURIString should filter \r\n\t from the entire URL r=honzab (734d9b8cae)
- Bug 1259459 - h2 0 length options puts end-stream on headers r=hurley (31ac211a9b)
- Bug 1174899 - fixup log format strings for spdy/h2 r=bagder (967c9ff71e)
- Bug 1211694 - dataLength has been added twice. r=mcmanus (6773981db3)
- cleanup (26517f5de0)
- Bug 1247998 - Let nsHttpChannel::AsyncOpen* throw after nsHttpHandler has been shutdown, r=mcmanus (90bb2364be)
- Bug 1231512 - Allow nsIHttpChannel.redirectTo() work also on an open channel, r=jduell (198fb72816)
- Bug 1242472 - Properly propagate mTopWindowURI through redirects. r=francois/ckerschb (1d27a15770)
- Bug 1133873 - some spdy logs r=hurley (cd95cfed5a)
- bug 1215724 - enable brotli on spdy r=hurley (83cca72fa5)
- Bug 137852 - Add a new working HTTP authentication identity to the begining of the session cache list. r=honzab (f670349771)
- Bug 1245414, part 1 - Delete the mfbt/decimal/LICENSE* files since upstream now just uses inline comments. r=Waldo (15bb211e14)
- Bug 1245414, part 2 - Update mfbt/decimal/update.sh to reflect Blink's switch from svn to git, and the different files we now pull. r=Waldo (4dd0b5916a)
- Bug 1245414, part 3 - Overwrite mfbt/decimal/Decimal.* with vanilla upstream copies. r=Waldo (98f7ba4711)
- Bug 1245414, part 4 - Update mfbt/decimal/zero-serialization.patch. r =Waldo (055e1354a7)
- Bug 1245414, part 5 - Update mfbt/decimal/comparison-with-nan.patch. r=Waldo (583e0f3e76)
- Bug 1245414, part 6 - Update mfbt/decimal/mfbt-abi-markers.patch. r=Waldo (148b1ac08b)
- Bug 1245414, part 7 - Update mfbt/decimal/to-moz-dependencies.patch. r=Waldo (2e2a6a33d7)
- Bug 1245414, part 8 - Remove mfbt/decimal/floor-ceiling.patch now that the issue is fixed upstream. r=Waldo (84fc02c068)
- Bug 1245414, part 9 - Disable mfbt/decimal/fix-wshadow-warnings.patch. r=cpeterson (4476d04c5d)
- Bug 1245414, part 10 - Apply the Mozilla patches via mfbt/decimal/update.sh. r=Waldo (1f95ef5524)
- Bug 1247082 - Suppress rendering of nsBackdropFrame for VR content r=dholbert (0ffeae4267)
- Bug 1206545 - Initialize AccessibleCaretEventHub in nsCanvasFrame. r=roc (687d4997fb)
- Bug 591737 - Add SummaryFrame. r=bz (1b750bfeb8)
- Bug 1165893 - Fix rounding issue in nsDisplaySelectionOverlay::Paint. r=mattwoodro (9994cc983a)
- Bug 1245450 - Only setup AutoSaveRestorePerspectiveIndex for the descendants of the element with perspective. r=roc (fe8a350417)
- Bug 1243282 - Wrap items having clips with a separator. r=mattwoodrow (915737e3d0)
- Bug 1223232 - Use GetUsedBorder() instead of the computed border value when calculating CB size. r=roc (f4c05b30c7)
- Bug 1223232 - Crashtest. (394e112818)
- Bug 1230665 - Make anonymous flex/grid items non-tabbable and non-focusable. r=roc (0d3f70e672)
- Bug 1142295 - Closing descriptor when GECKO_DISPLAY_REFLOW_RULES_FILE is setted. r=erahm (664ae6ba0a)
- minor change (b914bd2602)
- Bug 1237754 part 1 - [css-grid][css-align] Make 'align/justify-content:normal' behave as 'stretch' for Grid containers. r=dholbert (09a9a09629)
- Bug 1237754 part 2 - [css-grid][css-align] Test updates to account for new default behavior for 'align/justify-content'. (5e62e837ff)
- minor of Bug 1141931 part 2 (a12f5b430e)
- Bu 974309: Fixes the IsEditable() logic for table cells. r=ehsan (2a3caa932f)
- Bug 1238137 - Telemetry pings for main thread keyboard-driven scroll input methods. r=ehsan (e9c07427f9)
- Bug 1238137 - Telemetry pings for main thread scrolling to bring the caret into view after moving it in response to keyboard input. r=ehsan (834bc12b7a)
- Bug 1246405 - Declare mTextRun earlier to avoid alignment spill on 64-bit architectures. r=roc (7ba93b72c9)
- Fixing bug 440486. Work around a Windows XP fax dialog bug. r=rstrong. (a59409acd6)
- Bug 1240911 - Prevent SerializedStructuredCloneBuffer from escaping into the heap. r=amarchesini (2c0b7c474b)
- Bug 1240985 - Hold off processing some messages during timeout (r=dvander) (10f6f6d7a2)
- Bug 1146471 - Release thread asserts for IPC (r=dvander) (f94d0ee09a)
- Bug 1240985 - Fix bug where mAwaitingSyncReply can be overwritten in Send after Cancel (r=dvander) (7b95acdca6)
- Bug 1193861: Log to the process log when launching a sandboxed process on Windows. r=billm (0ad1afd0d0)
- Bug 1233061 - add override declarations for MessagePumpForNonMainUIThreads; r=billm (94b9a5bfe9)
- Bug 1172467: Fix an IPC channel file descriptor leak from Nuwa to the child process. r=khuey (908601ed0e)
- Bug 1240985 - Check WasTransactionCanceled after timeout (and avoid timing out) (r=dvander) (33aade0a92)
- Bug 1237458 - Use MOZ_RELEASE_ASSERT for IPC assertions (r=jld) (cb0f058205)
- Bug 1247429 - Warn instead of error if shmem deallocated before IPDL sends it. r=nical (3c94d99b21)
- Bug 1175999 - Deallocate mach SharedMemory properly. r=blassey. (542649b570)
- Bug 1188186 - Fix leak of FDs in |CreateTransport|. r=bds (a40b9a0c58)
- Bg 1240607 - Force CreateWindow hooks to be detours. r=jmathies (895d1c21c4)
- Bug 1209464: Fix missing neutered window region in MessageChannel::WaitForInterruptNotify. Regression from bug 1189709; r=jimm (204256880b)
- Bug 1229825 - Make GIF deinterlacer respect the frame rect bounds. r=tn (904f6bd9b7)
- Bug 1242093 - Fix assertion in Downscaler::ClearRow. r=njn (63ffe82e99)
- Bug 1235859 - Add FrameSize to non-skia downscaler. r=edwin (e7474630e0)
- Bug 1237709: During RasterImage error-handling cleanup, set UniquePtr mAnim to null instead of using reset(), to avoid leaking. r=dholbert (b064f9c20d)
- Bug 1235605 - Use CheckedInt in Deinterlacer and make its buffer allocation fallible. r=tn (f6f3858c65)
- cleanup (f02aa9441e)
- Bug 1242778: Add MOZ_COUNT_CTOR & MOZ_COUNT_DTOR calls to track leaks of imagelib's FrameAnimator class. r=tn (b1aa366694)
- Bug 1241728. Add crashtest. (17d80a3387)
- Bug 1241729. Add crashtest. (bd6d7337d7)
- Bug 1241728. Limit the size of images that we will downscale from to 1048576 pixels. r=edwin (ad38a82aad)
- Bug 1218782 - use fallible allocations in Downscaler.cpp; r=seth (b22caa1121)
- Bug 1224979. Check if we compute usable filters for the downscaler, and if not put the downscaler in error state so it's not used. r=edwin (8fb59463ef)
- Bug 1235297 - Annotate intentional switch fallthroughs to suppress -Wimplicit-fallthrough warnings in image/decoders/. r=tn (094c37c0fe)
- Bug 1238558 (part 1) - Add Decoder::BeforeFinishInternal(). r=tnikkel. (c7922054d6)
- Bug 1238558 (part 2) - Add a test. r=tnikkel. (7e09caf47f)
- Bug 1238551 (part 2) - Add a test. r=tn. (f548a2cb97)
- Bug 1238551 (part 1) - Reject BITMAPV3INFOHEADER BMP images. r=tn. (c4c8f95cb3)
- Bug 1240629. Don't buffer image file data that we are never going to look at in the gap between the header and the pixel data for BMP files. r=njn (f580910cd3)
- Bug 1237171 - Improve a case where ICO and BMP files disagree on an image size. r=tn. (615db65802)
- Bug 1220021 (part 1) - Don't treat 0RGB ICO files as transparent. r=seth. (b97298285f)
- Bug 1220021 (part 2) - Add four reftests. r=seth. (b1e7b58a98)
- Bug 1163856 (Part 2) - Fix tests that depended on image load event timing. r=tn (4304c676a0)
- Bug 1207958 - Fix heuristic for choosing which ICO sub-image to render - r=tn (3d4db5a033)
- Bug 987625 - Conditionally define MOZ_PNG_MAX_DIMENSION. r=jrmuizel (859bae490c)
- Bug 75077 - Interpolate interlaced PNG images instead of libpng blocky display. r=seth (bc17b43fa6)
- fix side-effect of 1219405 (6536821e18)
- Bug 1245845, part 1 - Stop Moz2D Path::CopyToBuilder/TransformedCopyToBuilder implicitly converting the Path's FillRule. r=Bas (ecc552f359)
- Bug 1245845, part 2 - Remove code that is now useless from gfxContext::EnsurePath. r=Bas (2430be2837)
- Bug 1237448 - Moz2Dify two functions in gfxSurfaceDrawable. r=roc. (bb768302c5)
- Bug 1231888 (follow-up) - Simplify CurrentSurface(). r=jrmuizel. (303cea98f3)
- Bug 1247380: Only copy the background if we can succesfully get a snapshot. r=jrmuizel (13b64445e9)
- Bug 1228507 - Initialize mBlendOpacity. r=Bas (b301a2c9f4)
- Bug 1238846 (part 2) - Remove gfxContext::mOriginalDT, which is unused. r=mattwoodrow. (a5b0f948b7)
- Bug 1240819 - cleanup dead branches in gfxXlibNativeRender.cpp. r=jrmuizel (57bbec6693)
- Bug 1234950 - When advancing APZ animations, use the next vsync timestamp instead of the current one, since that is what will be composited. r=mstange (421829d459)
- Bug 1021845 - Don't skip checkerboarding layers during compositing, even if the layer's visible region is empty. r=botond (6cf1497019)
- Bug 1230149 - check bigImgIter to see if it's not null. r=jmuizelaar (aeef579f9f)
- Bug 1248325 - Update BufferTextureHost::GetAsSurface() r=nical (39a8b3ca71)
- reapply per misspatch Bug 1200595 - Consolidate the TextureClient's destruction logic (68966e4dc3)
- Bug 1249245 - Add missing header gfxPrefs.h to GrallocTextureClient.cpp. r=cyu (676669eb01)
- Bug 1245057: Refer to |gfx::IntPoint| in |GrallocTextureHostOGL::SetCropRect|, r=sotaro (99e572f3f6)
- Bug 1240867 - Fix non-unified build bustage in OGLShaderProgram.cpp. r=nical (0071f08285)
- Bug 1238015 - Make sure PTexture actors are destroyed after all messages referring to them are sent. r=sotaro (250f99b4a4)
- Bug 1220895 - Add layerviewer for layer tree & display list visualization NPOTB. r=botond (fa211145a1)
- Bug 1213464 - ImageBridgeChild and CompositorChild should delete their Transport. r=billm (a37a0dbdfd)
- Bug 1234343 (part 1) - Make GfxMemoryImageReporter::sAmount signed. r=Bas. (18f0cb61ec)
- Bug 1234343 (part 2) - Add a missing GfxMemoryImageReporter::DidAlloc() call. r=Bas. (69df7f3674)
- Bug 1245249 - Check actor state before calling Send__delete__(); r=luke (65716a5915)
- Bug 1221418 - A better cleanup method for AsmJSCache::ChildRunnable, r=janv (5c8c023b9d)
- Bug 1235657 - Session storage needs to handle origin attributes correctly - part 1 - createOriginAttributesWithUserContextId, r=huseby (f2df8109ef)
- Bug 1245954 - Console StartTimer/StopTimer and IncrementCounter should run in the owning thread, r=bz (64f73d7759)
- Bug 1245957 - Adding assertions in Console about in which thread is running what, r=bz (291ee70e2d)
- Bug 1248022 - ConsoleEvent.styles can be a sequence of nullable strings, r=bz (b94ec79ac0)
- Bug 1245242 - Normalize to unit vector for DOMMatrix.rotateAxisAngleSelf. r=roc (3a9e684b4d)
- Bug 1236329. Back out the patch for bug 492933 (revision d8012b35413b) because it's not web-compatible in practice. r=smaug (f6540d84c3)
- mTarget can be null in CanvasRenderingContext2D::ClearRect(), return early if so. (13e8a4e26a)
This commit is contained in:
+232
-65
@@ -84,6 +84,11 @@ public:
|
||||
: mMethodName(Console::MethodLog)
|
||||
, mPrivate(false)
|
||||
, mTimeStamp(JS_Now() / PR_USEC_PER_MSEC)
|
||||
, mStartTimerValue(0)
|
||||
, mStartTimerStatus(false)
|
||||
, mStopTimerDuration(0)
|
||||
, mStopTimerStatus(false)
|
||||
, mCountValue(MAX_PAGE_COUNTERS)
|
||||
, mIDType(eUnknown)
|
||||
, mOuterIDNumber(0)
|
||||
, mInnerIDNumber(0)
|
||||
@@ -172,7 +177,34 @@ public:
|
||||
Console::MethodName mMethodName;
|
||||
bool mPrivate;
|
||||
int64_t mTimeStamp;
|
||||
DOMHighResTimeStamp mMonotonicTimer;
|
||||
|
||||
// These values are set in the owning thread and they contain the timestamp of
|
||||
// when the new timer has started, the name of it and the status of the
|
||||
// creation of it. If status is false, something went wrong. User
|
||||
// DOMHighResTimeStamp instead mozilla::TimeStamp because we use
|
||||
// monotonicTimer from Performance.now();
|
||||
// They will be set on the owning thread and never touched again on that
|
||||
// thread. They will be used on the main-thread in order to create a
|
||||
// ConsoleTimerStart dictionary when console.time() is used.
|
||||
DOMHighResTimeStamp mStartTimerValue;
|
||||
nsString mStartTimerLabel;
|
||||
bool mStartTimerStatus;
|
||||
|
||||
// These values are set in the owning thread and they contain the duration,
|
||||
// the name and the status of the StopTimer method. If status is false,
|
||||
// something went wrong. They will be set on the owning thread and never
|
||||
// touched again on that thread. They will be used on the main-thread in order
|
||||
// to create a ConsoleTimerEnd dictionary. This members are set when
|
||||
// console.timeEnd() is called.
|
||||
double mStopTimerDuration;
|
||||
nsString mStopTimerLabel;
|
||||
bool mStopTimerStatus;
|
||||
|
||||
// These 2 values are set by IncreaseCounter on the owning thread and they are
|
||||
// used on the main-thread by CreateCounterValue. These members are set when
|
||||
// console.count() is called.
|
||||
nsString mCountLabel;
|
||||
uint32_t mCountValue;
|
||||
|
||||
// The concept of outerID and innerID is misleading because when a
|
||||
// ConsoleCallData is created from a window, these are the window IDs, but
|
||||
@@ -345,7 +377,7 @@ private:
|
||||
void
|
||||
RunWithWindow(nsPIDOMWindow* aWindow)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnMainThread();
|
||||
|
||||
AutoJSAPI jsapi;
|
||||
MOZ_ASSERT(aWindow);
|
||||
@@ -367,7 +399,7 @@ private:
|
||||
void
|
||||
RunWindowless()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnMainThread();
|
||||
|
||||
WorkerPrivate* wp = mWorkerPrivate;
|
||||
while (wp->GetParent()) {
|
||||
@@ -517,7 +549,7 @@ private:
|
||||
RunConsole(JSContext* aCx, nsPIDOMWindow* aOuterWindow,
|
||||
nsPIDOMWindow* aInnerWindow) override
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(mCallData->mCopiedArguments.IsEmpty());
|
||||
|
||||
// The windows have to run in parallel.
|
||||
@@ -564,6 +596,8 @@ private:
|
||||
void
|
||||
ProcessCallData(JSContext* aCx)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
ClearException ce(aCx);
|
||||
|
||||
JS::Rooted<JS::Value> argumentsValue(aCx);
|
||||
@@ -746,6 +780,9 @@ NS_INTERFACE_MAP_END
|
||||
|
||||
Console::Console(nsPIDOMWindow* aWindow)
|
||||
: mWindow(aWindow)
|
||||
#ifdef DEBUG
|
||||
, mOwningThread(PR_GetCurrentThread())
|
||||
#endif
|
||||
, mOuterID(0)
|
||||
, mInnerID(0)
|
||||
{
|
||||
@@ -774,6 +811,7 @@ Console::Console(nsPIDOMWindow* aWindow)
|
||||
|
||||
Console::~Console()
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(mConsoleCallDataArray.IsEmpty());
|
||||
|
||||
if (!NS_IsMainThread()) {
|
||||
@@ -793,7 +831,7 @@ NS_IMETHODIMP
|
||||
Console::Observe(nsISupports* aSubject, const char* aTopic,
|
||||
const char16_t* aData)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnMainThread();
|
||||
|
||||
if (strcmp(aTopic, "inner-window-destroyed")) {
|
||||
return NS_OK;
|
||||
@@ -843,6 +881,8 @@ METHOD(Table, "table")
|
||||
void
|
||||
Console::Trace(JSContext* aCx)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
const Sequence<JS::Value> data;
|
||||
Method(aCx, MethodTrace, NS_LITERAL_STRING("trace"), data);
|
||||
}
|
||||
@@ -858,6 +898,8 @@ METHOD(GroupEnd, "groupEnd")
|
||||
void
|
||||
Console::Time(JSContext* aCx, const JS::Handle<JS::Value> aTime)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
Sequence<JS::Value> data;
|
||||
SequenceRooter<JS::Value> rooter(aCx, &data);
|
||||
|
||||
@@ -871,6 +913,8 @@ Console::Time(JSContext* aCx, const JS::Handle<JS::Value> aTime)
|
||||
void
|
||||
Console::TimeEnd(JSContext* aCx, const JS::Handle<JS::Value> aTime)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
Sequence<JS::Value> data;
|
||||
SequenceRooter<JS::Value> rooter(aCx, &data);
|
||||
|
||||
@@ -884,6 +928,8 @@ Console::TimeEnd(JSContext* aCx, const JS::Handle<JS::Value> aTime)
|
||||
void
|
||||
Console::TimeStamp(JSContext* aCx, const JS::Handle<JS::Value> aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
Sequence<JS::Value> data;
|
||||
SequenceRooter<JS::Value> rooter(aCx, &data);
|
||||
|
||||
@@ -897,12 +943,14 @@ Console::TimeStamp(JSContext* aCx, const JS::Handle<JS::Value> aData)
|
||||
void
|
||||
Console::Profile(JSContext* aCx, const Sequence<JS::Value>& aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
ProfileMethod(aCx, NS_LITERAL_STRING("profile"), aData);
|
||||
}
|
||||
|
||||
void
|
||||
Console::ProfileEnd(JSContext* aCx, const Sequence<JS::Value>& aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
ProfileMethod(aCx, NS_LITERAL_STRING("profileEnd"), aData);
|
||||
}
|
||||
|
||||
@@ -966,6 +1014,8 @@ void
|
||||
Console::Assert(JSContext* aCx, bool aCondition,
|
||||
const Sequence<JS::Value>& aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
if (!aCondition) {
|
||||
Method(aCx, MethodAssert, NS_LITERAL_STRING("assert"), aData);
|
||||
}
|
||||
@@ -976,6 +1026,8 @@ METHOD(Count, "count")
|
||||
void
|
||||
Console::NoopMethod()
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
// Nothing to do.
|
||||
}
|
||||
|
||||
@@ -1053,6 +1105,8 @@ Console::Method(JSContext* aCx, MethodName aMethodName,
|
||||
const nsAString& aMethodString,
|
||||
const Sequence<JS::Value>& aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
RefPtr<ConsoleCallData> callData(new ConsoleCallData());
|
||||
|
||||
ClearException ce(aCx);
|
||||
@@ -1120,6 +1174,8 @@ Console::Method(JSContext* aCx, MethodName aMethodName,
|
||||
}
|
||||
}
|
||||
|
||||
DOMHighResTimeStamp monotonicTimer;
|
||||
|
||||
// Monotonic timer for 'time' and 'timeEnd'
|
||||
if (aMethodName == MethodTime ||
|
||||
aMethodName == MethodTimeEnd ||
|
||||
@@ -1133,7 +1189,7 @@ Console::Method(JSContext* aCx, MethodName aMethodName,
|
||||
return;
|
||||
}
|
||||
|
||||
callData->mMonotonicTimer = performance->Now();
|
||||
monotonicTimer = performance->Now();
|
||||
|
||||
nsDocShell* docShell = static_cast<nsDocShell*>(mWindow->GetDocShell());
|
||||
RefPtr<TimelineConsumers> timelines = TimelineConsumers::Get();
|
||||
@@ -1175,12 +1231,36 @@ Console::Method(JSContext* aCx, MethodName aMethodName,
|
||||
MOZ_ASSERT(workerPrivate);
|
||||
|
||||
TimeDuration duration =
|
||||
mozilla::TimeStamp::Now() - workerPrivate->CreationTimeStamp();
|
||||
mozilla::TimeStamp::Now() - workerPrivate->NowBaseTimeStamp();
|
||||
|
||||
callData->mMonotonicTimer = duration.ToMilliseconds();
|
||||
monotonicTimer = duration.ToMilliseconds();
|
||||
}
|
||||
}
|
||||
|
||||
if (aMethodName == MethodTime && !aData.IsEmpty()) {
|
||||
callData->mStartTimerStatus = StartTimer(aCx, aData[0],
|
||||
monotonicTimer,
|
||||
callData->mStartTimerLabel,
|
||||
&callData->mStartTimerValue);
|
||||
}
|
||||
|
||||
else if (aMethodName == MethodTimeEnd && !aData.IsEmpty()) {
|
||||
callData->mStopTimerStatus = StopTimer(aCx, aData[0],
|
||||
monotonicTimer,
|
||||
callData->mStopTimerLabel,
|
||||
&callData->mStopTimerDuration);
|
||||
}
|
||||
|
||||
else if (aMethodName == MethodCount) {
|
||||
ConsoleStackEntry frame;
|
||||
if (callData->mTopStackFrame) {
|
||||
frame = *callData->mTopStackFrame;
|
||||
}
|
||||
|
||||
callData->mCountValue = IncreaseCounter(aCx, frame, aData,
|
||||
callData->mCountLabel);
|
||||
}
|
||||
|
||||
JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx));
|
||||
|
||||
if (NS_IsMainThread()) {
|
||||
@@ -1207,6 +1287,8 @@ enum {
|
||||
bool
|
||||
LazyStackGetter(JSContext* aCx, unsigned aArgc, JS::Value* aVp)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
JS::CallArgs args = CallArgsFromVp(aArgc, aVp);
|
||||
JS::Rooted<JSObject*> callee(aCx, &args.callee());
|
||||
|
||||
@@ -1243,8 +1325,8 @@ void
|
||||
Console::ProcessCallData(ConsoleCallData* aData, JS::Handle<JSObject*> aGlobal,
|
||||
const Sequence<JS::Value>& aArguments)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aData);
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
ConsoleStackEntry frame;
|
||||
if (aData->mTopStackFrame) {
|
||||
@@ -1322,15 +1404,20 @@ Console::ProcessCallData(ConsoleCallData* aData, JS::Handle<JSObject*> aGlobal,
|
||||
}
|
||||
|
||||
else if (aData->mMethodName == MethodTime && !aArguments.IsEmpty()) {
|
||||
event.mTimer = StartTimer(cx, aArguments[0], aData->mMonotonicTimer);
|
||||
event.mTimer = CreateStartTimerValue(cx, aData->mStartTimerLabel,
|
||||
aData->mStartTimerValue,
|
||||
aData->mStartTimerStatus);
|
||||
}
|
||||
|
||||
else if (aData->mMethodName == MethodTimeEnd && !aArguments.IsEmpty()) {
|
||||
event.mTimer = StopTimer(cx, aArguments[0], aData->mMonotonicTimer);
|
||||
event.mTimer = CreateStopTimerValue(cx, aData->mStopTimerLabel,
|
||||
aData->mStopTimerDuration,
|
||||
aData->mStopTimerStatus);
|
||||
}
|
||||
|
||||
else if (aData->mMethodName == MethodCount) {
|
||||
event.mCounter = IncreaseCounter(cx, frame, aArguments);
|
||||
event.mCounter = CreateCounterValue(cx, aData->mCountLabel,
|
||||
aData->mCountValue);
|
||||
}
|
||||
|
||||
// We want to create a console event object and pass it to our
|
||||
@@ -1434,6 +1521,8 @@ namespace {
|
||||
bool
|
||||
FlushOutput(JSContext* aCx, Sequence<JS::Value>& aSequence, nsString &aOutput)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
if (!aOutput.IsEmpty()) {
|
||||
JS::Rooted<JSString*> str(aCx, JS_NewUCStringCopyN(aCx,
|
||||
aOutput.get(),
|
||||
@@ -1458,8 +1547,10 @@ bool
|
||||
Console::ProcessArguments(JSContext* aCx,
|
||||
const Sequence<JS::Value>& aData,
|
||||
Sequence<JS::Value>& aSequence,
|
||||
Sequence<JS::Value>& aStyles) const
|
||||
Sequence<nsString>& aStyles) const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
if (aData.IsEmpty()) {
|
||||
return true;
|
||||
}
|
||||
@@ -1602,13 +1693,18 @@ Console::ProcessArguments(JSContext* aCx,
|
||||
int32_t diff = aSequence.Length() - aStyles.Length();
|
||||
if (diff > 0) {
|
||||
for (int32_t i = 0; i < diff; i++) {
|
||||
if (!aStyles.AppendElement(JS::NullValue(), fallible)) {
|
||||
if (!aStyles.AppendElement(NullString(), fallible)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!aStyles.AppendElement(JS::StringValue(jsString), fallible)) {
|
||||
nsAutoJSString string;
|
||||
if (!string.init(aCx, jsString)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!aStyles.AppendElement(string, fallible)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1697,7 +1793,7 @@ void
|
||||
Console::MakeFormatString(nsCString& aFormat, int32_t aInteger,
|
||||
int32_t aMantissa, char aCh) const
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnMainThread();
|
||||
|
||||
aFormat.Append('%');
|
||||
if (aInteger >= 0) {
|
||||
@@ -1717,6 +1813,8 @@ Console::ComposeGroupName(JSContext* aCx,
|
||||
const Sequence<JS::Value>& aData,
|
||||
nsAString& aName) const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
for (uint32_t i = 0; i < aData.Length(); ++i) {
|
||||
if (i != 0) {
|
||||
aName.AppendASCII(" ");
|
||||
@@ -1737,13 +1835,52 @@ Console::ComposeGroupName(JSContext* aCx,
|
||||
}
|
||||
}
|
||||
|
||||
JS::Value
|
||||
bool
|
||||
Console::StartTimer(JSContext* aCx, const JS::Value& aName,
|
||||
DOMHighResTimeStamp aTimestamp)
|
||||
DOMHighResTimeStamp aTimestamp,
|
||||
nsAString& aTimerLabel,
|
||||
DOMHighResTimeStamp* aTimerValue)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(aTimerValue);
|
||||
|
||||
*aTimerValue = 0;
|
||||
|
||||
if (mTimerRegistry.Count() >= MAX_PAGE_TIMERS) {
|
||||
return false;
|
||||
}
|
||||
|
||||
JS::Rooted<JS::Value> name(aCx, aName);
|
||||
JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, name));
|
||||
if (!jsString) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsAutoJSString label;
|
||||
if (!label.init(aCx, jsString)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
DOMHighResTimeStamp entry;
|
||||
if (!mTimerRegistry.Get(label, &entry)) {
|
||||
mTimerRegistry.Put(label, aTimestamp);
|
||||
} else {
|
||||
aTimestamp = entry;
|
||||
}
|
||||
|
||||
aTimerLabel = label;
|
||||
*aTimerValue = aTimestamp;
|
||||
return true;
|
||||
}
|
||||
|
||||
JS::Value
|
||||
Console::CreateStartTimerValue(JSContext* aCx, const nsAString& aTimerLabel,
|
||||
DOMHighResTimeStamp aTimerValue,
|
||||
bool aTimerStatus) const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
if (!aTimerStatus) {
|
||||
RootedDictionary<ConsoleTimerError> error(aCx);
|
||||
|
||||
JS::Rooted<JS::Value> value(aCx);
|
||||
@@ -1756,27 +1893,8 @@ Console::StartTimer(JSContext* aCx, const JS::Value& aName,
|
||||
|
||||
RootedDictionary<ConsoleTimerStart> timer(aCx);
|
||||
|
||||
JS::Rooted<JS::Value> name(aCx, aName);
|
||||
JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, name));
|
||||
if (!jsString) {
|
||||
return JS::UndefinedValue();
|
||||
}
|
||||
|
||||
nsAutoJSString key;
|
||||
if (!key.init(aCx, jsString)) {
|
||||
return JS::UndefinedValue();
|
||||
}
|
||||
|
||||
timer.mName = key;
|
||||
|
||||
DOMHighResTimeStamp entry;
|
||||
if (!mTimerRegistry.Get(key, &entry)) {
|
||||
mTimerRegistry.Put(key, aTimestamp);
|
||||
} else {
|
||||
aTimestamp = entry;
|
||||
}
|
||||
|
||||
timer.mStarted = aTimestamp;
|
||||
timer.mName = aTimerLabel;
|
||||
timer.mStarted = aTimerValue;
|
||||
|
||||
JS::Rooted<JS::Value> value(aCx);
|
||||
if (!ToJSValue(aCx, timer, &value)) {
|
||||
@@ -1786,33 +1904,53 @@ Console::StartTimer(JSContext* aCx, const JS::Value& aName,
|
||||
return value;
|
||||
}
|
||||
|
||||
JS::Value
|
||||
bool
|
||||
Console::StopTimer(JSContext* aCx, const JS::Value& aName,
|
||||
DOMHighResTimeStamp aTimestamp)
|
||||
DOMHighResTimeStamp aTimestamp,
|
||||
nsAString& aTimerLabel,
|
||||
double* aTimerDuration)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(aTimerDuration);
|
||||
|
||||
*aTimerDuration = 0;
|
||||
|
||||
JS::Rooted<JS::Value> name(aCx, aName);
|
||||
JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, name));
|
||||
if (!jsString) {
|
||||
return JS::UndefinedValue();
|
||||
return false;
|
||||
}
|
||||
|
||||
nsAutoJSString key;
|
||||
if (!key.init(aCx, jsString)) {
|
||||
return JS::UndefinedValue();
|
||||
return false;
|
||||
}
|
||||
|
||||
DOMHighResTimeStamp entry;
|
||||
if (!mTimerRegistry.Get(key, &entry)) {
|
||||
return JS::UndefinedValue();
|
||||
return false;
|
||||
}
|
||||
|
||||
mTimerRegistry.Remove(key);
|
||||
|
||||
aTimerLabel = key;
|
||||
*aTimerDuration = aTimestamp - entry;
|
||||
return true;
|
||||
}
|
||||
|
||||
JS::Value
|
||||
Console::CreateStopTimerValue(JSContext* aCx, const nsAString& aLabel,
|
||||
double aDuration, bool aStatus) const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
if (!aStatus) {
|
||||
return JS::UndefinedValue();
|
||||
}
|
||||
|
||||
RootedDictionary<ConsoleTimerEnd> timer(aCx);
|
||||
timer.mName = key;
|
||||
timer.mDuration = aTimestamp - entry;
|
||||
timer.mName = aLabel;
|
||||
timer.mDuration = aDuration;
|
||||
|
||||
JS::Rooted<JS::Value> value(aCx);
|
||||
if (!ToJSValue(aCx, timer, &value)) {
|
||||
@@ -1826,6 +1964,8 @@ bool
|
||||
Console::ArgumentsToValueList(const Sequence<JS::Value>& aData,
|
||||
Sequence<JS::Value>& aSequence) const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
for (uint32_t i = 0; i < aData.Length(); ++i) {
|
||||
if (!aSequence.AppendElement(aData[i], fallible)) {
|
||||
return false;
|
||||
@@ -1835,11 +1975,12 @@ Console::ArgumentsToValueList(const Sequence<JS::Value>& aData,
|
||||
return true;
|
||||
}
|
||||
|
||||
JS::Value
|
||||
uint32_t
|
||||
Console::IncreaseCounter(JSContext* aCx, const ConsoleStackEntry& aFrame,
|
||||
const Sequence<JS::Value>& aArguments)
|
||||
const Sequence<JS::Value>& aArguments,
|
||||
nsAString& aCountLabel)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
ClearException ce(aCx);
|
||||
|
||||
@@ -1864,25 +2005,40 @@ Console::IncreaseCounter(JSContext* aCx, const ConsoleStackEntry& aFrame,
|
||||
}
|
||||
|
||||
uint32_t count = 0;
|
||||
if (!mCounterRegistry.Get(key, &count)) {
|
||||
if (mCounterRegistry.Count() >= MAX_PAGE_COUNTERS) {
|
||||
RootedDictionary<ConsoleCounterError> error(aCx);
|
||||
|
||||
JS::Rooted<JS::Value> value(aCx);
|
||||
if (!ToJSValue(aCx, error, &value)) {
|
||||
return JS::UndefinedValue();
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
if (!mCounterRegistry.Get(key, &count) &&
|
||||
mCounterRegistry.Count() >= MAX_PAGE_COUNTERS) {
|
||||
return MAX_PAGE_COUNTERS;
|
||||
}
|
||||
|
||||
++count;
|
||||
mCounterRegistry.Put(key, count);
|
||||
|
||||
aCountLabel = label;
|
||||
return count;
|
||||
}
|
||||
|
||||
JS::Value
|
||||
Console::CreateCounterValue(JSContext* aCx, const nsAString& aCountLabel,
|
||||
uint32_t aCountValue) const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
ClearException ce(aCx);
|
||||
|
||||
if (aCountValue == MAX_PAGE_COUNTERS) {
|
||||
RootedDictionary<ConsoleCounterError> error(aCx);
|
||||
|
||||
JS::Rooted<JS::Value> value(aCx);
|
||||
if (!ToJSValue(aCx, error, &value)) {
|
||||
return JS::UndefinedValue();
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
RootedDictionary<ConsoleCounter> data(aCx);
|
||||
data.mLabel = label;
|
||||
data.mCount = count;
|
||||
data.mLabel = aCountLabel;
|
||||
data.mCount = aCountValue;
|
||||
|
||||
JS::Rooted<JS::Value> value(aCx);
|
||||
if (!ToJSValue(aCx, data, &value)) {
|
||||
@@ -1909,7 +2065,7 @@ Console::ShouldIncludeStackTrace(MethodName aMethodName) const
|
||||
JSObject*
|
||||
Console::GetOrCreateSandbox(JSContext* aCx, nsIPrincipal* aPrincipal)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AssertIsOnMainThread();
|
||||
|
||||
if (!mSandbox) {
|
||||
nsIXPConnect* xpc = nsContentUtils::XPConnect();
|
||||
@@ -1930,6 +2086,8 @@ Console::GetOrCreateSandbox(JSContext* aCx, nsIPrincipal* aPrincipal)
|
||||
void
|
||||
Console::RegisterConsoleCallData(ConsoleCallData* aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
MOZ_ASSERT(!mConsoleCallDataArray.Contains(aData));
|
||||
mConsoleCallDataArray.AppendElement(aData);
|
||||
}
|
||||
@@ -1937,9 +2095,18 @@ Console::RegisterConsoleCallData(ConsoleCallData* aData)
|
||||
void
|
||||
Console::UnregisterConsoleCallData(ConsoleCallData* aData)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
MOZ_ASSERT(mConsoleCallDataArray.Contains(aData));
|
||||
mConsoleCallDataArray.RemoveElement(aData);
|
||||
}
|
||||
|
||||
void
|
||||
Console::AssertIsOnOwningThread() const
|
||||
{
|
||||
MOZ_ASSERT(mOwningThread);
|
||||
MOZ_ASSERT(PR_GetCurrentThread() == mOwningThread);
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
Reference in New Issue
Block a user